@radixdlt/hardware-ledger
Version:
Ledger Nano hardware wallet connection
68 lines • 3.68 kB
JavaScript
;
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