@onekeyfe/hd-core 1.2.0-alpha.75 → 1.2.0-alpha.77
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/__tests__/connectSettings.test.ts +45 -5
- package/__tests__/device-initialize-timeout.test.ts +56 -0
- package/__tests__/firmware-update/check-all-firmware-release.test.ts +175 -0
- package/__tests__/firmware-update/device-update-bootloader.test.ts +87 -0
- package/__tests__/firmware-update/firmware-artifact-source.test.ts +119 -0
- package/__tests__/firmware-update/firmware-host-binding.test.ts +70 -0
- package/__tests__/firmware-update/firmware-preparation-error.test.ts +27 -0
- package/__tests__/firmware-update/firmware-update-bootloader-poll.test.ts +200 -0
- package/__tests__/firmware-update/firmware-update-capabilities.test.ts +13 -0
- package/__tests__/firmware-update/firmware-update-plan-bootloader-identity.test.ts +394 -0
- package/__tests__/firmware-update/firmware-update-plan.test.ts +593 -0
- package/__tests__/firmware-update/firmware-update-prepared-plan.test.ts +231 -0
- package/__tests__/firmware-update/firmware-update-v2-download-before-boot.test.ts +86 -31
- package/__tests__/firmware-update/firmware-update-v3-reconnect.test.ts +121 -0
- package/__tests__/firmware-update/firmware-upload-source.test.ts +70 -0
- package/__tests__/protocol-v2.test.ts +405 -100
- package/dist/api/CheckAllFirmwareRelease.d.ts.map +1 -1
- package/dist/api/FirmwareUpdate.d.ts.map +1 -1
- package/dist/api/FirmwareUpdateV2.d.ts +10 -0
- package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
- package/dist/api/FirmwareUpdateV3.d.ts +7 -3
- package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
- package/dist/api/FirmwareUpdateV4.d.ts +25 -5
- package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
- package/dist/api/device/DeviceUpdateBootloader.d.ts +5 -1
- package/dist/api/device/DeviceUpdateBootloader.d.ts.map +1 -1
- package/dist/api/firmware/FirmwareArtifactSource.d.ts +25 -0
- package/dist/api/firmware/FirmwareArtifactSource.d.ts.map +1 -0
- package/dist/api/firmware/FirmwareHostBinding.d.ts +6 -0
- package/dist/api/firmware/FirmwareHostBinding.d.ts.map +1 -0
- package/dist/api/firmware/FirmwarePreparationError.d.ts +3 -0
- package/dist/api/firmware/FirmwarePreparationError.d.ts.map +1 -0
- package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts +8 -0
- package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts.map +1 -1
- package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts +3 -0
- package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts.map +1 -0
- package/dist/api/firmware/FirmwareUpdatePlan.d.ts +25 -0
- package/dist/api/firmware/FirmwareUpdatePlan.d.ts.map +1 -0
- package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts +32 -0
- package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts.map +1 -0
- package/dist/api/firmware/getBinary.d.ts +7 -0
- package/dist/api/firmware/getBinary.d.ts.map +1 -1
- package/dist/api/firmware/updateBootloader.d.ts +2 -0
- package/dist/api/firmware/updateBootloader.d.ts.map +1 -1
- package/dist/api/firmware/uploadFirmware.d.ts +9 -1
- package/dist/api/firmware/uploadFirmware.d.ts.map +1 -1
- package/dist/api/stellar/StellarSignTransaction.d.ts +1 -1
- package/dist/data-manager/DataManager.d.ts +1 -0
- package/dist/data-manager/DataManager.d.ts.map +1 -1
- package/dist/data-manager/connectSettings.d.ts.map +1 -1
- package/dist/device/Device.d.ts +1 -0
- package/dist/device/Device.d.ts.map +1 -1
- package/dist/index.d.ts +179 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3088 -1063
- package/dist/inject.d.ts.map +1 -1
- package/dist/lowLevelInject.d.ts.map +1 -1
- package/dist/topLevelInject.d.ts.map +1 -1
- package/dist/types/api/checkAllFirmwareRelease.d.ts +4 -0
- package/dist/types/api/checkAllFirmwareRelease.d.ts.map +1 -1
- package/dist/types/api/deviceUpdateBootloader.d.ts +6 -0
- package/dist/types/api/deviceUpdateBootloader.d.ts.map +1 -1
- package/dist/types/api/export.d.ts +4 -1
- package/dist/types/api/export.d.ts.map +1 -1
- package/dist/types/api/firmwareUpdate.d.ts +68 -0
- package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
- package/dist/types/api/firmwareUpdateCapabilities.d.ts +9 -0
- package/dist/types/api/firmwareUpdateCapabilities.d.ts.map +1 -0
- package/dist/types/api/firmwareUpdatePlan.d.ts +28 -0
- package/dist/types/api/firmwareUpdatePlan.d.ts.map +1 -0
- package/dist/types/api/firmwareUpdatePreparedPlan.d.ts +42 -0
- package/dist/types/api/firmwareUpdatePreparedPlan.d.ts.map +1 -0
- package/dist/types/api/index.d.ts +9 -1
- package/dist/types/api/index.d.ts.map +1 -1
- package/dist/types/settings.d.ts +13 -0
- package/dist/types/settings.d.ts.map +1 -1
- package/dist/utils/deviceFeaturesCompat.d.ts +1 -0
- package/dist/utils/deviceFeaturesCompat.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/api/CheckAllFirmwareRelease.ts +57 -6
- package/src/api/FirmwareUpdate.ts +13 -1
- package/src/api/FirmwareUpdateV2.ts +308 -121
- package/src/api/FirmwareUpdateV3.ts +265 -58
- package/src/api/FirmwareUpdateV4.ts +881 -349
- package/src/api/device/DeviceUpdateBootloader.ts +125 -6
- package/src/api/firmware/FirmwareArtifactSource.ts +278 -0
- package/src/api/firmware/FirmwareHostBinding.ts +100 -0
- package/src/api/firmware/FirmwarePreparationError.ts +12 -0
- package/src/api/firmware/FirmwareUpdateBaseMethod.ts +72 -1
- package/src/api/firmware/FirmwareUpdateCapabilities.ts +9 -0
- package/src/api/firmware/FirmwareUpdatePlan.ts +772 -0
- package/src/api/firmware/FirmwareUpdatePreparedPlan.ts +449 -0
- package/src/api/firmware/updateBootloader.ts +19 -4
- package/src/api/firmware/uploadFirmware.ts +140 -22
- package/src/data-manager/DataManager.ts +62 -54
- package/src/data-manager/connectSettings.ts +11 -0
- package/src/device/Device.ts +6 -1
- package/src/index.ts +5 -0
- package/src/inject.ts +22 -2
- package/src/lowLevelInject.ts +5 -1
- package/src/topLevelInject.ts +5 -1
- package/src/types/api/checkAllFirmwareRelease.ts +4 -0
- package/src/types/api/deviceUpdateBootloader.ts +6 -0
- package/src/types/api/export.ts +18 -0
- package/src/types/api/firmwareUpdate.ts +75 -0
- package/src/types/api/firmwareUpdateCapabilities.ts +9 -0
- package/src/types/api/firmwareUpdatePlan.ts +38 -0
- package/src/types/api/firmwareUpdatePreparedPlan.ts +53 -0
- package/src/types/api/index.ts +14 -0
- package/src/types/settings.ts +13 -0
- package/src/utils/deviceFeaturesCompat.ts +6 -0
|
@@ -1,6 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
EDeviceType,
|
|
3
|
+
EFirmwareType,
|
|
4
|
+
ERRORS,
|
|
5
|
+
HardwareError,
|
|
6
|
+
HardwareErrorCode,
|
|
7
|
+
} from '@onekeyfe/hd-shared';
|
|
2
8
|
import semver from 'semver';
|
|
3
9
|
|
|
10
|
+
import { BaseMethod } from './BaseMethod';
|
|
4
11
|
import { UI_REQUEST } from '../constants/ui-request';
|
|
5
12
|
import { DataManager } from '../data-manager';
|
|
6
13
|
import {
|
|
@@ -8,13 +15,22 @@ import {
|
|
|
8
15
|
getBootloaderReleaseInfo,
|
|
9
16
|
getFirmwareReleaseInfo,
|
|
10
17
|
} from './firmware/releaseHelper';
|
|
18
|
+
import {
|
|
19
|
+
buildFirmwareUpdatePlan,
|
|
20
|
+
validateFirmwareUpdatePlanForceTargets,
|
|
21
|
+
} from './firmware/FirmwareUpdatePlan';
|
|
11
22
|
import { getBridgeReleaseInfo } from '../utils/bridgeUpdate';
|
|
12
|
-
import { getDeviceFirmwareVersion, getDeviceType, getFirmwareType } from '../utils';
|
|
13
|
-
import { BaseMethod } from './BaseMethod';
|
|
14
23
|
import {
|
|
15
24
|
buildProtocolV2ResourceUpdatePlan,
|
|
16
25
|
readProtocolV2ResourceInventory,
|
|
17
26
|
} from '../protocols/protocol-v2/resources';
|
|
27
|
+
import {
|
|
28
|
+
LoggerNames,
|
|
29
|
+
getDeviceFirmwareVersion,
|
|
30
|
+
getDeviceType,
|
|
31
|
+
getFirmwareType,
|
|
32
|
+
getLogger,
|
|
33
|
+
} from '../utils';
|
|
18
34
|
|
|
19
35
|
import type {
|
|
20
36
|
AllFirmwareRelease,
|
|
@@ -30,6 +46,7 @@ import type {
|
|
|
30
46
|
IProtocolV2FirmwareComponent,
|
|
31
47
|
IProtocolV2FirmwareComponentTarget,
|
|
32
48
|
} from '../types';
|
|
49
|
+
import type { FirmwareUpdatePlan } from '../types/api/firmwareUpdatePlan';
|
|
33
50
|
|
|
34
51
|
const UPDATE_TARGET_BY_COMPONENT_TARGET: Readonly<
|
|
35
52
|
Partial<Record<IProtocolV2FirmwareComponentTarget, FirmwareUpdateV4Target>>
|
|
@@ -266,6 +283,8 @@ export function buildProtocolV2FirmwareRelease({
|
|
|
266
283
|
};
|
|
267
284
|
}
|
|
268
285
|
|
|
286
|
+
const Log = getLogger(LoggerNames.Method);
|
|
287
|
+
|
|
269
288
|
export default class CheckAllFirmwareRelease extends BaseMethod {
|
|
270
289
|
getSupportedProtocols() {
|
|
271
290
|
return ['V1', 'V2'] as const;
|
|
@@ -283,8 +302,13 @@ export default class CheckAllFirmwareRelease extends BaseMethod {
|
|
|
283
302
|
}
|
|
284
303
|
|
|
285
304
|
const { features } = this.device;
|
|
286
|
-
const {
|
|
287
|
-
|
|
305
|
+
const {
|
|
306
|
+
checkBridgeRelease,
|
|
307
|
+
firmwareType: firmwareTypeParams,
|
|
308
|
+
platform,
|
|
309
|
+
forceUpdateTargets,
|
|
310
|
+
} = this.payload as CheckAllFirmwareReleaseParams;
|
|
311
|
+
const validatedForceUpdateTargets = validateFirmwareUpdatePlanForceTargets(forceUpdateTargets);
|
|
288
312
|
|
|
289
313
|
if (!features) {
|
|
290
314
|
return Promise.resolve(null);
|
|
@@ -315,6 +339,32 @@ export default class CheckAllFirmwareRelease extends BaseMethod {
|
|
|
315
339
|
firmwareType,
|
|
316
340
|
});
|
|
317
341
|
const bleFirmwareReleaseInfo = getBleFirmwareReleaseInfo(features);
|
|
342
|
+
let firmwareUpdatePlan: FirmwareUpdatePlan | undefined;
|
|
343
|
+
try {
|
|
344
|
+
firmwareUpdatePlan = buildFirmwareUpdatePlan({
|
|
345
|
+
features,
|
|
346
|
+
firmwareType,
|
|
347
|
+
platform: platform ?? 'web',
|
|
348
|
+
firmware: firmwareRelease,
|
|
349
|
+
ble: bleFirmwareReleaseInfo,
|
|
350
|
+
bootloader: bootloaderRelease,
|
|
351
|
+
forceUpdateTargets: validatedForceUpdateTargets,
|
|
352
|
+
});
|
|
353
|
+
} catch (error) {
|
|
354
|
+
if (
|
|
355
|
+
validatedForceUpdateTargets.length > 0 ||
|
|
356
|
+
!(error instanceof HardwareError) ||
|
|
357
|
+
error.params?.firmwareUpdateCode !== 'FirmwarePlanInvalid'
|
|
358
|
+
) {
|
|
359
|
+
throw error;
|
|
360
|
+
}
|
|
361
|
+
// A Plan is an optional external-host capability. Release checks remain
|
|
362
|
+
// available for legacy and recovery flows when a Plan cannot be built.
|
|
363
|
+
Log.warn(
|
|
364
|
+
'[CheckAllFirmwareRelease] Optional firmware Plan is unavailable; using the legacy release result'
|
|
365
|
+
);
|
|
366
|
+
firmwareUpdatePlan = undefined;
|
|
367
|
+
}
|
|
318
368
|
|
|
319
369
|
return {
|
|
320
370
|
firmware: firmwareRelease,
|
|
@@ -329,7 +379,8 @@ export default class CheckAllFirmwareRelease extends BaseMethod {
|
|
|
329
379
|
}
|
|
330
380
|
: undefined,
|
|
331
381
|
features,
|
|
332
|
-
|
|
382
|
+
firmwareUpdatePlan,
|
|
383
|
+
} as unknown as AllFirmwareRelease;
|
|
333
384
|
}
|
|
334
385
|
|
|
335
386
|
private async runProtocolV2(): Promise<AllFirmwareRelease> {
|
|
@@ -10,6 +10,7 @@ import { UI_REQUEST } from '../constants/ui-request';
|
|
|
10
10
|
import { BaseMethod } from './BaseMethod';
|
|
11
11
|
import { validateParams } from './helpers/paramsValidator';
|
|
12
12
|
import { getBinary } from './firmware/getBinary';
|
|
13
|
+
import { BOOTLOADER_POLL_INITIALIZE_TIMEOUT_MS } from './firmware/FirmwareUpdateBaseMethod';
|
|
13
14
|
import { uploadFirmware } from './firmware/uploadFirmware';
|
|
14
15
|
import { createUiMessage } from '../events';
|
|
15
16
|
import { DeviceModelToTypes, type KnownDevice } from '../types';
|
|
@@ -78,6 +79,10 @@ export default class FirmwareUpdate extends BaseMethod<Params> {
|
|
|
78
79
|
this.checkPromise = createDeferred();
|
|
79
80
|
const env = DataManager.getSettings('env');
|
|
80
81
|
const isBleReconnect = connectId && DataManager.isBleConnect(env);
|
|
82
|
+
// Tracks the in-flight BLE probe so interval ticks never overlap: a superseded
|
|
83
|
+
// Initialize left pending on the V1 transport is exactly what later times out
|
|
84
|
+
// and used to tear down the connection mid-firmware-upload.
|
|
85
|
+
let bleProbeInFlight = false;
|
|
81
86
|
|
|
82
87
|
Log.log('FirmwareUpdate [checkDeviceToBootloader] isBleReconnect: ', isBleReconnect);
|
|
83
88
|
|
|
@@ -85,6 +90,8 @@ export default class FirmwareUpdate extends BaseMethod<Params> {
|
|
|
85
90
|
const intervalTimer: ReturnType<typeof setInterval> | undefined = setInterval(
|
|
86
91
|
async () => {
|
|
87
92
|
if (isBleReconnect) {
|
|
93
|
+
if (bleProbeInFlight) return;
|
|
94
|
+
bleProbeInFlight = true;
|
|
88
95
|
try {
|
|
89
96
|
await this.device.deviceConnector?.acquire(
|
|
90
97
|
this.device.originalDescriptor.id,
|
|
@@ -92,7 +99,10 @@ export default class FirmwareUpdate extends BaseMethod<Params> {
|
|
|
92
99
|
true,
|
|
93
100
|
this.payload.connectProtocol ?? this.device.originalDescriptor.protocolType
|
|
94
101
|
);
|
|
95
|
-
|
|
102
|
+
// Bound each probe so a request the rebooting device never received
|
|
103
|
+
// frees the slot for the next tick instead of hanging into the
|
|
104
|
+
// 30s reboot budget.
|
|
105
|
+
await this.device.initialize({ timeoutMs: BOOTLOADER_POLL_INITIALIZE_TIMEOUT_MS });
|
|
96
106
|
if (this.device.isBootloader()) {
|
|
97
107
|
clearInterval(intervalTimer);
|
|
98
108
|
this.checkPromise?.resolve(true);
|
|
@@ -100,6 +110,8 @@ export default class FirmwareUpdate extends BaseMethod<Params> {
|
|
|
100
110
|
} catch (e) {
|
|
101
111
|
// ignore error because of device is not connected
|
|
102
112
|
Log.log('catch Bluetooth error when device is restarting: ', e);
|
|
113
|
+
} finally {
|
|
114
|
+
bleProbeInFlight = false;
|
|
103
115
|
}
|
|
104
116
|
} else {
|
|
105
117
|
const deviceDiff = await this.device.deviceConnector?.enumerate();
|