@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.
- package/dist/api/BaseMethod.d.ts +4 -0
- package/dist/api/BaseMethod.d.ts.map +1 -1
- package/dist/api/CheckBLEFirmwareRelease.d.ts.map +1 -1
- package/dist/api/CheckFirmwareRelease.d.ts.map +1 -1
- package/dist/api/GetLogs.d.ts +11 -0
- package/dist/api/GetLogs.d.ts.map +1 -0
- package/dist/api/firmware/releaseHelper.d.ts +18 -0
- package/dist/api/firmware/releaseHelper.d.ts.map +1 -0
- package/dist/api/index.d.ts +1 -0
- package/dist/api/index.d.ts.map +1 -1
- package/dist/constants/errors.d.ts.map +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/data-manager/TransportManager.d.ts.map +1 -1
- package/dist/device/Device.d.ts +3 -1
- package/dist/device/Device.d.ts.map +1 -1
- package/dist/device/DeviceCommands.d.ts +1 -1
- package/dist/device/DeviceCommands.d.ts.map +1 -1
- package/dist/device/DeviceList.d.ts +1 -1
- package/dist/device/DeviceList.d.ts.map +1 -1
- package/dist/events/core.d.ts +3 -1
- package/dist/events/core.d.ts.map +1 -1
- package/dist/events/firmware.d.ts +21 -0
- package/dist/events/firmware.d.ts.map +1 -0
- package/dist/events/index.d.ts +2 -0
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/log.d.ts +15 -0
- package/dist/events/log.d.ts.map +1 -0
- package/dist/index.d.ts +134 -40
- package/dist/index.js +730 -396
- package/dist/inject.d.ts.map +1 -1
- package/dist/types/api/btcGetAddress.d.ts +2 -2
- package/dist/types/api/btcGetAddress.d.ts.map +1 -1
- package/dist/types/api/btcGetPublicKey.d.ts +2 -2
- package/dist/types/api/btcGetPublicKey.d.ts.map +1 -1
- package/dist/types/api/btcSignMessage.d.ts +1 -1
- package/dist/types/api/btcSignMessage.d.ts.map +1 -1
- package/dist/types/api/btcSignTransaction.d.ts +1 -1
- package/dist/types/api/btcSignTransaction.d.ts.map +1 -1
- package/dist/types/api/btcVerifyMessage.d.ts +1 -1
- package/dist/types/api/btcVerifyMessage.d.ts.map +1 -1
- package/dist/types/api/cipherKeyValue.d.ts +2 -2
- package/dist/types/api/cipherKeyValue.d.ts.map +1 -1
- package/dist/types/api/evmGetAddress.d.ts +2 -2
- package/dist/types/api/evmGetAddress.d.ts.map +1 -1
- package/dist/types/api/evmGetPublicKey.d.ts +2 -2
- package/dist/types/api/evmGetPublicKey.d.ts.map +1 -1
- package/dist/types/api/evmSignMessage.d.ts +1 -1
- package/dist/types/api/evmSignMessage.d.ts.map +1 -1
- package/dist/types/api/evmSignMessageEIP712.d.ts +1 -1
- package/dist/types/api/evmSignMessageEIP712.d.ts.map +1 -1
- package/dist/types/api/evmSignTransaction.d.ts +1 -1
- package/dist/types/api/evmSignTransaction.d.ts.map +1 -1
- package/dist/types/api/evmSignTypedData.d.ts +1 -1
- package/dist/types/api/evmSignTypedData.d.ts.map +1 -1
- package/dist/types/api/evmVerifyMessage.d.ts +1 -1
- package/dist/types/api/evmVerifyMessage.d.ts.map +1 -1
- package/dist/types/api/getLogs.d.ts +3 -0
- package/dist/types/api/getLogs.d.ts.map +1 -0
- package/dist/types/api/index.d.ts +2 -0
- package/dist/types/api/index.d.ts.map +1 -1
- package/dist/types/api/nemGetAddress.d.ts +2 -2
- package/dist/types/api/nemGetAddress.d.ts.map +1 -1
- package/dist/types/api/nemSignTransaction.d.ts +1 -1
- package/dist/types/api/nemSignTransaction.d.ts.map +1 -1
- package/dist/types/api/solGetAddress.d.ts +2 -2
- package/dist/types/api/solGetAddress.d.ts.map +1 -1
- package/dist/types/api/solSignTransaction.d.ts +2 -2
- package/dist/types/api/solSignTransaction.d.ts.map +1 -1
- package/dist/types/api/starcoinGetAddress.d.ts +2 -2
- package/dist/types/api/starcoinGetAddress.d.ts.map +1 -1
- package/dist/types/api/starcoinGetPublicKey.d.ts +2 -2
- package/dist/types/api/starcoinGetPublicKey.d.ts.map +1 -1
- package/dist/types/api/starcoinSignMessage.d.ts +1 -1
- package/dist/types/api/starcoinSignMessage.d.ts.map +1 -1
- package/dist/types/api/starcoinSignTransaction.d.ts +1 -1
- package/dist/types/api/starcoinSignTransaction.d.ts.map +1 -1
- package/dist/types/api/starcoinVerifyMessage.d.ts +1 -1
- package/dist/types/api/starcoinVerifyMessage.d.ts.map +1 -1
- package/dist/types/api/stellarGetAddress.d.ts +2 -2
- package/dist/types/api/stellarGetAddress.d.ts.map +1 -1
- package/dist/types/api/stellarSignTransaction.d.ts +1 -1
- package/dist/types/api/stellarSignTransaction.d.ts.map +1 -1
- package/dist/types/params.d.ts +3 -0
- package/dist/types/params.d.ts.map +1 -1
- package/dist/utils/deviceFeaturesUtils.d.ts.map +1 -1
- package/dist/utils/index.d.ts +1 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/logger.d.ts +56 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/package.json +4 -4
- package/src/api/BaseMethod.ts +30 -1
- package/src/api/CheckBLEFirmwareRelease.ts +4 -9
- package/src/api/CheckFirmwareRelease.ts +3 -9
- package/src/api/FirmwareUpdate.ts +1 -1
- package/src/api/GetLogs.ts +13 -0
- package/src/api/device/DeviceVerify.ts +1 -1
- package/src/api/firmware/releaseHelper.ts +24 -0
- package/src/api/index.ts +2 -0
- package/src/constants/errors.ts +5 -1
- package/src/core/index.ts +150 -32
- package/src/data-manager/TransportManager.ts +8 -6
- package/src/device/Device.ts +23 -7
- package/src/device/DeviceCommands.ts +12 -9
- package/src/device/DeviceConnector.ts +3 -3
- package/src/device/DeviceList.ts +25 -10
- package/src/events/core.ts +4 -0
- package/src/events/firmware.ts +32 -0
- package/src/events/index.ts +2 -0
- package/src/events/log.ts +23 -0
- package/src/inject.ts +55 -46
- package/src/types/api/btcGetAddress.ts +3 -5
- package/src/types/api/btcGetPublicKey.ts +2 -0
- package/src/types/api/btcSignMessage.ts +1 -0
- package/src/types/api/btcSignTransaction.ts +1 -0
- package/src/types/api/btcVerifyMessage.ts +1 -0
- package/src/types/api/cipherKeyValue.ts +2 -0
- package/src/types/api/evmGetAddress.ts +2 -0
- package/src/types/api/evmGetPublicKey.ts +2 -0
- package/src/types/api/evmSignMessage.ts +1 -0
- package/src/types/api/evmSignMessageEIP712.ts +1 -0
- package/src/types/api/evmSignTransaction.ts +1 -0
- package/src/types/api/evmSignTypedData.ts +1 -0
- package/src/types/api/evmVerifyMessage.ts +1 -0
- package/src/types/api/getLogs.ts +3 -0
- package/src/types/api/index.ts +2 -0
- package/src/types/api/nemGetAddress.ts +2 -0
- package/src/types/api/nemSignTransaction.ts +1 -0
- package/src/types/api/solGetAddress.ts +2 -0
- package/src/types/api/solSignTransaction.ts +2 -0
- package/src/types/api/starcoinGetAddress.ts +2 -0
- package/src/types/api/starcoinGetPublicKey.ts +2 -0
- package/src/types/api/starcoinSignMessage.ts +1 -0
- package/src/types/api/starcoinSignTransaction.ts +1 -0
- package/src/types/api/starcoinVerifyMessage.ts +1 -0
- package/src/types/api/stellarGetAddress.ts +2 -0
- package/src/types/api/stellarSignTransaction.ts +1 -0
- package/src/types/params.ts +12 -0
- package/src/utils/deviceFeaturesUtils.ts +2 -10
- package/src/utils/index.ts +1 -3
- 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.
|
|
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.
|
|
29
|
-
"@onekeyfe/hd-transport": "^0.1.
|
|
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": "
|
|
40
|
+
"gitHead": "eebfd1dd46b146c64a8bfda691dc4d8402fa105b"
|
|
41
41
|
}
|
package/src/api/BaseMethod.ts
CHANGED
|
@@ -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 {
|
|
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
|
|
14
|
-
|
|
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 {
|
|
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
|
|
11
|
-
|
|
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
|
|
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';
|
package/src/constants/errors.ts
CHANGED
|
@@ -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 {
|
|
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 =
|
|
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
|
-
|
|
75
|
-
|
|
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
|
-
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
81
|
+
Log.debug('set transport: ', this.transport);
|
|
80
82
|
}
|
|
81
83
|
|
|
82
84
|
static getTransport() {
|