@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 +1 -1
- package/__tests__/device-state-events.test.ts +78 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -9
- package/jest.config.js +10 -0
- package/package.json +6 -5
- package/src/index.ts +14 -6
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
|
|
@@ -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
|
+
});
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
601
|
-
|
|
602
|
-
|
|
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
|
|
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 (((
|
|
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 (((
|
|
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 (((
|
|
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.
|
|
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.
|
|
24
|
-
"@onekeyfe/hd-shared": "1.2.2-alpha.
|
|
25
|
-
"@onekeyfe/hd-transport-react-native": "1.2.2-alpha.
|
|
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": "
|
|
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
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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);
|