UNPKG

@trezor/connect

Version:

High-level javascript interface for Trezor hardware wallet.

76 lines 3.43 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.uploadFirmware = void 0; const transport_1 = require("@trezor/transport"); const constants_1 = require("../../constants"); const events_1 = require("../../events"); const postConfirmationMessage = (device) => { if (device.features.firmware_present) { device.emit(events_1.DEVICE.BUTTON, { device, payload: { code: 'ButtonRequest_FirmwareUpdate' } }); } }; const postProgressMessage = (device, progress, postMessage) => { postMessage((0, events_1.createUiMessage)(events_1.UI.FIRMWARE_PROGRESS, { device: device.toMessageObject(), operation: 'flashing', progress, })); }; const FIRMWARE_ERASE_TIMEOUT_MILLISECONDS = 15_000; const uploadFirmware = async (typedCall, postMessage, device, { payload }) => { if (device.features.major_version === 1) { postConfirmationMessage(device); const timeoutId = setTimeout(() => { postMessage((0, events_1.createUiMessage)(events_1.UI.FIRMWARE_PROGRESS_UNEXPECTED_DELAY, {})); }, FIRMWARE_ERASE_TIMEOUT_MILLISECONDS); await typedCall('FirmwareErase', 'Success', {}); clearTimeout(timeoutId); postProgressMessage(device, 0, postMessage); let i = 0; const progressTimer = setInterval(() => { i++; postProgressMessage(device, Math.min(i * 2, 99), postMessage); }, 300); const message = await typedCall('FirmwareUpload', 'Success', { payload, }).finally(() => { clearInterval(progressTimer); }); postProgressMessage(device, 100, postMessage); return message; } if (device.features.major_version === 2) { postConfirmationMessage(device); const length = payload.byteLength; let progress = 0; let response = await typedCall('FirmwareErase', ['FirmwareRequest', 'Success'], { length }); while (response.type !== 'Success') { const start = response.message.offset; const end = response.message.offset + response.message.length; const chunk = payload.slice(start, end); const progressStart = Math.round((start / length) * 100); const progressEnd = Math.round((end / length) * 100); const progressDiff = progressEnd - progressStart; device.transport.on(transport_1.TRANSPORT.SEND_MESSAGE_PROGRESS, p => { const newProgress = progressStart + Math.floor(progressDiff * p); if (start > 0 && newProgress > progress) { progress = newProgress; postProgressMessage(device, progress, postMessage); } }); if (start > 0) { postProgressMessage(device, progressStart, postMessage); } response = await typedCall('FirmwareUpload', ['FirmwareRequest', 'Success'], { payload: chunk, }).finally(() => { device.transport.removeAllListeners(transport_1.TRANSPORT.SEND_MESSAGE_PROGRESS); }); } postProgressMessage(device, 100, postMessage); return response.message; } throw constants_1.ERRORS.TypedError('Runtime', 'uploadFirmware: unknown major_version'); }; exports.uploadFirmware = uploadFirmware; //# sourceMappingURL=uploadFirmware.js.map