@onekeyfe/hd-common-connect-sdk 1.2.2-alpha.9 → 1.2.2

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
@@ -2,6 +2,10 @@ import { CORE_EVENT, DEVICE, DEVICE_EVENT, initCore } from '@onekeyfe/hd-core';
2
2
 
3
3
  import HardwareCommonConnectSdk from '../src';
4
4
 
5
+ jest.mock('../../core/src/data/config', () => ({
6
+ getSDKVersion: jest.fn(() => '1.0.0-test'),
7
+ DEFAULT_DOMAIN: 'https://jssdk.onekey.so/1.0.0-test/',
8
+ }));
5
9
  jest.mock('@onekeyfe/hd-core', () => {
6
10
  const actual = jest.requireActual('@onekeyfe/hd-core');
7
11
  return {
@@ -1,5 +1,25 @@
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-http', () => ({}));
20
+ jest.mock('@onekeyfe/hd-transport-web-device', () => ({}));
21
+ jest.mock('@onekeyfe/hd-transport-lowlevel', () => ({}));
22
+ jest.mock('@onekeyfe/hd-transport-emulator', () => ({}));
3
23
 
4
24
  describe('hd-common-connect-sdk device state events', () => {
5
25
  test('forwards the canonical DEVICE.STATE event to SDK consumers', () => {
@@ -9,3 +29,64 @@ describe('hd-common-connect-sdk device state events', () => {
9
29
  expect(source).toContain('eventEmitter.emit(message.type, message.payload)');
10
30
  });
11
31
  });
32
+
33
+ const sdk = sdkExport as unknown as {
34
+ init(settings: Record<string, unknown>): Promise<boolean>;
35
+ call(params: Record<string, unknown>): Promise<unknown>;
36
+ dispose(): Promise<void>;
37
+ };
38
+
39
+ describe('SDK request cleanup', () => {
40
+ const core = Object.assign(new EventEmitter(), {
41
+ handleMessage: jest.fn(),
42
+ dispose: jest.fn(),
43
+ });
44
+
45
+ beforeEach(async () => {
46
+ core.handleMessage.mockReset();
47
+ core.dispose.mockReset().mockImplementation(() => {
48
+ core.removeAllListeners();
49
+ return Promise.resolve();
50
+ });
51
+ jest.mocked(initCore).mockResolvedValue(core as never);
52
+ await sdk.init({ env: 'desktop-web-ble' });
53
+ });
54
+
55
+ afterEach(async () => {
56
+ await sdk.dispose();
57
+ });
58
+
59
+ test('removes only the completed request when calls settle out of order', async () => {
60
+ const first = createDeferred<unknown>();
61
+ const second = createDeferred<unknown>();
62
+ core.handleMessage.mockReturnValueOnce(first.promise).mockReturnValueOnce(second.promise);
63
+ const firstCall = sdk.call({ method: 'getDeviceState' });
64
+ const secondCall = sdk.call({ method: 'getDeviceState' });
65
+ expect(Object.keys(messagePromises)).toHaveLength(2);
66
+ second.resolve({ success: true, payload: {} });
67
+ await secondCall;
68
+ expect(Object.keys(messagePromises)).toHaveLength(1);
69
+ first.reject(new Error('Connection failed'));
70
+ await firstCall;
71
+ expect(Object.keys(messagePromises)).toHaveLength(0);
72
+ });
73
+
74
+ test('waits for Core disposal and does not retain old listeners after reinitialization', async () => {
75
+ const cleanup = createDeferred<void>();
76
+ core.dispose.mockImplementationOnce(async () => {
77
+ await cleanup.promise;
78
+ core.removeAllListeners();
79
+ });
80
+ let finished = false;
81
+ const disposing = sdk.dispose().then(() => {
82
+ finished = true;
83
+ });
84
+ await Promise.resolve();
85
+ expect(core.dispose).toHaveBeenCalledTimes(1);
86
+ expect(finished).toBe(false);
87
+ cleanup.resolve();
88
+ await disposing;
89
+ await sdk.init({ env: 'desktop-web-ble' });
90
+ expect(core.listenerCount(CORE_EVENT)).toBe(1);
91
+ });
92
+ });
package/dist/index.js CHANGED
@@ -679,22 +679,26 @@ function handleMessage(message) {
679
679
  function postMessage(message, usePromise) {
680
680
  if (usePromise === void 0) { usePromise = true; }
681
681
  return __awaiter(this, void 0, void 0, function () {
682
- var response;
682
+ var messageId;
683
683
  return __generator(this, function (_a) {
684
684
  switch (_a.label) {
685
685
  case 0:
686
686
  if (!_core) {
687
687
  throw hdShared.ERRORS.TypedError('postMessage: _core not found');
688
688
  }
689
- if (!usePromise) return [3 /*break*/, 2];
689
+ if (!usePromise) return [3 /*break*/, 4];
690
690
  _messageID++;
691
- messagePromises[_messageID] = hdShared.createDeferred();
692
- return [4 /*yield*/, _core.handleMessage(__assign(__assign({}, message), { id: "".concat(_messageID) }))];
691
+ messageId = _messageID;
692
+ messagePromises[messageId] = hdShared.createDeferred();
693
+ _a.label = 1;
693
694
  case 1:
694
- response = _a.sent();
695
- // return promise;
696
- return [2 /*return*/, response];
697
- case 2:
695
+ _a.trys.push([1, , 3, 4]);
696
+ return [4 /*yield*/, _core.handleMessage(__assign(__assign({}, message), { id: "".concat(messageId) }))];
697
+ case 2: return [2 /*return*/, _a.sent()];
698
+ case 3:
699
+ delete messagePromises[messageId];
700
+ return [7 /*endfinally*/];
701
+ case 4:
698
702
  _core.handleMessage(message);
699
703
  return [2 /*return*/];
700
704
  }
package/jest.config.js ADDED
@@ -0,0 +1,9 @@
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
+ },
9
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onekeyfe/hd-common-connect-sdk",
3
- "version": "1.2.2-alpha.9",
3
+ "version": "1.2.2",
4
4
  "author": "OneKey",
5
5
  "homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
6
6
  "license": "ISC",
@@ -16,17 +16,18 @@
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.9",
24
- "@onekeyfe/hd-shared": "1.2.2-alpha.9",
25
- "@onekeyfe/hd-transport-emulator": "1.2.2-alpha.9",
26
- "@onekeyfe/hd-transport-http": "1.2.2-alpha.9",
27
- "@onekeyfe/hd-transport-lowlevel": "1.2.2-alpha.9",
28
- "@onekeyfe/hd-transport-usb": "1.2.2-alpha.9",
29
- "@onekeyfe/hd-transport-web-device": "1.2.2-alpha.9"
24
+ "@onekeyfe/hd-core": "1.2.2",
25
+ "@onekeyfe/hd-shared": "1.2.2",
26
+ "@onekeyfe/hd-transport-emulator": "1.2.2",
27
+ "@onekeyfe/hd-transport-http": "1.2.2",
28
+ "@onekeyfe/hd-transport-lowlevel": "1.2.2",
29
+ "@onekeyfe/hd-transport-usb": "1.2.2",
30
+ "@onekeyfe/hd-transport-web-device": "1.2.2"
30
31
  },
31
- "gitHead": "c097e98f32c451ccdda468da1195daf679e991e6"
32
+ "gitHead": "859070892dad35c285433c032e5173c9db332ce7"
32
33
  }
package/src/index.ts CHANGED
@@ -132,11 +132,13 @@ async function postMessage(message: CoreMessage, usePromise = true) {
132
132
 
133
133
  if (usePromise) {
134
134
  _messageID++;
135
- messagePromises[_messageID] = createDeferred();
136
- // const { promise } = messagePromises[_messageID];
137
- const response = await _core.handleMessage({ ...message, id: `${_messageID}` });
138
- // return promise;
139
- return response;
135
+ const messageId = _messageID;
136
+ messagePromises[messageId] = createDeferred();
137
+ try {
138
+ return await _core.handleMessage({ ...message, id: `${messageId}` });
139
+ } finally {
140
+ delete messagePromises[messageId];
141
+ }
140
142
  }
141
143
 
142
144
  _core.handleMessage(message);