@onekeyfe/hd-core 1.2.0-alpha.97 → 1.2.0-alpha.99

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 (103) hide show
  1. package/__tests__/check-all-firmware-release-protocol-v2.test.ts +411 -86
  2. package/__tests__/check-firmware-release-protocol-v2.test.ts +199 -0
  3. package/__tests__/firmware-memory-host.test.ts +126 -0
  4. package/__tests__/firmware-update/device-update-bootloader.test.ts +14 -2
  5. package/__tests__/firmware-update/firmware-host-binding.test.ts +9 -0
  6. package/__tests__/firmware-update/firmware-prepared-host-digest.test.ts +573 -0
  7. package/__tests__/firmware-update/firmware-prepared-resource-archive.test.ts +150 -0
  8. package/__tests__/firmware-update/firmware-update-bootloader-poll.test.ts +65 -2
  9. package/__tests__/firmware-update/firmware-update-plan-bootloader-identity.test.ts +80 -0
  10. package/__tests__/firmware-update/firmware-update-plan.test.ts +293 -71
  11. package/__tests__/firmware-update/firmware-update-prepared-plan.test.ts +53 -1
  12. package/__tests__/firmware-update/firmware-update-prepared-resource-executors.test.ts +326 -0
  13. package/__tests__/firmware-update/firmware-update-v2-download-before-boot.test.ts +2 -2
  14. package/__tests__/protocol-v2-firmware-targets.test.ts +16 -0
  15. package/__tests__/protocol-v2-resources.test.ts +148 -232
  16. package/__tests__/protocol-v2.test.ts +1326 -510
  17. package/dist/api/CheckAllFirmwareRelease.d.ts +2 -3
  18. package/dist/api/CheckAllFirmwareRelease.d.ts.map +1 -1
  19. package/dist/api/CheckBLEFirmwareRelease.d.ts +3 -2
  20. package/dist/api/CheckBLEFirmwareRelease.d.ts.map +1 -1
  21. package/dist/api/CheckBootloaderRelease.d.ts +2 -1
  22. package/dist/api/CheckBootloaderRelease.d.ts.map +1 -1
  23. package/dist/api/CheckFirmwareRelease.d.ts +3 -2
  24. package/dist/api/CheckFirmwareRelease.d.ts.map +1 -1
  25. package/dist/api/FirmwareUpdateV2.d.ts +1 -0
  26. package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
  27. package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
  28. package/dist/api/FirmwareUpdateV4.d.ts +11 -9
  29. package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
  30. package/dist/api/UploadPortfolio.d.ts.map +1 -1
  31. package/dist/api/device/DeviceUpdateBootloader.d.ts.map +1 -1
  32. package/dist/api/firmware/FirmwareHostBinding.d.ts +1 -1
  33. package/dist/api/firmware/FirmwareHostBinding.d.ts.map +1 -1
  34. package/dist/api/firmware/FirmwareMemoryHost.d.ts +22 -0
  35. package/dist/api/firmware/FirmwareMemoryHost.d.ts.map +1 -0
  36. package/dist/api/firmware/FirmwarePreparedResourceArchive.d.ts +11 -0
  37. package/dist/api/firmware/FirmwarePreparedResourceArchive.d.ts.map +1 -0
  38. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts.map +1 -1
  39. package/dist/api/firmware/FirmwareUpdatePlan.d.ts +48 -1
  40. package/dist/api/firmware/FirmwareUpdatePlan.d.ts.map +1 -1
  41. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts +7 -1
  42. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts.map +1 -1
  43. package/dist/api/firmware/getBinary.d.ts +0 -1
  44. package/dist/api/firmware/getBinary.d.ts.map +1 -1
  45. package/dist/api/firmware/protocolV2Release.d.ts +33 -0
  46. package/dist/api/firmware/protocolV2Release.d.ts.map +1 -0
  47. package/dist/data-manager/DataManager.d.ts +4 -3
  48. package/dist/data-manager/DataManager.d.ts.map +1 -1
  49. package/dist/index.d.ts +108 -114
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +1825 -1006
  52. package/dist/protocols/protocol-v2/resources.d.ts +10 -28
  53. package/dist/protocols/protocol-v2/resources.d.ts.map +1 -1
  54. package/dist/types/api/checkAllFirmwareRelease.d.ts +20 -8
  55. package/dist/types/api/checkAllFirmwareRelease.d.ts.map +1 -1
  56. package/dist/types/api/checkBLEFirmwareRelease.d.ts +2 -13
  57. package/dist/types/api/checkBLEFirmwareRelease.d.ts.map +1 -1
  58. package/dist/types/api/checkBootloaderRelease.d.ts +2 -6
  59. package/dist/types/api/checkBootloaderRelease.d.ts.map +1 -1
  60. package/dist/types/api/checkFirmwareRelease.d.ts +2 -13
  61. package/dist/types/api/checkFirmwareRelease.d.ts.map +1 -1
  62. package/dist/types/api/checkFirmwareTypeAvailable.d.ts +2 -2
  63. package/dist/types/api/checkFirmwareTypeAvailable.d.ts.map +1 -1
  64. package/dist/types/api/deviceUpdateBootloader.d.ts.map +1 -1
  65. package/dist/types/api/export.d.ts +1 -1
  66. package/dist/types/api/export.d.ts.map +1 -1
  67. package/dist/types/api/firmwareUpdate.d.ts +4 -12
  68. package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
  69. package/dist/types/api/firmwareUpdatePlan.d.ts +2 -2
  70. package/dist/types/api/firmwareUpdatePlan.d.ts.map +1 -1
  71. package/dist/types/settings.d.ts +35 -36
  72. package/dist/types/settings.d.ts.map +1 -1
  73. package/package.json +4 -4
  74. package/src/api/CheckAllFirmwareRelease.ts +113 -80
  75. package/src/api/CheckBLEFirmwareRelease.ts +37 -5
  76. package/src/api/CheckBootloaderRelease.ts +35 -3
  77. package/src/api/CheckFirmwareRelease.ts +35 -7
  78. package/src/api/FirmwareUpdateV2.ts +231 -138
  79. package/src/api/FirmwareUpdateV3.ts +101 -56
  80. package/src/api/FirmwareUpdateV4.ts +936 -408
  81. package/src/api/UploadPortfolio.ts +18 -0
  82. package/src/api/device/DeviceUpdateBootloader.ts +37 -11
  83. package/src/api/firmware/FirmwareHostBinding.ts +26 -3
  84. package/src/api/firmware/FirmwareMemoryHost.ts +143 -0
  85. package/src/api/firmware/FirmwarePreparedResourceArchive.ts +207 -0
  86. package/src/api/firmware/FirmwareUpdateBaseMethod.ts +122 -73
  87. package/src/api/firmware/FirmwareUpdatePlan.ts +295 -122
  88. package/src/api/firmware/FirmwareUpdatePreparedPlan.ts +49 -12
  89. package/src/api/firmware/protocolV2Release.ts +168 -0
  90. package/src/data-manager/DataManager.ts +35 -19
  91. package/src/index.ts +10 -0
  92. package/src/protocols/protocol-v2/resources.ts +157 -341
  93. package/src/types/api/checkAllFirmwareRelease.ts +27 -12
  94. package/src/types/api/checkBLEFirmwareRelease.ts +4 -13
  95. package/src/types/api/checkBootloaderRelease.ts +2 -6
  96. package/src/types/api/checkFirmwareRelease.ts +2 -13
  97. package/src/types/api/checkFirmwareTypeAvailable.ts +2 -2
  98. package/src/types/api/deviceUpdateBootloader.ts +1 -0
  99. package/src/types/api/export.ts +6 -1
  100. package/src/types/api/firmwareUpdate.ts +12 -17
  101. package/src/types/api/firmwareUpdatePlan.ts +2 -2
  102. package/src/types/settings.ts +35 -61
  103. package/src/utils/deviceFeaturesUtils.ts +2 -2
@@ -167,92 +167,141 @@ export class FirmwareUpdateBaseMethod<Params> extends BaseMethod<Params> {
167
167
  let checkCount = 0;
168
168
  let hasPromptedWebDevice = false;
169
169
  let isPromptingWebDevice = false;
170
- // eslint-disable-next-line prefer-const
170
+ let isFinished = false;
171
+ let intervalTimer: ReturnType<typeof setInterval> | undefined;
171
172
  let timeoutTimer: ReturnType<typeof setTimeout> | undefined;
172
173
 
173
174
  const isTouchOrProDevice =
174
175
  this?.device?.getCurrentDeviceType() === EDeviceType.Touch ||
175
176
  this?.device?.getCurrentDeviceType() === EDeviceType.Pro;
176
177
 
177
- const intervalTimer: ReturnType<typeof setInterval> | undefined = setInterval(
178
- async () => {
179
- checkCount += 1;
180
- Log.log('FirmwareUpdateBaseMethod [checkDeviceToBootloader] isFirstCheck: ', isFirstCheck);
181
- if (isTouchOrProDevice && isFirstCheck) {
182
- isFirstCheck = false;
183
- Log.log('FirmwareUpdateBaseMethod [checkDeviceToBootloader] wait 3000ms');
184
- await wait(3000);
185
- }
178
+ const clearPollingTimers = () => {
179
+ if (intervalTimer !== undefined) {
180
+ clearInterval(intervalTimer);
181
+ intervalTimer = undefined;
182
+ }
183
+ if (timeoutTimer !== undefined) {
184
+ clearTimeout(timeoutTimer);
185
+ timeoutTimer = undefined;
186
+ }
187
+ };
186
188
 
187
- if (
188
- checkCount > 4 &&
189
- DataManager.isBrowserWebUsb(DataManager.getSettings('env')) &&
190
- !this.payload.skipWebDevicePrompt &&
191
- !hasPromptedWebDevice &&
192
- !isPromptingWebDevice
193
- ) {
194
- clearInterval(intervalTimer);
195
- clearTimeout(timeoutTimer);
196
- isPromptingWebDevice = true;
197
- try {
198
- this.postTipMessage(FirmwareUpdateTipMessage.SelectDeviceInBootloaderForWebDevice);
199
- const confirmed = await this._promptDeviceInBootloaderForWebDevice();
200
- hasPromptedWebDevice = true;
201
- if (confirmed) {
202
- await this._checkDeviceInBootloaderMode(connectId, intervalTimer, timeoutTimer);
203
- }
204
- } catch (e) {
205
- clearInterval(intervalTimer);
206
- clearTimeout(timeoutTimer);
207
- Log.log(
208
- 'FirmwareUpdateBaseMethod [checkDeviceToBootloader] _promptDeviceInBootloaderForWebDevice failed: ',
209
- e
210
- );
211
- this.checkPromise?.reject(e);
212
- } finally {
213
- isPromptingWebDevice = false;
189
+ const checkForBootloader = async (clearActiveTimers: boolean) => {
190
+ const found = await this._checkDeviceInBootloaderMode(
191
+ connectId,
192
+ clearActiveTimers ? intervalTimer : undefined,
193
+ clearActiveTimers ? timeoutTimer : undefined
194
+ );
195
+ if (found) {
196
+ isFinished = true;
197
+ clearPollingTimers();
198
+ }
199
+ return found;
200
+ };
201
+
202
+ let startPolling: () => void = () => undefined;
203
+ const pollForBootloader = async () => {
204
+ if (isFinished || isPromptingWebDevice) return;
205
+ checkCount += 1;
206
+ Log.log('FirmwareUpdateBaseMethod [checkDeviceToBootloader] isFirstCheck: ', isFirstCheck);
207
+ if (isTouchOrProDevice && isFirstCheck) {
208
+ isFirstCheck = false;
209
+ Log.log('FirmwareUpdateBaseMethod [checkDeviceToBootloader] wait 3000ms');
210
+ await wait(3000);
211
+ }
212
+
213
+ if (
214
+ checkCount > 4 &&
215
+ DataManager.isBrowserWebUsb(DataManager.getSettings('env')) &&
216
+ !this.payload.skipWebDevicePrompt &&
217
+ !hasPromptedWebDevice &&
218
+ !isPromptingWebDevice
219
+ ) {
220
+ clearPollingTimers();
221
+ isPromptingWebDevice = true;
222
+ try {
223
+ this.postTipMessage(FirmwareUpdateTipMessage.SelectDeviceInBootloaderForWebDevice);
224
+ const confirmed = await this._promptDeviceInBootloaderForWebDevice();
225
+ hasPromptedWebDevice = true;
226
+ if (confirmed) {
227
+ await checkForBootloader(false);
228
+ }
229
+ // WebUSB enumeration can still be empty immediately after the chooser
230
+ // resolves. Resume a fresh bounded polling window instead of leaving the
231
+ // deferred check pending forever after the original timers were paused.
232
+ if (!isFinished) {
233
+ startPolling();
214
234
  }
215
- return;
235
+ } catch (e) {
236
+ isFinished = true;
237
+ clearPollingTimers();
238
+ Log.log(
239
+ 'FirmwareUpdateBaseMethod [checkDeviceToBootloader] _promptDeviceInBootloaderForWebDevice failed: ',
240
+ e
241
+ );
242
+ this.checkPromise?.reject(e);
243
+ } finally {
244
+ isPromptingWebDevice = false;
216
245
  }
246
+ return;
247
+ }
217
248
 
218
- if (isBleReconnect) {
219
- if (bleProbeInFlight) return;
220
- bleProbeInFlight = true;
221
- try {
222
- await this.device.deviceConnector?.acquire(
223
- this.device.originalDescriptor.id,
224
- null,
225
- true,
226
- this.payload.connectProtocol ?? this.device.originalDescriptor.protocolType
227
- );
228
- // Bound each probe so a request the rebooting device never received
229
- // frees the slot for the next tick instead of hanging into the
230
- // 30s reboot budget.
231
- await this.device.initialize({ timeoutMs: BOOTLOADER_POLL_INITIALIZE_TIMEOUT_MS });
232
- if (this.device.isBootloader()) {
233
- clearInterval(intervalTimer);
234
- this.checkPromise?.resolve(true);
235
- }
236
- } catch (e) {
237
- // ignore error because of device is not connected
238
- Log.log('catch Bluetooth error when device is restarting: ', e);
239
- } finally {
240
- bleProbeInFlight = false;
249
+ if (isBleReconnect) {
250
+ if (bleProbeInFlight) return;
251
+ bleProbeInFlight = true;
252
+ try {
253
+ await this.device.deviceConnector?.acquire(
254
+ this.device.originalDescriptor.id,
255
+ null,
256
+ true,
257
+ this.payload.connectProtocol ?? this.device.originalDescriptor.protocolType
258
+ );
259
+ // Bound each probe so a request the rebooting device never received
260
+ // frees the slot for the next tick instead of hanging into the
261
+ // 30s reboot budget.
262
+ await this.device.initialize({ timeoutMs: BOOTLOADER_POLL_INITIALIZE_TIMEOUT_MS });
263
+ if (this.device.isBootloader()) {
264
+ isFinished = true;
265
+ clearPollingTimers();
266
+ this.checkPromise?.resolve(true);
241
267
  }
242
- } else {
243
- await this._checkDeviceInBootloaderMode(connectId, intervalTimer, timeoutTimer);
268
+ } catch (e) {
269
+ // ignore error because of device is not connected
270
+ Log.log('catch Bluetooth error when device is restarting: ', e);
271
+ } finally {
272
+ bleProbeInFlight = false;
244
273
  }
245
- },
246
- isBleReconnect ? 3000 : 2000
247
- );
248
-
249
- // check goto bootloader mode timeout and throw error
250
- timeoutTimer = setTimeout(() => {
251
- if (this.checkPromise) {
252
- clearInterval(intervalTimer);
253
- this.checkPromise.reject(new Error());
274
+ } else {
275
+ await checkForBootloader(true);
254
276
  }
255
- }, 30000);
277
+ };
278
+
279
+ startPolling = () => {
280
+ if (isFinished) return;
281
+ clearPollingTimers();
282
+ intervalTimer = setInterval(
283
+ () => {
284
+ pollForBootloader().catch(error => {
285
+ if (isFinished) return;
286
+ isFinished = true;
287
+ clearPollingTimers();
288
+ this.checkPromise?.reject(error);
289
+ });
290
+ },
291
+ isBleReconnect ? 3000 : 2000
292
+ );
293
+ // Each automatic polling phase is bounded. Time spent in the browser's
294
+ // permission chooser is intentionally excluded from this deadline.
295
+ timeoutTimer = setTimeout(() => {
296
+ if (!isFinished && this.checkPromise) {
297
+ isFinished = true;
298
+ clearPollingTimers();
299
+ this.checkPromise.reject(new Error());
300
+ }
301
+ }, 30000);
302
+ };
303
+
304
+ startPolling();
256
305
  }
257
306
 
258
307
  private async _checkDeviceInBootloaderMode(