@onekeyfe/hd-common-connect-sdk 1.2.0-alpha.55 → 1.2.0-alpha.57

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
@@ -1,6 +1,7 @@
1
1
  # `@onekeyfe/hd-common-connect-sdk`
2
2
 
3
- `@onekeyfe/hd-common-connect-sdk` is a libarary that runs in the node enviroment. And communicates with transport in the normal way.
3
+ `@onekeyfe/hd-common-connect-sdk` selects the transport for Node, browser WebUSB,
4
+ Electron BLE, low-level, and emulator environments. It does not use an iframe.
4
5
 
5
6
  ## Installation
6
7
 
@@ -24,13 +25,18 @@ import HardwareSDK from '@onekeyfe/hd-common-connect-sdk';
24
25
  function init() {
25
26
  HardwareSDK.init({
26
27
  debug: false,
28
+ env: 'webusb',
27
29
  });
28
30
  }
29
31
  ```
30
32
 
33
+ Test and factory-only methods are intentionally absent from the default SDK. Use
34
+ `@onekeyfe/hd-test-api` when those methods are required.
35
+
31
36
  ## Docs
32
37
 
33
38
  Documentation is available [hardware-js-sdk](https://developer.onekey.so/connect-to-hardware/hardware-sdk/start)
34
39
 
35
40
  ## Examples
41
+
36
42
  // TODO: add example url
@@ -1,15 +1,17 @@
1
1
  import { CORE_EVENT, DEVICE, DEVICE_EVENT, initCore } from '@onekeyfe/hd-core';
2
+ import { WebUsbTransport } from '@onekeyfe/hd-transport-web-device';
2
3
 
3
- import HardwareCommonConnectSdk from '../src';
4
+ import HardwareCommonConnectSdk, { createHardwareCommonConnectSdk } from '../src';
4
5
 
5
6
  jest.mock('@onekeyfe/hd-core', () => {
6
7
  const actual = jest.requireActual('@onekeyfe/hd-core');
7
8
  return {
8
9
  __esModule: true,
9
10
  ...actual,
10
- default: ({ eventEmitter, init, dispose }) => ({
11
+ default: ({ eventEmitter, init, dispose, call }) => ({
11
12
  init,
12
13
  dispose,
14
+ call,
13
15
  on: (type, listener) => eventEmitter.on(type, listener),
14
16
  off: (type, listener) => eventEmitter.off(type, listener),
15
17
  removeAllListeners: type => eventEmitter.removeAllListeners(type),
@@ -77,6 +79,11 @@ describe('hd-common-connect-sdk device state events', () => {
77
79
  HardwareCommonConnectSdk.on(DEVICE.STATE, listener);
78
80
 
79
81
  await HardwareCommonConnectSdk.init({ env: 'webusb' });
82
+ expect(initCore).toHaveBeenLastCalledWith(
83
+ expect.objectContaining({ env: 'webusb' }),
84
+ WebUsbTransport,
85
+ undefined
86
+ );
80
87
  const payload = {
81
88
  connectId: 'connect-id',
82
89
  revision: 1,
@@ -94,4 +101,33 @@ describe('hd-common-connect-sdk device state events', () => {
94
101
  HardwareCommonConnectSdk.removeAllListeners(DEVICE.STATE);
95
102
  await HardwareCommonConnectSdk.dispose();
96
103
  });
104
+
105
+ test('keeps method extensions scoped to the created SDK instance', async () => {
106
+ const methodExtension = {
107
+ name: 'test-extension',
108
+ methods: {},
109
+ };
110
+ const extendedSdk = createHardwareCommonConnectSdk({
111
+ extension: {
112
+ methodExtensions: [methodExtension],
113
+ createApi: () => ({ extensionMarker: () => 'enabled' }),
114
+ },
115
+ });
116
+
117
+ expect(extendedSdk.extensionMarker()).toBe('enabled');
118
+ expect(HardwareCommonConnectSdk).not.toHaveProperty('extensionMarker');
119
+
120
+ initCore.mockResolvedValue({ on: jest.fn(), dispose: jest.fn() });
121
+ await extendedSdk.init({ env: 'webusb' });
122
+ expect(initCore).toHaveBeenLastCalledWith(
123
+ expect.objectContaining({ env: 'webusb' }),
124
+ WebUsbTransport,
125
+ undefined,
126
+ {
127
+ methodExtensions: [methodExtension],
128
+ allowDestructiveOperations: false,
129
+ }
130
+ );
131
+ await extendedSdk.dispose();
132
+ });
97
133
  });
package/dist/index.d.ts CHANGED
@@ -1,9 +1,18 @@
1
- import * as _onekeyfe_hd_core from '@onekeyfe/hd-core';
1
+ import { CoreMethodExtension, CoreApi } from '@onekeyfe/hd-core';
2
2
  import { Deferred } from '@onekeyfe/hd-shared';
3
3
 
4
+ type HardwareCommonConnectSdkExtension<TExtensionApi extends object> = {
5
+ methodExtensions: readonly CoreMethodExtension[];
6
+ createApi: (call: CoreApi['call']) => TExtensionApi;
7
+ };
8
+ type HardwareCommonConnectSdkOptions<TExtensionApi extends object> = {
9
+ extension?: HardwareCommonConnectSdkExtension<TExtensionApi>;
10
+ allowDestructiveOperations?: boolean;
11
+ };
12
+ declare const createHardwareCommonConnectSdk: <TExtensionApi extends object = Record<never, never>>(options?: HardwareCommonConnectSdkOptions<TExtensionApi>) => CoreApi & TExtensionApi;
13
+ declare const HardwareCommonConnectSdk: CoreApi & object;
4
14
  declare const messagePromises: {
5
15
  [key: number]: Deferred<any>;
6
16
  };
7
- declare const HardwareCommonConnectSdk: _onekeyfe_hd_core.CoreApi;
8
17
 
9
- export { HardwareCommonConnectSdk as default, messagePromises };
18
+ export { HardwareCommonConnectSdkExtension, HardwareCommonConnectSdkOptions, createHardwareCommonConnectSdk, HardwareCommonConnectSdk as default, messagePromises };
package/dist/index.js CHANGED
@@ -4,10 +4,10 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var HardwareSdk = require('@onekeyfe/hd-core');
6
6
  var hdShared = require('@onekeyfe/hd-shared');
7
+ var EmulatorTransport = require('@onekeyfe/hd-transport-emulator');
7
8
  var HttpTransport = require('@onekeyfe/hd-transport-http');
8
- var hdTransportWebDevice = require('@onekeyfe/hd-transport-web-device');
9
9
  var LowlevelTransport = require('@onekeyfe/hd-transport-lowlevel');
10
- var EmulatorTransport = require('@onekeyfe/hd-transport-emulator');
10
+ var hdTransportWebDevice = require('@onekeyfe/hd-transport-web-device');
11
11
 
12
12
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
13
 
@@ -30,9 +30,9 @@ function _interopNamespace(e) {
30
30
  }
31
31
 
32
32
  var HardwareSdk__default = /*#__PURE__*/_interopDefaultLegacy(HardwareSdk);
33
+ var EmulatorTransport__default = /*#__PURE__*/_interopDefaultLegacy(EmulatorTransport);
33
34
  var HttpTransport__default = /*#__PURE__*/_interopDefaultLegacy(HttpTransport);
34
35
  var LowlevelTransport__default = /*#__PURE__*/_interopDefaultLegacy(LowlevelTransport);
35
- var EmulatorTransport__default = /*#__PURE__*/_interopDefaultLegacy(EmulatorTransport);
36
36
 
37
37
  /******************************************************************************
38
38
  Copyright (c) Microsoft Corporation.
@@ -579,7 +579,6 @@ function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
579
579
  }
580
580
  }
581
581
 
582
- var eventEmitter = new events.exports();
583
582
  var Log = HardwareSdk.getLogger(HardwareSdk.LoggerNames.HdCommonConnectSdk);
584
583
  var getTransport = function (env) { return __awaiter(void 0, void 0, void 0, function () {
585
584
  var NodeUsbTransport;
@@ -605,185 +604,225 @@ var getTransport = function (env) { return __awaiter(void 0, void 0, void 0, fun
605
604
  }
606
605
  });
607
606
  }); };
608
- var _core;
609
- var _settings = HardwareSdk.parseConnectSettings();
610
- var _messageID = 0;
611
- var messagePromises = {};
612
- var dispose = function () { return __awaiter(void 0, void 0, void 0, function () {
607
+ var createSdkInstance = function (options) {
608
+ var _a, _b;
609
+ if (options === void 0) { options = {}; }
610
+ var eventEmitter = new events.exports.EventEmitter();
613
611
  var core;
614
- var _a;
615
- return __generator(this, function (_b) {
616
- switch (_b.label) {
617
- case 0:
618
- core = _core;
619
- _core = undefined;
620
- eventEmitter.removeAllListeners();
621
- Object.keys(messagePromises).forEach(function (key) {
622
- delete messagePromises[Number(key)];
623
- });
624
- _settings = HardwareSdk.parseConnectSettings();
625
- return [4 /*yield*/, ((_a = core === null || core === void 0 ? void 0 : core.dispose) === null || _a === void 0 ? void 0 : _a.call(core))];
626
- case 1:
627
- _b.sent();
628
- return [2 /*return*/];
612
+ var settings = HardwareSdk.parseConnectSettings();
613
+ var messageID = 0;
614
+ var instanceMessagePromises = {};
615
+ var dispose = function () { return __awaiter(void 0, void 0, void 0, function () {
616
+ var currentCore;
617
+ var _a;
618
+ return __generator(this, function (_b) {
619
+ switch (_b.label) {
620
+ case 0:
621
+ currentCore = core;
622
+ core = undefined;
623
+ eventEmitter.removeAllListeners();
624
+ Object.keys(instanceMessagePromises).forEach(function (key) {
625
+ delete instanceMessagePromises[Number(key)];
626
+ });
627
+ settings = HardwareSdk.parseConnectSettings();
628
+ return [4 /*yield*/, ((_a = currentCore === null || currentCore === void 0 ? void 0 : currentCore.dispose) === null || _a === void 0 ? void 0 : _a.call(currentCore))];
629
+ case 1:
630
+ _b.sent();
631
+ return [2 /*return*/];
632
+ }
633
+ });
634
+ }); };
635
+ var uiResponse = function (response) {
636
+ if (!core) {
637
+ throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.NotInitialized);
629
638
  }
630
- });
631
- }); };
632
- var uiResponse = function (response) {
633
- if (!_core) {
634
- throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.NotInitialized);
635
- }
636
- var type = response.type, payload = response.payload;
637
- _core.handleMessage({ event: HardwareSdk.UI_EVENT, type: type, payload: payload });
638
- };
639
- var cancel = function (connectId) {
640
- if (_core === undefined)
641
- return;
642
- _core.handleMessage({ event: HardwareSdk.IFRAME.CANCEL, type: HardwareSdk.IFRAME.CANCEL, payload: { connectId: connectId } });
643
- };
644
- function handleMessage(message) {
645
- var event = message.event;
646
- if (!_core) {
647
- return;
648
- }
649
- var blockLog = HardwareSdk.getLogBlockLabel(message);
650
- if (event !== HardwareSdk.LOG_EVENT) {
651
- Log.debug('hd-common-connect-sdk handleMessage', blockLog !== null && blockLog !== void 0 ? blockLog : message);
652
- }
653
- switch (event) {
654
- case HardwareSdk.UI_EVENT:
655
- // pass UI event up
656
- eventEmitter.emit(message.event, message);
657
- eventEmitter.emit(message.type, message.payload);
658
- break;
659
- case HardwareSdk.LOG_EVENT:
660
- case HardwareSdk.FIRMWARE_EVENT:
661
- eventEmitter.emit(message.event, message);
662
- break;
663
- case HardwareSdk.DEVICE_EVENT:
664
- if ([
665
- HardwareSdk.DEVICE.CONNECT,
666
- HardwareSdk.DEVICE.DISCONNECT,
667
- HardwareSdk.DEVICE.FEATURES,
668
- HardwareSdk.DEVICE.STATE,
669
- HardwareSdk.DEVICE.SUPPORT_FEATURES,
670
- ].includes(message.type)) {
639
+ var type = response.type, payload = response.payload;
640
+ core
641
+ .handleMessage({ event: HardwareSdk.UI_EVENT, type: type, payload: payload })
642
+ .catch(function (error) { return Log.error(HardwareSdk.createErrorMessage(error)); });
643
+ };
644
+ var cancel = function (connectId) {
645
+ if (!core)
646
+ return;
647
+ core
648
+ .handleMessage({
649
+ event: HardwareSdk.IFRAME.CANCEL,
650
+ type: HardwareSdk.IFRAME.CANCEL,
651
+ payload: { connectId: connectId },
652
+ })
653
+ .catch(function (error) { return Log.error(HardwareSdk.createErrorMessage(error)); });
654
+ };
655
+ function handleMessage(message) {
656
+ var event = message.event;
657
+ if (!core) {
658
+ return;
659
+ }
660
+ var blockLog = HardwareSdk.getLogBlockLabel(message);
661
+ if (event !== HardwareSdk.LOG_EVENT) {
662
+ Log.debug('hd-common-connect-sdk handleMessage', blockLog !== null && blockLog !== void 0 ? blockLog : message);
663
+ }
664
+ switch (event) {
665
+ case HardwareSdk.UI_EVENT:
666
+ eventEmitter.emit(message.event, message);
671
667
  eventEmitter.emit(message.type, message.payload);
668
+ break;
669
+ case HardwareSdk.LOG_EVENT:
670
+ case HardwareSdk.FIRMWARE_EVENT:
671
+ eventEmitter.emit(message.event, message);
672
+ break;
673
+ case HardwareSdk.DEVICE_EVENT:
674
+ if ([
675
+ HardwareSdk.DEVICE.CONNECT,
676
+ HardwareSdk.DEVICE.DISCONNECT,
677
+ HardwareSdk.DEVICE.FEATURES,
678
+ HardwareSdk.DEVICE.STATE,
679
+ HardwareSdk.DEVICE.SUPPORT_FEATURES,
680
+ ].includes(message.type)) {
681
+ eventEmitter.emit(message.type, message.payload);
682
+ }
683
+ break;
684
+ case HardwareSdk.IFRAME.CALLBACK: {
685
+ var _a = message.payload, callbackId = _a.callbackId, data = _a.data, error = _a.error;
686
+ HardwareSdk.executeCallback(callbackId, data, error);
687
+ break;
672
688
  }
673
- break;
674
- case HardwareSdk.IFRAME.CALLBACK: {
675
- var _a = message.payload, callbackId = _a.callbackId, data = _a.data, error = _a.error;
676
- HardwareSdk.executeCallback(callbackId, data, error);
677
- break;
689
+ default:
690
+ Log.log('No need to be captured message', message.event);
678
691
  }
679
- default:
680
- Log.log('No need to be captured message', message.event);
681
692
  }
682
- }
683
- function postMessage(message, usePromise) {
684
- if (usePromise === void 0) { usePromise = true; }
685
- return __awaiter(this, void 0, void 0, function () {
686
- var response;
687
- return __generator(this, function (_a) {
688
- switch (_a.label) {
693
+ function postMessage(message, usePromise) {
694
+ if (usePromise === void 0) { usePromise = true; }
695
+ return __awaiter(this, void 0, void 0, function () {
696
+ return __generator(this, function (_a) {
697
+ switch (_a.label) {
698
+ case 0:
699
+ if (!core) {
700
+ throw hdShared.ERRORS.TypedError('postMessage: _core not found');
701
+ }
702
+ if (usePromise) {
703
+ messageID += 1;
704
+ instanceMessagePromises[messageID] = hdShared.createDeferred();
705
+ return [2 /*return*/, core.handleMessage(__assign(__assign({}, message), { id: "".concat(messageID) }))];
706
+ }
707
+ return [4 /*yield*/, core.handleMessage(message)];
708
+ case 1:
709
+ _a.sent();
710
+ return [2 /*return*/];
711
+ }
712
+ });
713
+ });
714
+ }
715
+ var init = function (partialSettings, _, plugin) { return __awaiter(void 0, void 0, void 0, function () {
716
+ var Transport, error_1;
717
+ var _a;
718
+ return __generator(this, function (_b) {
719
+ switch (_b.label) {
689
720
  case 0:
690
- if (!_core) {
691
- throw hdShared.ERRORS.TypedError('postMessage: _core not found');
692
- }
693
- if (!usePromise) return [3 /*break*/, 2];
694
- _messageID++;
695
- messagePromises[_messageID] = hdShared.createDeferred();
696
- return [4 /*yield*/, _core.handleMessage(__assign(__assign({}, message), { id: "".concat(_messageID) }))];
721
+ settings = __assign(__assign(__assign({}, settings), partialSettings), { env: (_a = partialSettings.env) !== null && _a !== void 0 ? _a : 'node' });
722
+ HardwareSdk.enableLog(!!partialSettings.debug);
723
+ Log.debug('init');
724
+ _b.label = 1;
697
725
  case 1:
698
- response = _a.sent();
699
- // return promise;
700
- return [2 /*return*/, response];
726
+ _b.trys.push([1, 7, , 8]);
727
+ return [4 /*yield*/, getTransport(settings.env)];
701
728
  case 2:
702
- _core.handleMessage(message);
703
- return [2 /*return*/];
729
+ Transport = _b.sent();
730
+ if (!options.extension) return [3 /*break*/, 4];
731
+ return [4 /*yield*/, HardwareSdk.initCore(settings, Transport, plugin, {
732
+ methodExtensions: options.extension.methodExtensions,
733
+ allowDestructiveOperations: options.allowDestructiveOperations === true,
734
+ })];
735
+ case 3:
736
+ core = _b.sent();
737
+ return [3 /*break*/, 6];
738
+ case 4: return [4 /*yield*/, HardwareSdk.initCore(settings, Transport, plugin)];
739
+ case 5:
740
+ core = _b.sent();
741
+ _b.label = 6;
742
+ case 6:
743
+ core === null || core === void 0 ? void 0 : core.on(HardwareSdk.CORE_EVENT, handleMessage);
744
+ HardwareSdk.setLoggerPostMessage(handleMessage);
745
+ return [2 /*return*/, true];
746
+ case 7:
747
+ error_1 = _b.sent();
748
+ Log.error(HardwareSdk.createErrorMessage(error_1));
749
+ return [2 /*return*/, false];
750
+ case 8: return [2 /*return*/];
704
751
  }
705
752
  });
706
- });
707
- }
708
- var init = function (settings, _, plugin) { return __awaiter(void 0, void 0, void 0, function () {
709
- var Transport, error_1;
710
- var _a;
711
- return __generator(this, function (_b) {
712
- switch (_b.label) {
713
- case 0:
714
- _settings = __assign(__assign(__assign({}, _settings), settings), { env: (_a = settings.env) !== null && _a !== void 0 ? _a : 'node' });
715
- HardwareSdk.enableLog(!!settings.debug);
716
- Log.debug('init');
717
- _b.label = 1;
718
- case 1:
719
- _b.trys.push([1, 4, , 5]);
720
- return [4 /*yield*/, getTransport(_settings.env)];
721
- case 2:
722
- Transport = _b.sent();
723
- return [4 /*yield*/, HardwareSdk.initCore(_settings, Transport, plugin)];
724
- case 3:
725
- _core = _b.sent();
726
- _core === null || _core === void 0 ? void 0 : _core.on(HardwareSdk.CORE_EVENT, handleMessage);
727
- HardwareSdk.setLoggerPostMessage(handleMessage);
728
- return [2 /*return*/, true];
729
- case 4:
730
- error_1 = _b.sent();
731
- Log.error(HardwareSdk.createErrorMessage(error_1));
732
- return [2 /*return*/, false];
733
- case 5: return [2 /*return*/];
734
- }
735
- });
736
- }); };
737
- var call = function (params) { return __awaiter(void 0, void 0, void 0, function () {
738
- var blockLog, response, error_2;
739
- var _a, _b, _c;
740
- return __generator(this, function (_d) {
741
- switch (_d.label) {
742
- case 0:
743
- blockLog = HardwareSdk.getLogBlockLabel(params);
744
- Log.debug('call: ', blockLog !== null && blockLog !== void 0 ? blockLog : params);
745
- _d.label = 1;
746
- case 1:
747
- _d.trys.push([1, 3, , 4]);
748
- return [4 /*yield*/, postMessage({ event: HardwareSdk.IFRAME.CALL, type: HardwareSdk.IFRAME.CALL, payload: params })];
749
- case 2:
750
- response = _d.sent();
751
- if (response) {
752
- Log.debug('response: ', blockLog ? '[REDACTED]' : response);
753
- if (!response.success) {
754
- if (((_a = response.payload) === null || _a === void 0 ? void 0 : _a.code) === hdShared.HardwareErrorCode.BleUnsupported) {
755
- postMessage(HardwareSdk.createUiMessage(HardwareSdk.UI_REQUEST.BLUETOOTH_UNSUPPORTED), false);
756
- }
757
- if (((_b = response.payload) === null || _b === void 0 ? void 0 : _b.code) === hdShared.HardwareErrorCode.BlePoweredOff) {
758
- postMessage(HardwareSdk.createUiMessage(HardwareSdk.UI_REQUEST.BLUETOOTH_POWERED_OFF), false);
759
- }
760
- if (((_c = response.payload) === null || _c === void 0 ? void 0 : _c.code) === hdShared.HardwareErrorCode.BlePermissionError) {
761
- postMessage(HardwareSdk.createUiMessage(HardwareSdk.UI_REQUEST.BLUETOOTH_PERMISSION), false);
753
+ }); };
754
+ var call = function (params) { return __awaiter(void 0, void 0, void 0, function () {
755
+ var blockLog, response, error_2;
756
+ var _a, _b, _c;
757
+ return __generator(this, function (_d) {
758
+ switch (_d.label) {
759
+ case 0:
760
+ blockLog = HardwareSdk.getLogBlockLabel(params);
761
+ Log.debug('call: ', blockLog !== null && blockLog !== void 0 ? blockLog : params);
762
+ _d.label = 1;
763
+ case 1:
764
+ _d.trys.push([1, 3, , 4]);
765
+ return [4 /*yield*/, postMessage({
766
+ event: HardwareSdk.IFRAME.CALL,
767
+ type: HardwareSdk.IFRAME.CALL,
768
+ payload: params,
769
+ })];
770
+ case 2:
771
+ response = _d.sent();
772
+ if (response) {
773
+ Log.debug('response: ', blockLog ? '[REDACTED]' : response);
774
+ if (!response.success) {
775
+ if (((_a = response.payload) === null || _a === void 0 ? void 0 : _a.code) === hdShared.HardwareErrorCode.BleUnsupported) {
776
+ postMessage(HardwareSdk.createUiMessage(HardwareSdk.UI_REQUEST.BLUETOOTH_UNSUPPORTED), false).catch(function (error) {
777
+ return Log.error(HardwareSdk.createErrorMessage(error));
778
+ });
779
+ }
780
+ if (((_b = response.payload) === null || _b === void 0 ? void 0 : _b.code) === hdShared.HardwareErrorCode.BlePoweredOff) {
781
+ postMessage(HardwareSdk.createUiMessage(HardwareSdk.UI_REQUEST.BLUETOOTH_POWERED_OFF), false).catch(function (error) {
782
+ return Log.error(HardwareSdk.createErrorMessage(error));
783
+ });
784
+ }
785
+ if (((_c = response.payload) === null || _c === void 0 ? void 0 : _c.code) === hdShared.HardwareErrorCode.BlePermissionError) {
786
+ postMessage(HardwareSdk.createUiMessage(HardwareSdk.UI_REQUEST.BLUETOOTH_PERMISSION), false).catch(function (error) {
787
+ return Log.error(HardwareSdk.createErrorMessage(error));
788
+ });
789
+ }
762
790
  }
791
+ return [2 /*return*/, response];
763
792
  }
764
- return [2 /*return*/, response];
765
- }
766
- return [2 /*return*/, HardwareSdk.createErrorMessage(hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.CallMethodNotResponse))];
767
- case 3:
768
- error_2 = _d.sent();
769
- Log.error('__call error: ', error_2);
770
- return [2 /*return*/, HardwareSdk.createErrorMessage(error_2)];
771
- case 4: return [2 /*return*/];
772
- }
793
+ return [2 /*return*/, HardwareSdk.createErrorMessage(hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.CallMethodNotResponse))];
794
+ case 3:
795
+ error_2 = _d.sent();
796
+ Log.error('__call error: ', error_2);
797
+ return [2 /*return*/, HardwareSdk.createErrorMessage(error_2)];
798
+ case 4: return [2 /*return*/];
799
+ }
800
+ });
801
+ }); };
802
+ var updateSettings = function () { return Promise.resolve(true); };
803
+ var switchTransport = function () { return Promise.resolve({ success: true }); };
804
+ var sdk = HardwareSdk__default["default"]({
805
+ eventEmitter: eventEmitter,
806
+ init: init,
807
+ call: call,
808
+ cancel: cancel,
809
+ dispose: dispose,
810
+ uiResponse: uiResponse,
811
+ updateSettings: updateSettings,
812
+ switchTransport: switchTransport,
773
813
  });
774
- }); };
775
- var updateSettings = function () { return Promise.resolve(true); };
776
- var switchTransport = function () { return Promise.resolve({ success: true }); };
777
- var HardwareCommonConnectSdk = HardwareSdk__default["default"]({
778
- eventEmitter: eventEmitter,
779
- init: init,
780
- call: call,
781
- cancel: cancel,
782
- dispose: dispose,
783
- uiResponse: uiResponse,
784
- updateSettings: updateSettings,
785
- switchTransport: switchTransport,
786
- });
814
+ var extensionApi = (_b = (_a = options.extension) === null || _a === void 0 ? void 0 : _a.createApi(sdk.call)) !== null && _b !== void 0 ? _b : {};
815
+ return {
816
+ sdk: Object.assign(sdk, extensionApi),
817
+ messagePromises: instanceMessagePromises,
818
+ };
819
+ };
820
+ var createHardwareCommonConnectSdk = function (options) {
821
+ if (options === void 0) { options = {}; }
822
+ return createSdkInstance(options).sdk;
823
+ };
824
+ var _a = createSdkInstance(), HardwareCommonConnectSdk = _a.sdk, messagePromises = _a.messagePromises;
787
825
 
826
+ exports.createHardwareCommonConnectSdk = createHardwareCommonConnectSdk;
788
827
  exports["default"] = HardwareCommonConnectSdk;
789
828
  exports.messagePromises = messagePromises;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onekeyfe/hd-common-connect-sdk",
3
- "version": "1.2.0-alpha.55",
3
+ "version": "1.2.0-alpha.57",
4
4
  "author": "OneKey",
5
5
  "homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
6
6
  "license": "ISC",
@@ -20,13 +20,13 @@
20
20
  "lint:fix": "eslint . --fix"
21
21
  },
22
22
  "dependencies": {
23
- "@onekeyfe/hd-core": "1.2.0-alpha.55",
24
- "@onekeyfe/hd-shared": "1.2.0-alpha.55",
25
- "@onekeyfe/hd-transport-emulator": "1.2.0-alpha.55",
26
- "@onekeyfe/hd-transport-http": "1.2.0-alpha.55",
27
- "@onekeyfe/hd-transport-lowlevel": "1.2.0-alpha.55",
28
- "@onekeyfe/hd-transport-usb": "1.2.0-alpha.55",
29
- "@onekeyfe/hd-transport-web-device": "1.2.0-alpha.55"
23
+ "@onekeyfe/hd-core": "1.2.0-alpha.57",
24
+ "@onekeyfe/hd-shared": "1.2.0-alpha.57",
25
+ "@onekeyfe/hd-transport-emulator": "1.2.0-alpha.57",
26
+ "@onekeyfe/hd-transport-http": "1.2.0-alpha.57",
27
+ "@onekeyfe/hd-transport-lowlevel": "1.2.0-alpha.57",
28
+ "@onekeyfe/hd-transport-usb": "1.2.0-alpha.57",
29
+ "@onekeyfe/hd-transport-web-device": "1.2.0-alpha.57"
30
30
  },
31
- "gitHead": "0a99a180062ec32fac0c5e14be3366fbfb7bc01a"
31
+ "gitHead": "3279714eb381518b8dec4837d388271e74a0a5e6"
32
32
  }
package/src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- import EventEmitter from 'events';
1
+ import { EventEmitter } from 'events';
2
2
  import HardwareSdk, {
3
3
  CORE_EVENT,
4
4
  DEVICE,
@@ -20,22 +20,23 @@ import HardwareSdk, {
20
20
  setLoggerPostMessage,
21
21
  } from '@onekeyfe/hd-core';
22
22
  import { ERRORS, HardwareErrorCode, createDeferred } from '@onekeyfe/hd-shared';
23
+ import EmulatorTransport from '@onekeyfe/hd-transport-emulator';
23
24
  import HttpTransport from '@onekeyfe/hd-transport-http';
24
- import { ElectronBleTransport, WebUsbTransport } from '@onekeyfe/hd-transport-web-device';
25
25
  import LowlevelTransport from '@onekeyfe/hd-transport-lowlevel';
26
- import EmulatorTransport from '@onekeyfe/hd-transport-emulator';
26
+ import { ElectronBleTransport, WebUsbTransport } from '@onekeyfe/hd-transport-web-device';
27
27
 
28
- import type { Deferred } from '@onekeyfe/hd-shared';
29
28
  import type {
30
29
  ConnectSettings,
31
30
  Core,
31
+ CoreApi,
32
32
  CoreMessage,
33
+ CoreMethodExtension,
33
34
  LowLevelCoreApi,
34
35
  UiResponseEvent,
35
36
  } from '@onekeyfe/hd-core';
37
+ import type { Deferred } from '@onekeyfe/hd-shared';
36
38
  import type { LowlevelTransportSharedPlugin } from '@onekeyfe/hd-transport';
37
39
 
38
- const eventEmitter = new EventEmitter();
39
40
  const Log = getLogger(LoggerNames.HdCommonConnectSdk);
40
41
 
41
42
  const getTransport = async (env: ConnectSettings['env']) => {
@@ -45,8 +46,7 @@ const getTransport = async (env: ConnectSettings['env']) => {
45
46
  if (env === 'webusb' || env === 'desktop-webusb') return WebUsbTransport;
46
47
  if (env === 'lowlevel') return LowlevelTransport;
47
48
  if (env === 'node-usb') {
48
- // Dynamic import usb is a native Node.js module (libusb C++ bindings)
49
- // that cannot be resolved by browser/React Native bundlers
49
+ // Keep the native libusb binding out of browser and React Native bundles.
50
50
  const { default: NodeUsbTransport } = await import('@onekeyfe/hd-transport-usb');
51
51
  return NodeUsbTransport;
52
52
  }
@@ -54,166 +54,218 @@ const getTransport = async (env: ConnectSettings['env']) => {
54
54
  return HttpTransport;
55
55
  };
56
56
 
57
- let _core: Core | undefined;
58
- let _settings = parseConnectSettings();
59
-
60
- let _messageID = 0;
61
- export const messagePromises: { [key: number]: Deferred<any> } = {};
62
-
63
- const dispose = async () => {
64
- const core = _core;
65
- _core = undefined;
66
- eventEmitter.removeAllListeners();
67
- Object.keys(messagePromises).forEach(key => {
68
- delete messagePromises[Number(key)];
69
- });
70
- _settings = parseConnectSettings();
71
- await core?.dispose?.();
57
+ export type HardwareCommonConnectSdkExtension<TExtensionApi extends object> = {
58
+ methodExtensions: readonly CoreMethodExtension[];
59
+ createApi: (call: CoreApi['call']) => TExtensionApi;
72
60
  };
73
61
 
74
- const uiResponse = (response: UiResponseEvent) => {
75
- if (!_core) {
76
- throw ERRORS.TypedError(HardwareErrorCode.NotInitialized);
77
- }
78
- const { type, payload } = response;
79
- _core.handleMessage({ event: UI_EVENT, type, payload } as CoreMessage);
62
+ export type HardwareCommonConnectSdkOptions<TExtensionApi extends object> = {
63
+ extension?: HardwareCommonConnectSdkExtension<TExtensionApi>;
64
+ allowDestructiveOperations?: boolean;
80
65
  };
81
66
 
82
- const cancel = (connectId?: string) => {
83
- if (_core === undefined) return;
84
- _core.handleMessage({ event: IFRAME.CANCEL, type: IFRAME.CANCEL, payload: { connectId } });
67
+ type SdkInstance<TExtensionApi extends object> = {
68
+ sdk: CoreApi & TExtensionApi;
69
+ messagePromises: { [key: number]: Deferred<any> };
85
70
  };
86
71
 
87
- function handleMessage(message: CoreMessage) {
88
- const { event } = message;
89
- if (!_core) {
90
- return;
91
- }
72
+ const createSdkInstance = <TExtensionApi extends object>(
73
+ options: HardwareCommonConnectSdkOptions<TExtensionApi> = {}
74
+ ): SdkInstance<TExtensionApi> => {
75
+ const eventEmitter = new EventEmitter();
76
+ let core: Core | undefined;
77
+ let settings = parseConnectSettings();
78
+ let messageID = 0;
79
+ const instanceMessagePromises: { [key: number]: Deferred<any> } = {};
92
80
 
93
- const blockLog = getLogBlockLabel(message);
94
- if (event !== LOG_EVENT) {
95
- Log.debug('hd-common-connect-sdk handleMessage', blockLog ?? message);
96
- }
97
- switch (event) {
98
- case UI_EVENT:
99
- // pass UI event up
100
- eventEmitter.emit(message.event, message);
101
- eventEmitter.emit(message.type, message.payload);
102
- break;
103
- case LOG_EVENT:
104
- case FIRMWARE_EVENT:
105
- eventEmitter.emit(message.event, message);
106
- break;
107
- case DEVICE_EVENT:
108
- if (
109
- (
110
- [
111
- DEVICE.CONNECT,
112
- DEVICE.DISCONNECT,
113
- DEVICE.FEATURES,
114
- DEVICE.STATE,
115
- DEVICE.SUPPORT_FEATURES,
116
- ] as string[]
117
- ).includes(message.type)
118
- ) {
119
- eventEmitter.emit(message.type, message.payload);
120
- }
121
- break;
122
- case IFRAME.CALLBACK: {
123
- const { callbackId, data, error } = message.payload;
124
- executeCallback(callbackId, data, error);
125
- break;
81
+ const dispose = async () => {
82
+ const currentCore = core;
83
+ core = undefined;
84
+ eventEmitter.removeAllListeners();
85
+ Object.keys(instanceMessagePromises).forEach(key => {
86
+ delete instanceMessagePromises[Number(key)];
87
+ });
88
+ settings = parseConnectSettings();
89
+ await currentCore?.dispose?.();
90
+ };
91
+
92
+ const uiResponse = (response: UiResponseEvent) => {
93
+ if (!core) {
94
+ throw ERRORS.TypedError(HardwareErrorCode.NotInitialized);
126
95
  }
127
- default:
128
- Log.log('No need to be captured message', message.event);
129
- }
130
- }
96
+ const { type, payload } = response;
97
+ core
98
+ .handleMessage({ event: UI_EVENT, type, payload } as CoreMessage)
99
+ .catch(error => Log.error(createErrorMessage(error)));
100
+ };
131
101
 
132
- async function postMessage(message: CoreMessage, usePromise = true) {
133
- if (!_core) {
134
- throw ERRORS.TypedError('postMessage: _core not found');
135
- }
102
+ const cancel = (connectId?: string) => {
103
+ if (!core) return;
104
+ core
105
+ .handleMessage({
106
+ event: IFRAME.CANCEL,
107
+ type: IFRAME.CANCEL,
108
+ payload: { connectId },
109
+ })
110
+ .catch(error => Log.error(createErrorMessage(error)));
111
+ };
136
112
 
137
- if (usePromise) {
138
- _messageID++;
139
- messagePromises[_messageID] = createDeferred();
140
- // const { promise } = messagePromises[_messageID];
141
- const response = await _core.handleMessage({ ...message, id: `${_messageID}` });
142
- // return promise;
143
- return response;
113
+ function handleMessage(message: CoreMessage) {
114
+ const { event } = message;
115
+ if (!core) {
116
+ return;
117
+ }
118
+
119
+ const blockLog = getLogBlockLabel(message);
120
+ if (event !== LOG_EVENT) {
121
+ Log.debug('hd-common-connect-sdk handleMessage', blockLog ?? message);
122
+ }
123
+ switch (event) {
124
+ case UI_EVENT:
125
+ eventEmitter.emit(message.event, message);
126
+ eventEmitter.emit(message.type, message.payload);
127
+ break;
128
+ case LOG_EVENT:
129
+ case FIRMWARE_EVENT:
130
+ eventEmitter.emit(message.event, message);
131
+ break;
132
+ case DEVICE_EVENT:
133
+ if (
134
+ (
135
+ [
136
+ DEVICE.CONNECT,
137
+ DEVICE.DISCONNECT,
138
+ DEVICE.FEATURES,
139
+ DEVICE.STATE,
140
+ DEVICE.SUPPORT_FEATURES,
141
+ ] as string[]
142
+ ).includes(message.type)
143
+ ) {
144
+ eventEmitter.emit(message.type, message.payload);
145
+ }
146
+ break;
147
+ case IFRAME.CALLBACK: {
148
+ const { callbackId, data, error } = message.payload;
149
+ executeCallback(callbackId, data, error);
150
+ break;
151
+ }
152
+ default:
153
+ Log.log('No need to be captured message', message.event);
154
+ }
144
155
  }
145
156
 
146
- _core.handleMessage(message);
147
- }
157
+ async function postMessage(message: CoreMessage, usePromise = true) {
158
+ if (!core) {
159
+ throw ERRORS.TypedError('postMessage: _core not found');
160
+ }
148
161
 
149
- const init = async (
150
- settings: Partial<ConnectSettings>,
151
- _?: LowLevelCoreApi,
152
- plugin?: LowlevelTransportSharedPlugin
153
- ) => {
154
- _settings = { ..._settings, ...settings, env: settings.env ?? 'node' };
162
+ if (usePromise) {
163
+ messageID += 1;
164
+ instanceMessagePromises[messageID] = createDeferred();
165
+ return core.handleMessage({ ...message, id: `${messageID}` });
166
+ }
155
167
 
156
- enableLog(!!settings.debug);
168
+ await core.handleMessage(message);
169
+ }
157
170
 
158
- Log.debug('init');
171
+ const init = async (
172
+ partialSettings: Partial<ConnectSettings>,
173
+ _?: LowLevelCoreApi,
174
+ plugin?: LowlevelTransportSharedPlugin
175
+ ) => {
176
+ settings = { ...settings, ...partialSettings, env: partialSettings.env ?? 'node' };
159
177
 
160
- try {
161
- const Transport = await getTransport(_settings.env);
162
- _core = await initCore(_settings, Transport, plugin);
163
- _core?.on(CORE_EVENT, handleMessage);
164
- setLoggerPostMessage(handleMessage);
178
+ enableLog(!!partialSettings.debug);
179
+ Log.debug('init');
165
180
 
166
- return true;
167
- } catch (error) {
168
- Log.error(createErrorMessage(error));
181
+ try {
182
+ const Transport = await getTransport(settings.env);
183
+ if (options.extension) {
184
+ core = await initCore(settings, Transport, plugin, {
185
+ methodExtensions: options.extension.methodExtensions,
186
+ allowDestructiveOperations: options.allowDestructiveOperations === true,
187
+ });
188
+ } else {
189
+ core = await initCore(settings, Transport, plugin);
190
+ }
191
+ core?.on(CORE_EVENT, handleMessage);
192
+ setLoggerPostMessage(handleMessage);
169
193
 
170
- return false;
171
- }
172
- };
194
+ return true;
195
+ } catch (error) {
196
+ Log.error(createErrorMessage(error));
197
+ return false;
198
+ }
199
+ };
173
200
 
174
- const call = async (params: any) => {
175
- const blockLog = getLogBlockLabel(params);
176
- Log.debug('call: ', blockLog ?? params);
201
+ const call: CoreApi['call'] = async params => {
202
+ const blockLog = getLogBlockLabel(params);
203
+ Log.debug('call: ', blockLog ?? params);
177
204
 
178
- try {
179
- const response = await postMessage({ event: IFRAME.CALL, type: IFRAME.CALL, payload: params });
180
- if (response) {
181
- Log.debug('response: ', blockLog ? '[REDACTED]' : response);
205
+ try {
206
+ const response = await postMessage({
207
+ event: IFRAME.CALL,
208
+ type: IFRAME.CALL,
209
+ payload: params,
210
+ });
211
+ if (response) {
212
+ Log.debug('response: ', blockLog ? '[REDACTED]' : response);
182
213
 
183
- if (!response.success) {
184
- if (response.payload?.code === HardwareErrorCode.BleUnsupported) {
185
- postMessage(createUiMessage(UI_REQUEST.BLUETOOTH_UNSUPPORTED), false);
186
- }
187
- if (response.payload?.code === HardwareErrorCode.BlePoweredOff) {
188
- postMessage(createUiMessage(UI_REQUEST.BLUETOOTH_POWERED_OFF), false);
189
- }
190
- if (response.payload?.code === HardwareErrorCode.BlePermissionError) {
191
- postMessage(createUiMessage(UI_REQUEST.BLUETOOTH_PERMISSION), false);
214
+ if (!response.success) {
215
+ if (response.payload?.code === HardwareErrorCode.BleUnsupported) {
216
+ postMessage(createUiMessage(UI_REQUEST.BLUETOOTH_UNSUPPORTED), false).catch(error =>
217
+ Log.error(createErrorMessage(error))
218
+ );
219
+ }
220
+ if (response.payload?.code === HardwareErrorCode.BlePoweredOff) {
221
+ postMessage(createUiMessage(UI_REQUEST.BLUETOOTH_POWERED_OFF), false).catch(error =>
222
+ Log.error(createErrorMessage(error))
223
+ );
224
+ }
225
+ if (response.payload?.code === HardwareErrorCode.BlePermissionError) {
226
+ postMessage(createUiMessage(UI_REQUEST.BLUETOOTH_PERMISSION), false).catch(error =>
227
+ Log.error(createErrorMessage(error))
228
+ );
229
+ }
192
230
  }
231
+
232
+ return response;
193
233
  }
194
234
 
195
- return response;
235
+ return createErrorMessage(ERRORS.TypedError(HardwareErrorCode.CallMethodNotResponse));
236
+ } catch (error) {
237
+ Log.error('__call error: ', error);
238
+ return createErrorMessage(error);
196
239
  }
240
+ };
197
241
 
198
- return createErrorMessage(ERRORS.TypedError(HardwareErrorCode.CallMethodNotResponse));
199
- } catch (error) {
200
- Log.error('__call error: ', error);
201
- return createErrorMessage(error);
202
- }
242
+ const updateSettings = () => Promise.resolve(true);
243
+ const switchTransport = () => Promise.resolve({ success: true });
244
+
245
+ const sdk = HardwareSdk({
246
+ eventEmitter,
247
+ init,
248
+ call,
249
+ cancel,
250
+ dispose,
251
+ uiResponse,
252
+ updateSettings,
253
+ switchTransport,
254
+ });
255
+ const extensionApi = options.extension?.createApi(sdk.call) ?? ({} as TExtensionApi);
256
+
257
+ return {
258
+ sdk: Object.assign(sdk, extensionApi),
259
+ messagePromises: instanceMessagePromises,
260
+ };
203
261
  };
204
262
 
205
- const updateSettings = () => Promise.resolve(true);
206
- const switchTransport = () => Promise.resolve({ success: true });
207
-
208
- const HardwareCommonConnectSdk = HardwareSdk({
209
- eventEmitter,
210
- init,
211
- call,
212
- cancel,
213
- dispose,
214
- uiResponse,
215
- updateSettings,
216
- switchTransport,
217
- });
263
+ export const createHardwareCommonConnectSdk = <TExtensionApi extends object = Record<never, never>>(
264
+ options: HardwareCommonConnectSdkOptions<TExtensionApi> = {}
265
+ ): CoreApi & TExtensionApi => createSdkInstance(options).sdk;
266
+
267
+ const { sdk: HardwareCommonConnectSdk, messagePromises } = createSdkInstance();
268
+
269
+ export { messagePromises };
218
270
 
219
271
  export default HardwareCommonConnectSdk;