@onekeyfe/hd-common-connect-sdk 1.2.3-alpha.2 → 1.2.3-alpha.4
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 +1 -1
- package/__tests__/device-state-event.test.js +4 -0
- package/__tests__/device-state-events.test.ts +81 -0
- package/dist/index.js +12 -8
- package/jest.config.js +9 -0
- package/package.json +10 -9
- package/src/index.ts +7 -5
package/README.md
CHANGED
|
@@ -30,7 +30,7 @@ function init() {
|
|
|
30
30
|
|
|
31
31
|
## Docs
|
|
32
32
|
|
|
33
|
-
Documentation is available [
|
|
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
|
|
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*/,
|
|
689
|
+
if (!usePromise) return [3 /*break*/, 4];
|
|
690
690
|
_messageID++;
|
|
691
|
-
|
|
692
|
-
|
|
691
|
+
messageId = _messageID;
|
|
692
|
+
messagePromises[messageId] = hdShared.createDeferred();
|
|
693
|
+
_a.label = 1;
|
|
693
694
|
case 1:
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
case
|
|
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.3-alpha.
|
|
3
|
+
"version": "1.2.3-alpha.4",
|
|
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.3-alpha.
|
|
24
|
-
"@onekeyfe/hd-shared": "1.2.3-alpha.
|
|
25
|
-
"@onekeyfe/hd-transport-emulator": "1.2.3-alpha.
|
|
26
|
-
"@onekeyfe/hd-transport-http": "1.2.3-alpha.
|
|
27
|
-
"@onekeyfe/hd-transport-lowlevel": "1.2.3-alpha.
|
|
28
|
-
"@onekeyfe/hd-transport-usb": "1.2.3-alpha.
|
|
29
|
-
"@onekeyfe/hd-transport-web-device": "1.2.3-alpha.
|
|
24
|
+
"@onekeyfe/hd-core": "1.2.3-alpha.4",
|
|
25
|
+
"@onekeyfe/hd-shared": "1.2.3-alpha.4",
|
|
26
|
+
"@onekeyfe/hd-transport-emulator": "1.2.3-alpha.4",
|
|
27
|
+
"@onekeyfe/hd-transport-http": "1.2.3-alpha.4",
|
|
28
|
+
"@onekeyfe/hd-transport-lowlevel": "1.2.3-alpha.4",
|
|
29
|
+
"@onekeyfe/hd-transport-usb": "1.2.3-alpha.4",
|
|
30
|
+
"@onekeyfe/hd-transport-web-device": "1.2.3-alpha.4"
|
|
30
31
|
},
|
|
31
|
-
"gitHead": "
|
|
32
|
+
"gitHead": "705729baaec54b86a4fc28cce310a85b67b82730"
|
|
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
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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);
|