@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.
- package/__tests__/check-all-firmware-release-protocol-v2.test.ts +411 -86
- package/__tests__/check-firmware-release-protocol-v2.test.ts +199 -0
- package/__tests__/firmware-memory-host.test.ts +126 -0
- package/__tests__/firmware-update/device-update-bootloader.test.ts +14 -2
- package/__tests__/firmware-update/firmware-host-binding.test.ts +9 -0
- package/__tests__/firmware-update/firmware-prepared-host-digest.test.ts +573 -0
- package/__tests__/firmware-update/firmware-prepared-resource-archive.test.ts +150 -0
- package/__tests__/firmware-update/firmware-update-bootloader-poll.test.ts +65 -2
- package/__tests__/firmware-update/firmware-update-plan-bootloader-identity.test.ts +80 -0
- package/__tests__/firmware-update/firmware-update-plan.test.ts +293 -71
- package/__tests__/firmware-update/firmware-update-prepared-plan.test.ts +53 -1
- package/__tests__/firmware-update/firmware-update-prepared-resource-executors.test.ts +326 -0
- package/__tests__/firmware-update/firmware-update-v2-download-before-boot.test.ts +2 -2
- package/__tests__/protocol-v2-firmware-targets.test.ts +16 -0
- package/__tests__/protocol-v2-resources.test.ts +148 -232
- package/__tests__/protocol-v2.test.ts +1326 -510
- package/dist/api/CheckAllFirmwareRelease.d.ts +2 -3
- package/dist/api/CheckAllFirmwareRelease.d.ts.map +1 -1
- package/dist/api/CheckBLEFirmwareRelease.d.ts +3 -2
- package/dist/api/CheckBLEFirmwareRelease.d.ts.map +1 -1
- package/dist/api/CheckBootloaderRelease.d.ts +2 -1
- package/dist/api/CheckBootloaderRelease.d.ts.map +1 -1
- package/dist/api/CheckFirmwareRelease.d.ts +3 -2
- package/dist/api/CheckFirmwareRelease.d.ts.map +1 -1
- package/dist/api/FirmwareUpdateV2.d.ts +1 -0
- package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
- package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
- package/dist/api/FirmwareUpdateV4.d.ts +11 -9
- package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
- package/dist/api/UploadPortfolio.d.ts.map +1 -1
- package/dist/api/device/DeviceUpdateBootloader.d.ts.map +1 -1
- package/dist/api/firmware/FirmwareHostBinding.d.ts +1 -1
- package/dist/api/firmware/FirmwareHostBinding.d.ts.map +1 -1
- package/dist/api/firmware/FirmwareMemoryHost.d.ts +22 -0
- package/dist/api/firmware/FirmwareMemoryHost.d.ts.map +1 -0
- package/dist/api/firmware/FirmwarePreparedResourceArchive.d.ts +11 -0
- package/dist/api/firmware/FirmwarePreparedResourceArchive.d.ts.map +1 -0
- package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts.map +1 -1
- package/dist/api/firmware/FirmwareUpdatePlan.d.ts +48 -1
- package/dist/api/firmware/FirmwareUpdatePlan.d.ts.map +1 -1
- package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts +7 -1
- package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts.map +1 -1
- package/dist/api/firmware/getBinary.d.ts +0 -1
- package/dist/api/firmware/getBinary.d.ts.map +1 -1
- package/dist/api/firmware/protocolV2Release.d.ts +33 -0
- package/dist/api/firmware/protocolV2Release.d.ts.map +1 -0
- package/dist/data-manager/DataManager.d.ts +4 -3
- package/dist/data-manager/DataManager.d.ts.map +1 -1
- package/dist/index.d.ts +108 -114
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1825 -1006
- package/dist/protocols/protocol-v2/resources.d.ts +10 -28
- package/dist/protocols/protocol-v2/resources.d.ts.map +1 -1
- package/dist/types/api/checkAllFirmwareRelease.d.ts +20 -8
- package/dist/types/api/checkAllFirmwareRelease.d.ts.map +1 -1
- package/dist/types/api/checkBLEFirmwareRelease.d.ts +2 -13
- package/dist/types/api/checkBLEFirmwareRelease.d.ts.map +1 -1
- package/dist/types/api/checkBootloaderRelease.d.ts +2 -6
- package/dist/types/api/checkBootloaderRelease.d.ts.map +1 -1
- package/dist/types/api/checkFirmwareRelease.d.ts +2 -13
- package/dist/types/api/checkFirmwareRelease.d.ts.map +1 -1
- package/dist/types/api/checkFirmwareTypeAvailable.d.ts +2 -2
- package/dist/types/api/checkFirmwareTypeAvailable.d.ts.map +1 -1
- package/dist/types/api/deviceUpdateBootloader.d.ts.map +1 -1
- package/dist/types/api/export.d.ts +1 -1
- package/dist/types/api/export.d.ts.map +1 -1
- package/dist/types/api/firmwareUpdate.d.ts +4 -12
- package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
- package/dist/types/api/firmwareUpdatePlan.d.ts +2 -2
- package/dist/types/api/firmwareUpdatePlan.d.ts.map +1 -1
- package/dist/types/settings.d.ts +35 -36
- package/dist/types/settings.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/api/CheckAllFirmwareRelease.ts +113 -80
- package/src/api/CheckBLEFirmwareRelease.ts +37 -5
- package/src/api/CheckBootloaderRelease.ts +35 -3
- package/src/api/CheckFirmwareRelease.ts +35 -7
- package/src/api/FirmwareUpdateV2.ts +231 -138
- package/src/api/FirmwareUpdateV3.ts +101 -56
- package/src/api/FirmwareUpdateV4.ts +936 -408
- package/src/api/UploadPortfolio.ts +18 -0
- package/src/api/device/DeviceUpdateBootloader.ts +37 -11
- package/src/api/firmware/FirmwareHostBinding.ts +26 -3
- package/src/api/firmware/FirmwareMemoryHost.ts +143 -0
- package/src/api/firmware/FirmwarePreparedResourceArchive.ts +207 -0
- package/src/api/firmware/FirmwareUpdateBaseMethod.ts +122 -73
- package/src/api/firmware/FirmwareUpdatePlan.ts +295 -122
- package/src/api/firmware/FirmwareUpdatePreparedPlan.ts +49 -12
- package/src/api/firmware/protocolV2Release.ts +168 -0
- package/src/data-manager/DataManager.ts +35 -19
- package/src/index.ts +10 -0
- package/src/protocols/protocol-v2/resources.ts +157 -341
- package/src/types/api/checkAllFirmwareRelease.ts +27 -12
- package/src/types/api/checkBLEFirmwareRelease.ts +4 -13
- package/src/types/api/checkBootloaderRelease.ts +2 -6
- package/src/types/api/checkFirmwareRelease.ts +2 -13
- package/src/types/api/checkFirmwareTypeAvailable.ts +2 -2
- package/src/types/api/deviceUpdateBootloader.ts +1 -0
- package/src/types/api/export.ts +6 -1
- package/src/types/api/firmwareUpdate.ts +12 -17
- package/src/types/api/firmwareUpdatePlan.ts +2 -2
- package/src/types/settings.ts +35 -61
- 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
|
-
|
|
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
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
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
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
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
|
-
|
|
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
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
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
|
-
}
|
|
243
|
-
|
|
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
|
-
|
|
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
|
-
}
|
|
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(
|