UNPKG

@radixdlt/hardware-ledger

Version:
68 lines 3.68 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.LedgerNano = void 0; const tslib_1 = require("tslib"); const _types_1 = require("./_types"); const rxjs_1 = require("rxjs"); const util_1 = require("@radixdlt/util"); const device_connection_1 = require("./device-connection"); const ledgerAPDUResponseCodeBufferLength = 2; // two bytes const fromTransport = (basicLedgerTransport) => { const sendAPDUToDevice = (apdu) => new rxjs_1.Observable(subscriber => { (0, device_connection_1.send)({ apdu, with: basicLedgerTransport, }) .then(responseFromLedger => { if (!Buffer.isBuffer(responseFromLedger)) { responseFromLedger = Buffer.from(responseFromLedger); // Convert Uint8Array to Buffer for Electron renderer compatibility 💩 } util_1.log.debug(`📲 🥩 Raw response from Ledger device: ${responseFromLedger.toString('hex')}`); if (responseFromLedger.length < ledgerAPDUResponseCodeBufferLength) { const errMsg = `Got too short response from Ledger, expected all responses to be at least #${ledgerAPDUResponseCodeBufferLength} bytes, but got: #${responseFromLedger.length} bytes`; util_1.log.error(errMsg); subscriber.error(new Error(errMsg)); } const responseCodeBuf = responseFromLedger.slice(-ledgerAPDUResponseCodeBufferLength); const responseCode = parseInt(responseCodeBuf.toString('hex'), 16); util_1.log.debug(`📲 Response code Ledger device: ${(0, _types_1.prettifyLedgerResponseCode)(responseCode)}`); if (!apdu.requiredResponseStatusCodeFromDevice.includes(responseCode)) { const errMsg = `Invalid response code, got ${responseCode}, but requires any of: ${JSON.stringify(apdu.requiredResponseStatusCodeFromDevice, null, 4)}`; util_1.log.error(errMsg); subscriber.error(new Error(errMsg)); } const result = responseFromLedger.slice(0, responseFromLedger.length - ledgerAPDUResponseCodeBufferLength); util_1.log.debug(`📲 ✅ Response data Ledger device: ${result.toString('hex')}`); subscriber.next(result); subscriber.complete(); }) .catch(error => { if ( // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access error.statusCode !== undefined && error.statusCode === _types_1.LedgerResponseCodes.SW_CLA_NOT_SUPPORTED) { const errMsg = `🤷‍♀️ Wrong app/Radix app not opened on Ledger yet. ${(0, util_1.msgFromError)(error)}`; util_1.log.error(errMsg); subscriber.error(new Error(errMsg)); } else { const ledgerResponseCodesFromError = _types_1.LedgerResponseCodes[error.statusCode]; const underlyingError = ledgerResponseCodesFromError !== null && ledgerResponseCodesFromError !== void 0 ? ledgerResponseCodesFromError : (0, util_1.msgFromError)(error); const errMsg = `SEND APDU failed with underlying error: '${underlyingError}'`; util_1.log.error(errMsg); subscriber.error(new Error(errMsg)); } }); }); return { sendAPDUToDevice, }; }; const connect = (transport) => (0, tslib_1.__awaiter)(void 0, void 0, void 0, function* () { return fromTransport(transport); }); exports.LedgerNano = { connect, }; //# sourceMappingURL=ledgerNano.js.map