@onekeyfe/hd-core 1.2.0-alpha.129 → 1.2.0-alpha.130

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.
@@ -1,4 +1,4 @@
1
- import { EDeviceType, HardwareErrorCode } from '@onekeyfe/hd-shared';
1
+ import { EDeviceType, ERRORS, HardwareErrorCode, createDeferred } from '@onekeyfe/hd-shared';
2
2
  import { DeviceType, TRANSPORT_EVENT } from '@onekeyfe/hd-transport';
3
3
 
4
4
  import { initConnector, initCore } from '../src/core';
@@ -310,6 +310,62 @@ describe('public device lifecycle events', () => {
310
310
  }
311
311
  );
312
312
 
313
+ test('sends a fallback Cancel for an acquired Protocol V2 BLE call without a prompt callback', async () => {
314
+ jest.spyOn(DataManager, 'getSettings').mockReturnValue('react-native' as never);
315
+ const device = createInitializedDevice('V2');
316
+ const post = jest.fn().mockResolvedValue(undefined);
317
+ const cancelDevice = jest.fn(() => cancelDeviceInPrompt(device, false));
318
+ const cancel = jest.fn().mockResolvedValue(undefined);
319
+ (device as unknown as { deviceAcquired: boolean }).deviceAcquired = true;
320
+ device.commands = {
321
+ transport: { post },
322
+ cancelDevice,
323
+ cancel,
324
+ } as never;
325
+
326
+ await device.interruptionFromUser();
327
+
328
+ expect(cancelDevice).toHaveBeenCalledTimes(1);
329
+ expect(post).toHaveBeenCalledWith(device.mainId, 'Cancel', {});
330
+ expect(cancel).toHaveBeenCalledTimes(1);
331
+ });
332
+
333
+ test('waits for the canceled run to finish releasing before cancellation completes', async () => {
334
+ jest.spyOn(DataManager, 'getSettings').mockReturnValue('react-native' as never);
335
+ const device = createInitializedDevice('V2');
336
+ const operation = createDeferred<void>();
337
+ const releaseGate = createDeferred<void>();
338
+ const cancelError = ERRORS.TypedError(HardwareErrorCode.DeviceInterruptedFromUser);
339
+ const release = jest.spyOn(device, 'release').mockImplementation(() => releaseGate.promise);
340
+ device.commands = {
341
+ disposed: false,
342
+ cancel: jest.fn(() => {
343
+ operation.reject(cancelError);
344
+ return Promise.resolve();
345
+ }),
346
+ } as never;
347
+ (device as unknown as { deviceAcquired: boolean }).deviceAcquired = true;
348
+
349
+ const runResult = device.run(() => operation.promise).catch(error => error);
350
+ const cancellation = device.interruptionFromUser();
351
+ let cancellationCompleted = false;
352
+ cancellation.then(() => {
353
+ cancellationCompleted = true;
354
+ });
355
+
356
+ await new Promise(resolve => {
357
+ setImmediate(resolve);
358
+ });
359
+ expect(release).toHaveBeenCalledTimes(1);
360
+ expect(cancellationCompleted).toBe(false);
361
+
362
+ releaseGate.resolve();
363
+ await cancellation;
364
+ await expect(runResult).resolves.toMatchObject({
365
+ errorCode: HardwareErrorCode.DeviceInterruptedFromUser,
366
+ });
367
+ });
368
+
313
369
  test.each([
314
370
  [EDeviceType.Pro2, 'webusb', false, DeviceType.PRO2],
315
371
  [EDeviceType.Neo, 'webusb', false, DeviceType.NEO],
@@ -2,6 +2,9 @@ import { EDeviceType, HardwareErrorCode } from '@onekeyfe/hd-shared';
2
2
  import { DeviceSettingsPage } from '@onekeyfe/hd-transport';
3
3
 
4
4
  import DeviceSettings from '../src/api/device/DeviceSettings';
5
+ import { Device } from '../src/device/Device';
6
+ import { DEVICE } from '../src/events';
7
+ import { PROTOCOL_V2_DEVICE_STATUS_GET_MESSAGE_TYPE } from '../src/protocols/protocol-v2';
5
8
  import { DEVICE_SETTINGS_NEVER_TIMEOUT_MS } from '../src/utils/deviceSettings';
6
9
 
7
10
  import type { Features } from '../src/types';
@@ -21,6 +24,9 @@ function createDevice({ protocol }: { protocol: 'V1' | 'V2' }) {
21
24
  const typedCall = jest.fn().mockResolvedValue({ message: { message: 'Success' } });
22
25
  const updateState = jest.fn();
23
26
  const getDeviceState = jest.fn();
27
+ const refreshProtocolV2SettingsAfterMutation = jest.fn(() =>
28
+ getDeviceState({ refreshSections: ['status', 'settings'] })
29
+ );
24
30
  return {
25
31
  device: {
26
32
  features,
@@ -29,6 +35,7 @@ function createDevice({ protocol }: { protocol: 'V1' | 'V2' }) {
29
35
  commands: { typedCall },
30
36
  updateState,
31
37
  getDeviceState,
38
+ refreshProtocolV2SettingsAfterMutation,
32
39
  },
33
40
  typedCall,
34
41
  updateState,
@@ -181,6 +188,97 @@ describe('DeviceSettings protocol routing', () => {
181
188
  expect(updateState).not.toHaveBeenCalled();
182
189
  });
183
190
 
191
+ it('reconciles stale passphrase and label after an unrelated Protocol V2 setting change', async () => {
192
+ const typedCall = jest.fn().mockImplementation((requestType: string) => {
193
+ if (requestType === 'DeviceSettingsSet') {
194
+ return { message: { message: 'Success' } };
195
+ }
196
+ if (requestType === 'DeviceStatusGet') {
197
+ return {
198
+ message: {
199
+ init_states: true,
200
+ unlocked: false,
201
+ passphrase_enabled: false,
202
+ },
203
+ };
204
+ }
205
+ if (requestType === 'DeviceSettingsGet') {
206
+ return {
207
+ message: {
208
+ label: 'Current Label',
209
+ brightness: 80,
210
+ passphrase_enable: false,
211
+ },
212
+ };
213
+ }
214
+ throw new Error(`Unexpected request: ${requestType}`);
215
+ });
216
+ const device = Device.fromDescriptor({
217
+ id: 'pro2',
218
+ path: 'pro2',
219
+ protocolType: 'V2',
220
+ } as never);
221
+ (device as any).commands = { typedCall };
222
+ device.updateState(
223
+ {
224
+ protocol: 'V2',
225
+ identity: {
226
+ deviceType: EDeviceType.Pro2,
227
+ label: 'Stale Label',
228
+ },
229
+ status: {
230
+ mode: 'normal',
231
+ unlocked: false,
232
+ passphraseProtection: true,
233
+ },
234
+ settings: { brightness: 20 },
235
+ raw: {
236
+ protocolV2ProtocolInfo: {
237
+ version: 1,
238
+ build_fingerprint: 'application__5.0.0__abcdef0__PROD__RELEASE',
239
+ supported_messages: [PROTOCOL_V2_DEVICE_STATUS_GET_MESSAGE_TYPE],
240
+ },
241
+ },
242
+ },
243
+ 'initialize'
244
+ );
245
+ const onState = jest.fn();
246
+ device.on(DEVICE.STATE, onState);
247
+ const method = new DeviceSettings({
248
+ id: 3,
249
+ payload: {
250
+ method: 'deviceSettings',
251
+ brightness: 80,
252
+ },
253
+ });
254
+ method.init();
255
+ (method as any).device = device;
256
+
257
+ await expect(method.run()).resolves.toEqual({ message: 'Success' });
258
+
259
+ expect(typedCall.mock.calls.map(call => call[0])).toEqual([
260
+ 'DeviceSettingsSet',
261
+ 'DeviceStatusGet',
262
+ 'DeviceSettingsGet',
263
+ ]);
264
+ expect(device.state).toMatchObject({
265
+ identity: { label: 'Current Label' },
266
+ status: { passphraseProtection: false },
267
+ settings: { brightness: 80 },
268
+ });
269
+ expect(onState).toHaveBeenLastCalledWith(
270
+ device,
271
+ expect.objectContaining({
272
+ source: 'settings-read',
273
+ state: expect.objectContaining({
274
+ identity: expect.objectContaining({ label: 'Current Label' }),
275
+ status: expect.objectContaining({ passphraseProtection: false }),
276
+ settings: expect.objectContaining({ brightness: 80 }),
277
+ }),
278
+ })
279
+ );
280
+ });
281
+
184
282
  it('uses the Pro2 passphrase page as a device-side toggle and verifies the target state', async () => {
185
283
  const { device, typedCall, getDeviceState } = createDevice({ protocol: 'V2' });
186
284
  getDeviceState
@@ -183,6 +183,7 @@ describe('DeviceUploadWallpaper', () => {
183
183
  stubDevice({
184
184
  ...device,
185
185
  ensureProtocolV2RuntimeContext: jest.fn().mockResolvedValue(wallpaperProtocolInfo),
186
+ refreshProtocolV2SettingsAfterMutation: jest.fn().mockResolvedValue({}),
186
187
  });
187
188
 
188
189
  test('encodes, uploads and applies a Pro2 wallpaper', async () => {
@@ -204,7 +205,8 @@ describe('DeviceUploadWallpaper', () => {
204
205
  jpegBase64: createJpegBase64(604, 1024),
205
206
  },
206
207
  });
207
- (method as any).device = stubWallpaperDevice({ commands: { typedCall } });
208
+ const device = stubWallpaperDevice({ commands: { typedCall } });
209
+ (method as any).device = device;
208
210
  method.postMessage = jest.fn();
209
211
 
210
212
  method.init();
@@ -224,6 +226,7 @@ describe('DeviceUploadWallpaper', () => {
224
226
  expect(typedCall).toHaveBeenLastCalledWith('DeviceSettingsSet', 'Success', {
225
227
  settings: { wallpaper_path: result.path },
226
228
  });
229
+ expect(device.refreshProtocolV2SettingsAfterMutation).toHaveBeenCalledTimes(1);
227
230
  expect(typedCall.mock.calls.some(call => call[0] === 'SetWallpaper')).toBe(false);
228
231
  expect(result).toMatchObject({ colorFormat: 'RGB565', message: 'wallpaper applied' });
229
232
  const fileWriteCallCount = typedCall.mock.calls.filter(
@@ -1 +1 @@
1
- {"version":3,"file":"DeviceSettings.d.ts","sourceRoot":"","sources":["../../../src/api/device/DeviceSettings.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAgB3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AA0D5D,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,UAAU,CAAC,aAAa,CAAC;IACnE,qBAAqB;IAIrB,IAAI;IA0EJ,eAAe;;;;;;;IAWT,GAAG;CAyIV"}
1
+ {"version":3,"file":"DeviceSettings.d.ts","sourceRoot":"","sources":["../../../src/api/device/DeviceSettings.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAgB3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AA0D5D,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,UAAU,CAAC,aAAa,CAAC;IACnE,qBAAqB;IAIrB,IAAI;IA0EJ,eAAe;;;;;;;IAWT,GAAG;CAwIV"}
@@ -1 +1 @@
1
- {"version":3,"file":"DeviceUploadWallpaper.d.ts","sourceRoot":"","sources":["../../../src/api/protocol-v2/DeviceUploadWallpaper.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAM3C,OAAO,EAGL,KAAK,wBAAwB,EAE9B,MAAM,2BAA2B,CAAC;AAEnC,MAAM,MAAM,2BAA2B,GAAG;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,wBAAwB,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAkBF,MAAM,CAAC,OAAO,OAAO,qBAAsB,SAAQ,UAAU,CAAC,2BAA2B,CAAC;IACxF,qBAAqB;IAIrB,OAAO,CAAC,OAAO,CAAC,CAA8D;IAE9E,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO,CAAC,IAAI,CAAM;IAElB,IAAI;YAwBU,kBAAkB;YAgBlB,eAAe;YAaf,MAAM;IAwBd,GAAG,IAAI,OAAO,CAAC,6BAA6B,CAAC;CAgBpD"}
1
+ {"version":3,"file":"DeviceUploadWallpaper.d.ts","sourceRoot":"","sources":["../../../src/api/protocol-v2/DeviceUploadWallpaper.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAM3C,OAAO,EAGL,KAAK,wBAAwB,EAE9B,MAAM,2BAA2B,CAAC;AAEnC,MAAM,MAAM,2BAA2B,GAAG;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,wBAAwB,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAkBF,MAAM,CAAC,OAAO,OAAO,qBAAsB,SAAQ,UAAU,CAAC,2BAA2B,CAAC;IACxF,qBAAqB;IAIrB,OAAO,CAAC,OAAO,CAAC,CAA8D;IAE9E,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO,CAAC,IAAI,CAAM;IAElB,IAAI;YAwBU,kBAAkB;YAgBlB,eAAe;YAaf,MAAM;IAwBd,GAAG,IAAI,OAAO,CAAC,6BAA6B,CAAC;CAiBpD"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":";AACA,OAAO,YAAY,MAAM,QAAQ,CAAC;AAoClC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAsB1C,OAAO,eAAe,MAAM,2BAA2B,CAAC;AAYxD,OAAO,KAAK,EAAE,eAAe,EAAyB,MAAM,UAAU,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAmD,MAAM,WAAW,CAAC;AAI9F,OAAO,KAAK,EACV,6BAA6B,EAG9B,MAAM,wBAAwB,CAAC;AAWhC,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAmE7D,eAAO,MAAM,OAAO,YAAmB,WAAW,WAAW,WAAW,iBAoFvE,CAAC;AA44BF,eAAO,MAAM,MAAM,YAAa,WAAW,cAAc,MAAM,SAkF9D,CAAC;AAmGF,eAAO,MAAM,qBAAqB,gFAejC,CAAC;AAiLF,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,YAAY;IAC5C,OAAO,CAAC,cAAc,CAAoB;IAE1C,SAAgB,aAAa,EAAE,MAAM,CAAC;IAEtC,OAAO,CAAC,YAAY,CAAsB;IAE1C,OAAO,CAAC,cAAc,CAAC,CAAgB;IAGvC,OAAO,CAAC,qBAAqB,CAA4B;IAEzD,OAAO,CAAC,iBAAiB,CAAoB;;IAS7C,OAAO,CAAC,cAAc;IAoBhB,aAAa,CAAC,OAAO,EAAE,WAAW;IAuExC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAOV,gBAAgB;CAiC/B;AAED,eAAO,MAAM,QAAQ,YAIpB,CAAC;AAEF,eAAO,MAAM,aAAa,uBAYzB,CAAC;AAMF,eAAO,MAAM,IAAI,aACL,eAAe,aACd,GAAG,WACL,6BAA6B,8BAiBvC,CAAC;AAEF,eAAO,MAAM,eAAe;SAKrB,eAAe,CAAC,KAAK,CAAC;eAChB,GAAG;;UASf,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":";AACA,OAAO,YAAY,MAAM,QAAQ,CAAC;AAoClC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAsB1C,OAAO,eAAe,MAAM,2BAA2B,CAAC;AAYxD,OAAO,KAAK,EAAE,eAAe,EAAyB,MAAM,UAAU,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAmD,MAAM,WAAW,CAAC;AAI9F,OAAO,KAAK,EACV,6BAA6B,EAG9B,MAAM,wBAAwB,CAAC;AAWhC,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAmE7D,eAAO,MAAM,OAAO,YAAmB,WAAW,WAAW,WAAW,iBAoFvE,CAAC;AAg5BF,eAAO,MAAM,MAAM,YAAa,WAAW,cAAc,MAAM,SAkF9D,CAAC;AAmGF,eAAO,MAAM,qBAAqB,gFAejC,CAAC;AAiLF,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,YAAY;IAC5C,OAAO,CAAC,cAAc,CAAoB;IAE1C,SAAgB,aAAa,EAAE,MAAM,CAAC;IAEtC,OAAO,CAAC,YAAY,CAAsB;IAE1C,OAAO,CAAC,cAAc,CAAC,CAAgB;IAGvC,OAAO,CAAC,qBAAqB,CAA4B;IAEzD,OAAO,CAAC,iBAAiB,CAAoB;;IAS7C,OAAO,CAAC,cAAc;IAoBhB,aAAa,CAAC,OAAO,EAAE,WAAW;IAuExC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAOV,gBAAgB;CAiC/B;AAED,eAAO,MAAM,QAAQ,YAIpB,CAAC;AAEF,eAAO,MAAM,aAAa,uBAYzB,CAAC;AAMF,eAAO,MAAM,IAAI,aACL,eAAe,aACd,GAAG,WACL,6BAA6B,8BAiBvC,CAAC;AAEF,eAAO,MAAM,eAAe;SAKrB,eAAe,CAAC,KAAK,CAAC;eAChB,GAAG;;UASf,CAAC"}
@@ -80,6 +80,7 @@ export declare class Device extends EventEmitter {
80
80
  get features(): Features | undefined;
81
81
  set features(features: Features | undefined);
82
82
  runPromise?: Deferred<void> | null;
83
+ private runCleanupPromise?;
83
84
  externalState: string[];
84
85
  unavailableCapabilities: UnavailableCapabilities;
85
86
  instance: number;
@@ -148,6 +149,7 @@ export declare class Device extends EventEmitter {
148
149
  private _initializeProtocolV2;
149
150
  getFeatures(): Promise<Features | undefined>;
150
151
  getDeviceState(params?: DeviceStateReadOptions): Promise<import("../types").DeviceState>;
152
+ refreshProtocolV2SettingsAfterMutation(): Promise<import("../types").DeviceState>;
151
153
  _updateFeatures(protoFeatures: PROTO.Features | Features, initSession?: boolean): void;
152
154
  updateState(patch: DeviceStatePatch, source: DeviceStateUpdateSource): import("../types").DeviceState & {
153
155
  raw?: import("../types").DeviceFeaturesRaw | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"Device.d.ts","sourceRoot":"","sources":["../../src/device/Device.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Device.d.ts","sourceRoot":"","sources":["../../src/device/Device.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -833,6 +833,8 @@ declare class Device extends EventEmitter {
833
833
  get features(): Features | undefined;
834
834
  set features(features: Features | undefined);
835
835
  runPromise?: Deferred<void> | null;
836
+ /** Resolves only after the active run has completed its release path. */
837
+ private runCleanupPromise?;
836
838
  externalState: string[];
837
839
  unavailableCapabilities: UnavailableCapabilities;
838
840
  instance: number;
@@ -927,6 +929,7 @@ declare class Device extends EventEmitter {
927
929
  private _initializeProtocolV2;
928
930
  getFeatures(): Promise<Features | undefined>;
929
931
  getDeviceState(params?: DeviceStateReadOptions): Promise<DeviceState>;
932
+ refreshProtocolV2SettingsAfterMutation(): Promise<DeviceState>;
930
933
  _updateFeatures(protoFeatures: Messages.Features | Features, initSession?: boolean): void;
931
934
  updateState(patch: DeviceStatePatch, source: DeviceStateUpdateSource): DeviceState & {
932
935
  raw?: DeviceFeaturesRaw | undefined;
package/dist/index.js CHANGED
@@ -45732,6 +45732,11 @@ class Device extends events.exports {
45732
45732
  return params.includeRaw ? cloneDeviceState(this.state) : createPublicDeviceState(this.state);
45733
45733
  });
45734
45734
  }
45735
+ refreshProtocolV2SettingsAfterMutation() {
45736
+ return __awaiter(this, void 0, void 0, function* () {
45737
+ return this.getDeviceState({ refreshSections: ['status', 'settings'] });
45738
+ });
45739
+ }
45735
45740
  _updateFeatures(protoFeatures, initSession) {
45736
45741
  var _a;
45737
45742
  const previousDeviceId = this.getCurrentDeviceId();
@@ -45987,12 +45992,20 @@ class Device extends events.exports {
45987
45992
  options = parseRunOptions(options);
45988
45993
  const runPromise = hdShared.createDeferred();
45989
45994
  this.runPromise = runPromise;
45990
- this._runInner(fn, options, runPromise).catch(error => {
45995
+ const cleanupPromise = this._runInner(fn, options, runPromise).catch(error => {
45991
45996
  if (this.runPromise === runPromise) {
45992
45997
  this.runPromise = null;
45993
45998
  }
45994
45999
  runPromise.reject(error);
45995
46000
  });
46001
+ this.runCleanupPromise = cleanupPromise;
46002
+ cleanupPromise
46003
+ .finally(() => {
46004
+ if (this.runCleanupPromise === cleanupPromise) {
46005
+ this.runCleanupPromise = undefined;
46006
+ }
46007
+ })
46008
+ .catch(() => undefined);
45996
46009
  return runPromise.promise;
45997
46010
  });
45998
46011
  }
@@ -46086,15 +46099,27 @@ class Device extends events.exports {
46086
46099
  });
46087
46100
  }
46088
46101
  interruptionFromUser() {
46089
- var _a, _b;
46102
+ var _a, _b, _c;
46090
46103
  return __awaiter(this, void 0, void 0, function* () {
46091
46104
  const error = hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.DeviceInterruptedFromUser);
46092
- yield ((_a = this.cancelableAction) === null || _a === void 0 ? void 0 : _a.call(this, error));
46093
- yield ((_b = this.commands) === null || _b === void 0 ? void 0 : _b.cancel());
46105
+ const cleanupPromise = this.runCleanupPromise;
46106
+ const { cancelableAction } = this;
46107
+ if (cancelableAction) {
46108
+ yield cancelableAction(error);
46109
+ }
46110
+ else if (this.isProtocolV2() &&
46111
+ DataManager.isBleConnect(DataManager.getSettings('env')) &&
46112
+ this.hasDeviceAcquire()) {
46113
+ yield ((_b = (_a = this.commands) === null || _a === void 0 ? void 0 : _a.cancelDevice) === null || _b === void 0 ? void 0 : _b.call(_a).catch(cancelError => {
46114
+ Log$g.debug('Protocol V2 BLE fallback cancel error', cancelError);
46115
+ }));
46116
+ }
46117
+ yield ((_c = this.commands) === null || _c === void 0 ? void 0 : _c.cancel());
46094
46118
  if (this.runPromise) {
46095
46119
  this.runPromise.reject(error);
46096
46120
  this.runPromise = null;
46097
46121
  }
46122
+ yield (cleanupPromise === null || cleanupPromise === void 0 ? void 0 : cleanupPromise.catch(() => undefined));
46098
46123
  });
46099
46124
  }
46100
46125
  setCancelableAction(callback) {
@@ -48467,7 +48492,7 @@ class DeviceSettings extends BaseMethod {
48467
48492
  return __awaiter(this, void 0, void 0, function* () {
48468
48493
  try {
48469
48494
  if (this.device.isProtocolV2()) {
48470
- const refreshStatusAndSettings = () => this.device.getDeviceState({ refreshSections: ['status', 'settings'] });
48495
+ const refreshStatusAndSettings = () => this.device.refreshProtocolV2SettingsAfterMutation();
48471
48496
  assertSettingsSupported(this.payload, DEVICE_SETTINGS_V1_ONLY_FIELDS, 'Protocol V2');
48472
48497
  const capabilities = getDeviceSettingsCapabilities(this.device.getCurrentDeviceType(), 'V2');
48473
48498
  assertProtocolV2SettingValues(this.payload, capabilities);
@@ -54467,6 +54492,7 @@ class DeviceUploadWallpaper extends BaseMethod {
54467
54492
  const response = yield this.device.commands.typedCall('DeviceSettingsSet', 'Success', {
54468
54493
  settings: { wallpaper_path: this.path },
54469
54494
  });
54495
+ yield this.device.refreshProtocolV2SettingsAfterMutation();
54470
54496
  return {
54471
54497
  path: this.path,
54472
54498
  size: encoded.data.byteLength,
@@ -65143,18 +65169,12 @@ const handlePreWarmSignal = (context, message, method) => __awaiter(void 0, void
65143
65169
  }
65144
65170
  }
65145
65171
  });
65146
- const waitWithTimeout = (promise, timeout) => __awaiter(void 0, void 0, void 0, function* () {
65147
- const timeoutPromise = new Promise((_, reject) => {
65148
- setTimeout(() => reject(new Error('Request timeout')), timeout);
65149
- });
65150
- return Promise.race([promise, timeoutPromise]);
65151
- });
65152
65172
  const waitForPendingPromise = (getPrePendingCallPromise, removePrePendingCallPromise) => __awaiter(void 0, void 0, void 0, function* () {
65153
65173
  const pendingPromise = getPrePendingCallPromise();
65154
65174
  if (pendingPromise) {
65155
65175
  Log.debug('pre pending call promise before call method, wait for it');
65156
65176
  try {
65157
- yield waitWithTimeout(pendingPromise, 5 * 1000);
65177
+ yield pendingPromise;
65158
65178
  }
65159
65179
  catch (error) {
65160
65180
  }
@@ -65564,6 +65584,12 @@ function isRetryableBleProtocolV2ProbeError(method, error) {
65564
65584
  message.includes('expected V2') &&
65565
65585
  message.includes('did not respond to expected protocol'));
65566
65586
  }
65587
+ function isMissingDetectedProtocolError(error) {
65588
+ const typedError = error;
65589
+ return ((typedError === null || typedError === void 0 ? void 0 : typedError.errorCode) === hdShared.HardwareErrorCode.RuntimeError &&
65590
+ typeof typedError.message === 'string' &&
65591
+ typedError.message.includes('Device protocol has not been detected'));
65592
+ }
65567
65593
  function connectDeviceForBle(method, device, retryCount = 0) {
65568
65594
  var _a;
65569
65595
  return __awaiter(this, void 0, void 0, function* () {
@@ -65598,7 +65624,8 @@ function connectDeviceForBle(method, device, retryCount = 0) {
65598
65624
  }
65599
65625
  }
65600
65626
  catch (err) {
65601
- if (hdShared.ERROR_CODES_REQUIRE_DISCONNECT.includes(err.errorCode) &&
65627
+ const requiresColdReconnect = isMissingDetectedProtocolError(err);
65628
+ if ((hdShared.ERROR_CODES_REQUIRE_DISCONNECT.includes(err.errorCode) || requiresColdReconnect) &&
65602
65629
  device.mainId &&
65603
65630
  device.deviceConnector) {
65604
65631
  yield device.deviceConnector.disconnect(device.mainId).catch(() => undefined);
@@ -65606,10 +65633,11 @@ function connectDeviceForBle(method, device, retryCount = 0) {
65606
65633
  }
65607
65634
  if ((err.errorCode === hdShared.HardwareErrorCode.BleTimeoutError ||
65608
65635
  err.errorCode === hdShared.HardwareErrorCode.BleConnectedError ||
65609
- isRetryableBleProtocolV2ProbeError(method, err)) &&
65636
+ isRetryableBleProtocolV2ProbeError(method, err) ||
65637
+ requiresColdReconnect) &&
65610
65638
  retryCount < 6) {
65611
65639
  const nextRetry = retryCount + 1;
65612
- Log.debug(`Bluetooth connect timeout and will retry, retry count: ${nextRetry}`);
65640
+ Log.debug(`Bluetooth connection will retry, retry count: ${nextRetry}`);
65613
65641
  yield wait(3000);
65614
65642
  yield connectDeviceForBle(method, device, nextRetry);
65615
65643
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onekeyfe/hd-core",
3
- "version": "1.2.0-alpha.129",
3
+ "version": "1.2.0-alpha.130",
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.0-alpha.129",
29
- "@onekeyfe/hd-transport": "1.2.0-alpha.129",
28
+ "@onekeyfe/hd-shared": "1.2.0-alpha.130",
29
+ "@onekeyfe/hd-transport": "1.2.0-alpha.130",
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": "d996758fef2d61a868b1989efcce1f04c8ef5e22"
49
+ "gitHead": "287003096bc4df3a5824f2bea77e50f7fdc20565"
50
50
  }
@@ -168,8 +168,7 @@ export default class DeviceSettings extends BaseMethod<ApplySettings> {
168
168
  async run() {
169
169
  try {
170
170
  if (this.device.isProtocolV2()) {
171
- const refreshStatusAndSettings = () =>
172
- this.device.getDeviceState({ refreshSections: ['status', 'settings'] });
171
+ const refreshStatusAndSettings = () => this.device.refreshProtocolV2SettingsAfterMutation();
173
172
  assertSettingsSupported(this.payload, DEVICE_SETTINGS_V1_ONLY_FIELDS, 'Protocol V2');
174
173
  const capabilities = getDeviceSettingsCapabilities(
175
174
  this.device.getCurrentDeviceType(),
@@ -143,6 +143,7 @@ export default class DeviceUploadWallpaper extends BaseMethod<DeviceUploadWallpa
143
143
  const response = await this.device.commands.typedCall('DeviceSettingsSet', 'Success', {
144
144
  settings: { wallpaper_path: this.path },
145
145
  });
146
+ await this.device.refreshProtocolV2SettingsAfterMutation();
146
147
  return {
147
148
  path: this.path,
148
149
  size: encoded.data.byteLength,
package/src/core/index.ts CHANGED
@@ -296,13 +296,6 @@ const handlePreWarmSignal = async (
296
296
  }
297
297
  };
298
298
 
299
- const waitWithTimeout = async (promise: Promise<any>, timeout: number) => {
300
- const timeoutPromise = new Promise((_, reject) => {
301
- setTimeout(() => reject(new Error('Request timeout')), timeout);
302
- });
303
- return Promise.race([promise, timeoutPromise]);
304
- };
305
-
306
299
  const waitForPendingPromise = async (
307
300
  getPrePendingCallPromise: () => Promise<void> | undefined,
308
301
  removePrePendingCallPromise?: (promise: Promise<void> | undefined) => void
@@ -311,9 +304,9 @@ const waitForPendingPromise = async (
311
304
  if (pendingPromise) {
312
305
  Log.debug('pre pending call promise before call method, wait for it');
313
306
  try {
314
- await waitWithTimeout(pendingPromise, 5 * 1000);
307
+ await pendingPromise;
315
308
  } catch (error) {
316
- // ignore timeout error
309
+ // Cancellation is best-effort, but its teardown must settle before reuse.
317
310
  }
318
311
  removePrePendingCallPromise?.(pendingPromise);
319
312
  Log.debug('pre pending call promise before call method done');
@@ -906,6 +899,15 @@ function isRetryableBleProtocolV2ProbeError(method: BaseMethod, error: unknown)
906
899
  );
907
900
  }
908
901
 
902
+ function isMissingDetectedProtocolError(error: unknown) {
903
+ const typedError = error as { errorCode?: unknown; message?: unknown };
904
+ return (
905
+ typedError?.errorCode === HardwareErrorCode.RuntimeError &&
906
+ typeof typedError.message === 'string' &&
907
+ typedError.message.includes('Device protocol has not been detected')
908
+ );
909
+ }
910
+
909
911
  /**
910
912
  * If the Bluetooth connection times out, retry up to 6 times
911
913
  * @param retryCount - Current retry count (default 0)
@@ -943,12 +945,13 @@ async function connectDeviceForBle(method: BaseMethod, device: Device, retryCoun
943
945
  DevicePool.emitter.emit(DEVICE.CONNECT, device);
944
946
  }
945
947
  } catch (err) {
948
+ const requiresColdReconnect = isMissingDetectedProtocolError(err);
946
949
  // Device.run()'s REQUIRE_DISCONNECT handling never sees acquire/initialize
947
950
  // failures, so with keep-alive a wedged link would be reused by every retry
948
951
  // (field case: Initialize timing out at 25s per attempt, forever). Drop it
949
952
  // here so the next retry cold-connects.
950
953
  if (
951
- ERROR_CODES_REQUIRE_DISCONNECT.includes(err.errorCode) &&
954
+ (ERROR_CODES_REQUIRE_DISCONNECT.includes(err.errorCode) || requiresColdReconnect) &&
952
955
  device.mainId &&
953
956
  device.deviceConnector
954
957
  ) {
@@ -961,11 +964,12 @@ async function connectDeviceForBle(method: BaseMethod, device: Device, retryCoun
961
964
  if (
962
965
  (err.errorCode === HardwareErrorCode.BleTimeoutError ||
963
966
  err.errorCode === HardwareErrorCode.BleConnectedError ||
964
- isRetryableBleProtocolV2ProbeError(method, err)) &&
967
+ isRetryableBleProtocolV2ProbeError(method, err) ||
968
+ requiresColdReconnect) &&
965
969
  retryCount < 6
966
970
  ) {
967
971
  const nextRetry = retryCount + 1;
968
- Log.debug(`Bluetooth connect timeout and will retry, retry count: ${nextRetry}`);
972
+ Log.debug(`Bluetooth connection will retry, retry count: ${nextRetry}`);
969
973
  await wait(3000);
970
974
  await connectDeviceForBle(method, device, nextRetry);
971
975
  } else {
@@ -284,6 +284,9 @@ export class Device extends EventEmitter {
284
284
 
285
285
  runPromise?: Deferred<void> | null;
286
286
 
287
+ /** Resolves only after the active run has completed its release path. */
288
+ private runCleanupPromise?: Promise<void>;
289
+
287
290
  externalState: string[] = [];
288
291
 
289
292
  unavailableCapabilities: UnavailableCapabilities = {};
@@ -1079,6 +1082,10 @@ export class Device extends EventEmitter {
1079
1082
  return params.includeRaw ? cloneDeviceState(this.state) : createPublicDeviceState(this.state);
1080
1083
  }
1081
1084
 
1085
+ async refreshProtocolV2SettingsAfterMutation() {
1086
+ return this.getDeviceState({ refreshSections: ['status', 'settings'] });
1087
+ }
1088
+
1082
1089
  _updateFeatures(protoFeatures: PROTO.Features | Features, initSession?: boolean) {
1083
1090
  const previousDeviceId = this.getCurrentDeviceId();
1084
1091
  let feat =
@@ -1396,12 +1403,20 @@ export class Device extends EventEmitter {
1396
1403
 
1397
1404
  const runPromise = createDeferred<void>();
1398
1405
  this.runPromise = runPromise;
1399
- this._runInner(fn, options, runPromise).catch(error => {
1406
+ const cleanupPromise = this._runInner(fn, options, runPromise).catch(error => {
1400
1407
  if (this.runPromise === runPromise) {
1401
1408
  this.runPromise = null;
1402
1409
  }
1403
1410
  runPromise.reject(error);
1404
1411
  });
1412
+ this.runCleanupPromise = cleanupPromise;
1413
+ cleanupPromise
1414
+ .finally(() => {
1415
+ if (this.runCleanupPromise === cleanupPromise) {
1416
+ this.runCleanupPromise = undefined;
1417
+ }
1418
+ })
1419
+ .catch(() => undefined);
1405
1420
  return runPromise.promise;
1406
1421
  }
1407
1422
 
@@ -1513,13 +1528,26 @@ export class Device extends EventEmitter {
1513
1528
 
1514
1529
  async interruptionFromUser() {
1515
1530
  const error = ERRORS.TypedError(HardwareErrorCode.DeviceInterruptedFromUser);
1516
- await this.cancelableAction?.(error);
1531
+ const cleanupPromise = this.runCleanupPromise;
1532
+ const { cancelableAction } = this;
1533
+ if (cancelableAction) {
1534
+ await cancelableAction(error);
1535
+ } else if (
1536
+ this.isProtocolV2() &&
1537
+ DataManager.isBleConnect(DataManager.getSettings('env')) &&
1538
+ this.hasDeviceAcquire()
1539
+ ) {
1540
+ await this.commands?.cancelDevice?.().catch(cancelError => {
1541
+ Log.debug('Protocol V2 BLE fallback cancel error', cancelError);
1542
+ });
1543
+ }
1517
1544
  await this.commands?.cancel();
1518
1545
 
1519
1546
  if (this.runPromise) {
1520
1547
  this.runPromise.reject(error);
1521
1548
  this.runPromise = null;
1522
1549
  }
1550
+ await cleanupPromise?.catch(() => undefined);
1523
1551
  }
1524
1552
 
1525
1553
  setCancelableAction(callback: (err?: Error) => Promise<unknown>) {