@onekeyfe/hd-core 1.2.8-alpha.116 → 1.2.8-alpha.118

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.
@@ -3,21 +3,16 @@ import { LoggerNames, enableLog, getLogger } from '../src/utils/logger';
3
3
  describe('logger', () => {
4
4
  afterEach(() => {
5
5
  enableLog(false);
6
+ jest.restoreAllMocks();
6
7
  });
7
8
 
8
9
  test('enables method logs that share a prefix with common-connect-sdk', () => {
9
10
  const consoleSpy = jest.spyOn(console, 'log').mockImplementation(() => undefined);
10
- try {
11
- enableLog(true);
12
- getLogger(LoggerNames.Method).debug('[FirmwareUpdateV4] BLE FileWrite window');
11
+ enableLog(true);
13
12
 
14
- expect(getLogger(LoggerNames.Method)).toBe(getLogger(LoggerNames.HdCommonConnectSdk));
15
- expect(consoleSpy).toHaveBeenCalledWith(
16
- LoggerNames.Method,
17
- '[FirmwareUpdateV4] BLE FileWrite window'
18
- );
19
- } finally {
20
- consoleSpy.mockRestore();
21
- }
13
+ expect(getLogger(LoggerNames.Method)).toBe(getLogger(LoggerNames.HdCommonConnectSdk));
14
+ getLogger(LoggerNames.Method).debug('shared prefix message');
15
+
16
+ expect(consoleSpy).toHaveBeenCalledWith(LoggerNames.Method, 'shared prefix message');
22
17
  });
23
18
  });
@@ -8884,13 +8884,163 @@ describe('Protocol V2 firmware update targets', () => {
8884
8884
  expect((method as any).protocolV2SourceUpdateProcess).not.toHaveBeenCalled();
8885
8885
  });
8886
8886
 
8887
+ describe('RESC header check link recovery', () => {
8888
+ const currentHeader = {
8889
+ version: [1, 0, 0],
8890
+ payloadHash: '11'.repeat(64),
8891
+ headerHash: '22'.repeat(64),
8892
+ };
8893
+ const linkLost = () =>
8894
+ ERRORS.TypedError(
8895
+ HardwareErrorCode.RuntimeError,
8896
+ 'Device protocol has not been detected for AA:BB'
8897
+ );
8898
+ const createResource = (name: string) => ({
8899
+ name,
8900
+ source: { size: 3, readAt: jest.fn(), close: jest.fn() },
8901
+ devicePath: `vol0:/bundles/${name}`,
8902
+ ...currentHeader,
8903
+ });
8904
+ const createMethod = () => {
8905
+ const method = new FirmwareUpdateV4({
8906
+ id: 1,
8907
+ payload: {
8908
+ method: 'firmwareUpdateV4',
8909
+ },
8910
+ });
8911
+ method.postTipMessage = jest.fn();
8912
+ method.postProgressMessage = jest.fn();
8913
+ (method as any).protocolV2SourceUpdateProcess = jest.fn(
8914
+ ({ processedSize }: { processedSize: number }) => Promise.resolve(processedSize + 3)
8915
+ );
8916
+ (method as any).verifyProtocolV2StagedFile = jest.fn().mockResolvedValue(undefined);
8917
+ (method as any).recoverProtocolV2FileTransfer = jest.fn().mockResolvedValue(undefined);
8918
+ return method;
8919
+ };
8920
+
8921
+ test('reconnects and asks again when the link drops during a header check', async () => {
8922
+ const method = createMethod();
8923
+ (method as any).readProtocolV2DeviceFileHeader = jest
8924
+ .fn()
8925
+ .mockRejectedValueOnce(linkLost())
8926
+ .mockResolvedValue(currentHeader);
8927
+
8928
+ await (method as any).executeProtocolV2TransferPhase({
8929
+ installSources: [],
8930
+ resourceSources: [createResource('images.okpkg'), createResource('fonts.okpkg')],
8931
+ });
8932
+
8933
+ expect((method as any).recoverProtocolV2FileTransfer).toHaveBeenCalledTimes(1);
8934
+ expect((method as any).readProtocolV2DeviceFileHeader).toHaveBeenCalledTimes(3);
8935
+ expect((method as any).protocolV2SourceUpdateProcess).not.toHaveBeenCalled();
8936
+ });
8937
+
8938
+ test.each([
8939
+ ['BLE disconnect', () => ERRORS.TypedError(HardwareErrorCode.BleDeviceDisconnected)],
8940
+ ['BLE timeout', () => ERRORS.TypedError(HardwareErrorCode.BleTimeoutError)],
8941
+ [
8942
+ 'invalidated Protocol V2 link',
8943
+ () =>
8944
+ Object.assign(new Error('Protocol V2 link generation changed'), {
8945
+ name: 'ProtocolV2LinkError',
8946
+ code: 'generation',
8947
+ }),
8948
+ ],
8949
+ [
8950
+ 'released React Native BLE transport',
8951
+ () => new Error('React Native BLE transport released'),
8952
+ ],
8953
+ ['released Electron BLE transport', () => new Error('Electron BLE transport released')],
8954
+ ['cleaned Electron BLE state', () => new Error('Electron BLE device state cleaned')],
8955
+ [
8956
+ 'Electron BLE device that is no longer connected',
8957
+ () => ERRORS.TypedError(HardwareErrorCode.TransportNotFound, 'Device AA:BB not connected'),
8958
+ ],
8959
+ ])('rethrows a %s from the header check for recovery', async (_label, createError) => {
8960
+ const method = createMethod();
8961
+ const error = createError();
8962
+ (method as any).readProtocolV2DeviceFileHeader = jest.fn().mockRejectedValue(error);
8963
+
8964
+ await expect(
8965
+ (method as any).isProtocolV2ResourceBundleUpToDate(createResource('images.okpkg'))
8966
+ ).rejects.toBe(error);
8967
+ });
8968
+
8969
+ test('treats a device-side header read failure as stale without reconnecting', async () => {
8970
+ const method = createMethod();
8971
+ (method as any).readProtocolV2DeviceFileHeader = jest
8972
+ .fn()
8973
+ .mockRejectedValue(ERRORS.TypedError(HardwareErrorCode.RuntimeError, 'Failure: busy'));
8974
+
8975
+ await (method as any).executeProtocolV2TransferPhase({
8976
+ installSources: [],
8977
+ resourceSources: [createResource('images.okpkg')],
8978
+ });
8979
+
8980
+ expect((method as any).recoverProtocolV2FileTransfer).not.toHaveBeenCalled();
8981
+ expect((method as any).protocolV2SourceUpdateProcess).toHaveBeenCalledTimes(1);
8982
+ });
8983
+
8984
+ test('limits header-check reconnects per transfer phase', async () => {
8985
+ const method = createMethod();
8986
+ (method as any).readProtocolV2DeviceFileHeader = jest.fn().mockRejectedValue(linkLost());
8987
+
8988
+ await (method as any).executeProtocolV2TransferPhase({
8989
+ installSources: [],
8990
+ resourceSources: ['a.okpkg', 'b.okpkg', 'c.okpkg'].map(createResource),
8991
+ });
8992
+
8993
+ expect((method as any).recoverProtocolV2FileTransfer).toHaveBeenCalledTimes(2);
8994
+ expect((method as any).protocolV2SourceUpdateProcess).toHaveBeenCalledTimes(3);
8995
+ });
8996
+
8997
+ test('resends without further reconnects when the header-check reconnect fails', async () => {
8998
+ const method = createMethod();
8999
+ (method as any).readProtocolV2DeviceFileHeader = jest.fn().mockRejectedValue(linkLost());
9000
+ (method as any).recoverProtocolV2FileTransfer = jest
9001
+ .fn()
9002
+ .mockRejectedValue(ERRORS.TypedError(HardwareErrorCode.DeviceNotFound));
9003
+
9004
+ await (method as any).executeProtocolV2TransferPhase({
9005
+ installSources: [],
9006
+ resourceSources: [createResource('images.okpkg'), createResource('fonts.okpkg')],
9007
+ });
9008
+
9009
+ expect((method as any).recoverProtocolV2FileTransfer).toHaveBeenCalledTimes(1);
9010
+ expect((method as any).protocolV2SourceUpdateProcess).toHaveBeenCalledTimes(2);
9011
+ });
9012
+
9013
+ test.each(['mismatch: expected A, received B', 'unavailable: expected path A'])(
9014
+ 'aborts instead of resending when the reconnected device identity is %s',
9015
+ async identityFailure => {
9016
+ const method = createMethod();
9017
+ (method as any).readProtocolV2DeviceFileHeader = jest.fn().mockRejectedValue(linkLost());
9018
+ (method as any).recoverProtocolV2FileTransfer = jest
9019
+ .fn()
9020
+ .mockRejectedValue(
9021
+ ERRORS.TypedError(
9022
+ HardwareErrorCode.DeviceNotFound,
9023
+ `Protocol V2 reconnect physical identity ${identityFailure}`
9024
+ )
9025
+ );
9026
+
9027
+ await expect(
9028
+ (method as any).executeProtocolV2TransferPhase({
9029
+ installSources: [],
9030
+ resourceSources: [createResource('images.okpkg')],
9031
+ })
9032
+ ).rejects.toMatchObject({ errorCode: HardwareErrorCode.DeviceNotFound });
9033
+ expect((method as any).protocolV2SourceUpdateProcess).not.toHaveBeenCalled();
9034
+ }
9035
+ );
9036
+ });
9037
+
8887
9038
  test.each([
8888
9039
  ['1.0.3', '1.0.3', true],
8889
9040
  ['1.0.10', '1.0.3', true],
8890
9041
  ['1.0.2', '1.0.3', false],
8891
9042
  ['0.0.0.1', '1.0.3', false],
8892
- ['1.0.2', undefined, true],
8893
- ['1.0.1', undefined, false],
9043
+ ['1.0.3', '', false],
8894
9044
  ] as const)(
8895
9045
  'gates the BLE file write window on bootloader %s with minimum %s',
8896
9046
  (bootloaderVersion, minBootloaderVersion, expected) => {
@@ -8900,6 +9050,11 @@ describe('Protocol V2 firmware update targets', () => {
8900
9050
  }
8901
9051
  );
8902
9052
 
9053
+ test('defaults the BLE file write window to the 1.0.2 bootloader minimum', () => {
9054
+ expect(supportsProtocolV2BleFileWriteWindow('1.0.2')).toBe(true);
9055
+ expect(supportsProtocolV2BleFileWriteWindow('1.0.1')).toBe(false);
9056
+ });
9057
+
8903
9058
  test.each([
8904
9059
  ['react-native', 'bootloader', true],
8905
9060
  ['desktop-web-ble', 'bootloader', true],
@@ -9000,14 +9155,12 @@ describe('Protocol V2 firmware update targets', () => {
9000
9155
  expect(requests.map(request => request.file.data.byteLength)).toEqual([1000, 1000, 500]);
9001
9156
  expect(requests.map(request => request.overwrite)).toEqual([true, false, false]);
9002
9157
  expect(requests.map(request => request.ui_percentage)).toEqual([50, 84, 99]);
9003
- expect(
9004
- requests.every(
9005
- request =>
9006
- request.append === false &&
9007
- request.file.total_size === 2500 &&
9008
- request.file.path === 'vol0:/application_p1.bin'
9009
- )
9010
- ).toBe(true);
9158
+ requests.forEach(request =>
9159
+ expect(request).toMatchObject({
9160
+ append: false,
9161
+ file: { total_size: 2500, path: 'vol0:/application_p1.bin' },
9162
+ })
9163
+ );
9011
9164
  const transferredBytes = (method.postProgressMessage as jest.Mock).mock.calls.map(
9012
9165
  ([, , metrics]) => metrics.transferredBytes
9013
9166
  );
@@ -9026,21 +9179,21 @@ describe('Protocol V2 firmware update targets', () => {
9026
9179
  expect(requests.map(request => request.file.data.byteLength)).toEqual([1800, 700]);
9027
9180
  });
9028
9181
 
9029
- test.each([
9030
- ['react-native', 10_000],
9031
- ['desktop-web-ble', 10_000],
9032
- ] as const)('bounds each windowed response wait in %s', async (env, timeoutMs) => {
9033
- const getSettingsSpy = jest.spyOn(DataManager, 'getSettings').mockReturnValue(env);
9034
- const typedCall = streamAll([]);
9182
+ test.each(['react-native', 'desktop-web-ble'] as const)(
9183
+ 'bounds each windowed response wait in %s',
9184
+ async env => {
9185
+ const getSettingsSpy = jest.spyOn(DataManager, 'getSettings').mockReturnValue(env);
9186
+ const typedCall = streamAll([]);
9035
9187
 
9036
- try {
9037
- await transfer(createMethod(typedCall));
9038
- } finally {
9039
- getSettingsSpy.mockRestore();
9040
- }
9188
+ try {
9189
+ await transfer(createMethod(typedCall));
9190
+ } finally {
9191
+ getSettingsSpy.mockRestore();
9192
+ }
9041
9193
 
9042
- expect(typedCall.mock.calls[0][3]).toEqual(expect.objectContaining({ timeoutMs }));
9043
- });
9194
+ expect(typedCall.mock.calls[0][3]).toEqual(expect.objectContaining({ timeoutMs: 10_000 }));
9195
+ }
9196
+ );
9044
9197
 
9045
9198
  test('restarts the whole file after a failed windowed write', async () => {
9046
9199
  const requests: any[] = [];
@@ -338,6 +338,42 @@ describe('SearchDevices', () => {
338
338
  }
339
339
  );
340
340
 
341
+ test('BLE discovery returns the advertised color letter without a device identity', async () => {
342
+ mockIsBleConnect.mockReturnValue(true);
343
+
344
+ const descriptor = {
345
+ id: 'ble-peripheral-id',
346
+ path: 'ble-peripheral-id',
347
+ name: 'Neo A1B2',
348
+ commType: 'ble',
349
+ bleColorCode: 'E',
350
+ };
351
+ const method = new SearchDevices({
352
+ id: 1,
353
+ payload: {
354
+ method: 'searchDevices',
355
+ },
356
+ } as any);
357
+ method.init();
358
+ method.connector = {
359
+ enumerate: jest.fn().mockResolvedValue({
360
+ descriptors: [descriptor],
361
+ }),
362
+ } as any;
363
+
364
+ await expect(method.run()).resolves.toEqual([
365
+ {
366
+ ...descriptor,
367
+ connectId: 'ble-peripheral-id',
368
+ serialNo: null,
369
+ uuid: '',
370
+ deviceId: null,
371
+ deviceType: 'neo',
372
+ bleColorCode: 'E',
373
+ },
374
+ ]);
375
+ });
376
+
341
377
  test.each([
342
378
  ['Pro2 A1B2 - Find My', undefined, 'Pro 2 A1B2'],
343
379
  ['Pro2 5E9D - Finde My', undefined, 'Pro 2 5E9D'],
@@ -69,6 +69,7 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
69
69
  private getProtocolV2ResourceComparePath;
70
70
  private readProtocolV2DeviceFileHeader;
71
71
  private isProtocolV2ResourceBundleUpToDate;
72
+ private isProtocolV2ResourceBundleUpToDateWithRecovery;
72
73
  private isProtocolV2BootloaderMode;
73
74
  private isProtocolV2RomloaderMode;
74
75
  private rebootProtocolV2ToBootloader;
@@ -1 +1 @@
1
- {"version":3,"file":"FirmwareUpdateV4.d.ts","sourceRoot":"","sources":["../../src/api/FirmwareUpdateV4.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FirmwareUpdateV4.d.ts","sourceRoot":"","sources":["../../src/api/FirmwareUpdateV4.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -383,6 +383,12 @@ type SearchDevice = {
383
383
  deviceType: IDeviceType;
384
384
  name: string;
385
385
  commType: OneKeyDeviceCommType;
386
+ /**
387
+ * React Native and Electron BLE discovery only. Serial-number color letter ('A'-'Z')
388
+ * advertised by Pro2 / Neo, possibly remembered from an earlier advertisement in this
389
+ * process. Absent when unknown; the letter's meaning depends on deviceType.
390
+ */
391
+ bleColorCode?: string;
386
392
  };
387
393
  /** Identity confirmed over USB. The descriptor path is only a transport address. */
388
394
  type UsbDeviceIdentity = {
package/dist/index.js CHANGED
@@ -52634,6 +52634,7 @@ const PROTOCOL_V2_CONNECT_POLL_INTERVAL = 500;
52634
52634
  const PROTOCOL_V2_CONNECT_SINGLE_TIMEOUT = 75 * 1000;
52635
52635
  const PROTOCOL_V2_DEVICE_INFO_READY_TIMEOUT = 30 * 1000;
52636
52636
  const PROTOCOL_V2_FILE_TRANSFER_RETRY_COUNT = 3;
52637
+ const PROTOCOL_V2_RESOURCE_HEADER_RECOVERY_LIMIT = 2;
52637
52638
  const PROTOCOL_V2_BLE_FILE_WRITE_WINDOW_MIN_BOOTLOADER_VERSION = '1.0.2';
52638
52639
  const PROTOCOL_V2_TRANSFER_PROGRESS_HEARTBEAT_MS = 1000;
52639
52640
  const PROTOCOL_V2_INSTALL_STATUS_CONFLICT_CODE = 'FirmwareInstallStatusConflict';
@@ -52696,6 +52697,8 @@ const getProtocolV2DeviceTransferProgress = (bytesBeforeChunk, bytesAfterChunk,
52696
52697
  }
52697
52698
  return Math.min(Math.max(Math.ceil((bytesAfterChunk / totalBytes) * 100), 1), 99);
52698
52699
  };
52700
+ const getProtocolV2TransferRate = (bytes, elapsedMs) => elapsedMs > 0 ? Math.round((bytes / elapsedMs) * 1000) : undefined;
52701
+ const getProtocolV2ElapsedMs = (startedAt, now = Date.now()) => Math.max(now - startedAt, 0);
52699
52702
  const PROTOCOL_V2_REMOTE_COMPONENT_TARGETS = {
52700
52703
  BOOTLOADER: {
52701
52704
  fileName: 'bootloader.bin',
@@ -52796,6 +52799,21 @@ const getProtocolV2ErrorCode = (error) => {
52796
52799
  const causeCode = errorCode !== null && errorCode !== void 0 ? errorCode : code;
52797
52800
  return typeof causeCode === 'number' || typeof causeCode === 'string' ? causeCode : undefined;
52798
52801
  };
52802
+ const isProtocolV2ResourceHeaderLinkError = (error) => {
52803
+ if (isProtocolV2DeviceDisconnectedError(error))
52804
+ return true;
52805
+ const errorCode = getProtocolV2ErrorCode(error);
52806
+ if (errorCode === hdShared.HardwareErrorCode.BleTimeoutError)
52807
+ return true;
52808
+ const message = getProtocolV2UnknownErrorText(error);
52809
+ if (errorCode === hdShared.HardwareErrorCode.TransportNotFound && /not connected/i.test(message)) {
52810
+ return true;
52811
+ }
52812
+ return (message.includes('ProtocolV2LinkError') ||
52813
+ message.includes('Device protocol has not been detected') ||
52814
+ message.includes('Electron BLE device state cleaned') ||
52815
+ message.includes('Electron BLE transport released'));
52816
+ };
52799
52817
  const isProtocolV2TerminalInstallStatusError = (error) => {
52800
52818
  var _a;
52801
52819
  return error instanceof hdShared.HardwareError &&
@@ -52911,6 +52929,7 @@ const assertProtocolV2ReconnectIdentity = (expectedSerialNumber, actualSerialNum
52911
52929
  }
52912
52930
  throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.DeviceNotFound, `Protocol V2 reconnect physical identity unavailable: expected path ${expectedPath !== null && expectedPath !== void 0 ? expectedPath : 'unknown'}, received ${actualPath !== null && actualPath !== void 0 ? actualPath : 'unknown'}`);
52913
52931
  };
52932
+ const isProtocolV2ReconnectIdentityUnverified = (error) => getProtocolV2UnknownErrorText(error).includes('Protocol V2 reconnect physical identity');
52914
52933
  class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
52915
52934
  constructor() {
52916
52935
  super(...arguments);
@@ -53899,11 +53918,43 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
53899
53918
  return true;
53900
53919
  }
53901
53920
  catch (error) {
53921
+ if (isProtocolV2ResourceHeaderLinkError(error))
53922
+ throw error;
53902
53923
  Log$6.log(`[FirmwareUpdateV4] RESC bundle ${bundle.name} header check failed: `, error);
53903
53924
  return false;
53904
53925
  }
53905
53926
  });
53906
53927
  }
53928
+ isProtocolV2ResourceBundleUpToDateWithRecovery(bundle, recovery) {
53929
+ return __awaiter(this, void 0, void 0, function* () {
53930
+ for (;;) {
53931
+ try {
53932
+ return yield this.isProtocolV2ResourceBundleUpToDate(bundle);
53933
+ }
53934
+ catch (error) {
53935
+ this.throwIfAborted();
53936
+ if (recovery.remaining <= 0) {
53937
+ Log$6.log(`[FirmwareUpdateV4] RESC bundle ${bundle.name} header check lost the link; reconnect budget used up: `, getProtocolV2UnknownErrorText(error));
53938
+ return false;
53939
+ }
53940
+ recovery.remaining -= 1;
53941
+ Log$6.log(`[FirmwareUpdateV4] RESC bundle ${bundle.name} header check lost the link; reconnecting: `, getProtocolV2UnknownErrorText(error));
53942
+ }
53943
+ try {
53944
+ yield this.recoverProtocolV2FileTransfer();
53945
+ }
53946
+ catch (recoverError) {
53947
+ this.throwIfAborted();
53948
+ if (isProtocolV2ReconnectIdentityUnverified(recoverError))
53949
+ throw recoverError;
53950
+ recovery.remaining = 0;
53951
+ Log$6.log('[FirmwareUpdateV4] RESC header check reconnect failed: ', getProtocolV2UnknownErrorText(recoverError));
53952
+ return false;
53953
+ }
53954
+ this.throwIfAborted();
53955
+ }
53956
+ });
53957
+ }
53907
53958
  isProtocolV2BootloaderMode() {
53908
53959
  var _a, _b, _c;
53909
53960
  if (typeof this.device.isBootloader === 'function') {
@@ -54082,8 +54133,9 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
54082
54133
  return __awaiter(this, void 0, void 0, function* () {
54083
54134
  let totalSize = installSources.reduce((total, item) => total + item.source.size, 0);
54084
54135
  const resourcesToSync = [];
54136
+ const headerRecovery = { remaining: PROTOCOL_V2_RESOURCE_HEADER_RECOVERY_LIMIT };
54085
54137
  for (const resource of resourceSources) {
54086
- if (yield this.isProtocolV2ResourceBundleUpToDate(resource)) {
54138
+ if (yield this.isProtocolV2ResourceBundleUpToDateWithRecovery(resource, headerRecovery)) {
54087
54139
  Log$6.log(`[FirmwareUpdateV4] skip RESC bundle ${resource.name}; already up to date`);
54088
54140
  }
54089
54141
  else {
@@ -54128,8 +54180,8 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
54128
54180
  });
54129
54181
  }
54130
54182
  if (totalSize > 0) {
54131
- const elapsedMs = Math.max(Date.now() - transferStartedAt, 0);
54132
- const rateBytesPerSecond = elapsedMs > 0 ? Math.round((totalSize / elapsedMs) * 1000) : undefined;
54183
+ const elapsedMs = getProtocolV2ElapsedMs(transferStartedAt);
54184
+ const rateBytesPerSecond = getProtocolV2TransferRate(totalSize, elapsedMs);
54133
54185
  this.postProgressMessage(100, 'transferData', {
54134
54186
  transferredBytes: totalSize,
54135
54187
  totalBytes: totalSize,
@@ -54158,7 +54210,7 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
54158
54210
  yield this.waitForProtocolV2FirmwareUpdateComplete(targets, true);
54159
54211
  Log$6.debug('[FirmwareUpdateV4] Protocol V2 install completed', {
54160
54212
  targets: targets.length,
54161
- elapsedMs: Math.max(Date.now() - installStartedAt, 0),
54213
+ elapsedMs: getProtocolV2ElapsedMs(installStartedAt),
54162
54214
  });
54163
54215
  }
54164
54216
  finally {
@@ -54171,7 +54223,7 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
54171
54223
  const reportConfirmedChunk = (chunkEnd) => {
54172
54224
  const transferredBytes = processedSize + chunkEnd;
54173
54225
  const now = Date.now();
54174
- const elapsedMs = Math.max(now - transferStartedAt, 0);
54226
+ const elapsedMs = getProtocolV2ElapsedMs(transferStartedAt, now);
54175
54227
  const progress = Math.min(Math.ceil((transferredBytes / totalSize) * 100), 99);
54176
54228
  const shouldPostProgress = transferredBytes >= this.protocolV2LastTransferredBytes &&
54177
54229
  (progress !== this.protocolV2LastTransferProgress ||
@@ -54185,7 +54237,7 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
54185
54237
  this.postProgressMessage(progress, 'transferData', {
54186
54238
  transferredBytes,
54187
54239
  totalBytes: totalSize,
54188
- rateBytesPerSecond: elapsedMs > 0 ? Math.round((transferredBytes / elapsedMs) * 1000) : undefined,
54240
+ rateBytesPerSecond: getProtocolV2TransferRate(transferredBytes, elapsedMs),
54189
54241
  elapsedMs,
54190
54242
  });
54191
54243
  }
@@ -54229,7 +54281,7 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
54229
54281
  Log$6.debug('[FirmwareUpdateV4] Protocol V2 file transferred', {
54230
54282
  path: filePath,
54231
54283
  bytes: source.size,
54232
- elapsedMs: Math.max(Date.now() - attemptStartedAt, 0),
54284
+ elapsedMs: getProtocolV2ElapsedMs(attemptStartedAt),
54233
54285
  attempt,
54234
54286
  fileWriteWindow: windowed ? hdTransport.PROTOCOL_V2_FILE_WRITE_PIPELINE_WINDOW : 1,
54235
54287
  });
@@ -46,6 +46,7 @@ export type SearchDevice = {
46
46
  deviceType: IDeviceType;
47
47
  name: string;
48
48
  commType: OneKeyDeviceCommType;
49
+ bleColorCode?: string;
49
50
  };
50
51
  export type UsbDeviceIdentity = {
51
52
  path: string;
@@ -1 +1 @@
1
- {"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../../src/types/device.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../../src/types/device.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onekeyfe/hd-core",
3
- "version": "1.2.8-alpha.116",
3
+ "version": "1.2.8-alpha.118",
4
4
  "description": "Core processes and APIs for communicating with OneKey hardware devices.",
5
5
  "author": "OneKey",
6
6
  "homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
@@ -25,8 +25,8 @@
25
25
  "url": "https://github.com/OneKeyHQ/hardware-js-sdk/issues"
26
26
  },
27
27
  "dependencies": {
28
- "@onekeyfe/hd-shared": "1.2.8-alpha.116",
29
- "@onekeyfe/hd-transport": "1.2.8-alpha.116",
28
+ "@onekeyfe/hd-shared": "1.2.8-alpha.118",
29
+ "@onekeyfe/hd-transport": "1.2.8-alpha.118",
30
30
  "axios": "1.15.2",
31
31
  "bignumber.js": "^9.0.2",
32
32
  "buffer": "^6.0.3",
@@ -46,5 +46,5 @@
46
46
  "@types/w3c-web-usb": "^1.0.10",
47
47
  "@types/web-bluetooth": "^0.0.21"
48
48
  },
49
- "gitHead": "3278c53853e85c2b3dff67caf65fcc59481f28eb"
49
+ "gitHead": "7b5fe42a7c29ff0aa4c8340c1d5da93026a1b590"
50
50
  }
@@ -103,13 +103,14 @@ const PROTOCOL_V2_CONNECT_POLL_INTERVAL = 500;
103
103
  const PROTOCOL_V2_CONNECT_SINGLE_TIMEOUT = 75 * 1000;
104
104
  const PROTOCOL_V2_DEVICE_INFO_READY_TIMEOUT = 30 * 1000;
105
105
  const PROTOCOL_V2_FILE_TRANSFER_RETRY_COUNT = 3;
106
- // Bootloaders with the 2048-byte BLE UART FIFO have no room beside one waiting FileWrite
107
- // frame, so a second in-flight write can overflow it and lose a chunk. Firmware has not yet
108
- // confirmed which bootloader version ships the 4096-byte FIFO, nor that the BLE coprocessor
109
- // queues absorb two back-to-back frames.
110
- // TEST ONLY: 1.0.2 also matches released bootloaders with the 2048-byte FIFO, so this build
111
- // must only update test devices flashed with the 4096-byte FIFO bootloader. Replace it with
112
- // the first released version that ships the 4096-byte FIFO before any release.
106
+ const PROTOCOL_V2_RESOURCE_HEADER_RECOVERY_LIMIT = 2;
107
+ // Minimum running bootloader that receives two in-flight BLE FilesystemFileWrite frames.
108
+ // Bootloaders with the 2048-byte BLE UART FIFO have no room beside one waiting FileWrite frame,
109
+ // so a second frame can overflow it: the lost chunk is detected (no response or a mismatched
110
+ // confirmation) and Core rewrites the file, which slows the transfer or fails it after the
111
+ // retries. 1.0.2 also matches released 2048-byte FIFO bootloaders. Raise it to the first
112
+ // release that ships the 4096-byte FIFO once firmware confirms that version and the BLE
113
+ // coprocessor margin, or set it to undefined to keep every transfer serial.
113
114
  const PROTOCOL_V2_BLE_FILE_WRITE_WINDOW_MIN_BOOTLOADER_VERSION: string | undefined = '1.0.2';
114
115
  const PROTOCOL_V2_TRANSFER_PROGRESS_HEARTBEAT_MS = 1000;
115
116
  const PROTOCOL_V2_INSTALL_STATUS_CONFLICT_CODE = 'FirmwareInstallStatusConflict';
@@ -206,6 +207,12 @@ const getProtocolV2DeviceTransferProgress = (
206
207
  return Math.min(Math.max(Math.ceil((bytesAfterChunk / totalBytes) * 100), 1), 99);
207
208
  };
208
209
 
210
+ const getProtocolV2TransferRate = (bytes: number, elapsedMs: number) =>
211
+ elapsedMs > 0 ? Math.round((bytes / elapsedMs) * 1000) : undefined;
212
+
213
+ const getProtocolV2ElapsedMs = (startedAt: number, now = Date.now()) =>
214
+ Math.max(now - startedAt, 0);
215
+
209
216
  type ProtocolV2FirmwareUpdateStatusTarget = {
210
217
  target_id: number | string;
211
218
  status?: number | string;
@@ -404,6 +411,23 @@ const getProtocolV2ErrorCode = (error: unknown): number | string | undefined =>
404
411
  return typeof causeCode === 'number' || typeof causeCode === 'string' ? causeCode : undefined;
405
412
  };
406
413
 
414
+ /** Errors that mean the link is gone, so the read says nothing about the installed bundle. */
415
+ const isProtocolV2ResourceHeaderLinkError = (error: unknown) => {
416
+ if (isProtocolV2DeviceDisconnectedError(error)) return true;
417
+ const errorCode = getProtocolV2ErrorCode(error);
418
+ if (errorCode === HardwareErrorCode.BleTimeoutError) return true;
419
+ const message = getProtocolV2UnknownErrorText(error);
420
+ if (errorCode === HardwareErrorCode.TransportNotFound && /not connected/i.test(message)) {
421
+ return true;
422
+ }
423
+ return (
424
+ message.includes('ProtocolV2LinkError') ||
425
+ message.includes('Device protocol has not been detected') ||
426
+ message.includes('Electron BLE device state cleaned') ||
427
+ message.includes('Electron BLE transport released')
428
+ );
429
+ };
430
+
407
431
  const isProtocolV2TerminalInstallStatusError = (error: unknown) =>
408
432
  error instanceof HardwareError &&
409
433
  (error.errorCode === HardwareErrorCode.ActionCancelled ||
@@ -557,6 +581,10 @@ export const assertProtocolV2ReconnectIdentity = (
557
581
  );
558
582
  };
559
583
 
584
+ /** Mismatch or unavailable: the reconnected device could not be re-verified. */
585
+ const isProtocolV2ReconnectIdentityUnverified = (error: unknown) =>
586
+ getProtocolV2UnknownErrorText(error).includes('Protocol V2 reconnect physical identity');
587
+
560
588
  /**
561
589
  * FirmwareUpdateV4 is the complete Protocol V2 firmware update flow.
562
590
  *
@@ -810,9 +838,8 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
810
838
  if (direction === 'read') {
811
839
  maxChunkSize = PROTOCOL_V2_BLE_FILE_READ_CHUNK_SIZE;
812
840
  } else if (fileWriteWindow) {
813
- // Pipelined frames share the main MCU's 4096-byte UART FIFO. Two 1800-byte chunks
814
- // (about 3.75 KB of frames) leave room to spare; two 1960-byte staging chunks would
815
- // leave under 60 bytes.
841
+ // Skip the larger staging chunk so two in-flight frames fit the UART FIFO; see
842
+ // PROTOCOL_V2_FILE_WRITE_PIPELINE_WINDOW.
816
843
  maxChunkSize = PROTOCOL_V2_BLE_FILE_CHUNK_SIZE;
817
844
  } else {
818
845
  // Firmware staging writes tolerate a larger BLE chunk than generic filesystem writes.
@@ -1900,11 +1927,57 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
1900
1927
  if (!expectedHeaderHash || header.headerHash !== expectedHeaderHash) return false;
1901
1928
  return true;
1902
1929
  } catch (error) {
1930
+ if (isProtocolV2ResourceHeaderLinkError(error)) throw error;
1903
1931
  Log.log(`[FirmwareUpdateV4] RESC bundle ${bundle.name} header check failed: `, error);
1904
1932
  return false;
1905
1933
  }
1906
1934
  }
1907
1935
 
1936
+ /**
1937
+ * A lost link would fail every remaining header check and resend bundles that are already
1938
+ * installed, so reconnect (a bounded number of times per transfer phase) and ask again.
1939
+ * Header reads have no side effects. If reconnecting fails or the budget is used up, the bundle
1940
+ * is resent as before; a failed identity check after reconnecting aborts the update.
1941
+ */
1942
+ private async isProtocolV2ResourceBundleUpToDateWithRecovery(
1943
+ bundle: ProtocolV2ResourceBundleSource,
1944
+ recovery: { remaining: number }
1945
+ ): Promise<boolean> {
1946
+ for (;;) {
1947
+ try {
1948
+ return await this.isProtocolV2ResourceBundleUpToDate(bundle);
1949
+ } catch (error) {
1950
+ this.throwIfAborted();
1951
+ if (recovery.remaining <= 0) {
1952
+ Log.log(
1953
+ `[FirmwareUpdateV4] RESC bundle ${bundle.name} header check lost the link; reconnect budget used up: `,
1954
+ getProtocolV2UnknownErrorText(error)
1955
+ );
1956
+ return false;
1957
+ }
1958
+ recovery.remaining -= 1;
1959
+ Log.log(
1960
+ `[FirmwareUpdateV4] RESC bundle ${bundle.name} header check lost the link; reconnecting: `,
1961
+ getProtocolV2UnknownErrorText(error)
1962
+ );
1963
+ }
1964
+ try {
1965
+ await this.recoverProtocolV2FileTransfer();
1966
+ } catch (recoverError) {
1967
+ this.throwIfAborted();
1968
+ // Never keep writing to a device that was not re-verified.
1969
+ if (isProtocolV2ReconnectIdentityUnverified(recoverError)) throw recoverError;
1970
+ recovery.remaining = 0;
1971
+ Log.log(
1972
+ '[FirmwareUpdateV4] RESC header check reconnect failed: ',
1973
+ getProtocolV2UnknownErrorText(recoverError)
1974
+ );
1975
+ return false;
1976
+ }
1977
+ this.throwIfAborted();
1978
+ }
1979
+ }
1980
+
1908
1981
  private isProtocolV2BootloaderMode() {
1909
1982
  if (typeof this.device.isBootloader === 'function') {
1910
1983
  return !!this.device.isBootloader();
@@ -2143,8 +2216,9 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
2143
2216
  }: ProtocolV2TransferBatch) {
2144
2217
  let totalSize = installSources.reduce((total, item) => total + item.source.size, 0);
2145
2218
  const resourcesToSync: ProtocolV2ResourceBundleSource[] = [];
2219
+ const headerRecovery = { remaining: PROTOCOL_V2_RESOURCE_HEADER_RECOVERY_LIMIT };
2146
2220
  for (const resource of resourceSources) {
2147
- if (await this.isProtocolV2ResourceBundleUpToDate(resource)) {
2221
+ if (await this.isProtocolV2ResourceBundleUpToDateWithRecovery(resource, headerRecovery)) {
2148
2222
  Log.log(`[FirmwareUpdateV4] skip RESC bundle ${resource.name}; already up to date`);
2149
2223
  } else {
2150
2224
  resourcesToSync.push(resource);
@@ -2193,9 +2267,8 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
2193
2267
  }
2194
2268
 
2195
2269
  if (totalSize > 0) {
2196
- const elapsedMs = Math.max(Date.now() - transferStartedAt, 0);
2197
- const rateBytesPerSecond =
2198
- elapsedMs > 0 ? Math.round((totalSize / elapsedMs) * 1000) : undefined;
2270
+ const elapsedMs = getProtocolV2ElapsedMs(transferStartedAt);
2271
+ const rateBytesPerSecond = getProtocolV2TransferRate(totalSize, elapsedMs);
2199
2272
  this.postProgressMessage(100, 'transferData', {
2200
2273
  transferredBytes: totalSize,
2201
2274
  totalBytes: totalSize,
@@ -2226,7 +2299,7 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
2226
2299
  await this.waitForProtocolV2FirmwareUpdateComplete(targets, true);
2227
2300
  Log.debug('[FirmwareUpdateV4] Protocol V2 install completed', {
2228
2301
  targets: targets.length,
2229
- elapsedMs: Math.max(Date.now() - installStartedAt, 0),
2302
+ elapsedMs: getProtocolV2ElapsedMs(installStartedAt),
2230
2303
  });
2231
2304
  } finally {
2232
2305
  this.device?.clearCancelableAction();
@@ -2249,7 +2322,7 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
2249
2322
  const reportConfirmedChunk = (chunkEnd: number) => {
2250
2323
  const transferredBytes = processedSize + chunkEnd;
2251
2324
  const now = Date.now();
2252
- const elapsedMs = Math.max(now - transferStartedAt, 0);
2325
+ const elapsedMs = getProtocolV2ElapsedMs(transferStartedAt, now);
2253
2326
  const progress = Math.min(Math.ceil((transferredBytes / totalSize) * 100), 99);
2254
2327
  const shouldPostProgress =
2255
2328
  transferredBytes >= this.protocolV2LastTransferredBytes &&
@@ -2264,8 +2337,7 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
2264
2337
  this.postProgressMessage(progress, 'transferData', {
2265
2338
  transferredBytes,
2266
2339
  totalBytes: totalSize,
2267
- rateBytesPerSecond:
2268
- elapsedMs > 0 ? Math.round((transferredBytes / elapsedMs) * 1000) : undefined,
2340
+ rateBytesPerSecond: getProtocolV2TransferRate(transferredBytes, elapsedMs),
2269
2341
  elapsedMs,
2270
2342
  });
2271
2343
  }
@@ -2323,7 +2395,7 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
2323
2395
  Log.debug('[FirmwareUpdateV4] Protocol V2 file transferred', {
2324
2396
  path: filePath,
2325
2397
  bytes: source.size,
2326
- elapsedMs: Math.max(Date.now() - attemptStartedAt, 0),
2398
+ elapsedMs: getProtocolV2ElapsedMs(attemptStartedAt),
2327
2399
  attempt,
2328
2400
  fileWriteWindow: windowed ? PROTOCOL_V2_FILE_WRITE_PIPELINE_WINDOW : 1,
2329
2401
  });
@@ -83,6 +83,12 @@ export type SearchDevice = {
83
83
  deviceType: IDeviceType;
84
84
  name: string;
85
85
  commType: OneKeyDeviceCommType;
86
+ /**
87
+ * React Native and Electron BLE discovery only. Serial-number color letter ('A'-'Z')
88
+ * advertised by Pro2 / Neo, possibly remembered from an earlier advertisement in this
89
+ * process. Absent when unknown; the letter's meaning depends on deviceType.
90
+ */
91
+ bleColorCode?: string;
86
92
  };
87
93
 
88
94
  /** Identity confirmed over USB. The descriptor path is only a transport address. */