@onekeyfe/hd-core 0.1.14 → 0.1.18

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.
Files changed (140) hide show
  1. package/dist/api/BaseMethod.d.ts +4 -0
  2. package/dist/api/BaseMethod.d.ts.map +1 -1
  3. package/dist/api/CheckBLEFirmwareRelease.d.ts.map +1 -1
  4. package/dist/api/CheckFirmwareRelease.d.ts.map +1 -1
  5. package/dist/api/GetLogs.d.ts +11 -0
  6. package/dist/api/GetLogs.d.ts.map +1 -0
  7. package/dist/api/firmware/releaseHelper.d.ts +18 -0
  8. package/dist/api/firmware/releaseHelper.d.ts.map +1 -0
  9. package/dist/api/index.d.ts +1 -0
  10. package/dist/api/index.d.ts.map +1 -1
  11. package/dist/constants/errors.d.ts.map +1 -1
  12. package/dist/core/index.d.ts.map +1 -1
  13. package/dist/data-manager/TransportManager.d.ts.map +1 -1
  14. package/dist/device/Device.d.ts +3 -1
  15. package/dist/device/Device.d.ts.map +1 -1
  16. package/dist/device/DeviceCommands.d.ts +1 -1
  17. package/dist/device/DeviceCommands.d.ts.map +1 -1
  18. package/dist/device/DeviceList.d.ts +1 -1
  19. package/dist/device/DeviceList.d.ts.map +1 -1
  20. package/dist/events/core.d.ts +3 -1
  21. package/dist/events/core.d.ts.map +1 -1
  22. package/dist/events/firmware.d.ts +21 -0
  23. package/dist/events/firmware.d.ts.map +1 -0
  24. package/dist/events/index.d.ts +2 -0
  25. package/dist/events/index.d.ts.map +1 -1
  26. package/dist/events/log.d.ts +15 -0
  27. package/dist/events/log.d.ts.map +1 -0
  28. package/dist/index.d.ts +134 -40
  29. package/dist/index.js +730 -396
  30. package/dist/inject.d.ts.map +1 -1
  31. package/dist/types/api/btcGetAddress.d.ts +2 -2
  32. package/dist/types/api/btcGetAddress.d.ts.map +1 -1
  33. package/dist/types/api/btcGetPublicKey.d.ts +2 -2
  34. package/dist/types/api/btcGetPublicKey.d.ts.map +1 -1
  35. package/dist/types/api/btcSignMessage.d.ts +1 -1
  36. package/dist/types/api/btcSignMessage.d.ts.map +1 -1
  37. package/dist/types/api/btcSignTransaction.d.ts +1 -1
  38. package/dist/types/api/btcSignTransaction.d.ts.map +1 -1
  39. package/dist/types/api/btcVerifyMessage.d.ts +1 -1
  40. package/dist/types/api/btcVerifyMessage.d.ts.map +1 -1
  41. package/dist/types/api/cipherKeyValue.d.ts +2 -2
  42. package/dist/types/api/cipherKeyValue.d.ts.map +1 -1
  43. package/dist/types/api/evmGetAddress.d.ts +2 -2
  44. package/dist/types/api/evmGetAddress.d.ts.map +1 -1
  45. package/dist/types/api/evmGetPublicKey.d.ts +2 -2
  46. package/dist/types/api/evmGetPublicKey.d.ts.map +1 -1
  47. package/dist/types/api/evmSignMessage.d.ts +1 -1
  48. package/dist/types/api/evmSignMessage.d.ts.map +1 -1
  49. package/dist/types/api/evmSignMessageEIP712.d.ts +1 -1
  50. package/dist/types/api/evmSignMessageEIP712.d.ts.map +1 -1
  51. package/dist/types/api/evmSignTransaction.d.ts +1 -1
  52. package/dist/types/api/evmSignTransaction.d.ts.map +1 -1
  53. package/dist/types/api/evmSignTypedData.d.ts +1 -1
  54. package/dist/types/api/evmSignTypedData.d.ts.map +1 -1
  55. package/dist/types/api/evmVerifyMessage.d.ts +1 -1
  56. package/dist/types/api/evmVerifyMessage.d.ts.map +1 -1
  57. package/dist/types/api/getLogs.d.ts +3 -0
  58. package/dist/types/api/getLogs.d.ts.map +1 -0
  59. package/dist/types/api/index.d.ts +2 -0
  60. package/dist/types/api/index.d.ts.map +1 -1
  61. package/dist/types/api/nemGetAddress.d.ts +2 -2
  62. package/dist/types/api/nemGetAddress.d.ts.map +1 -1
  63. package/dist/types/api/nemSignTransaction.d.ts +1 -1
  64. package/dist/types/api/nemSignTransaction.d.ts.map +1 -1
  65. package/dist/types/api/solGetAddress.d.ts +2 -2
  66. package/dist/types/api/solGetAddress.d.ts.map +1 -1
  67. package/dist/types/api/solSignTransaction.d.ts +2 -2
  68. package/dist/types/api/solSignTransaction.d.ts.map +1 -1
  69. package/dist/types/api/starcoinGetAddress.d.ts +2 -2
  70. package/dist/types/api/starcoinGetAddress.d.ts.map +1 -1
  71. package/dist/types/api/starcoinGetPublicKey.d.ts +2 -2
  72. package/dist/types/api/starcoinGetPublicKey.d.ts.map +1 -1
  73. package/dist/types/api/starcoinSignMessage.d.ts +1 -1
  74. package/dist/types/api/starcoinSignMessage.d.ts.map +1 -1
  75. package/dist/types/api/starcoinSignTransaction.d.ts +1 -1
  76. package/dist/types/api/starcoinSignTransaction.d.ts.map +1 -1
  77. package/dist/types/api/starcoinVerifyMessage.d.ts +1 -1
  78. package/dist/types/api/starcoinVerifyMessage.d.ts.map +1 -1
  79. package/dist/types/api/stellarGetAddress.d.ts +2 -2
  80. package/dist/types/api/stellarGetAddress.d.ts.map +1 -1
  81. package/dist/types/api/stellarSignTransaction.d.ts +1 -1
  82. package/dist/types/api/stellarSignTransaction.d.ts.map +1 -1
  83. package/dist/types/params.d.ts +3 -0
  84. package/dist/types/params.d.ts.map +1 -1
  85. package/dist/utils/deviceFeaturesUtils.d.ts.map +1 -1
  86. package/dist/utils/index.d.ts +1 -2
  87. package/dist/utils/index.d.ts.map +1 -1
  88. package/dist/utils/logger.d.ts +56 -0
  89. package/dist/utils/logger.d.ts.map +1 -0
  90. package/package.json +4 -4
  91. package/src/api/BaseMethod.ts +30 -1
  92. package/src/api/CheckBLEFirmwareRelease.ts +4 -9
  93. package/src/api/CheckFirmwareRelease.ts +3 -9
  94. package/src/api/FirmwareUpdate.ts +1 -1
  95. package/src/api/GetLogs.ts +13 -0
  96. package/src/api/device/DeviceVerify.ts +1 -1
  97. package/src/api/firmware/releaseHelper.ts +24 -0
  98. package/src/api/index.ts +2 -0
  99. package/src/constants/errors.ts +5 -1
  100. package/src/core/index.ts +150 -32
  101. package/src/data-manager/TransportManager.ts +8 -6
  102. package/src/device/Device.ts +23 -7
  103. package/src/device/DeviceCommands.ts +12 -9
  104. package/src/device/DeviceConnector.ts +3 -3
  105. package/src/device/DeviceList.ts +25 -10
  106. package/src/events/core.ts +4 -0
  107. package/src/events/firmware.ts +32 -0
  108. package/src/events/index.ts +2 -0
  109. package/src/events/log.ts +23 -0
  110. package/src/inject.ts +55 -46
  111. package/src/types/api/btcGetAddress.ts +3 -5
  112. package/src/types/api/btcGetPublicKey.ts +2 -0
  113. package/src/types/api/btcSignMessage.ts +1 -0
  114. package/src/types/api/btcSignTransaction.ts +1 -0
  115. package/src/types/api/btcVerifyMessage.ts +1 -0
  116. package/src/types/api/cipherKeyValue.ts +2 -0
  117. package/src/types/api/evmGetAddress.ts +2 -0
  118. package/src/types/api/evmGetPublicKey.ts +2 -0
  119. package/src/types/api/evmSignMessage.ts +1 -0
  120. package/src/types/api/evmSignMessageEIP712.ts +1 -0
  121. package/src/types/api/evmSignTransaction.ts +1 -0
  122. package/src/types/api/evmSignTypedData.ts +1 -0
  123. package/src/types/api/evmVerifyMessage.ts +1 -0
  124. package/src/types/api/getLogs.ts +3 -0
  125. package/src/types/api/index.ts +2 -0
  126. package/src/types/api/nemGetAddress.ts +2 -0
  127. package/src/types/api/nemSignTransaction.ts +1 -0
  128. package/src/types/api/solGetAddress.ts +2 -0
  129. package/src/types/api/solSignTransaction.ts +2 -0
  130. package/src/types/api/starcoinGetAddress.ts +2 -0
  131. package/src/types/api/starcoinGetPublicKey.ts +2 -0
  132. package/src/types/api/starcoinSignMessage.ts +1 -0
  133. package/src/types/api/starcoinSignTransaction.ts +1 -0
  134. package/src/types/api/starcoinVerifyMessage.ts +1 -0
  135. package/src/types/api/stellarGetAddress.ts +2 -0
  136. package/src/types/api/stellarSignTransaction.ts +1 -0
  137. package/src/types/params.ts +12 -0
  138. package/src/utils/deviceFeaturesUtils.ts +2 -10
  139. package/src/utils/index.ts +1 -3
  140. package/src/utils/logger.ts +179 -0
@@ -0,0 +1,56 @@
1
+ import { CoreMessage } from '../events';
2
+ declare type LogMessage = {
3
+ level: string;
4
+ prefix: string;
5
+ message: any[];
6
+ timestamp: number;
7
+ };
8
+ declare class Log {
9
+ prefix: string;
10
+ enabled: boolean;
11
+ messages: LogMessage[];
12
+ constructor(prefix: string, enabled: boolean);
13
+ addMessage(level: string, prefix: string, ...args: any[]): void;
14
+ log(...args: any[]): void;
15
+ error(...args: any[]): void;
16
+ warn(...args: any[]): void;
17
+ debug(...args: any[]): void;
18
+ }
19
+ export declare const initLog: (prefix: string, enabled?: boolean | undefined) => Log;
20
+ export declare const enableLog: (enabled?: boolean | undefined) => void;
21
+ export declare const enableLogByPrefix: (prefix: string, enabled: boolean) => void;
22
+ export declare const getLog: () => LogMessage[];
23
+ export declare const setLoggerPostMessage: (postMessageFn: (message: CoreMessage) => void) => void;
24
+ export declare enum LoggerNames {
25
+ Core = "Core",
26
+ Transport = "Transport",
27
+ Device = "Device",
28
+ DeviceCommands = "DeviceCommands",
29
+ DeviceConnector = "DeviceConnector",
30
+ DeviceList = "DeviceList",
31
+ HdBleSdk = "@onekey/hd-ble-sdk",
32
+ HdTransportHttp = "@onekey/hd-transport-http",
33
+ HdBleTransport = "@onekey/hd-ble-transport",
34
+ Connect = "@onekey/connect",
35
+ Iframe = "IFrame",
36
+ SendMessage = "[SendMessage]",
37
+ Method = "[Method]"
38
+ }
39
+ export declare const LoggerMap: {
40
+ Core: Log;
41
+ Transport: Log;
42
+ Device: Log;
43
+ DeviceCommands: Log;
44
+ DeviceConnector: Log;
45
+ DeviceList: Log;
46
+ "@onekey/hd-ble-sdk": Log;
47
+ "@onekey/hd-transport-http": Log;
48
+ "@onekey/hd-ble-transport": Log;
49
+ "@onekey/connect": Log;
50
+ IFrame: Log;
51
+ "[SendMessage]": Log;
52
+ "[Method]": Log;
53
+ };
54
+ export declare const getLogger: (key: LoggerNames) => Log;
55
+ export {};
56
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAGxC,aAAK,UAAU,GAAG;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,GAAG,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAMF,cAAM,GAAG;IACP,MAAM,EAAE,MAAM,CAAC;IAEf,OAAO,EAAE,OAAO,CAAC;IAEjB,QAAQ,EAAE,UAAU,EAAE,CAAC;gBAEX,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;IAM5C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAYxD,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE;IASlB,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE;IASpB,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE;IASnB,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE;CAQrB;AAID,eAAO,MAAM,OAAO,WAAY,MAAM,uCAIrC,CAAC;AAEF,eAAO,MAAM,SAAS,yCAIrB,CAAC;AAEF,eAAO,MAAM,iBAAiB,WAAY,MAAM,WAAW,OAAO,SAIjE,CAAC;AAEF,eAAO,MAAM,MAAM,oBAOlB,CAAC;AAEF,eAAO,MAAM,oBAAoB,4BAA6B,WAAW,KAAK,IAAI,SAEjF,CAAC;AAuCF,oBAAY,WAAW;IACrB,IAAI,SAAS;IACb,SAAS,cAAc;IACvB,MAAM,WAAW;IACjB,cAAc,mBAAmB;IACjC,eAAe,oBAAoB;IACnC,UAAU,eAAe;IACzB,QAAQ,uBAAuB;IAC/B,eAAe,8BAA8B;IAC7C,cAAc,6BAA6B;IAC3C,OAAO,oBAAoB;IAC3B,MAAM,WAAW;IACjB,WAAW,kBAAkB;IAC7B,MAAM,aAAa;CACpB;AAED,eAAO,MAAM,SAAS;;;;;;;;;;;;;;CAcrB,CAAC;AAEF,eAAO,MAAM,SAAS,QAAS,WAAW,QAAmB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onekeyfe/hd-core",
3
- "version": "0.1.14",
3
+ "version": "0.1.18",
4
4
  "description": "> TODO: description",
5
5
  "author": "OneKey",
6
6
  "homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
@@ -25,8 +25,8 @@
25
25
  "url": "https://github.com/OneKeyHQ/hardware-js-sdk/issues"
26
26
  },
27
27
  "dependencies": {
28
- "@onekeyfe/hd-shared": "^0.1.14",
29
- "@onekeyfe/hd-transport": "^0.1.14",
28
+ "@onekeyfe/hd-shared": "^0.1.18",
29
+ "@onekeyfe/hd-transport": "^0.1.18",
30
30
  "axios": "^0.27.2",
31
31
  "bignumber.js": "^9.0.2",
32
32
  "js-sha256": "^0.9.0",
@@ -37,5 +37,5 @@
37
37
  "@types/parse-uri": "^1.0.0",
38
38
  "@types/semver": "^7.3.9"
39
39
  },
40
- "gitHead": "216fee1795067013da0d68f4fc25f583509bb509"
40
+ "gitHead": "eebfd1dd46b146c64a8bfda691dc4d8402fa105b"
41
41
  }
@@ -2,7 +2,8 @@ import { UI_REQUEST } from '../constants/ui-request';
2
2
  import { Device } from '../device/Device';
3
3
  import DeviceConnector from '../device/DeviceConnector';
4
4
  import { DeviceFirmwareRange } from '../types';
5
- import { CoreMessage } from '../events';
5
+ import { CoreMessage, createFirmwareMessage, FIRMWARE } from '../events';
6
+ import { getBleFirmwareReleaseInfo, getFirmwareReleaseInfo } from './firmware/releaseHelper';
6
7
 
7
8
  export abstract class BaseMethod<Params = undefined> {
8
9
  responseID: number;
@@ -20,6 +21,11 @@ export abstract class BaseMethod<Params = undefined> {
20
21
  */
21
22
  connectId?: string;
22
23
 
24
+ /**
25
+ * device id
26
+ */
27
+ deviceId?: string;
28
+
23
29
  deviceState?: string;
24
30
 
25
31
  /**
@@ -49,6 +55,16 @@ export abstract class BaseMethod<Params = undefined> {
49
55
  */
50
56
  requireDeviceMode: string[];
51
57
 
58
+ /**
59
+ * 是否需要轮询确认设备已连接
60
+ */
61
+ shouldEnsureConnected = true;
62
+
63
+ /**
64
+ * 是否需要校验 features 的 deviceId 是否一致
65
+ */
66
+ checkDeviceId = false;
67
+
52
68
  // @ts-expect-error: strictPropertyInitialization
53
69
  postMessage: (message: CoreMessage) => void;
54
70
 
@@ -58,6 +74,7 @@ export abstract class BaseMethod<Params = undefined> {
58
74
  this.payload = payload;
59
75
  this.responseID = message.id || 0;
60
76
  this.connectId = payload.connectId || '';
77
+ this.deviceId = payload.deviceId || '';
61
78
  this.useDevice = true;
62
79
  this.allowDeviceMode = [UI_REQUEST.INITIALIZE];
63
80
  this.requireDeviceMode = [];
@@ -76,5 +93,17 @@ export abstract class BaseMethod<Params = undefined> {
76
93
  this.connectId = device.originalDescriptor.path;
77
94
  }
78
95
 
96
+ checkFirmwareRelease() {
97
+ if (!this.device || !this.device.features) return;
98
+ const releaseInfo = getFirmwareReleaseInfo(this.device.features);
99
+ if (['outdated', 'required'].includes(releaseInfo.status)) {
100
+ this.postMessage(createFirmwareMessage(FIRMWARE.RELEASE_INFO, releaseInfo));
101
+ }
102
+ const bleReleaseInfo = getBleFirmwareReleaseInfo(this.device.features);
103
+ if (['outdated', 'required'].includes(bleReleaseInfo.status)) {
104
+ this.postMessage(createFirmwareMessage(FIRMWARE.BLE_RELEASE_INFO, bleReleaseInfo));
105
+ }
106
+ }
107
+
79
108
  dispose() {}
80
109
  }
@@ -1,23 +1,18 @@
1
1
  import { BaseMethod } from './BaseMethod';
2
2
 
3
3
  import { UI_REQUEST } from '../constants/ui-request';
4
- import { DataManager } from '../data-manager';
4
+ import { getBleFirmwareReleaseInfo } from './firmware/releaseHelper';
5
5
 
6
6
  export default class CheckBLEFirmwareRelease extends BaseMethod {
7
7
  init() {
8
8
  this.allowDeviceMode = [...this.allowDeviceMode, UI_REQUEST.BOOTLOADER];
9
+ this.checkDeviceId = true;
9
10
  }
10
11
 
11
12
  run() {
12
13
  if (this.device.features) {
13
- const firmwareStatus = DataManager.getBLEFirmwareStatus(this.device.features);
14
- const changelog = DataManager.getBleFirmwareChangelog(this.device.features);
15
- const release = DataManager.getBleFirmwareLeatestRelease(this.device.features);
16
- return Promise.resolve({
17
- status: firmwareStatus,
18
- changelog,
19
- release,
20
- });
14
+ const releaseInfo = getBleFirmwareReleaseInfo(this.device.features);
15
+ return Promise.resolve(releaseInfo);
21
16
  }
22
17
  return Promise.resolve(null);
23
18
  }
@@ -1,20 +1,14 @@
1
1
  import { BaseMethod } from './BaseMethod';
2
2
 
3
- import { DataManager } from '../data-manager';
3
+ import { getFirmwareReleaseInfo } from './firmware/releaseHelper';
4
4
 
5
5
  export default class CheckFirmwareRelease extends BaseMethod {
6
6
  init() {}
7
7
 
8
8
  run() {
9
9
  if (this.device.features) {
10
- const firmwareStatus = DataManager.getFirmwareStatus(this.device.features);
11
- const changelog = DataManager.getFirmwareChangelog(this.device.features);
12
- const release = DataManager.getFirmwareLeatestRelease(this.device.features);
13
- return Promise.resolve({
14
- status: firmwareStatus,
15
- changelog,
16
- release,
17
- });
10
+ const releaseInfo = getFirmwareReleaseInfo(this.device.features);
11
+ return Promise.resolve(releaseInfo);
18
12
  }
19
13
  return Promise.resolve(null);
20
14
  }
@@ -70,7 +70,7 @@ export default class FirmwareUpdate extends BaseMethod<Params> {
70
70
  binary = firmware.binary;
71
71
  }
72
72
  } catch (err) {
73
- throw ERRORS.TypedError(HardwareErrorCode.FirmwareUpdateDownloadFailed, err);
73
+ throw ERRORS.TypedError(HardwareErrorCode.FirmwareUpdateDownloadFailed, err.message ?? err);
74
74
  }
75
75
 
76
76
  return uploadFirmware(
@@ -0,0 +1,13 @@
1
+ import { BaseMethod } from './BaseMethod';
2
+ import { getLog } from '../utils';
3
+
4
+ export default class CheckBridgeStatus extends BaseMethod {
5
+ init() {
6
+ this.useDevice = false;
7
+ }
8
+
9
+ async run() {
10
+ const logs = getLog();
11
+ return Promise.resolve(logs);
12
+ }
13
+ }
@@ -33,7 +33,7 @@ export default class DeviceVerify extends BaseMethod<BixinVerifyDeviceRequest> {
33
33
  }
34
34
  );
35
35
  response = res.message;
36
- } else if (deviceType === 'mini') {
36
+ } else {
37
37
  const signatureRes = await this.device.commands.typedCall(
38
38
  'SESignMessage',
39
39
  'SEMessageSignature',
@@ -0,0 +1,24 @@
1
+ import { DataManager } from '../../data-manager';
2
+ import type { Features } from '../../types';
3
+
4
+ export const getFirmwareReleaseInfo = (features: Features) => {
5
+ const firmwareStatus = DataManager.getFirmwareStatus(features);
6
+ const changelog = DataManager.getFirmwareChangelog(features);
7
+ const release = DataManager.getFirmwareLeatestRelease(features);
8
+ return {
9
+ status: firmwareStatus,
10
+ changelog,
11
+ release,
12
+ };
13
+ };
14
+
15
+ export const getBleFirmwareReleaseInfo = (features: Features) => {
16
+ const firmwareStatus = DataManager.getBLEFirmwareStatus(features);
17
+ const changelog = DataManager.getBleFirmwareChangelog(features);
18
+ const release = DataManager.getBleFirmwareLeatestRelease(features);
19
+ return {
20
+ status: firmwareStatus,
21
+ changelog,
22
+ release,
23
+ };
24
+ };
package/src/api/index.ts CHANGED
@@ -43,3 +43,5 @@ export { default as stellarGetAddress } from './stellar/StellarGetAddress';
43
43
  export { default as stellarSignTransaction } from './stellar/StellarSignTransaction';
44
44
 
45
45
  export { default as firmwareUpdate } from './FirmwareUpdate';
46
+
47
+ export { default as getLogs } from './GetLogs';
@@ -1,8 +1,12 @@
1
- import { HardwareError, ERRORS } from '@onekeyfe/hd-shared';
1
+ import { HardwareError, ERRORS, HardwareErrorCode } from '@onekeyfe/hd-shared';
2
2
 
3
3
  export const safeThrowError = (error: any) => {
4
4
  if (error instanceof HardwareError) {
5
5
  throw error;
6
+ } else if (error.code === 'ERR_NETWORK') {
7
+ throw ERRORS.TypedError(HardwareErrorCode.BridgeNotInstalled);
8
+ } else if (error.code === 'ECONNABORTED') {
9
+ throw ERRORS.TypedError(HardwareErrorCode.BridgeTimeoutError);
6
10
  } else {
7
11
  throw ERRORS.TypedError(error);
8
12
  }
package/src/core/index.ts CHANGED
@@ -6,7 +6,7 @@ import { Device, DeviceEvents } from '../device/Device';
6
6
  import { DeviceList } from '../device/DeviceList';
7
7
  import { findMethod } from '../api/utils';
8
8
  import { DataManager } from '../data-manager';
9
- import { initLog, enableLog } from '../utils';
9
+ import { enableLog, getLogger, LoggerNames, setLoggerPostMessage } from '../utils';
10
10
  import {
11
11
  CoreMessage,
12
12
  createResponseMessage,
@@ -31,16 +31,18 @@ import {
31
31
  getDeviceType,
32
32
  } from '../utils/deviceFeaturesUtils';
33
33
 
34
- const Log = initLog('Core');
34
+ const Log = getLogger(LoggerNames.Core);
35
35
 
36
36
  let _core: Core;
37
37
  let _deviceList: DeviceList | undefined;
38
38
  let _connector: DeviceConnector | undefined;
39
39
  let _uiPromises: UiPromise<UiPromiseResponse['type']>[] = []; // Waiting for ui response
40
40
  let _callPromise: Deferred<any> | undefined;
41
- const callApiQueue = [];
41
+ const callApiQueue: BaseMethod[] = [];
42
42
 
43
43
  const deviceCacheMap = new Map<string, Device>();
44
+ let pollingId = 1;
45
+ const pollingState: Record<number, boolean> = {};
44
46
 
45
47
  export const callAPI = async (message: CoreMessage) => {
46
48
  if (!message.id || !message.payload || message.type !== IFRAME.CALL) {
@@ -71,26 +73,25 @@ export const callAPI = async (message: CoreMessage) => {
71
73
  // push method to queue
72
74
  callApiQueue.push(method);
73
75
 
74
- // update DeviceList every call and first configure transport messages
75
- try {
76
- await initDeviceList(method);
77
- } catch (error) {
78
- return Promise.reject(error);
76
+ if (callApiQueue.length > 1) {
77
+ Log.debug('should cancel the previous method execution: ', callApiQueue);
79
78
  }
80
79
 
81
- const env = DataManager.getSettings('env');
80
+ /**
81
+ * Polling to ensure successful connection
82
+ */
83
+ if (pollingState[pollingId]) {
84
+ pollingState[pollingId] = false;
85
+ }
86
+ pollingId += 1;
82
87
  let device: Device;
83
88
  try {
84
- if (env === 'react-native') {
85
- device = initDeviceForBle(method);
86
- } else {
87
- device = initDevice(method);
88
- }
89
- } catch (error) {
90
- return Promise.reject(error);
89
+ device = await ensureConnected(method, pollingId);
90
+ } catch (e) {
91
+ return createResponseMessage(method.responseID, false, { error: e });
91
92
  }
92
93
 
93
- Log.debug('Call API - setDevice: ', device);
94
+ Log.debug('Call API - setDevice: ', device.mainId);
94
95
  method.setDevice?.(device);
95
96
 
96
97
  device.on(DEVICE.PIN, onDevicePinHandler);
@@ -149,10 +150,17 @@ export const callAPI = async (message: CoreMessage) => {
149
150
  );
150
151
  }
151
152
 
152
- // const deviceTypeException = method.checkDeviceType();
153
- // if (deviceTypeException) {
154
- // return Promise.reject(ERRORS.TypedError('Not_Use_Onekey_Device'));
155
- // }
153
+ if (method.deviceId && method.checkDeviceId) {
154
+ const isSameDeviceID = device.checkDeviceId(method.deviceId);
155
+ if (!isSameDeviceID) {
156
+ return Promise.reject(ERRORS.TypedError(HardwareErrorCode.DeviceCheckDeviceIdError));
157
+ }
158
+ }
159
+
160
+ /**
161
+ * check firmware release info
162
+ */
163
+ method.checkFirmwareRelease();
156
164
 
157
165
  // reconfigure messages
158
166
  if (_deviceList) {
@@ -170,14 +178,14 @@ export const callAPI = async (message: CoreMessage) => {
170
178
  _callPromise?.resolve(messageResponse);
171
179
  }
172
180
  };
173
- Log.debug('Call API - Device Run: ', device);
181
+ Log.debug('Call API - Device Run: ', device.mainId);
174
182
  const deviceRun = () => device.run(inner);
175
183
  _callPromise = createDeferred(deviceRun);
176
184
 
177
185
  try {
178
186
  return await _callPromise.promise;
179
187
  } catch (e) {
180
- console.log('Device Run Error: ', e);
188
+ Log.debug('Device Run Error: ', e);
181
189
  return createResponseMessage(method.responseID, false, { error: e });
182
190
  }
183
191
  } catch (error) {
@@ -193,6 +201,16 @@ export const callAPI = async (message: CoreMessage) => {
193
201
  }
194
202
  }
195
203
 
204
+ // remove method from queue
205
+ const index =
206
+ messageResponse && messageResponse.id
207
+ ? callApiQueue.findIndex(m => m.responseID === messageResponse.id)
208
+ : -1;
209
+ if (index > -1) {
210
+ callApiQueue.splice(index, 1);
211
+ Log.debug('Remove the finished method from the queue: ', callApiQueue);
212
+ }
213
+
196
214
  closePopup();
197
215
 
198
216
  cleanup();
@@ -212,7 +230,8 @@ async function initDeviceList(method: BaseMethod) {
212
230
  await TransportManager.configure();
213
231
  _deviceList.connector = _connector;
214
232
  }
215
- await _deviceList.getDeviceLists();
233
+
234
+ await _deviceList.getDeviceLists(method.connectId);
216
235
  }
217
236
 
218
237
  function initDevice(method: BaseMethod) {
@@ -261,16 +280,112 @@ function initDeviceForBle(method: BaseMethod) {
261
280
  return device;
262
281
  }
263
282
 
283
+ type IPollFn<T> = (time?: number) => T;
284
+ // eslint-disable-next-line @typescript-eslint/require-await
285
+ const ensureConnected = async (method: BaseMethod, pollingId: number) => {
286
+ let tryCount = 0;
287
+ const MAX_RETRY_COUNT = (method.payload && method.payload.retryCount) || 5;
288
+ const POLL_INTERVAL_TIME = (method.payload && method.payload.pollIntervalTime) || 1000;
289
+ const TIME_OUT = (method.payload && method.payload.timeout) || 10000;
290
+ let timer: ReturnType<typeof setTimeout> | null = null;
291
+
292
+ Log.debug(
293
+ `EnsureConnected function start, MAX_RETRY_COUNT=${MAX_RETRY_COUNT}, POLL_INTERVAL_TIME=${POLL_INTERVAL_TIME} `
294
+ );
295
+
296
+ const poll: IPollFn<Promise<Device>> = async (time = POLL_INTERVAL_TIME) =>
297
+ // eslint-disable-next-line no-async-promise-executor
298
+ new Promise(async (resolve, reject) => {
299
+ if (!pollingState[pollingId]) {
300
+ Log.debug('EnsureConnected function stop, polling id: ', pollingId);
301
+ reject(ERRORS.TypedError(HardwareErrorCode.RuntimeError, 'Polling stop'));
302
+ return;
303
+ }
304
+
305
+ // 单次连接确保不超时
306
+ if (timer) {
307
+ clearTimeout(timer);
308
+ }
309
+ timer = setTimeout(() => {
310
+ reject(ERRORS.TypedError(HardwareErrorCode.RuntimeError, 'Polling timeout'));
311
+ }, TIME_OUT);
312
+
313
+ tryCount += 1;
314
+ Log.debug('EnsureConnected function try count: ', tryCount, ' poll interval time: ', time);
315
+ try {
316
+ await initDeviceList(method);
317
+ } catch (error) {
318
+ Log.debug('device list error: ', error);
319
+ if (error.errorCode === HardwareErrorCode.BridgeNotInstalled) {
320
+ reject(error);
321
+ return;
322
+ }
323
+ if (error.errorCode === HardwareErrorCode.TransportNotConfigured) {
324
+ await TransportManager.configure();
325
+ }
326
+ }
327
+
328
+ const env = DataManager.getSettings('env');
329
+ let device: Device;
330
+ try {
331
+ if (env === 'react-native') {
332
+ device = initDeviceForBle(method);
333
+ } else {
334
+ device = initDevice(method);
335
+ }
336
+
337
+ if (device) {
338
+ if (timer) {
339
+ clearTimeout(timer);
340
+ }
341
+ /**
342
+ * Bluetooth should call initialize here
343
+ */
344
+ if (env === 'react-native') {
345
+ await device.acquire();
346
+ await device.initialize();
347
+ }
348
+ resolve(device);
349
+ return;
350
+ }
351
+ } catch (error) {
352
+ Log.debug('device error: ', error);
353
+ if (error.errorCode === HardwareErrorCode.BlePermissionError) {
354
+ reject(error);
355
+ return;
356
+ }
357
+ }
358
+
359
+ if (tryCount > 5) {
360
+ if (timer) {
361
+ clearTimeout(timer);
362
+ }
363
+ Log.debug('EnsureConnected get to max try count, will return: ', tryCount);
364
+ reject(ERRORS.TypedError(HardwareErrorCode.DeviceNotFound));
365
+ return;
366
+ }
367
+ // eslint-disable-next-line no-promise-executor-return
368
+ return setTimeout(() => resolve(poll(time * 1.5)), time);
369
+ });
370
+ pollingState[pollingId] = true;
371
+ return poll();
372
+ };
373
+
264
374
  export const cancel = (connectId?: string) => {
265
375
  const env = DataManager.getSettings('env');
266
- if (connectId) {
267
- let device;
268
- if (env === 'react-native') {
269
- device = initDeviceForBle({ connectId } as BaseMethod);
270
- } else {
271
- device = initDevice({ connectId } as BaseMethod);
376
+ try {
377
+ if (connectId) {
378
+ let device;
379
+ if (env === 'react-native') {
380
+ device = initDeviceForBle({ connectId } as BaseMethod);
381
+ } else {
382
+ device = initDevice({ connectId } as BaseMethod);
383
+ }
384
+ device?.interruptionFromUser();
272
385
  }
273
- device?.interruption();
386
+ } catch (e) {
387
+ // Empty
388
+ Log.error('Cancel API Error: ', e);
274
389
  }
275
390
  cleanup();
276
391
  closePopup();
@@ -289,7 +404,7 @@ const closePopup = () => {
289
404
  };
290
405
 
291
406
  const onDevicePinHandler = async (...[device, type, callback]: DeviceEvents['pin']) => {
292
- console.log('onDevicePinHandler');
407
+ Log.debug('onDevicePinHandler');
293
408
  // create ui promise
294
409
  const uiPromise = createUiPromise(UI_RESPONSE.RECEIVE_PIN, device);
295
410
  // request pin view
@@ -405,6 +520,9 @@ export const init = async (settings: ConnectSettings, Transport: any) => {
405
520
  Log.error('DataManager.load error');
406
521
  }
407
522
  enableLog(DataManager.getSettings('debug'));
523
+ if (DataManager.getSettings('env') !== 'react-native') {
524
+ setLoggerPostMessage(postMessage);
525
+ }
408
526
  initCore();
409
527
  initConnector();
410
528
 
@@ -1,9 +1,11 @@
1
1
  import { Transport } from '@onekeyfe/hd-transport';
2
2
  import { ERRORS, HardwareErrorCode } from '@onekeyfe/hd-shared';
3
- import { initLog } from '../utils';
4
3
  import DataManager from './DataManager';
4
+ import { getLogger, LoggerNames } from '../utils';
5
5
 
6
- const Log = initLog('Transport');
6
+ const Log = getLogger(LoggerNames.Transport);
7
+ const BleLogger = getLogger(LoggerNames.HdBleTransport);
8
+ const HttpLogger = getLogger(LoggerNames.HdTransportHttp);
7
9
  /**
8
10
  * transport 在同一个环境中只会存在一个
9
11
  * 这里设计成单例获取
@@ -19,7 +21,7 @@ export default class TransportManager {
19
21
  static reactNativeInit = false;
20
22
 
21
23
  static load() {
22
- console.log('transport manager load');
24
+ Log.debug('transport manager load');
23
25
  this.defaultMessages = DataManager.getProtobufMessages();
24
26
  this.currentMessages = this.defaultMessages;
25
27
  }
@@ -30,13 +32,13 @@ export default class TransportManager {
30
32
  Log.debug('Initializing transports');
31
33
  if (env === 'react-native') {
32
34
  if (!this.reactNativeInit) {
33
- await this.transport.init();
35
+ await this.transport.init(BleLogger);
34
36
  this.reactNativeInit = true;
35
37
  } else {
36
38
  Log.debug('React Native Do Not Initializing transports');
37
39
  }
38
40
  } else {
39
- await this.transport.init();
41
+ await this.transport.init(HttpLogger);
40
42
  }
41
43
  Log.debug('Configuring transports');
42
44
  await this.transport.configure(JSON.stringify(this.defaultMessages));
@@ -76,7 +78,7 @@ export default class TransportManager {
76
78
  /** Actually initializes the HttpTransport */
77
79
  this.transport = new TransportConstructor() as unknown as Transport;
78
80
  }
79
- console.log('set transport: ', this.transport);
81
+ Log.debug('set transport: ', this.transport);
80
82
  }
81
83
 
82
84
  static getTransport() {