@trezor/connect 9.3.0 → 9.3.1-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +121 -8
- package/README.md +1 -1
- package/lib/api/checkFirmwareAuthenticity.d.ts +2 -1
- package/lib/api/checkFirmwareAuthenticity.js +34 -26
- package/lib/api/ethereum/api/ethereumSignTypedData.d.ts +1 -0
- package/lib/api/ethereum/api/ethereumSignTypedData.js +3 -1
- package/lib/api/ethereum/ethereumDefinitions.js +1 -0
- package/lib/api/firmware/getBinary.d.ts +4 -4
- package/lib/api/firmware/getBinary.js +4 -15
- package/lib/api/firmware/getBinaryForFirmwareUpgrade.d.ts +11 -0
- package/lib/api/firmware/getBinaryForFirmwareUpgrade.js +32 -0
- package/lib/api/firmware/index.d.ts +1 -0
- package/lib/api/firmware/index.js +3 -1
- package/lib/api/firmware/verifyAuthenticityProof.d.ts +1 -1
- package/lib/api/firmware/verifyAuthenticityProof.js +37 -2
- package/lib/api/firmware/x509certificate.d.ts +20 -6
- package/lib/api/firmware/x509certificate.js +82 -13
- package/lib/api/getCoinInfo.d.ts +3 -0
- package/lib/api/getFeatures.d.ts +1 -0
- package/lib/backend/Blockchain.js +10 -1
- package/lib/core/AbstractMethod.js +1 -0
- package/lib/core/index.d.ts +3 -3
- package/lib/core/index.js +93 -111
- package/lib/core/onCallFirmwareUpdate.js +25 -14
- package/lib/data/DataManager.d.ts +11 -0
- package/lib/data/DataManager.js +1 -1
- package/lib/data/coinInfo.d.ts +14 -0
- package/lib/data/config.d.ts +11 -0
- package/lib/data/config.js +17 -1
- package/lib/data/connectSettings.js +3 -2
- package/lib/data/deviceAuthenticityConfig.d.ts +1 -28
- package/lib/data/deviceAuthenticityConfig.js +25 -24
- package/lib/data/deviceAuthenticityConfigTypes.d.ts +38 -0
- package/lib/data/deviceAuthenticityConfigTypes.js +28 -0
- package/lib/data/models.d.ts +10 -0
- package/lib/data/models.js +12 -10
- package/lib/data/version.d.ts +2 -1
- package/lib/data/version.js +3 -2
- package/lib/device/Device.d.ts +2 -3
- package/lib/device/Device.js +15 -24
- package/lib/device/DeviceCommands.js +2 -27
- package/lib/device/DeviceList.d.ts +42 -27
- package/lib/device/DeviceList.js +249 -233
- package/lib/events/core.d.ts +2 -2
- package/lib/events/popup.d.ts +1 -0
- package/lib/events/transport.d.ts +5 -0
- package/lib/index.js +20 -20
- package/lib/types/api/authenticateDevice.d.ts +9 -0
- package/lib/types/api/authenticateDevice.js +2 -2
- package/lib/types/api/checkFirmwareAuthenticity.d.ts +4 -1
- package/lib/types/api/init.d.ts +2 -2
- package/lib/types/coinInfo.d.ts +7 -0
- package/lib/types/firmware.d.ts +2 -2
- package/lib/types/settings.d.ts +7 -3
- package/lib/utils/assetUtils.js +1 -0
- package/lib/utils/promiseUtils.d.ts +3 -3
- package/lib/utils/promiseUtils.js +7 -5
- package/package.json +16 -17
- package/lib/core/coreManager.d.ts +0 -16
- package/lib/core/coreManager.js +0 -55
package/lib/api/getFeatures.d.ts
CHANGED
|
@@ -15,6 +15,7 @@ export default class GetFeatures extends AbstractMethod<'getFeatures'> {
|
|
|
15
15
|
language_version_matches?: boolean | undefined;
|
|
16
16
|
unit_packaging?: number | undefined;
|
|
17
17
|
recovery_type?: "NormalRecovery" | "DryRun" | "UnlockRepeatedBackup" | undefined;
|
|
18
|
+
optiga_sec?: number | undefined;
|
|
18
19
|
flags: number | null;
|
|
19
20
|
language: string | null;
|
|
20
21
|
label: string | null;
|
|
@@ -22,6 +22,15 @@ const getWorker = (type) => {
|
|
|
22
22
|
return null;
|
|
23
23
|
}
|
|
24
24
|
};
|
|
25
|
+
const getNormalizedShortcut = (shortcut) => {
|
|
26
|
+
if (shortcut === 'tXRP') {
|
|
27
|
+
return 'XRP';
|
|
28
|
+
}
|
|
29
|
+
if (shortcut.toLowerCase() === 'bsc') {
|
|
30
|
+
return 'bnb';
|
|
31
|
+
}
|
|
32
|
+
return shortcut;
|
|
33
|
+
};
|
|
25
34
|
class Blockchain {
|
|
26
35
|
constructor(options) {
|
|
27
36
|
this.feeForBlock = [];
|
|
@@ -72,7 +81,7 @@ class Blockchain {
|
|
|
72
81
|
throw constants_1.ERRORS.TypedError('Backend_Error', error.message);
|
|
73
82
|
}
|
|
74
83
|
this.serverInfo = info;
|
|
75
|
-
const shortcut = this.coinInfo.shortcut
|
|
84
|
+
const shortcut = getNormalizedShortcut(this.coinInfo.shortcut);
|
|
76
85
|
if (info.shortcut.toLowerCase() !== shortcut.toLowerCase()) {
|
|
77
86
|
throw constants_1.ERRORS.TypedError('Backend_Invalid');
|
|
78
87
|
}
|
package/lib/core/index.d.ts
CHANGED
|
@@ -14,9 +14,9 @@ export declare class Core extends EventEmitter {
|
|
|
14
14
|
init(settings: ConnectSettings, onCoreEvent: (message: CoreEventMessage) => void, logWriterFactory?: () => LogWriter | undefined): Promise<void>;
|
|
15
15
|
}
|
|
16
16
|
export declare const initCoreState: () => {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
get: () => Core | undefined;
|
|
18
|
+
getPending: () => Promise<Core> | undefined;
|
|
19
|
+
getOrInit: (settings: ConnectSettings, onCoreEvent: (message: CoreEventMessage) => void, logWriterFactory?: (() => LogWriter) | undefined) => Promise<Core>;
|
|
20
20
|
dispose: () => void;
|
|
21
21
|
};
|
|
22
22
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/core/index.js
CHANGED
|
@@ -20,12 +20,11 @@ const debug_1 = require("../utils/debug");
|
|
|
20
20
|
const BlockchainLink_1 = require("../backend/BlockchainLink");
|
|
21
21
|
const interactionTimeout_1 = require("../utils/interactionTimeout");
|
|
22
22
|
const onCallFirmwareUpdate_1 = require("./onCallFirmwareUpdate");
|
|
23
|
-
const coreManager_1 = require("./coreManager");
|
|
24
23
|
let _core;
|
|
25
24
|
let _deviceList;
|
|
26
25
|
const _callMethods = [];
|
|
27
26
|
let _interactionTimeout;
|
|
28
|
-
let
|
|
27
|
+
let _deviceListInitReject;
|
|
29
28
|
let _overridePromise;
|
|
30
29
|
const methodSynchronize = (0, utils_2.getSynchronize)();
|
|
31
30
|
let waitForFirstMethod = (0, utils_1.createDeferred)();
|
|
@@ -52,13 +51,8 @@ const interactionTimeout = () => _interactionTimeout.start(() => {
|
|
|
52
51
|
});
|
|
53
52
|
const uiPromises = (0, uiPromiseManager_1.createUiPromiseManager)(interactionTimeout);
|
|
54
53
|
const initDevice = async (devicePath) => {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
await _deviceList.transportFirstEventPromise;
|
|
59
|
-
if (!_deviceList) {
|
|
60
|
-
throw constants_1.ERRORS.TypedError('Transport_Missing');
|
|
61
|
-
}
|
|
54
|
+
await _deviceList.pendingConnection();
|
|
55
|
+
_deviceList.assertConnected();
|
|
62
56
|
const isWebUsb = _deviceList.transportType() === 'WebUsbTransport';
|
|
63
57
|
let device;
|
|
64
58
|
let showDeviceSelection = isWebUsb;
|
|
@@ -92,9 +86,7 @@ const initDevice = async (devicePath) => {
|
|
|
92
86
|
if (showDeviceSelection) {
|
|
93
87
|
uiPromises.create(events_2.UI.RECEIVE_DEVICE);
|
|
94
88
|
await waitForPopup();
|
|
95
|
-
|
|
96
|
-
throw constants_1.ERRORS.TypedError('Transport_Missing');
|
|
97
|
-
}
|
|
89
|
+
_deviceList.assertConnected();
|
|
98
90
|
const devices = _deviceList.asArray();
|
|
99
91
|
if (devices.length === 1 &&
|
|
100
92
|
devices[0].type !== 'unreadable' &&
|
|
@@ -124,6 +116,9 @@ const initDevice = async (devicePath) => {
|
|
|
124
116
|
}
|
|
125
117
|
}
|
|
126
118
|
}
|
|
119
|
+
else if (uiPromises.exists(events_2.UI.RECEIVE_DEVICE)) {
|
|
120
|
+
await uiPromises.get(events_2.UI.RECEIVE_DEVICE);
|
|
121
|
+
}
|
|
127
122
|
if (!device) {
|
|
128
123
|
throw constants_1.ERRORS.TypedError('Device_NotFound');
|
|
129
124
|
}
|
|
@@ -246,7 +241,7 @@ const inner = async (method, device) => {
|
|
|
246
241
|
const uiResp = await uiPromise.promise;
|
|
247
242
|
if (uiResp.payload) {
|
|
248
243
|
device.setInternalState(undefined);
|
|
249
|
-
await device.initialize(method.
|
|
244
|
+
await device.initialize(method.useCardanoDerivation);
|
|
250
245
|
invalidDeviceState = await getInvalidDeviceState(device, method.preauthorized);
|
|
251
246
|
}
|
|
252
247
|
else {
|
|
@@ -333,8 +328,10 @@ const onCall = async (message) => {
|
|
|
333
328
|
postMessage(messageResponse);
|
|
334
329
|
return Promise.resolve();
|
|
335
330
|
}
|
|
336
|
-
if (!_deviceList && !
|
|
337
|
-
|
|
331
|
+
if (!_deviceList.isConnected() && !_deviceList.pendingConnection()) {
|
|
332
|
+
const { transports, pendingTransportEvent } = DataManager_1.DataManager.getSettings();
|
|
333
|
+
_deviceList.setTransports(transports);
|
|
334
|
+
await _deviceList.init({ pendingTransportEvent });
|
|
338
335
|
}
|
|
339
336
|
if (method.isManagementRestricted()) {
|
|
340
337
|
postMessage((0, events_2.createPopupMessage)(events_2.POPUP.CANCEL_POPUP_REQUEST));
|
|
@@ -429,17 +426,17 @@ const onCall = async (message) => {
|
|
|
429
426
|
});
|
|
430
427
|
await device.run(innerAction, {
|
|
431
428
|
keepSession: method.keepSession,
|
|
432
|
-
useEmptyPassphrase: method.useEmptyPassphrase,
|
|
433
429
|
skipFinalReload: method.skipFinalReload,
|
|
434
430
|
useCardanoDerivation: method.useCardanoDerivation,
|
|
435
431
|
});
|
|
436
432
|
}
|
|
437
433
|
catch (error) {
|
|
438
|
-
if (
|
|
434
|
+
if (error.code === 'Device_Disconnected') {
|
|
439
435
|
_deviceList.addAuthPenalty(device);
|
|
440
436
|
}
|
|
441
437
|
if (method) {
|
|
442
|
-
if (_deviceList
|
|
438
|
+
if (_deviceList.isConnected() &&
|
|
439
|
+
error.message === transport_1.TRANSPORT_ERROR.SESSION_WRONG_PREVIOUS) {
|
|
443
440
|
await _deviceList.enumerate();
|
|
444
441
|
}
|
|
445
442
|
messageResponse = (0, events_2.createResponseMessage)(method.responseID, false, { error });
|
|
@@ -468,10 +465,8 @@ const onCall = async (message) => {
|
|
|
468
465
|
if (method) {
|
|
469
466
|
method.dispose();
|
|
470
467
|
}
|
|
471
|
-
if (
|
|
472
|
-
|
|
473
|
-
_deviceList.removeAuthPenalty(device);
|
|
474
|
-
}
|
|
468
|
+
if (response.success) {
|
|
469
|
+
_deviceList.removeAuthPenalty(device);
|
|
475
470
|
}
|
|
476
471
|
if (!useCoreInPopup) {
|
|
477
472
|
postMessage(response);
|
|
@@ -543,7 +538,7 @@ const onPopupClosed = (customErrorMessage) => {
|
|
|
543
538
|
const error = customErrorMessage
|
|
544
539
|
? constants_1.ERRORS.TypedError('Method_Cancel', customErrorMessage)
|
|
545
540
|
: constants_1.ERRORS.TypedError('Method_Interrupted');
|
|
546
|
-
if (_deviceList && _deviceList.asArray().length > 0) {
|
|
541
|
+
if (_deviceList.isConnected() && _deviceList.asArray().length > 0) {
|
|
547
542
|
_deviceList.allDevices().forEach(d => {
|
|
548
543
|
d.keepSession = false;
|
|
549
544
|
if (d.isUsedHere()) {
|
|
@@ -569,7 +564,7 @@ const onPopupClosed = (customErrorMessage) => {
|
|
|
569
564
|
};
|
|
570
565
|
const handleDeviceSelectionChanges = (interruptDevice) => {
|
|
571
566
|
const promiseExists = uiPromises.exists(events_2.UI.RECEIVE_DEVICE);
|
|
572
|
-
if (promiseExists && _deviceList) {
|
|
567
|
+
if (promiseExists && _deviceList.isConnected()) {
|
|
573
568
|
const list = _deviceList.asArray();
|
|
574
569
|
const isWebUsb = _deviceList.transportType() === 'WebUsbTransport';
|
|
575
570
|
if (list.length === 1 && !isWebUsb) {
|
|
@@ -594,62 +589,29 @@ const handleDeviceSelectionChanges = (interruptDevice) => {
|
|
|
594
589
|
}
|
|
595
590
|
}
|
|
596
591
|
};
|
|
597
|
-
const
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
});
|
|
618
|
-
_deviceList.on(transport_1.TRANSPORT.ERROR, error => {
|
|
619
|
-
_log.warn('TRANSPORT.ERROR', error);
|
|
620
|
-
if (_deviceList) {
|
|
621
|
-
_deviceList.disconnectDevices();
|
|
622
|
-
_deviceList.dispose();
|
|
623
|
-
}
|
|
624
|
-
_deviceList = undefined;
|
|
625
|
-
postMessage((0, events_2.createTransportMessage)(transport_1.TRANSPORT.ERROR, { error }));
|
|
626
|
-
if (transportReconnect) {
|
|
627
|
-
const { promise, timeout } = (0, promiseUtils_1.resolveAfter)(1000, null);
|
|
628
|
-
_deviceListInitTimeout = timeout;
|
|
629
|
-
promise.then(() => {
|
|
630
|
-
initDeviceList(transportReconnect);
|
|
631
|
-
});
|
|
632
|
-
}
|
|
633
|
-
});
|
|
634
|
-
_deviceList.on(transport_1.TRANSPORT.START, transportType => postMessage((0, events_2.createTransportMessage)(transport_1.TRANSPORT.START, transportType)));
|
|
635
|
-
_deviceList.init();
|
|
636
|
-
if (_deviceList) {
|
|
637
|
-
await _deviceList.waitForTransportFirstEvent();
|
|
638
|
-
}
|
|
639
|
-
}
|
|
640
|
-
catch (error) {
|
|
641
|
-
_deviceList = undefined;
|
|
592
|
+
const createDeviceList = (params) => {
|
|
593
|
+
const deviceList = new DeviceList_1.DeviceList(params);
|
|
594
|
+
deviceList.on(events_2.DEVICE.CONNECT, device => {
|
|
595
|
+
handleDeviceSelectionChanges();
|
|
596
|
+
postMessage((0, events_2.createDeviceMessage)(events_2.DEVICE.CONNECT, device));
|
|
597
|
+
});
|
|
598
|
+
deviceList.on(events_2.DEVICE.CONNECT_UNACQUIRED, device => {
|
|
599
|
+
handleDeviceSelectionChanges();
|
|
600
|
+
postMessage((0, events_2.createDeviceMessage)(events_2.DEVICE.CONNECT_UNACQUIRED, device));
|
|
601
|
+
});
|
|
602
|
+
deviceList.on(events_2.DEVICE.DISCONNECT, device => {
|
|
603
|
+
handleDeviceSelectionChanges(device);
|
|
604
|
+
postMessage((0, events_2.createDeviceMessage)(events_2.DEVICE.DISCONNECT, device));
|
|
605
|
+
});
|
|
606
|
+
deviceList.on(events_2.DEVICE.CHANGED, device => {
|
|
607
|
+
postMessage((0, events_2.createDeviceMessage)(events_2.DEVICE.CHANGED, device));
|
|
608
|
+
});
|
|
609
|
+
deviceList.on(transport_1.TRANSPORT.START, transportType => postMessage((0, events_2.createTransportMessage)(transport_1.TRANSPORT.START, transportType)));
|
|
610
|
+
deviceList.on(transport_1.TRANSPORT.ERROR, error => {
|
|
611
|
+
_log.warn('TRANSPORT.ERROR', error);
|
|
642
612
|
postMessage((0, events_2.createTransportMessage)(transport_1.TRANSPORT.ERROR, { error }));
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
}
|
|
646
|
-
else {
|
|
647
|
-
const { promise, timeout } = (0, promiseUtils_1.resolveAfter)(3000, null);
|
|
648
|
-
_deviceListInitTimeout = timeout;
|
|
649
|
-
await promise;
|
|
650
|
-
await initDeviceList(transportReconnect);
|
|
651
|
-
}
|
|
652
|
-
}
|
|
613
|
+
});
|
|
614
|
+
return deviceList;
|
|
653
615
|
};
|
|
654
616
|
class Core extends events_1.default {
|
|
655
617
|
constructor() {
|
|
@@ -670,7 +632,12 @@ class Core extends events_1.default {
|
|
|
670
632
|
disableWebUSBTransport();
|
|
671
633
|
break;
|
|
672
634
|
case transport_1.TRANSPORT.REQUEST_DEVICE:
|
|
673
|
-
|
|
635
|
+
if (_deviceList.isConnected()) {
|
|
636
|
+
_deviceList.enumerate();
|
|
637
|
+
}
|
|
638
|
+
break;
|
|
639
|
+
case transport_1.TRANSPORT.GET_INFO:
|
|
640
|
+
postMessage((0, events_2.createResponseMessage)(message.id, true, this.getTransportInfo()));
|
|
674
641
|
break;
|
|
675
642
|
case events_2.UI.RECEIVE_DEVICE:
|
|
676
643
|
case events_2.UI.RECEIVE_CONFIRMATION:
|
|
@@ -686,6 +653,7 @@ class Core extends events_1.default {
|
|
|
686
653
|
break;
|
|
687
654
|
case events_2.IFRAME.CALL:
|
|
688
655
|
if (message.payload.method === 'firmwareUpdate') {
|
|
656
|
+
_deviceList.assertConnected();
|
|
689
657
|
(0, onCallFirmwareUpdate_1.onCallFirmwareUpdate)({
|
|
690
658
|
params: message.payload,
|
|
691
659
|
context: {
|
|
@@ -713,30 +681,24 @@ class Core extends events_1.default {
|
|
|
713
681
|
}
|
|
714
682
|
dispose() {
|
|
715
683
|
(0, BlockchainLink_1.dispose)();
|
|
716
|
-
|
|
717
|
-
clearTimeout(_deviceListInitTimeout);
|
|
718
|
-
}
|
|
684
|
+
_deviceListInitReject === null || _deviceListInitReject === void 0 ? void 0 : _deviceListInitReject(new Error('Disposed during initialization'));
|
|
719
685
|
this.removeAllListeners();
|
|
720
686
|
this.abortController.abort();
|
|
721
|
-
|
|
722
|
-
_deviceList.dispose();
|
|
723
|
-
}
|
|
687
|
+
_deviceList.dispose();
|
|
724
688
|
}
|
|
725
689
|
async getCurrentMethod() {
|
|
726
690
|
await waitForFirstMethod.promise;
|
|
727
691
|
return await methodSynchronize(() => _callMethods[0]);
|
|
728
692
|
}
|
|
729
693
|
getTransportInfo() {
|
|
730
|
-
if (
|
|
731
|
-
return
|
|
694
|
+
if (_deviceList.isConnected()) {
|
|
695
|
+
return _deviceList.getTransportInfo();
|
|
732
696
|
}
|
|
733
|
-
return _deviceList.getTransportInfo();
|
|
734
697
|
}
|
|
735
698
|
enumerate() {
|
|
736
|
-
if (
|
|
737
|
-
|
|
699
|
+
if (_deviceList.isConnected()) {
|
|
700
|
+
_deviceList.enumerate();
|
|
738
701
|
}
|
|
739
|
-
_deviceList.enumerate();
|
|
740
702
|
}
|
|
741
703
|
async init(settings, onCoreEvent, logWriterFactory) {
|
|
742
704
|
if (logWriterFactory) {
|
|
@@ -744,8 +706,11 @@ class Core extends events_1.default {
|
|
|
744
706
|
}
|
|
745
707
|
try {
|
|
746
708
|
await DataManager_1.DataManager.load(settings);
|
|
747
|
-
|
|
709
|
+
const { debug, priority } = DataManager_1.DataManager.getSettings();
|
|
710
|
+
const messages = DataManager_1.DataManager.getProtobufMessages();
|
|
711
|
+
(0, debug_1.enableLog)(debug);
|
|
748
712
|
_core = this;
|
|
713
|
+
_deviceList = createDeviceList({ debug, messages, priority });
|
|
749
714
|
_interactionTimeout = new interactionTimeout_1.InteractionTimeout(settings.popup ? settings.interactionTimeout : 0);
|
|
750
715
|
this.on(events_2.CORE_EVENT, onCoreEvent);
|
|
751
716
|
}
|
|
@@ -753,46 +718,63 @@ class Core extends events_1.default {
|
|
|
753
718
|
_log.error('init', error);
|
|
754
719
|
throw error;
|
|
755
720
|
}
|
|
721
|
+
const { transports, pendingTransportEvent, transportReconnect, coreMode } = DataManager_1.DataManager.getSettings();
|
|
756
722
|
try {
|
|
757
|
-
|
|
758
|
-
await initDeviceList(false);
|
|
759
|
-
}
|
|
760
|
-
else {
|
|
761
|
-
initDeviceList(true);
|
|
762
|
-
}
|
|
723
|
+
_deviceList.setTransports(transports);
|
|
763
724
|
}
|
|
764
725
|
catch (error) {
|
|
765
|
-
_log.error('
|
|
726
|
+
_log.error('setTransports', error);
|
|
727
|
+
postMessage((0, events_2.createTransportMessage)(transport_1.TRANSPORT.ERROR, { error }));
|
|
766
728
|
throw error;
|
|
767
729
|
}
|
|
730
|
+
_deviceList.init({ pendingTransportEvent, transportReconnect });
|
|
731
|
+
if (!transportReconnect || coreMode === 'auto') {
|
|
732
|
+
await _deviceList.pendingConnection();
|
|
733
|
+
}
|
|
768
734
|
}
|
|
769
735
|
}
|
|
770
736
|
exports.Core = Core;
|
|
771
737
|
const disableWebUSBTransport = async () => {
|
|
772
|
-
|
|
773
|
-
if (!_deviceList)
|
|
738
|
+
if (!_deviceList.isConnected())
|
|
774
739
|
return;
|
|
775
740
|
if (_deviceList.transportType() !== 'WebUsbTransport')
|
|
776
741
|
return;
|
|
777
|
-
const
|
|
778
|
-
if (
|
|
779
|
-
const transportStr =
|
|
742
|
+
const { transports, pendingTransportEvent, transportReconnect } = DataManager_1.DataManager.getSettings();
|
|
743
|
+
if (transports) {
|
|
744
|
+
const transportStr = transports === null || transports === void 0 ? void 0 : transports.filter(transport => typeof transport !== 'object');
|
|
780
745
|
if (transportStr.includes('WebUsbTransport')) {
|
|
781
|
-
|
|
746
|
+
transports.splice(transports.indexOf('WebUsbTransport'), 1);
|
|
782
747
|
}
|
|
783
748
|
if (!transportStr.includes('BridgeTransport')) {
|
|
784
|
-
|
|
749
|
+
transports.unshift('BridgeTransport');
|
|
785
750
|
}
|
|
786
751
|
}
|
|
787
752
|
try {
|
|
788
|
-
_deviceList.
|
|
789
|
-
|
|
753
|
+
_deviceList.cleanup();
|
|
754
|
+
_deviceList.setTransports(transports);
|
|
755
|
+
await _deviceList.init({ pendingTransportEvent, transportReconnect });
|
|
790
756
|
}
|
|
791
757
|
catch (error) {
|
|
758
|
+
postMessage((0, events_2.createTransportMessage)(transport_1.TRANSPORT.ERROR, { error }));
|
|
792
759
|
}
|
|
793
760
|
};
|
|
794
|
-
const
|
|
795
|
-
|
|
761
|
+
const initCore = async (settings, onCoreEvent, logWriterFactory) => {
|
|
762
|
+
const core = new Core();
|
|
763
|
+
let promise;
|
|
764
|
+
const eventThrottle = (...args) => promise
|
|
765
|
+
.then(() => {
|
|
766
|
+
setTimeout(() => onCoreEvent(...args), 0);
|
|
767
|
+
})
|
|
768
|
+
.catch(() => { });
|
|
769
|
+
promise = core.init(settings, eventThrottle, logWriterFactory);
|
|
770
|
+
await promise;
|
|
771
|
+
core.on(events_2.CORE_EVENT, onCoreEvent);
|
|
772
|
+
core.off(events_2.CORE_EVENT, eventThrottle);
|
|
773
|
+
return core;
|
|
774
|
+
};
|
|
775
|
+
const disposeCore = (core) => {
|
|
776
|
+
core.dispose();
|
|
796
777
|
};
|
|
778
|
+
const initCoreState = () => (0, utils_1.createLazy)(initCore, disposeCore);
|
|
797
779
|
exports.initCoreState = initCoreState;
|
|
798
780
|
//# sourceMappingURL=index.js.map
|
|
@@ -71,24 +71,29 @@ const waitForReconnectedDevice = async ({ bootloader, method, intermediary }, {
|
|
|
71
71
|
await reconnectedDevice.acquire();
|
|
72
72
|
return reconnectedDevice;
|
|
73
73
|
};
|
|
74
|
-
const getInstallationParams = (device,
|
|
75
|
-
var _a;
|
|
74
|
+
const getInstallationParams = (device, params) => {
|
|
75
|
+
var _a, _b;
|
|
76
|
+
const btcOnly = (_a = params.btcOnly) !== null && _a !== void 0 ? _a : device.firmwareType === 'bitcoin-only';
|
|
76
77
|
if (!device.features.bootloader_mode) {
|
|
77
|
-
const version =
|
|
78
|
+
const version = params.binary
|
|
79
|
+
? (0, firmware_1.parseFirmwareHeaders)(Buffer.from(params.binary)).version
|
|
80
|
+
: undefined;
|
|
78
81
|
const isUpdatingToNewerVersion = !version
|
|
79
|
-
? (
|
|
82
|
+
? (_b = device.firmwareRelease) === null || _b === void 0 ? void 0 : _b.isNewer
|
|
80
83
|
: (0, versionUtils_1.isNewer)(version, [
|
|
81
84
|
device.features.major_version,
|
|
82
85
|
device.features.minor_version,
|
|
83
86
|
device.features.patch_version,
|
|
84
87
|
]);
|
|
85
|
-
const
|
|
88
|
+
const isUpdatingToEqualFirmwareType = (device.firmwareType === 'bitcoin-only') === btcOnly;
|
|
89
|
+
const upgrade = device.atLeast('2.6.3') && isUpdatingToNewerVersion && isUpdatingToEqualFirmwareType;
|
|
86
90
|
const manual = !device.atLeast(['1.10.0', '2.6.0']) && !upgrade;
|
|
87
91
|
const language = device.atLeast('2.7.0');
|
|
88
92
|
return {
|
|
89
93
|
manual,
|
|
90
94
|
upgrade,
|
|
91
95
|
language,
|
|
96
|
+
btcOnly,
|
|
92
97
|
};
|
|
93
98
|
}
|
|
94
99
|
else {
|
|
@@ -96,23 +101,23 @@ const getInstallationParams = (device, binary) => {
|
|
|
96
101
|
manual: false,
|
|
97
102
|
upgrade: false,
|
|
98
103
|
language: false,
|
|
104
|
+
btcOnly,
|
|
99
105
|
};
|
|
100
106
|
}
|
|
101
107
|
};
|
|
102
108
|
const getFwHeader = (binary) => Buffer.from(binary.slice(0, 6000)).toString('hex');
|
|
103
|
-
const getBinaryHelper = (device, params, log, postMessage, intermediaryVersion) => {
|
|
109
|
+
const getBinaryHelper = (device, params, log, postMessage, btcOnly, intermediaryVersion) => {
|
|
104
110
|
var _a;
|
|
105
111
|
if (!device.firmwareRelease) {
|
|
106
112
|
throw constants_1.ERRORS.TypedError('Runtime', 'device.firmwareRelease is not set');
|
|
107
113
|
}
|
|
108
|
-
const btcOnly = params.btcOnly || (params.btcOnly === undefined && device.firmwareType === 'bitcoin-only');
|
|
109
114
|
log.debug('onCallFirmwareUpdate loading binary', 'intermediaryVersion', intermediaryVersion, 'version', device.firmwareRelease.release.version, 'btcOnly', btcOnly);
|
|
110
115
|
postMessage((0, events_1.createUiMessage)(events_1.UI.FIRMWARE_PROGRESS, {
|
|
111
116
|
device: device.toMessageObject(),
|
|
112
117
|
operation: 'downloading',
|
|
113
118
|
progress: 0,
|
|
114
119
|
}));
|
|
115
|
-
return (0, firmware_1.
|
|
120
|
+
return (0, firmware_1.getBinaryForFirmwareUpgrade)({
|
|
116
121
|
features: device.features,
|
|
117
122
|
releases: (0, firmwareInfo_1.getReleases)((_a = device.features) === null || _a === void 0 ? void 0 : _a.internal_model),
|
|
118
123
|
baseUrl: params.baseUrl || 'https://data.trezor.io',
|
|
@@ -166,10 +171,15 @@ const onCallFirmwareUpdate = async ({ params, context: { deviceList, postMessage
|
|
|
166
171
|
}
|
|
167
172
|
log.debug('onCallFirmwareUpdate', 'device', device);
|
|
168
173
|
registerEvents(device, postMessage);
|
|
169
|
-
const { manual, upgrade, language } = getInstallationParams(device, params
|
|
170
|
-
log.debug('onCallFirmwareUpdate', 'installation params', {
|
|
174
|
+
const { manual, upgrade, language, btcOnly } = getInstallationParams(device, params);
|
|
175
|
+
log.debug('onCallFirmwareUpdate', 'installation params', {
|
|
176
|
+
manual,
|
|
177
|
+
upgrade,
|
|
178
|
+
language,
|
|
179
|
+
btcOnly,
|
|
180
|
+
});
|
|
171
181
|
const binary = params.binary ||
|
|
172
|
-
(await getBinaryHelper(device, params, log, postMessage, device.firmwareRelease.intermediaryVersion));
|
|
182
|
+
(await getBinaryHelper(device, params, log, postMessage, btcOnly, device.firmwareRelease.intermediaryVersion));
|
|
173
183
|
const deviceInitiallyConnectedInBootloader = device.features.bootloader_mode;
|
|
174
184
|
const deviceInitiallyConnectedWithoutFirmware = device.features.firmware_present === false;
|
|
175
185
|
let reconnectedDevice = device;
|
|
@@ -194,6 +204,7 @@ const onCallFirmwareUpdate = async ({ params, context: { deviceList, postMessage
|
|
|
194
204
|
language: targetLanguage,
|
|
195
205
|
version: device.firmwareRelease.release.version,
|
|
196
206
|
internal_model: device.features.internal_model,
|
|
207
|
+
}).catch(() => {
|
|
197
208
|
})
|
|
198
209
|
: null;
|
|
199
210
|
if (!languageBlob) {
|
|
@@ -216,14 +227,14 @@ const onCallFirmwareUpdate = async ({ params, context: { deviceList, postMessage
|
|
|
216
227
|
reconnectedDevice = await waitForReconnectedDevice({ bootloader: true, method: 'auto' }, { deviceList, device, log, postMessage, abortSignal });
|
|
217
228
|
}
|
|
218
229
|
const intermediary = !params.binary && device.firmwareRelease.intermediaryVersion;
|
|
219
|
-
await reconnectedDevice.initialize(false
|
|
230
|
+
await reconnectedDevice.initialize(false);
|
|
220
231
|
let stripped = (0, firmware_1.stripFwHeaders)(binary);
|
|
221
232
|
await (0, firmware_1.uploadFirmware)(reconnectedDevice.getCommands().typedCall.bind(reconnectedDevice.getCommands()), postMessage, reconnectedDevice, { payload: !intermediary && (0, firmware_1.shouldStripFwHeaders)(device.features) ? stripped : binary });
|
|
222
233
|
await reconnectedDevice.release();
|
|
223
234
|
if (intermediary) {
|
|
224
235
|
reconnectedDevice = await waitForReconnectedDevice({ bootloader: true, method: 'manual', intermediary: true }, { deviceList, device: reconnectedDevice, log, postMessage, abortSignal });
|
|
225
|
-
stripped = (0, firmware_1.stripFwHeaders)(await getBinaryHelper(reconnectedDevice, params, log, postMessage));
|
|
226
|
-
await reconnectedDevice.initialize(false
|
|
236
|
+
stripped = (0, firmware_1.stripFwHeaders)(await getBinaryHelper(reconnectedDevice, params, log, postMessage, btcOnly));
|
|
237
|
+
await reconnectedDevice.initialize(false);
|
|
227
238
|
await (0, firmware_1.uploadFirmware)(reconnectedDevice.getCommands().typedCall.bind(reconnectedDevice.getCommands()), postMessage, reconnectedDevice, { payload: stripped });
|
|
228
239
|
await reconnectedDevice.release();
|
|
229
240
|
}
|
|
@@ -74,6 +74,7 @@ export declare class DataManager {
|
|
|
74
74
|
T1B1: string;
|
|
75
75
|
T2T1: string;
|
|
76
76
|
T2B1?: undefined;
|
|
77
|
+
T3B1?: undefined;
|
|
77
78
|
T3T1?: undefined;
|
|
78
79
|
};
|
|
79
80
|
max: undefined;
|
|
@@ -85,6 +86,7 @@ export declare class DataManager {
|
|
|
85
86
|
T1B1: string;
|
|
86
87
|
T2T1: string;
|
|
87
88
|
T2B1?: undefined;
|
|
89
|
+
T3B1?: undefined;
|
|
88
90
|
T3T1?: undefined;
|
|
89
91
|
};
|
|
90
92
|
comment: string[];
|
|
@@ -97,6 +99,7 @@ export declare class DataManager {
|
|
|
97
99
|
T1B1: string;
|
|
98
100
|
T2T1: string;
|
|
99
101
|
T2B1?: undefined;
|
|
102
|
+
T3B1?: undefined;
|
|
100
103
|
T3T1?: undefined;
|
|
101
104
|
};
|
|
102
105
|
comment: string[];
|
|
@@ -109,6 +112,7 @@ export declare class DataManager {
|
|
|
109
112
|
T1B1: string;
|
|
110
113
|
T2T1: string;
|
|
111
114
|
T2B1?: undefined;
|
|
115
|
+
T3B1?: undefined;
|
|
112
116
|
T3T1?: undefined;
|
|
113
117
|
};
|
|
114
118
|
comment: string[];
|
|
@@ -122,6 +126,7 @@ export declare class DataManager {
|
|
|
122
126
|
T1B1: string;
|
|
123
127
|
T2T1: string;
|
|
124
128
|
T2B1?: undefined;
|
|
129
|
+
T3B1?: undefined;
|
|
125
130
|
T3T1?: undefined;
|
|
126
131
|
};
|
|
127
132
|
comment: string[];
|
|
@@ -134,6 +139,7 @@ export declare class DataManager {
|
|
|
134
139
|
T1B1: string;
|
|
135
140
|
T2T1: string;
|
|
136
141
|
T2B1?: undefined;
|
|
142
|
+
T3B1?: undefined;
|
|
137
143
|
T3T1?: undefined;
|
|
138
144
|
};
|
|
139
145
|
coin?: undefined;
|
|
@@ -145,6 +151,7 @@ export declare class DataManager {
|
|
|
145
151
|
T1B1: string;
|
|
146
152
|
T2T1: string;
|
|
147
153
|
T2B1: string;
|
|
154
|
+
T3B1?: undefined;
|
|
148
155
|
T3T1?: undefined;
|
|
149
156
|
};
|
|
150
157
|
comment: string[];
|
|
@@ -157,6 +164,7 @@ export declare class DataManager {
|
|
|
157
164
|
T1B1: string;
|
|
158
165
|
T2T1: string;
|
|
159
166
|
T2B1?: undefined;
|
|
167
|
+
T3B1?: undefined;
|
|
160
168
|
T3T1?: undefined;
|
|
161
169
|
};
|
|
162
170
|
coin?: undefined;
|
|
@@ -169,6 +177,7 @@ export declare class DataManager {
|
|
|
169
177
|
T1B1: string;
|
|
170
178
|
T2T1: string;
|
|
171
179
|
T2B1: string;
|
|
180
|
+
T3B1?: undefined;
|
|
172
181
|
T3T1?: undefined;
|
|
173
182
|
};
|
|
174
183
|
coin?: undefined;
|
|
@@ -181,6 +190,7 @@ export declare class DataManager {
|
|
|
181
190
|
T1B1: string;
|
|
182
191
|
T2T1: string;
|
|
183
192
|
T2B1: string;
|
|
193
|
+
T3B1?: undefined;
|
|
184
194
|
T3T1?: undefined;
|
|
185
195
|
};
|
|
186
196
|
comment: string[];
|
|
@@ -193,6 +203,7 @@ export declare class DataManager {
|
|
|
193
203
|
T1B1: string;
|
|
194
204
|
T2T1: string;
|
|
195
205
|
T2B1: string;
|
|
206
|
+
T3B1: string;
|
|
196
207
|
T3T1: string;
|
|
197
208
|
};
|
|
198
209
|
coin?: undefined;
|
package/lib/data/DataManager.js
CHANGED
|
@@ -22,7 +22,7 @@ class DataManager {
|
|
|
22
22
|
(0, transportInfo_1.parseBridgeJSON)(this.assets.bridge);
|
|
23
23
|
(0, coinInfo_1.parseCoinsJson)({
|
|
24
24
|
...this.assets.coins,
|
|
25
|
-
|
|
25
|
+
...this.assets.coinsEth,
|
|
26
26
|
});
|
|
27
27
|
for (const model in types_1.DeviceModelInternal) {
|
|
28
28
|
const firmwareKey = `firmware-${model.toLowerCase()}`;
|