@onekeyfe/hd-core 1.1.18 → 1.1.19-alpha.1
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 +9 -4
- package/dist/api/BaseMethod.d.ts.map +1 -1
- package/dist/api/CheckAllFirmwareRelease.d.ts +1 -1
- package/dist/api/CheckAllFirmwareRelease.d.ts.map +1 -1
- package/dist/api/CheckBootloaderRelease.d.ts.map +1 -1
- package/dist/api/CheckFirmwareRelease.d.ts.map +1 -1
- package/dist/api/FirmwareUpdate.d.ts +1 -1
- package/dist/api/FirmwareUpdate.d.ts.map +1 -1
- package/dist/api/FirmwareUpdateV2.d.ts +3 -2
- package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
- package/dist/api/FirmwareUpdateV3.d.ts +2 -2
- package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
- package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts +2 -2
- package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts.map +1 -1
- package/dist/api/device/DeviceFullyUploadResource.d.ts.map +1 -1
- package/dist/api/device/DeviceUpdateBootloader.d.ts +6 -1
- package/dist/api/device/DeviceUpdateBootloader.d.ts.map +1 -1
- package/dist/api/firmware/getBinary.d.ts +6 -3
- package/dist/api/firmware/getBinary.d.ts.map +1 -1
- package/dist/api/firmware/releaseHelper.d.ts +7 -2
- package/dist/api/firmware/releaseHelper.d.ts.map +1 -1
- package/dist/api/firmware/updateBootloader.d.ts +7 -2
- package/dist/api/firmware/updateBootloader.d.ts.map +1 -1
- package/dist/api/firmware/uploadFirmware.d.ts +4 -4
- package/dist/api/firmware/uploadFirmware.d.ts.map +1 -1
- package/dist/api/sui/SuiSignTransaction.d.ts +1 -1
- package/dist/api/sui/SuiSignTransaction.d.ts.map +1 -1
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/data-manager/DataManager.d.ts +16 -9
- package/dist/data-manager/DataManager.d.ts.map +1 -1
- package/dist/device/Device.d.ts +5 -2
- package/dist/device/Device.d.ts.map +1 -1
- package/dist/device/DeviceCommands.d.ts +6 -4
- package/dist/device/DeviceCommands.d.ts.map +1 -1
- package/dist/events/device.d.ts +2 -2
- package/dist/events/device.d.ts.map +1 -1
- package/dist/index.d.ts +96 -28
- package/dist/index.js +543 -132
- package/dist/types/api/checkAllFirmwareRelease.d.ts +5 -1
- package/dist/types/api/checkAllFirmwareRelease.d.ts.map +1 -1
- package/dist/types/api/checkBootloaderRelease.d.ts +5 -2
- package/dist/types/api/checkBootloaderRelease.d.ts.map +1 -1
- package/dist/types/api/checkFirmwareRelease.d.ts +6 -2
- package/dist/types/api/checkFirmwareRelease.d.ts.map +1 -1
- package/dist/types/api/deviceFullyUploadResource.d.ts +6 -1
- package/dist/types/api/deviceFullyUploadResource.d.ts.map +1 -1
- package/dist/types/api/deviceUpdateBootloader.d.ts +6 -3
- package/dist/types/api/deviceUpdateBootloader.d.ts.map +1 -1
- package/dist/types/api/firmwareUpdate.d.ts +3 -1
- package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
- package/dist/types/api/index.d.ts +128 -128
- package/dist/types/api/index.d.ts.map +1 -1
- package/dist/types/device.d.ts +4 -1
- package/dist/types/device.d.ts.map +1 -1
- package/dist/types/settings.d.ts +3 -0
- package/dist/types/settings.d.ts.map +1 -1
- package/dist/utils/deviceFeaturesUtils.d.ts +7 -5
- package/dist/utils/deviceFeaturesUtils.d.ts.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/patch.d.ts +1 -1
- package/dist/utils/patch.d.ts.map +1 -1
- package/dist/utils/release.d.ts +1 -1
- package/dist/utils/release.d.ts.map +1 -1
- package/dist/utils/tracing.d.ts +34 -0
- package/dist/utils/tracing.d.ts.map +1 -0
- package/package.json +4 -4
- package/src/api/BaseMethod.ts +55 -8
- package/src/api/CheckAllFirmwareRelease.ts +14 -6
- package/src/api/CheckBootloaderRelease.ts +13 -2
- package/src/api/CheckFirmwareRelease.ts +9 -2
- package/src/api/FirmwareUpdate.ts +7 -5
- package/src/api/FirmwareUpdateV2.ts +26 -14
- package/src/api/FirmwareUpdateV3.ts +31 -18
- package/src/api/allnetwork/AllNetworkGetAddressBase.ts +56 -26
- package/src/api/device/DeviceFullyUploadResource.ts +8 -2
- package/src/api/device/DeviceUpdateBootloader.ts +21 -5
- package/src/api/firmware/getBinary.ts +15 -4
- package/src/api/firmware/releaseHelper.ts +22 -11
- package/src/api/firmware/updateBootloader.ts +17 -9
- package/src/api/firmware/uploadFirmware.ts +51 -15
- package/src/api/sui/SuiSignTransaction.ts +7 -1
- package/src/core/index.ts +111 -8
- package/src/data/messages/messages.json +11 -1
- package/src/data-manager/DataManager.ts +126 -22
- package/src/device/Device.ts +24 -3
- package/src/device/DeviceCommands.ts +42 -8
- package/src/events/device.ts +2 -2
- package/src/types/api/checkAllFirmwareRelease.ts +5 -1
- package/src/types/api/checkBootloaderRelease.ts +7 -3
- package/src/types/api/checkFirmwareRelease.ts +10 -2
- package/src/types/api/deviceFullyUploadResource.ts +7 -1
- package/src/types/api/deviceUpdateBootloader.ts +8 -4
- package/src/types/api/firmwareUpdate.ts +4 -1
- package/src/types/api/index.ts +128 -161
- package/src/types/device.ts +7 -1
- package/src/types/settings.ts +37 -0
- package/src/utils/deviceFeaturesUtils.ts +22 -10
- package/src/utils/index.ts +1 -0
- package/src/utils/release.ts +2 -1
- package/src/utils/tracing.ts +251 -0
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import ByteBuffer from 'bytebuffer';
|
|
2
2
|
import semver from 'semver';
|
|
3
|
+
import type { EFirmwareType } from '@onekeyfe/hd-shared';
|
|
3
4
|
import { DeviceModelToTypes, Features } from '../../types';
|
|
4
5
|
import { getDeviceType, getDeviceBootloaderVersion, getDeviceFirmwareVersion } from '../../utils';
|
|
5
6
|
import { DataManager } from '../../data-manager';
|
|
6
7
|
import { shouldUpdateBootloaderForClassicAndMini } from './bootloaderHelper';
|
|
7
8
|
|
|
8
|
-
export function checkNeedUpdateBootForTouch(features: Features) {
|
|
9
|
+
export function checkNeedUpdateBootForTouch(features: Features, firmwareType: EFirmwareType) {
|
|
9
10
|
const deviceType = getDeviceType(features);
|
|
10
11
|
if (!DeviceModelToTypes.model_touch.includes(deviceType)) return false;
|
|
11
12
|
const currentVersion = getDeviceFirmwareVersion(features).join('.');
|
|
12
13
|
const bootloaderVersion = getDeviceBootloaderVersion(features).join('.');
|
|
13
|
-
const targetBootloaderVersion = DataManager.getBootloaderTargetVersion(features);
|
|
14
|
+
const targetBootloaderVersion = DataManager.getBootloaderTargetVersion(features, firmwareType);
|
|
14
15
|
if (!targetBootloaderVersion) return false;
|
|
15
16
|
|
|
16
17
|
return (
|
|
@@ -23,22 +24,29 @@ export function checkNeedUpdateBootForTouch(features: Features) {
|
|
|
23
24
|
);
|
|
24
25
|
}
|
|
25
26
|
|
|
26
|
-
export function checkNeedUpdateBootForClassicAndMini(
|
|
27
|
-
features
|
|
28
|
-
willUpdateFirmware
|
|
29
|
-
|
|
27
|
+
export function checkNeedUpdateBootForClassicAndMini({
|
|
28
|
+
features,
|
|
29
|
+
willUpdateFirmware,
|
|
30
|
+
firmwareType,
|
|
31
|
+
}: {
|
|
32
|
+
features: Features;
|
|
33
|
+
willUpdateFirmware?: string;
|
|
34
|
+
firmwareType: EFirmwareType;
|
|
35
|
+
}) {
|
|
30
36
|
const deviceType = getDeviceType(features);
|
|
31
37
|
if (!DeviceModelToTypes.model_mini.includes(deviceType)) return false;
|
|
32
38
|
if (!willUpdateFirmware) return false;
|
|
33
39
|
const currentVersion = getDeviceFirmwareVersion(features).join('.');
|
|
34
40
|
const bootloaderVersion = getDeviceBootloaderVersion(features).join('.');
|
|
35
|
-
const targetBootloaderVersion = DataManager.getBootloaderTargetVersion(features);
|
|
41
|
+
const targetBootloaderVersion = DataManager.getBootloaderTargetVersion(features, firmwareType);
|
|
36
42
|
if (targetBootloaderVersion && semver.gte(bootloaderVersion, targetBootloaderVersion.join('.'))) {
|
|
37
43
|
return false;
|
|
38
44
|
}
|
|
39
45
|
|
|
40
|
-
const bootloaderRelatedFirmwareVersion =
|
|
41
|
-
|
|
46
|
+
const bootloaderRelatedFirmwareVersion = DataManager.getBootloaderRelatedFirmwareVersion(
|
|
47
|
+
features,
|
|
48
|
+
firmwareType
|
|
49
|
+
);
|
|
42
50
|
if (!bootloaderRelatedFirmwareVersion) return false;
|
|
43
51
|
|
|
44
52
|
return shouldUpdateBootloaderForClassicAndMini({
|
|
@@ -2,29 +2,27 @@ import semver from 'semver';
|
|
|
2
2
|
import { blake2s } from '@noble/hashes/blake2s';
|
|
3
3
|
import JSZip from 'jszip';
|
|
4
4
|
import { ERRORS, HardwareErrorCode } from '@onekeyfe/hd-shared';
|
|
5
|
-
|
|
5
|
+
|
|
6
6
|
import {
|
|
7
|
-
|
|
7
|
+
LoggerNames,
|
|
8
8
|
getDeviceBootloaderVersion,
|
|
9
9
|
getDeviceType,
|
|
10
|
-
LoggerNames,
|
|
11
10
|
getLogger,
|
|
11
|
+
wait,
|
|
12
12
|
} from '../../utils';
|
|
13
|
-
import {
|
|
14
|
-
|
|
15
|
-
CoreMessage,
|
|
16
|
-
createUiMessage,
|
|
17
|
-
UI_REQUEST,
|
|
18
|
-
IFirmwareUpdateProgressType,
|
|
19
|
-
} from '../../events';
|
|
20
|
-
import { PROTO } from '../../constants';
|
|
21
|
-
import type { Device } from '../../device/Device';
|
|
22
|
-
import type { TypedCall, TypedResponseMessage } from '../../device/DeviceCommands';
|
|
23
|
-
import { DeviceModelToTypes, KnownDevice } from '../../types';
|
|
13
|
+
import { DEVICE, UI_REQUEST, createUiMessage } from '../../events';
|
|
14
|
+
import { DeviceModelToTypes } from '../../types';
|
|
24
15
|
import { bytesToHex } from '../helpers/hexUtils';
|
|
25
16
|
import { DataManager } from '../../data-manager';
|
|
26
17
|
import { DevicePool } from '../../device/DevicePool';
|
|
27
18
|
|
|
19
|
+
import type { KnownDevice } from '../../types';
|
|
20
|
+
import type { TypedCall, TypedResponseMessage } from '../../device/DeviceCommands';
|
|
21
|
+
import type { PROTO } from '../../constants';
|
|
22
|
+
import type { CoreMessage, IFirmwareUpdateProgressType } from '../../events';
|
|
23
|
+
import type { Success } from '@onekeyfe/hd-transport';
|
|
24
|
+
import type { Device } from '../../device/Device';
|
|
25
|
+
|
|
28
26
|
const NEW_BOOT_UPRATE_FIRMWARE_VERSION = '2.4.5';
|
|
29
27
|
const SESSION_ERROR = 'session not found';
|
|
30
28
|
const FIRMWARE_UPDATE_CONFIRM = 'Firmware install confirmed';
|
|
@@ -111,7 +109,45 @@ export const uploadFirmware = async (
|
|
|
111
109
|
if (DeviceModelToTypes.model_mini.includes(deviceType)) {
|
|
112
110
|
postConfirmationMessage(device);
|
|
113
111
|
postProgressTip(device, 'ConfirmOnDevice', postMessage);
|
|
114
|
-
const
|
|
112
|
+
const isFirmware = updateType === 'firmware';
|
|
113
|
+
|
|
114
|
+
const deviceBootloaderVersion = getDeviceBootloaderVersion(device.features).join('.');
|
|
115
|
+
const supportUpgradeFileHeader = semver.gt(deviceBootloaderVersion, '2.1.0');
|
|
116
|
+
|
|
117
|
+
Log.debug(
|
|
118
|
+
'supportUpgradeFileHeader:',
|
|
119
|
+
supportUpgradeFileHeader,
|
|
120
|
+
'deviceBootloaderVersion:',
|
|
121
|
+
deviceBootloaderVersion
|
|
122
|
+
);
|
|
123
|
+
if (isFirmware && supportUpgradeFileHeader) {
|
|
124
|
+
// Extract and validate firmware header (first 1KB)
|
|
125
|
+
const HEADER_SIZE = 1024;
|
|
126
|
+
if (payload.byteLength < HEADER_SIZE) {
|
|
127
|
+
throw ERRORS.TypedError(
|
|
128
|
+
HardwareErrorCode.RuntimeError,
|
|
129
|
+
`firmware payload too small: ${payload.byteLength} bytes, expected at least ${HEADER_SIZE} bytes`
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
Log.debug('Uploading firmware header:', { size: HEADER_SIZE, totalSize: payload.byteLength });
|
|
134
|
+
postProgressTip(device, 'UploadingFirmwareHeader', postMessage);
|
|
135
|
+
|
|
136
|
+
const header = new Uint8Array(payload.slice(0, HEADER_SIZE));
|
|
137
|
+
const headerRes = (await typedCall('UpgradeFileHeader', 'Success', {
|
|
138
|
+
data: bytesToHex(header),
|
|
139
|
+
})) as TypedResponseMessage<'Success'>;
|
|
140
|
+
|
|
141
|
+
const isUnexpectedMessage = headerRes.message?.message?.includes('Failure_UnexpectedMessage');
|
|
142
|
+
if (headerRes.type !== 'Success' && !isUnexpectedMessage) {
|
|
143
|
+
Log.error('Firmware header upload failed:', headerRes);
|
|
144
|
+
throw ERRORS.TypedError(HardwareErrorCode.RuntimeError, 'failed to upload firmware header');
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
Log.debug('Firmware header uploaded successfully, isUnexpectedMessage:', isUnexpectedMessage);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const eraseCommand = isFirmware ? 'FirmwareErase' : 'FirmwareErase_ex';
|
|
115
151
|
const eraseRes = await typedCall(eraseCommand as unknown as any, 'Success', {});
|
|
116
152
|
if (eraseRes.type !== 'Success') {
|
|
117
153
|
throw ERRORS.TypedError(HardwareErrorCode.RuntimeError, 'erase firmware error');
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { SuiSignTx as HardwareSuiSignTx, TypedCall, SuiSignedTx } from '@onekeyfe/hd-transport';
|
|
2
1
|
import semver from 'semver';
|
|
3
2
|
import { bytesToHex } from '@noble/hashes/utils';
|
|
3
|
+
|
|
4
4
|
import { UI_REQUEST } from '../../constants/ui-request';
|
|
5
5
|
import { validatePath } from '../helpers/pathUtils';
|
|
6
6
|
import { BaseMethod } from '../BaseMethod';
|
|
@@ -8,6 +8,12 @@ import { validateParams } from '../helpers/paramsValidator';
|
|
|
8
8
|
import { formatAnyHex } from '../helpers/hexUtils';
|
|
9
9
|
import { getDeviceFirmwareVersion, getDeviceType } from '../../utils';
|
|
10
10
|
import { DeviceModelToTypes } from '../../types';
|
|
11
|
+
|
|
12
|
+
import type {
|
|
13
|
+
SuiSignTx as HardwareSuiSignTx,
|
|
14
|
+
SuiSignedTx,
|
|
15
|
+
TypedCall,
|
|
16
|
+
} from '@onekeyfe/hd-transport';
|
|
11
17
|
import type { TypedResponseMessage } from '../../device/DeviceCommands';
|
|
12
18
|
|
|
13
19
|
type SuiSignTx = Omit<HardwareSuiSignTx, 'data_initial_chunk' | 'data_length'> & HardwareSuiSignTx;
|
package/src/core/index.ts
CHANGED
|
@@ -22,12 +22,23 @@ import {
|
|
|
22
22
|
setLoggerPostMessage,
|
|
23
23
|
wait,
|
|
24
24
|
getMethodVersionRange,
|
|
25
|
+
getFirmwareType,
|
|
25
26
|
} from '../utils';
|
|
26
27
|
import {
|
|
27
28
|
findDefectiveBatchDevice,
|
|
28
29
|
getDefectiveDeviceInfo,
|
|
29
30
|
} from '../utils/findDefectiveBatchDevice';
|
|
30
31
|
import { supportNewPassphrase } from '../utils/deviceFeaturesUtils';
|
|
32
|
+
import {
|
|
33
|
+
completeRequestContext,
|
|
34
|
+
createRequestContext,
|
|
35
|
+
createSdkTracingContext,
|
|
36
|
+
formatRequestContext,
|
|
37
|
+
getActiveRequestsByDeviceInstance,
|
|
38
|
+
SdkTracingContext,
|
|
39
|
+
updateRequestContext,
|
|
40
|
+
cleanupSdkInstance,
|
|
41
|
+
} from '../utils/tracing';
|
|
31
42
|
import { Device, DeviceEvents, InitOptions, RunOptions } from '../device/Device';
|
|
32
43
|
import { DeviceList } from '../device/DeviceList';
|
|
33
44
|
import { DevicePool } from '../device/DevicePool';
|
|
@@ -96,6 +107,30 @@ let preConnectCache: {
|
|
|
96
107
|
passphraseState: undefined,
|
|
97
108
|
};
|
|
98
109
|
|
|
110
|
+
const toError = (error: unknown): Error | undefined => {
|
|
111
|
+
if (error instanceof Error) return error;
|
|
112
|
+
if (error == null) return undefined;
|
|
113
|
+
if (typeof error === 'string') return new Error(error);
|
|
114
|
+
try {
|
|
115
|
+
return new Error(JSON.stringify(error));
|
|
116
|
+
} catch {
|
|
117
|
+
return new Error(String(error));
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
const updateMethodRequestContext = (method: BaseMethod, updates: any) => {
|
|
122
|
+
if (method.requestContext) {
|
|
123
|
+
updateRequestContext(method.requestContext.responseID, updates);
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
const completeMethodRequestContext = (method: BaseMethod, error?: unknown) => {
|
|
128
|
+
if (!method.requestContext) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
completeRequestContext(method.requestContext.responseID, toError(error));
|
|
132
|
+
};
|
|
133
|
+
|
|
99
134
|
export const callAPI = async (context: CoreContext, message: CoreMessage) => {
|
|
100
135
|
if (!message.id || !message.payload || message.type !== IFRAME.CALL) {
|
|
101
136
|
return Promise.reject(ERRORS.TypedError('on call: message.id or message.payload is missing'));
|
|
@@ -107,6 +142,15 @@ export const callAPI = async (context: CoreContext, message: CoreMessage) => {
|
|
|
107
142
|
method = findMethod(message as IFrameCallMessage);
|
|
108
143
|
method.connector = _connector;
|
|
109
144
|
method.postMessage = postMessage;
|
|
145
|
+
method.setContext?.(context);
|
|
146
|
+
|
|
147
|
+
method.requestContext = createRequestContext(method.responseID, method.name, {
|
|
148
|
+
sdkInstanceId: context.sdkInstanceId,
|
|
149
|
+
connectId: method.connectId,
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
Log.debug(`[${context.sdkInstanceId}] callAPI: ${formatRequestContext(method.requestContext)}`);
|
|
153
|
+
|
|
110
154
|
method.init();
|
|
111
155
|
} catch (error) {
|
|
112
156
|
return Promise.reject(error);
|
|
@@ -115,10 +159,13 @@ export const callAPI = async (context: CoreContext, message: CoreMessage) => {
|
|
|
115
159
|
DevicePool.emitter.on(DEVICE.CONNECT, onDeviceConnectHandler);
|
|
116
160
|
|
|
117
161
|
if (!method.useDevice) {
|
|
162
|
+
updateMethodRequestContext(method, { status: 'running' });
|
|
118
163
|
try {
|
|
119
164
|
const response = await method.run();
|
|
165
|
+
completeMethodRequestContext(method);
|
|
120
166
|
return createResponseMessage(method.responseID, true, response);
|
|
121
167
|
} catch (error) {
|
|
168
|
+
completeMethodRequestContext(method, error);
|
|
122
169
|
return createResponseMessage(method.responseID, false, { error });
|
|
123
170
|
}
|
|
124
171
|
}
|
|
@@ -190,6 +237,8 @@ const onCallDevice = async (
|
|
|
190
237
|
|
|
191
238
|
const { requestQueue, getPrePendingCallPromise, setPrePendingCallPromise } = context;
|
|
192
239
|
|
|
240
|
+
updateMethodRequestContext(method, { status: 'running' });
|
|
241
|
+
|
|
193
242
|
const connectStateChange = preConnectCache.passphraseState !== method.payload.passphraseState;
|
|
194
243
|
|
|
195
244
|
preConnectCache = {
|
|
@@ -224,6 +273,8 @@ const onCallDevice = async (
|
|
|
224
273
|
} catch (e) {
|
|
225
274
|
console.log('ensureConnected error: ', e);
|
|
226
275
|
|
|
276
|
+
completeMethodRequestContext(method, e);
|
|
277
|
+
|
|
227
278
|
if (e.name === 'AbortError' || e.message === 'Request aborted') {
|
|
228
279
|
requestQueue.releaseTask(method.responseID);
|
|
229
280
|
return createResponseMessage(method.responseID, false, {
|
|
@@ -238,6 +289,19 @@ const onCallDevice = async (
|
|
|
238
289
|
method.setDevice?.(device);
|
|
239
290
|
method.context = context;
|
|
240
291
|
|
|
292
|
+
updateMethodRequestContext(method, {
|
|
293
|
+
deviceInstanceId: device.instanceId,
|
|
294
|
+
commandsInstanceId: device.commands?.instanceId,
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
const activeRequests = getActiveRequestsByDeviceInstance(device.instanceId);
|
|
298
|
+
if (activeRequests.length > 0) {
|
|
299
|
+
Log.warn(
|
|
300
|
+
`[${method.instanceId}] Device ${device.instanceId} has ${activeRequests.length} active requests:`,
|
|
301
|
+
activeRequests.map(formatRequestContext)
|
|
302
|
+
);
|
|
303
|
+
}
|
|
304
|
+
|
|
241
305
|
device.on(DEVICE.PIN, onDevicePinHandler);
|
|
242
306
|
device.on(DEVICE.BUTTON, onDeviceButtonHandler);
|
|
243
307
|
device.on(
|
|
@@ -282,7 +346,8 @@ const onCallDevice = async (
|
|
|
282
346
|
}
|
|
283
347
|
}
|
|
284
348
|
|
|
285
|
-
const
|
|
349
|
+
const deviceFirmwareType = getFirmwareType(device.features);
|
|
350
|
+
const newVersionStatus = DataManager.getFirmwareStatus(device.features, deviceFirmwareType);
|
|
286
351
|
const bleVersionStatus = DataManager.getBLEFirmwareStatus(device.features);
|
|
287
352
|
|
|
288
353
|
const currentFirmwareVersion = getDeviceFirmwareVersion(device.features).join('.');
|
|
@@ -450,10 +515,12 @@ const onCallDevice = async (
|
|
|
450
515
|
Log.debug('Call API - Inner Method Run: ');
|
|
451
516
|
messageResponse = createResponseMessage(method.responseID, true, response);
|
|
452
517
|
requestQueue.resolveRequest(method.responseID, messageResponse);
|
|
518
|
+
completeMethodRequestContext(method);
|
|
453
519
|
} catch (error) {
|
|
454
|
-
Log.debug(
|
|
520
|
+
Log.debug(`Call API - Inner Method Run Error`, error);
|
|
455
521
|
messageResponse = createResponseMessage(method.responseID, false, { error });
|
|
456
522
|
requestQueue.resolveRequest(method.responseID, messageResponse);
|
|
523
|
+
completeMethodRequestContext(method, error);
|
|
457
524
|
}
|
|
458
525
|
};
|
|
459
526
|
Log.debug('Call API - Device Run: ', device.mainId);
|
|
@@ -469,6 +536,7 @@ const onCallDevice = async (
|
|
|
469
536
|
return await task.callPromise.promise;
|
|
470
537
|
} catch (e) {
|
|
471
538
|
Log.debug('Device Run Error: ', e);
|
|
539
|
+
completeMethodRequestContext(method, e);
|
|
472
540
|
return createResponseMessage(method.responseID, false, { error: e });
|
|
473
541
|
}
|
|
474
542
|
} catch (error) {
|
|
@@ -478,6 +546,7 @@ const onCallDevice = async (
|
|
|
478
546
|
ERRORS.TypedError(HardwareErrorCode.CallMethodError, error.message)
|
|
479
547
|
);
|
|
480
548
|
Log.debug('Call API - Run Error: ', error);
|
|
549
|
+
completeMethodRequestContext(method, error);
|
|
481
550
|
} finally {
|
|
482
551
|
const response = messageResponse;
|
|
483
552
|
|
|
@@ -505,7 +574,20 @@ const onCallDevice = async (
|
|
|
505
574
|
|
|
506
575
|
cleanup();
|
|
507
576
|
|
|
508
|
-
|
|
577
|
+
if (device) {
|
|
578
|
+
const stillActive = getActiveRequestsByDeviceInstance(device.instanceId);
|
|
579
|
+
if (stillActive.length > 1) {
|
|
580
|
+
Log.warn(
|
|
581
|
+
`[${method.instanceId}] Removing listeners while ${stillActive.length} requests are active!`,
|
|
582
|
+
{
|
|
583
|
+
deviceInstanceId: device.instanceId,
|
|
584
|
+
activeRequests: stillActive.map(formatRequestContext),
|
|
585
|
+
pinListeners: device.listenerCount(DEVICE.PIN),
|
|
586
|
+
}
|
|
587
|
+
);
|
|
588
|
+
}
|
|
589
|
+
removeDeviceListener(device);
|
|
590
|
+
}
|
|
509
591
|
}
|
|
510
592
|
};
|
|
511
593
|
|
|
@@ -585,7 +667,10 @@ function initDeviceForBle(method: BaseMethod) {
|
|
|
585
667
|
if (deviceCacheMap.has(method.connectId)) {
|
|
586
668
|
device = deviceCacheMap.get(method.connectId) as Device;
|
|
587
669
|
} else {
|
|
588
|
-
device = Device.fromDescriptor(
|
|
670
|
+
device = Device.fromDescriptor(
|
|
671
|
+
{ id: method.connectId } as OneKeyDeviceInfo,
|
|
672
|
+
method.sdkInstanceId
|
|
673
|
+
);
|
|
589
674
|
deviceCacheMap.set(method.connectId, device);
|
|
590
675
|
}
|
|
591
676
|
device.deviceConnector = _connector;
|
|
@@ -640,7 +725,7 @@ const ensureConnected = async (
|
|
|
640
725
|
if (timer) {
|
|
641
726
|
clearTimeout(timer);
|
|
642
727
|
}
|
|
643
|
-
reject(ERRORS.TypedError(HardwareErrorCode.
|
|
728
|
+
reject(ERRORS.TypedError(HardwareErrorCode.CallQueueActionCancelled));
|
|
644
729
|
return true;
|
|
645
730
|
}
|
|
646
731
|
return false;
|
|
@@ -804,7 +889,7 @@ export const cancel = (context: CoreContext, connectId?: string) => {
|
|
|
804
889
|
}
|
|
805
890
|
requestQueue.rejectRequest(
|
|
806
891
|
requestId,
|
|
807
|
-
ERRORS.TypedError(HardwareErrorCode.
|
|
892
|
+
ERRORS.TypedError(HardwareErrorCode.CallQueueActionCancelled)
|
|
808
893
|
);
|
|
809
894
|
}
|
|
810
895
|
}
|
|
@@ -829,7 +914,7 @@ export const cancel = (context: CoreContext, connectId?: string) => {
|
|
|
829
914
|
|
|
830
915
|
requestQueue.rejectRequest(
|
|
831
916
|
requestId,
|
|
832
|
-
ERRORS.TypedError(HardwareErrorCode.
|
|
917
|
+
ERRORS.TypedError(HardwareErrorCode.CallQueueActionCancelled)
|
|
833
918
|
);
|
|
834
919
|
}
|
|
835
920
|
}
|
|
@@ -842,7 +927,10 @@ export const cancel = (context: CoreContext, connectId?: string) => {
|
|
|
842
927
|
});
|
|
843
928
|
|
|
844
929
|
requestQueue.getRequestTasksId().forEach(requestId => {
|
|
845
|
-
requestQueue.rejectRequest(
|
|
930
|
+
requestQueue.rejectRequest(
|
|
931
|
+
requestId,
|
|
932
|
+
ERRORS.TypedError(HardwareErrorCode.CallQueueActionCancelled)
|
|
933
|
+
);
|
|
846
934
|
});
|
|
847
935
|
}
|
|
848
936
|
}
|
|
@@ -1021,6 +1109,10 @@ const removeUiPromise = (promise: Deferred<any>) => {
|
|
|
1021
1109
|
};
|
|
1022
1110
|
|
|
1023
1111
|
export default class Core extends EventEmitter {
|
|
1112
|
+
private tracingContext: SdkTracingContext;
|
|
1113
|
+
|
|
1114
|
+
public readonly sdkInstanceId: string;
|
|
1115
|
+
|
|
1024
1116
|
private requestQueue = new RequestQueue();
|
|
1025
1117
|
|
|
1026
1118
|
// background task
|
|
@@ -1028,8 +1120,17 @@ export default class Core extends EventEmitter {
|
|
|
1028
1120
|
|
|
1029
1121
|
private methodSynchronize = getSynchronize();
|
|
1030
1122
|
|
|
1123
|
+
constructor() {
|
|
1124
|
+
super();
|
|
1125
|
+
this.tracingContext = createSdkTracingContext();
|
|
1126
|
+
this.sdkInstanceId = this.tracingContext.sdkInstanceId;
|
|
1127
|
+
Log.debug(`[Core] Created SDK instance: ${this.sdkInstanceId}`);
|
|
1128
|
+
}
|
|
1129
|
+
|
|
1031
1130
|
private getCoreContext() {
|
|
1032
1131
|
return {
|
|
1132
|
+
sdkInstanceId: this.sdkInstanceId,
|
|
1133
|
+
tracingContext: this.tracingContext,
|
|
1033
1134
|
requestQueue: this.requestQueue,
|
|
1034
1135
|
methodSynchronize: this.methodSynchronize,
|
|
1035
1136
|
getPrePendingCallPromise: () => this.prePendingCallPromise,
|
|
@@ -1107,6 +1208,8 @@ export default class Core extends EventEmitter {
|
|
|
1107
1208
|
dispose() {
|
|
1108
1209
|
_deviceList = undefined;
|
|
1109
1210
|
_connector = undefined;
|
|
1211
|
+
Log.debug(`[Core] Disposing SDK instance: ${this.sdkInstanceId}`);
|
|
1212
|
+
cleanupSdkInstance(this.sdkInstanceId);
|
|
1110
1213
|
}
|
|
1111
1214
|
}
|
|
1112
1215
|
|
|
@@ -1997,6 +1997,15 @@
|
|
|
1997
1997
|
}
|
|
1998
1998
|
}
|
|
1999
1999
|
},
|
|
2000
|
+
"UpgradeFileHeader": {
|
|
2001
|
+
"fields": {
|
|
2002
|
+
"data": {
|
|
2003
|
+
"rule": "required",
|
|
2004
|
+
"type": "bytes",
|
|
2005
|
+
"id": 1
|
|
2006
|
+
}
|
|
2007
|
+
}
|
|
2008
|
+
},
|
|
2000
2009
|
"CardanoDerivationType": {
|
|
2001
2010
|
"values": {
|
|
2002
2011
|
"LEDGER": 0,
|
|
@@ -12397,7 +12406,8 @@
|
|
|
12397
12406
|
"MessageType_GetPassphraseState": 10028,
|
|
12398
12407
|
"MessageType_PassphraseState": 10029,
|
|
12399
12408
|
"MessageType_UnLockDevice": 10030,
|
|
12400
|
-
"MessageType_UnLockDeviceResponse": 10031
|
|
12409
|
+
"MessageType_UnLockDeviceResponse": 10031,
|
|
12410
|
+
"MessageType_UpgradeFileHeader": 10050
|
|
12401
12411
|
}
|
|
12402
12412
|
},
|
|
12403
12413
|
"google": {
|