@onekeyfe/hd-ble-sdk 1.2.2-alpha.11 → 1.2.2-alpha.111

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/README.md CHANGED
@@ -30,7 +30,7 @@ function init() {
30
30
 
31
31
  ## Docs
32
32
 
33
- Documentation is available [hardware-js-sdk](https://developer.onekey.so/connect-to-hardware/hardware-sdk/start)
33
+ Documentation is available [Hardware SDK Getting Started](https://developer.onekey.so/en/hardware-sdk/getting-started)
34
34
 
35
35
  ## Examples
36
36
  // TODO: add example url
@@ -1,5 +1,22 @@
1
1
  import { readFileSync } from 'fs';
2
2
  import { resolve } from 'path';
3
+ import EventEmitter from 'events';
4
+ import { CORE_EVENT, initCore } from '@onekeyfe/hd-core';
5
+ import { createDeferred } from '@onekeyfe/hd-shared';
6
+
7
+ import sdkExport, { messagePromises } from '../src';
8
+
9
+ jest.mock('../../core/src/data/config', () => ({
10
+ getSDKVersion: jest.fn(() => '1.0.0-test'),
11
+ DEFAULT_DOMAIN: 'https://jssdk.onekey.so/1.0.0-test/',
12
+ }));
13
+ jest.mock('@onekeyfe/hd-core', () => ({
14
+ ...jest.requireActual('@onekeyfe/hd-core'),
15
+ __esModule: true,
16
+ default: (options: unknown) => options,
17
+ initCore: jest.fn(),
18
+ }));
19
+ jest.mock('@onekeyfe/hd-transport-react-native', () => ({}));
3
20
 
4
21
  describe('hd-ble-sdk device state events', () => {
5
22
  test('forwards DEVICE.STATE to React Native SDK consumers', () => {
@@ -13,3 +30,64 @@ describe('hd-ble-sdk device state events', () => {
13
30
  expect(deviceEventHandler).toContain('eventEmitter.emit(message.type, message.payload)');
14
31
  });
15
32
  });
33
+
34
+ const sdk = sdkExport as unknown as {
35
+ init(settings: Record<string, unknown>): Promise<boolean>;
36
+ call(params: Record<string, unknown>): Promise<unknown>;
37
+ dispose(): Promise<void>;
38
+ };
39
+
40
+ describe('SDK request cleanup', () => {
41
+ const core = Object.assign(new EventEmitter(), {
42
+ handleMessage: jest.fn(),
43
+ dispose: jest.fn(),
44
+ });
45
+
46
+ beforeEach(async () => {
47
+ core.handleMessage.mockReset();
48
+ core.dispose.mockReset().mockImplementation(() => {
49
+ core.removeAllListeners();
50
+ return Promise.resolve();
51
+ });
52
+ jest.mocked(initCore).mockResolvedValue(core as never);
53
+ await sdk.init({ env: 'desktop-web-ble' });
54
+ });
55
+
56
+ afterEach(async () => {
57
+ await sdk.dispose();
58
+ });
59
+
60
+ test('removes only the completed request when calls settle out of order', async () => {
61
+ const first = createDeferred<unknown>();
62
+ const second = createDeferred<unknown>();
63
+ core.handleMessage.mockReturnValueOnce(first.promise).mockReturnValueOnce(second.promise);
64
+ const firstCall = sdk.call({ method: 'getDeviceState' });
65
+ const secondCall = sdk.call({ method: 'getDeviceState' });
66
+ expect(Object.keys(messagePromises)).toHaveLength(2);
67
+ second.resolve({ success: true, payload: {} });
68
+ await secondCall;
69
+ expect(Object.keys(messagePromises)).toHaveLength(1);
70
+ first.reject(new Error('Connection failed'));
71
+ await firstCall;
72
+ expect(Object.keys(messagePromises)).toHaveLength(0);
73
+ });
74
+
75
+ test('waits for Core disposal and does not retain old listeners after reinitialization', async () => {
76
+ const cleanup = createDeferred<void>();
77
+ core.dispose.mockImplementationOnce(async () => {
78
+ await cleanup.promise;
79
+ core.removeAllListeners();
80
+ });
81
+ let finished = false;
82
+ const disposing = sdk.dispose().then(() => {
83
+ finished = true;
84
+ });
85
+ await Promise.resolve();
86
+ expect(core.dispose).toHaveBeenCalledTimes(1);
87
+ expect(finished).toBe(false);
88
+ cleanup.resolve();
89
+ await disposing;
90
+ await sdk.init({ env: 'desktop-web-ble' });
91
+ expect(core.listenerCount(CORE_EVENT)).toBe(1);
92
+ });
93
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AASpD,eAAO,MAAM,eAAe,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;CAAO,CAAC;AAuJpE,QAAA,MAAM,cAAc,qCASlB,CAAC;AAEH,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AASpD,eAAO,MAAM,eAAe,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;CAAO,CAAC;AA+JpE,QAAA,MAAM,cAAc,qCASlB,CAAC;AAEH,eAAe,cAAc,CAAC"}
package/dist/index.js CHANGED
@@ -523,10 +523,17 @@ let _core;
523
523
  let _settings = HardwareSdk.parseConnectSettings();
524
524
  let _messageID = 0;
525
525
  const messagePromises = {};
526
- const dispose = () => {
526
+ const dispose = () => __awaiter(void 0, void 0, void 0, function* () {
527
+ var _a;
528
+ const core = _core;
529
+ _core = undefined;
527
530
  eventEmitter.removeAllListeners();
531
+ Object.keys(messagePromises).forEach(key => {
532
+ delete messagePromises[Number(key)];
533
+ });
528
534
  _settings = HardwareSdk.parseConnectSettings();
529
- };
535
+ yield ((_a = core === null || core === void 0 ? void 0 : core.dispose) === null || _a === void 0 ? void 0 : _a.call(core));
536
+ });
530
537
  const uiResponse = (response) => {
531
538
  if (!_core) {
532
539
  throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.NotInitialized);
@@ -597,9 +604,14 @@ function postMessage(message, usePromise = true) {
597
604
  }
598
605
  if (usePromise) {
599
606
  _messageID++;
600
- messagePromises[_messageID] = hdShared.createDeferred();
601
- const response = yield _core.handleMessage(Object.assign(Object.assign({}, message), { id: `${_messageID}` }));
602
- return response;
607
+ const messageId = _messageID;
608
+ messagePromises[messageId] = hdShared.createDeferred();
609
+ try {
610
+ return yield _core.handleMessage(Object.assign(Object.assign({}, message), { id: `${messageId}` }));
611
+ }
612
+ finally {
613
+ delete messagePromises[messageId];
614
+ }
603
615
  }
604
616
  _core.handleMessage(message);
605
617
  });
@@ -620,7 +632,7 @@ const init = (settings) => __awaiter(void 0, void 0, void 0, function* () {
620
632
  }
621
633
  });
622
634
  const call = (params) => __awaiter(void 0, void 0, void 0, function* () {
623
- var _a, _b, _c;
635
+ var _b, _c, _d;
624
636
  const blockLog = HardwareSdk.getLogBlockLabel(params);
625
637
  Log.debug('call: ', blockLog !== null && blockLog !== void 0 ? blockLog : params);
626
638
  try {
@@ -628,13 +640,13 @@ const call = (params) => __awaiter(void 0, void 0, void 0, function* () {
628
640
  if (response) {
629
641
  Log.debug('response: ', blockLog ? '[REDACTED]' : response);
630
642
  if (!response.success) {
631
- if (((_a = response.payload) === null || _a === void 0 ? void 0 : _a.code) === hdShared.HardwareErrorCode.BlePermissionError) {
643
+ if (((_b = response.payload) === null || _b === void 0 ? void 0 : _b.code) === hdShared.HardwareErrorCode.BlePermissionError) {
632
644
  postMessage(HardwareSdk.createUiMessage(HardwareSdk.UI_REQUEST.BLUETOOTH_PERMISSION), false);
633
645
  }
634
- if (((_b = response.payload) === null || _b === void 0 ? void 0 : _b.code) === hdShared.HardwareErrorCode.BleLocationError) {
646
+ if (((_c = response.payload) === null || _c === void 0 ? void 0 : _c.code) === hdShared.HardwareErrorCode.BleLocationError) {
635
647
  postMessage(HardwareSdk.createUiMessage(HardwareSdk.UI_REQUEST.LOCATION_PERMISSION), false);
636
648
  }
637
- if (((_c = response.payload) === null || _c === void 0 ? void 0 : _c.code) === hdShared.HardwareErrorCode.BleLocationServicesDisabled) {
649
+ if (((_d = response.payload) === null || _d === void 0 ? void 0 : _d.code) === hdShared.HardwareErrorCode.BleLocationServicesDisabled) {
638
650
  postMessage(HardwareSdk.createUiMessage(HardwareSdk.UI_REQUEST.LOCATION_SERVICE_PERMISSION), false);
639
651
  }
640
652
  }
package/jest.config.js ADDED
@@ -0,0 +1,10 @@
1
+ module.exports = {
2
+ preset: '../../jest.config.js',
3
+ testEnvironment: 'node',
4
+ modulePathIgnorePatterns: ['node_modules', '<rootDir>/dist'],
5
+ moduleNameMapper: {
6
+ '^@onekeyfe/hd-core$': '<rootDir>/../core/src/index.ts',
7
+ '^@onekeyfe/hd-shared$': '<rootDir>/../shared/src/index.ts',
8
+ '^@onekeyfe/hd-transport-react-native$': '<rootDir>/../hd-transport-react-native/src/index.ts',
9
+ },
10
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onekeyfe/hd-ble-sdk",
3
- "version": "1.2.2-alpha.11",
3
+ "version": "1.2.2-alpha.111",
4
4
  "author": "OneKey",
5
5
  "homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
6
6
  "license": "ISC",
@@ -16,13 +16,14 @@
16
16
  "scripts": {
17
17
  "dev": "rimraf dist && rollup -c ../../build/rollup.config.js -w",
18
18
  "build": "rimraf dist && rollup -c ../../build/rollup.config.js",
19
+ "test": "jest",
19
20
  "lint": "eslint .",
20
21
  "lint:fix": "eslint . --fix"
21
22
  },
22
23
  "dependencies": {
23
- "@onekeyfe/hd-core": "1.2.2-alpha.11",
24
- "@onekeyfe/hd-shared": "1.2.2-alpha.11",
25
- "@onekeyfe/hd-transport-react-native": "1.2.2-alpha.11"
24
+ "@onekeyfe/hd-core": "1.2.2-alpha.111",
25
+ "@onekeyfe/hd-shared": "1.2.2-alpha.111",
26
+ "@onekeyfe/hd-transport-react-native": "1.2.2-alpha.111"
26
27
  },
27
- "gitHead": "8928100acb893d72361eb74422d5e2a0f7af77d8"
28
+ "gitHead": "a87be5a4ae4b59f91f853a9873a9e8e924bbdfd6"
28
29
  }
package/src/index.ts CHANGED
@@ -33,9 +33,15 @@ let _settings = parseConnectSettings();
33
33
  let _messageID = 0;
34
34
  export const messagePromises: { [key: number]: Deferred<any> } = {};
35
35
 
36
- const dispose = () => {
36
+ const dispose = async () => {
37
+ const core = _core;
38
+ _core = undefined;
37
39
  eventEmitter.removeAllListeners();
40
+ Object.keys(messagePromises).forEach(key => {
41
+ delete messagePromises[Number(key)];
42
+ });
38
43
  _settings = parseConnectSettings();
44
+ await core?.dispose?.();
39
45
  };
40
46
 
41
47
  const uiResponse = (response: UiResponseEvent) => {
@@ -114,11 +120,13 @@ async function postMessage(message: CoreMessage, usePromise = true) {
114
120
 
115
121
  if (usePromise) {
116
122
  _messageID++;
117
- messagePromises[_messageID] = createDeferred();
118
- // const { promise } = messagePromises[_messageID];
119
- const response = await _core.handleMessage({ ...message, id: `${_messageID}` });
120
- // return promise;
121
- return response;
123
+ const messageId = _messageID;
124
+ messagePromises[messageId] = createDeferred();
125
+ try {
126
+ return await _core.handleMessage({ ...message, id: `${messageId}` });
127
+ } finally {
128
+ delete messagePromises[messageId];
129
+ }
122
130
  }
123
131
 
124
132
  _core.handleMessage(message);