//@flow import Transport from "@ledgerhq/hw-transport"; import { log } from "@ledgerhq/logs"; import type { RecordStore } from "./RecordStore"; /** * create a transport replayer with a record store. * @param recordStore */ const createTransportReplayer = ( recordStore: RecordStore ): Class> => { class TransportReplayer extends Transport<*> { static isSupported = () => Promise.resolve(true); static list = () => Promise.resolve([null]); static listen = (o) => { let unsubscribed; setTimeout(() => { if (unsubscribed) return; o.next({ type: "add", descriptor: null }); o.complete(); }, 0); return { unsubscribe: () => { unsubscribed = true; }, }; }; static open = () => Promise.resolve(new TransportReplayer()); setScrambleKey() {} close() { return Promise.resolve(); } exchange(apdu: Buffer): Promise { log("apdu", apdu.toString("hex")); try { const buffer = recordStore.replayExchange(apdu); log("apdu", buffer.toString("hex")); return Promise.resolve(buffer); } catch (e) { log("apdu-error", String(e)); return Promise.reject(e); } } } return TransportReplayer; }; export default createTransportReplayer;