@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.
Files changed (111) hide show
  1. package/__tests__/connectSettings.test.ts +45 -5
  2. package/__tests__/device-initialize-timeout.test.ts +56 -0
  3. package/__tests__/firmware-update/check-all-firmware-release.test.ts +175 -0
  4. package/__tests__/firmware-update/device-update-bootloader.test.ts +87 -0
  5. package/__tests__/firmware-update/firmware-artifact-source.test.ts +119 -0
  6. package/__tests__/firmware-update/firmware-host-binding.test.ts +70 -0
  7. package/__tests__/firmware-update/firmware-preparation-error.test.ts +27 -0
  8. package/__tests__/firmware-update/firmware-update-bootloader-poll.test.ts +200 -0
  9. package/__tests__/firmware-update/firmware-update-capabilities.test.ts +13 -0
  10. package/__tests__/firmware-update/firmware-update-plan-bootloader-identity.test.ts +394 -0
  11. package/__tests__/firmware-update/firmware-update-plan.test.ts +593 -0
  12. package/__tests__/firmware-update/firmware-update-prepared-plan.test.ts +231 -0
  13. package/__tests__/firmware-update/firmware-update-v2-download-before-boot.test.ts +86 -31
  14. package/__tests__/firmware-update/firmware-update-v3-reconnect.test.ts +121 -0
  15. package/__tests__/firmware-update/firmware-upload-source.test.ts +70 -0
  16. package/__tests__/protocol-v2.test.ts +405 -100
  17. package/dist/api/CheckAllFirmwareRelease.d.ts.map +1 -1
  18. package/dist/api/FirmwareUpdate.d.ts.map +1 -1
  19. package/dist/api/FirmwareUpdateV2.d.ts +10 -0
  20. package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
  21. package/dist/api/FirmwareUpdateV3.d.ts +7 -3
  22. package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
  23. package/dist/api/FirmwareUpdateV4.d.ts +25 -5
  24. package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
  25. package/dist/api/device/DeviceUpdateBootloader.d.ts +5 -1
  26. package/dist/api/device/DeviceUpdateBootloader.d.ts.map +1 -1
  27. package/dist/api/firmware/FirmwareArtifactSource.d.ts +25 -0
  28. package/dist/api/firmware/FirmwareArtifactSource.d.ts.map +1 -0
  29. package/dist/api/firmware/FirmwareHostBinding.d.ts +6 -0
  30. package/dist/api/firmware/FirmwareHostBinding.d.ts.map +1 -0
  31. package/dist/api/firmware/FirmwarePreparationError.d.ts +3 -0
  32. package/dist/api/firmware/FirmwarePreparationError.d.ts.map +1 -0
  33. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts +8 -0
  34. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts.map +1 -1
  35. package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts +3 -0
  36. package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts.map +1 -0
  37. package/dist/api/firmware/FirmwareUpdatePlan.d.ts +25 -0
  38. package/dist/api/firmware/FirmwareUpdatePlan.d.ts.map +1 -0
  39. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts +32 -0
  40. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts.map +1 -0
  41. package/dist/api/firmware/getBinary.d.ts +7 -0
  42. package/dist/api/firmware/getBinary.d.ts.map +1 -1
  43. package/dist/api/firmware/updateBootloader.d.ts +2 -0
  44. package/dist/api/firmware/updateBootloader.d.ts.map +1 -1
  45. package/dist/api/firmware/uploadFirmware.d.ts +9 -1
  46. package/dist/api/firmware/uploadFirmware.d.ts.map +1 -1
  47. package/dist/api/stellar/StellarSignTransaction.d.ts +1 -1
  48. package/dist/data-manager/DataManager.d.ts +1 -0
  49. package/dist/data-manager/DataManager.d.ts.map +1 -1
  50. package/dist/data-manager/connectSettings.d.ts.map +1 -1
  51. package/dist/device/Device.d.ts +1 -0
  52. package/dist/device/Device.d.ts.map +1 -1
  53. package/dist/index.d.ts +179 -1
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +3088 -1063
  56. package/dist/inject.d.ts.map +1 -1
  57. package/dist/lowLevelInject.d.ts.map +1 -1
  58. package/dist/topLevelInject.d.ts.map +1 -1
  59. package/dist/types/api/checkAllFirmwareRelease.d.ts +4 -0
  60. package/dist/types/api/checkAllFirmwareRelease.d.ts.map +1 -1
  61. package/dist/types/api/deviceUpdateBootloader.d.ts +6 -0
  62. package/dist/types/api/deviceUpdateBootloader.d.ts.map +1 -1
  63. package/dist/types/api/export.d.ts +4 -1
  64. package/dist/types/api/export.d.ts.map +1 -1
  65. package/dist/types/api/firmwareUpdate.d.ts +68 -0
  66. package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
  67. package/dist/types/api/firmwareUpdateCapabilities.d.ts +9 -0
  68. package/dist/types/api/firmwareUpdateCapabilities.d.ts.map +1 -0
  69. package/dist/types/api/firmwareUpdatePlan.d.ts +28 -0
  70. package/dist/types/api/firmwareUpdatePlan.d.ts.map +1 -0
  71. package/dist/types/api/firmwareUpdatePreparedPlan.d.ts +42 -0
  72. package/dist/types/api/firmwareUpdatePreparedPlan.d.ts.map +1 -0
  73. package/dist/types/api/index.d.ts +9 -1
  74. package/dist/types/api/index.d.ts.map +1 -1
  75. package/dist/types/settings.d.ts +13 -0
  76. package/dist/types/settings.d.ts.map +1 -1
  77. package/dist/utils/deviceFeaturesCompat.d.ts +1 -0
  78. package/dist/utils/deviceFeaturesCompat.d.ts.map +1 -1
  79. package/package.json +4 -4
  80. package/src/api/CheckAllFirmwareRelease.ts +57 -6
  81. package/src/api/FirmwareUpdate.ts +13 -1
  82. package/src/api/FirmwareUpdateV2.ts +308 -121
  83. package/src/api/FirmwareUpdateV3.ts +265 -58
  84. package/src/api/FirmwareUpdateV4.ts +881 -349
  85. package/src/api/device/DeviceUpdateBootloader.ts +125 -6
  86. package/src/api/firmware/FirmwareArtifactSource.ts +278 -0
  87. package/src/api/firmware/FirmwareHostBinding.ts +100 -0
  88. package/src/api/firmware/FirmwarePreparationError.ts +12 -0
  89. package/src/api/firmware/FirmwareUpdateBaseMethod.ts +72 -1
  90. package/src/api/firmware/FirmwareUpdateCapabilities.ts +9 -0
  91. package/src/api/firmware/FirmwareUpdatePlan.ts +772 -0
  92. package/src/api/firmware/FirmwareUpdatePreparedPlan.ts +449 -0
  93. package/src/api/firmware/updateBootloader.ts +19 -4
  94. package/src/api/firmware/uploadFirmware.ts +140 -22
  95. package/src/data-manager/DataManager.ts +62 -54
  96. package/src/data-manager/connectSettings.ts +11 -0
  97. package/src/device/Device.ts +6 -1
  98. package/src/index.ts +5 -0
  99. package/src/inject.ts +22 -2
  100. package/src/lowLevelInject.ts +5 -1
  101. package/src/topLevelInject.ts +5 -1
  102. package/src/types/api/checkAllFirmwareRelease.ts +4 -0
  103. package/src/types/api/deviceUpdateBootloader.ts +6 -0
  104. package/src/types/api/export.ts +18 -0
  105. package/src/types/api/firmwareUpdate.ts +75 -0
  106. package/src/types/api/firmwareUpdateCapabilities.ts +9 -0
  107. package/src/types/api/firmwareUpdatePlan.ts +38 -0
  108. package/src/types/api/firmwareUpdatePreparedPlan.ts +53 -0
  109. package/src/types/api/index.ts +14 -0
  110. package/src/types/settings.ts +13 -0
  111. package/src/utils/deviceFeaturesCompat.ts +6 -0
@@ -1,6 +1,13 @@
1
- import { EDeviceType, EFirmwareType, ERRORS, HardwareErrorCode } from '@onekeyfe/hd-shared';
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 { checkBridgeRelease, firmwareType: firmwareTypeParams } = this
287
- .payload as CheckAllFirmwareReleaseParams;
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
- } as AllFirmwareRelease;
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
- await this.device.initialize();
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();