@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,15 +1,19 @@
|
|
|
1
1
|
import axios from 'axios';
|
|
2
2
|
import semver from 'semver';
|
|
3
|
-
import { EDeviceType } from '@onekeyfe/hd-shared';
|
|
3
|
+
import { EDeviceType, EFirmwareType } from '@onekeyfe/hd-shared';
|
|
4
|
+
|
|
4
5
|
import MessagesJSON from '../data/messages/messages.json';
|
|
5
6
|
import MessagesLegacyV1JSON from '../data/messages/messages_legacy_v1.json';
|
|
6
7
|
import {
|
|
7
|
-
getTimeStamp,
|
|
8
8
|
getDeviceBLEFirmwareVersion,
|
|
9
9
|
getDeviceFirmwareVersion,
|
|
10
10
|
getDeviceType,
|
|
11
|
+
getFirmwareType,
|
|
11
12
|
getFirmwareUpdateField,
|
|
13
|
+
getTimeStamp,
|
|
12
14
|
} from '../utils';
|
|
15
|
+
import { DeviceModelToTypes } from '../types';
|
|
16
|
+
import { findLatestRelease, getReleaseChangelog, getReleaseStatus } from '../utils/release';
|
|
13
17
|
|
|
14
18
|
import type {
|
|
15
19
|
AssetsMap,
|
|
@@ -22,13 +26,37 @@ import type {
|
|
|
22
26
|
IVersionArray,
|
|
23
27
|
RemoteConfigResponse,
|
|
24
28
|
} from '../types';
|
|
25
|
-
import { DeviceModelToTypes } from '../types';
|
|
26
|
-
import { findLatestRelease, getReleaseChangelog, getReleaseStatus } from '../utils/release';
|
|
27
29
|
|
|
28
|
-
export
|
|
30
|
+
export const FIRMWARE_FIELDS = [
|
|
31
|
+
'firmware',
|
|
32
|
+
'firmware-v2',
|
|
33
|
+
'firmware-v7',
|
|
34
|
+
'firmware-btc-v7',
|
|
35
|
+
] as const;
|
|
36
|
+
|
|
37
|
+
export type IFirmwareField = (typeof FIRMWARE_FIELDS)[number];
|
|
29
38
|
|
|
30
39
|
export type MessageVersion = 'latest' | 'v1';
|
|
31
40
|
|
|
41
|
+
const FIRMWARE_FIELD_TYPE_MAP: Readonly<Record<IFirmwareField, EFirmwareType>> = {
|
|
42
|
+
firmware: EFirmwareType.Universal,
|
|
43
|
+
'firmware-v2': EFirmwareType.Universal,
|
|
44
|
+
'firmware-v7': EFirmwareType.Universal,
|
|
45
|
+
'firmware-btc-v7': EFirmwareType.BitcoinOnly,
|
|
46
|
+
} as const;
|
|
47
|
+
|
|
48
|
+
function getFirmwareTypeFromField(firmwareField: IFirmwareField): EFirmwareType {
|
|
49
|
+
const firmwareType = FIRMWARE_FIELD_TYPE_MAP[firmwareField];
|
|
50
|
+
|
|
51
|
+
// Explicit check for type safety
|
|
52
|
+
if (firmwareType === undefined) {
|
|
53
|
+
// Fallback to Universal for safety
|
|
54
|
+
return EFirmwareType.Universal;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return firmwareType;
|
|
58
|
+
}
|
|
59
|
+
|
|
32
60
|
export default class DataManager {
|
|
33
61
|
static deviceMap: DeviceTypeMap = {
|
|
34
62
|
[EDeviceType.Classic]: {
|
|
@@ -68,10 +96,14 @@ export default class DataManager {
|
|
|
68
96
|
|
|
69
97
|
static lastCheckTimestamp = 0;
|
|
70
98
|
|
|
71
|
-
static getFirmwareStatus = (
|
|
99
|
+
static getFirmwareStatus = (
|
|
100
|
+
features: Features,
|
|
101
|
+
firmwareType: EFirmwareType
|
|
102
|
+
): IDeviceFirmwareStatus => {
|
|
72
103
|
const deviceType = getDeviceType(features);
|
|
73
104
|
if (deviceType === EDeviceType.Unknown) return 'unknown';
|
|
74
105
|
|
|
106
|
+
const deviceFirmwareType = getFirmwareType(features);
|
|
75
107
|
const deviceFirmwareVersion = getDeviceFirmwareVersion(features);
|
|
76
108
|
if (features.firmware_present === false) {
|
|
77
109
|
return 'none';
|
|
@@ -81,9 +113,16 @@ export default class DataManager {
|
|
|
81
113
|
return 'unknown';
|
|
82
114
|
}
|
|
83
115
|
|
|
84
|
-
const firmwareUpdateField = getFirmwareUpdateField({
|
|
116
|
+
const firmwareUpdateField = getFirmwareUpdateField({
|
|
117
|
+
features,
|
|
118
|
+
updateType: 'firmware',
|
|
119
|
+
firmwareType,
|
|
120
|
+
});
|
|
85
121
|
const targetDeviceConfigList = this.deviceMap[deviceType]?.[firmwareUpdateField] ?? [];
|
|
86
|
-
|
|
122
|
+
let currentVersion = deviceFirmwareVersion.join('.');
|
|
123
|
+
if (targetDeviceConfigList.length > 0 && deviceFirmwareType !== firmwareType) {
|
|
124
|
+
currentVersion = '0.0.0';
|
|
125
|
+
}
|
|
87
126
|
return getReleaseStatus(targetDeviceConfigList, currentVersion);
|
|
88
127
|
};
|
|
89
128
|
|
|
@@ -91,7 +130,15 @@ export default class DataManager {
|
|
|
91
130
|
* Touch、Pro System UI Resource Update
|
|
92
131
|
* ** Interval upgrade is not considered **
|
|
93
132
|
*/
|
|
94
|
-
static getSysResourcesLatestRelease = (
|
|
133
|
+
static getSysResourcesLatestRelease = ({
|
|
134
|
+
features,
|
|
135
|
+
forcedUpdateRes,
|
|
136
|
+
firmwareType,
|
|
137
|
+
}: {
|
|
138
|
+
features: Features;
|
|
139
|
+
forcedUpdateRes?: boolean;
|
|
140
|
+
firmwareType: EFirmwareType;
|
|
141
|
+
}) => {
|
|
95
142
|
const deviceType = getDeviceType(features);
|
|
96
143
|
const deviceFirmwareVersion = getDeviceFirmwareVersion(features);
|
|
97
144
|
|
|
@@ -100,6 +147,7 @@ export default class DataManager {
|
|
|
100
147
|
const firmwareUpdateField = getFirmwareUpdateField({
|
|
101
148
|
features,
|
|
102
149
|
updateType: 'firmware',
|
|
150
|
+
firmwareType,
|
|
103
151
|
}) as IFirmwareField;
|
|
104
152
|
const targetDeviceConfigList = this.deviceMap[deviceType]?.[firmwareUpdateField] ?? [];
|
|
105
153
|
const currentVersion = deviceFirmwareVersion.join('.');
|
|
@@ -116,7 +164,7 @@ export default class DataManager {
|
|
|
116
164
|
* Touch、Pro System full UI Resource Update
|
|
117
165
|
* ** Interval upgrade is not considered **
|
|
118
166
|
*/
|
|
119
|
-
static getSysFullResource = (features: Features) => {
|
|
167
|
+
static getSysFullResource = (features: Features, firmwareType: EFirmwareType) => {
|
|
120
168
|
const deviceType = getDeviceType(features);
|
|
121
169
|
if (deviceType === EDeviceType.Unknown) return undefined;
|
|
122
170
|
|
|
@@ -125,6 +173,7 @@ export default class DataManager {
|
|
|
125
173
|
const firmwareUpdateField = getFirmwareUpdateField({
|
|
126
174
|
features,
|
|
127
175
|
updateType: 'firmware',
|
|
176
|
+
firmwareType,
|
|
128
177
|
}) as IFirmwareField;
|
|
129
178
|
const targetDeviceConfigList = this.deviceMap[deviceType]?.[firmwareUpdateField] ?? [];
|
|
130
179
|
const targetDeviceConfig = targetDeviceConfigList.filter(item => !!item.fullResource);
|
|
@@ -132,7 +181,7 @@ export default class DataManager {
|
|
|
132
181
|
return findLatestRelease(targetDeviceConfig)?.fullResource;
|
|
133
182
|
};
|
|
134
183
|
|
|
135
|
-
static getBootloaderResource = (features: Features) => {
|
|
184
|
+
static getBootloaderResource = (features: Features, firmwareType: EFirmwareType) => {
|
|
136
185
|
const deviceType = getDeviceType(features);
|
|
137
186
|
if (deviceType === EDeviceType.Unknown) throw new Error('Device type is unknown');
|
|
138
187
|
|
|
@@ -140,6 +189,7 @@ export default class DataManager {
|
|
|
140
189
|
const firmwareUpdateField = getFirmwareUpdateField({
|
|
141
190
|
features,
|
|
142
191
|
updateType: 'firmware',
|
|
192
|
+
firmwareType,
|
|
143
193
|
}) as IFirmwareField;
|
|
144
194
|
const targetDeviceConfigList = this.deviceMap[deviceType]?.[firmwareUpdateField] ?? [];
|
|
145
195
|
if (targetDeviceConfigList.length === 0) {
|
|
@@ -152,13 +202,17 @@ export default class DataManager {
|
|
|
152
202
|
return findLatestRelease(targetDeviceConfig)?.bootloaderResource;
|
|
153
203
|
};
|
|
154
204
|
|
|
155
|
-
static getBootloaderTargetVersion = (
|
|
205
|
+
static getBootloaderTargetVersion = (
|
|
206
|
+
features: Features,
|
|
207
|
+
firmwareType: EFirmwareType
|
|
208
|
+
): IVersionArray | undefined => {
|
|
156
209
|
const deviceType = getDeviceType(features);
|
|
157
210
|
if (deviceType === EDeviceType.Unknown) return undefined;
|
|
158
211
|
|
|
159
212
|
const firmwareUpdateField = getFirmwareUpdateField({
|
|
160
213
|
features,
|
|
161
214
|
updateType: 'firmware',
|
|
215
|
+
firmwareType,
|
|
162
216
|
}) as IFirmwareField;
|
|
163
217
|
const targetDeviceConfigList = this.deviceMap[deviceType]?.[firmwareUpdateField] ?? [];
|
|
164
218
|
const targetDeviceConfig = targetDeviceConfigList.filter(item => !!item.bootloaderResource);
|
|
@@ -166,7 +220,10 @@ export default class DataManager {
|
|
|
166
220
|
return targetDeviceConfig?.[0]?.bootloaderVersion ?? undefined;
|
|
167
221
|
};
|
|
168
222
|
|
|
169
|
-
static getBootloaderRelatedFirmwareVersion = (
|
|
223
|
+
static getBootloaderRelatedFirmwareVersion = (
|
|
224
|
+
features: Features,
|
|
225
|
+
firmwareType: EFirmwareType
|
|
226
|
+
): IVersionArray | undefined => {
|
|
170
227
|
const deviceType = getDeviceType(features);
|
|
171
228
|
if (deviceType === EDeviceType.Unknown) return undefined;
|
|
172
229
|
|
|
@@ -174,6 +231,7 @@ export default class DataManager {
|
|
|
174
231
|
const firmwareUpdateField = getFirmwareUpdateField({
|
|
175
232
|
features,
|
|
176
233
|
updateType: 'firmware',
|
|
234
|
+
firmwareType,
|
|
177
235
|
}) as IFirmwareField;
|
|
178
236
|
const targetDeviceConfigList = this.deviceMap[deviceType]?.[firmwareUpdateField] ?? [];
|
|
179
237
|
const targetDeviceConfig = targetDeviceConfigList.filter(
|
|
@@ -183,7 +241,7 @@ export default class DataManager {
|
|
|
183
241
|
return targetDeviceConfig?.[0]?.bootloaderRelatedFirmwareVersion ?? undefined;
|
|
184
242
|
};
|
|
185
243
|
|
|
186
|
-
static getFirmwareChangelog = (features: Features) => {
|
|
244
|
+
static getFirmwareChangelog = (features: Features, firmwareType: EFirmwareType) => {
|
|
187
245
|
const deviceType = getDeviceType(features);
|
|
188
246
|
if (deviceType === EDeviceType.Unknown) return [];
|
|
189
247
|
|
|
@@ -192,6 +250,7 @@ export default class DataManager {
|
|
|
192
250
|
const firmwareUpdateField = getFirmwareUpdateField({
|
|
193
251
|
features,
|
|
194
252
|
updateType: 'firmware',
|
|
253
|
+
firmwareType,
|
|
195
254
|
}) as IFirmwareField;
|
|
196
255
|
const targetDeviceConfigList = this.deviceMap[deviceType]?.[firmwareUpdateField] ?? [];
|
|
197
256
|
|
|
@@ -207,13 +266,14 @@ export default class DataManager {
|
|
|
207
266
|
return getReleaseChangelog(targetDeviceConfigList, currentVersion);
|
|
208
267
|
};
|
|
209
268
|
|
|
210
|
-
static getFirmwareLatestRelease = (features: Features) => {
|
|
269
|
+
static getFirmwareLatestRelease = (features: Features, firmwareType: EFirmwareType) => {
|
|
211
270
|
const deviceType = getDeviceType(features);
|
|
212
271
|
if (deviceType === EDeviceType.Unknown) return undefined;
|
|
213
272
|
|
|
214
273
|
const firmwareUpdateField = getFirmwareUpdateField({
|
|
215
274
|
features,
|
|
216
275
|
updateType: 'firmware',
|
|
276
|
+
firmwareType,
|
|
217
277
|
}) as IFirmwareField;
|
|
218
278
|
const targetDeviceConfigList = this.deviceMap[deviceType]?.[firmwareUpdateField] ?? [];
|
|
219
279
|
|
|
@@ -221,7 +281,7 @@ export default class DataManager {
|
|
|
221
281
|
if (!target) return target;
|
|
222
282
|
|
|
223
283
|
if (!target.resource) {
|
|
224
|
-
const resource = this.getSysResourcesLatestRelease(features);
|
|
284
|
+
const resource = this.getSysResourcesLatestRelease({ features, firmwareType });
|
|
225
285
|
return {
|
|
226
286
|
...target,
|
|
227
287
|
resource,
|
|
@@ -278,6 +338,50 @@ export default class DataManager {
|
|
|
278
338
|
|
|
279
339
|
static getBridgeChangelog = () => this.assets?.bridge.changelog;
|
|
280
340
|
|
|
341
|
+
private static enrichFirmwareReleaseInfo(
|
|
342
|
+
deviceData: DeviceTypeMap[keyof DeviceTypeMap] | undefined
|
|
343
|
+
): DeviceTypeMap[keyof DeviceTypeMap] {
|
|
344
|
+
// Safety check: return default structure if input is undefined/null
|
|
345
|
+
if (!deviceData || typeof deviceData !== 'object') {
|
|
346
|
+
return {
|
|
347
|
+
firmware: [],
|
|
348
|
+
ble: [],
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// Create a shallow copy to avoid mutating original data
|
|
353
|
+
const enrichedData = { ...deviceData };
|
|
354
|
+
|
|
355
|
+
FIRMWARE_FIELDS.forEach(field => {
|
|
356
|
+
const releases = enrichedData[field];
|
|
357
|
+
|
|
358
|
+
if (!releases || !Array.isArray(releases) || releases.length === 0) {
|
|
359
|
+
return; // Skip this field
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// Add firmwareType to each release in this field
|
|
363
|
+
try {
|
|
364
|
+
enrichedData[field] = releases.map(release => {
|
|
365
|
+
// Safety checks:
|
|
366
|
+
if (!release || typeof release !== 'object' || !!release.firmwareType) {
|
|
367
|
+
return release; // Return as-is if invalid or already has firmwareType
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
const firmwareType = getFirmwareTypeFromField(field);
|
|
371
|
+
|
|
372
|
+
return {
|
|
373
|
+
...release,
|
|
374
|
+
firmwareType,
|
|
375
|
+
};
|
|
376
|
+
});
|
|
377
|
+
} catch (error) {
|
|
378
|
+
console.error(`Error enriching firmware field "${field}":`, error);
|
|
379
|
+
}
|
|
380
|
+
});
|
|
381
|
+
|
|
382
|
+
return enrichedData;
|
|
383
|
+
}
|
|
384
|
+
|
|
281
385
|
static async load(settings: ConnectSettings) {
|
|
282
386
|
this.settings = settings;
|
|
283
387
|
if (!settings.fetchConfig) {
|
|
@@ -296,12 +400,12 @@ export default class DataManager {
|
|
|
296
400
|
}
|
|
297
401
|
);
|
|
298
402
|
this.deviceMap = {
|
|
299
|
-
[EDeviceType.Classic]: data.classic,
|
|
300
|
-
[EDeviceType.Classic1s]: data.classic1s,
|
|
301
|
-
[EDeviceType.ClassicPure]: data.classicpure,
|
|
302
|
-
[EDeviceType.Mini]: data.mini,
|
|
303
|
-
[EDeviceType.Touch]: data.touch,
|
|
304
|
-
[EDeviceType.Pro]: data.pro,
|
|
403
|
+
[EDeviceType.Classic]: this.enrichFirmwareReleaseInfo(data.classic),
|
|
404
|
+
[EDeviceType.Classic1s]: this.enrichFirmwareReleaseInfo(data.classic1s),
|
|
405
|
+
[EDeviceType.ClassicPure]: this.enrichFirmwareReleaseInfo(data.classicpure),
|
|
406
|
+
[EDeviceType.Mini]: this.enrichFirmwareReleaseInfo(data.mini),
|
|
407
|
+
[EDeviceType.Touch]: this.enrichFirmwareReleaseInfo(data.touch),
|
|
408
|
+
[EDeviceType.Pro]: this.enrichFirmwareReleaseInfo(data.pro),
|
|
305
409
|
};
|
|
306
410
|
this.assets = {
|
|
307
411
|
bridge: data.bridge,
|
package/src/device/Device.ts
CHANGED
|
@@ -24,6 +24,7 @@ import {
|
|
|
24
24
|
fixFeaturesFirmwareVersion,
|
|
25
25
|
getPassphraseStateWithRefreshDeviceInfo,
|
|
26
26
|
} from '../utils/deviceFeaturesUtils';
|
|
27
|
+
import { generateInstanceId } from '../utils/tracing';
|
|
27
28
|
|
|
28
29
|
import type DeviceConnector from './DeviceConnector';
|
|
29
30
|
// eslint-disable-next-line import/no-cycle
|
|
@@ -99,6 +100,15 @@ export class Device extends EventEmitter {
|
|
|
99
100
|
*/
|
|
100
101
|
originalDescriptor: DeviceDescriptor;
|
|
101
102
|
|
|
103
|
+
sdkInstanceId?: string;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* 设备实例唯一标识
|
|
107
|
+
*/
|
|
108
|
+
instanceId: string;
|
|
109
|
+
|
|
110
|
+
createdAt: number;
|
|
111
|
+
|
|
102
112
|
/**
|
|
103
113
|
* 设备主 ID
|
|
104
114
|
* 蓝牙连接时是设备的 UUID
|
|
@@ -158,14 +168,22 @@ export class Device extends EventEmitter {
|
|
|
158
168
|
|
|
159
169
|
pendingCallbackPromise?: Deferred<void>;
|
|
160
170
|
|
|
161
|
-
constructor(descriptor: DeviceDescriptor) {
|
|
171
|
+
constructor(descriptor: DeviceDescriptor, sdkInstanceId?: string) {
|
|
162
172
|
super();
|
|
163
173
|
this.originalDescriptor = descriptor;
|
|
174
|
+
this.sdkInstanceId = sdkInstanceId;
|
|
175
|
+
this.instanceId = generateInstanceId('Device', this.sdkInstanceId);
|
|
176
|
+
this.createdAt = Date.now();
|
|
177
|
+
Log.debug(
|
|
178
|
+
`[Device] Created: ${this.instanceId}${
|
|
179
|
+
this.sdkInstanceId ? ` for SDK: ${this.sdkInstanceId}` : ''
|
|
180
|
+
}`
|
|
181
|
+
);
|
|
164
182
|
}
|
|
165
183
|
|
|
166
|
-
static fromDescriptor(originalDescriptor: DeviceDescriptor) {
|
|
184
|
+
static fromDescriptor(originalDescriptor: DeviceDescriptor, sdkInstanceId?: string) {
|
|
167
185
|
const descriptor = { ...originalDescriptor };
|
|
168
|
-
return new Device(descriptor);
|
|
186
|
+
return new Device(descriptor, sdkInstanceId);
|
|
169
187
|
}
|
|
170
188
|
|
|
171
189
|
// simplified object to pass via postMessage
|
|
@@ -183,6 +201,9 @@ export class Device extends EventEmitter {
|
|
|
183
201
|
connectId: DataManager.isBleConnect(env) ? this.mainId || null : getDeviceUUID(this.features),
|
|
184
202
|
/** Hardware ID, will not change at any time */
|
|
185
203
|
uuid: getDeviceUUID(this.features),
|
|
204
|
+
sdkInstanceId: this.sdkInstanceId,
|
|
205
|
+
instanceId: this.instanceId,
|
|
206
|
+
createdAt: this.createdAt,
|
|
186
207
|
deviceType,
|
|
187
208
|
/** ID for current seeds, will clear after replace a new seed at device */
|
|
188
209
|
deviceId: this.features.device_id || null,
|
|
@@ -6,6 +6,11 @@ import { patchFeatures, getLogger, LoggerNames, getDeviceType } from '../utils';
|
|
|
6
6
|
import type { Device } from './Device';
|
|
7
7
|
import { DEVICE, type PassphraseRequestPayload } from '../events';
|
|
8
8
|
import { DeviceModelToTypes } from '../types';
|
|
9
|
+
import {
|
|
10
|
+
formatRequestContext,
|
|
11
|
+
generateInstanceId,
|
|
12
|
+
getActiveRequestsByDeviceInstance,
|
|
13
|
+
} from '../utils/tracing';
|
|
9
14
|
|
|
10
15
|
export type PassphrasePromptResponse = {
|
|
11
16
|
passphrase?: string;
|
|
@@ -114,12 +119,17 @@ export const cancelDeviceWithInitialize = (device: Device) => {
|
|
|
114
119
|
};
|
|
115
120
|
|
|
116
121
|
const Log = getLogger(LoggerNames.DeviceCommands);
|
|
122
|
+
const LogCore = getLogger(LoggerNames.Core);
|
|
117
123
|
|
|
118
124
|
/**
|
|
119
125
|
* The life cycle begins with the acquisition of the device and ends with the disposal device commands
|
|
120
126
|
* acquire device -> create DeviceCommands -> release device -> dispose DeviceCommands
|
|
121
127
|
*/
|
|
122
128
|
export class DeviceCommands {
|
|
129
|
+
instanceId: string;
|
|
130
|
+
|
|
131
|
+
currentResponseID?: number;
|
|
132
|
+
|
|
123
133
|
device: Device;
|
|
124
134
|
|
|
125
135
|
transport: Transport;
|
|
@@ -135,6 +145,9 @@ export class DeviceCommands {
|
|
|
135
145
|
this.mainId = mainId;
|
|
136
146
|
this.transport = TransportManager.getTransport();
|
|
137
147
|
this.disposed = false;
|
|
148
|
+
this.instanceId = generateInstanceId('DeviceCommands', device.sdkInstanceId);
|
|
149
|
+
|
|
150
|
+
Log.debug(`[DeviceCommands] Created: ${this.instanceId}, device: ${this.device.instanceId}`);
|
|
138
151
|
}
|
|
139
152
|
|
|
140
153
|
async dispose(_cancelRequest: boolean) {
|
|
@@ -217,10 +230,10 @@ export class DeviceCommands {
|
|
|
217
230
|
const promise = this.transport.call(this.mainId, type, msg) as any;
|
|
218
231
|
this.callPromise = promise;
|
|
219
232
|
const res = await promise;
|
|
220
|
-
|
|
233
|
+
LogCore.debug('[DeviceCommands] [call] Received', res.type);
|
|
221
234
|
return res;
|
|
222
235
|
} catch (error) {
|
|
223
|
-
|
|
236
|
+
LogCore.debug('[DeviceCommands] [call] Received error', error);
|
|
224
237
|
if (error.errorCode === HardwareErrorCode.BleDeviceBondError) {
|
|
225
238
|
return {
|
|
226
239
|
type: 'BleDeviceBondError',
|
|
@@ -500,7 +513,7 @@ export class DeviceCommands {
|
|
|
500
513
|
cancelDeviceInPrompt(this.device, false)
|
|
501
514
|
.then(onCancel => {
|
|
502
515
|
const error = ERRORS.TypedError(
|
|
503
|
-
HardwareErrorCode.
|
|
516
|
+
HardwareErrorCode.CallQueueActionCancelled,
|
|
504
517
|
`${DEVICE.PIN} canceled`
|
|
505
518
|
);
|
|
506
519
|
// onCancel not void
|
|
@@ -515,7 +528,15 @@ export class DeviceCommands {
|
|
|
515
528
|
reject(error);
|
|
516
529
|
});
|
|
517
530
|
|
|
518
|
-
|
|
531
|
+
const listenerCount = this.device.listenerCount(DEVICE.PIN);
|
|
532
|
+
|
|
533
|
+
Log.debug(`[${this.instanceId}] _promptPin called`, {
|
|
534
|
+
responseID: this.currentResponseID,
|
|
535
|
+
deviceInstanceId: this.device.instanceId,
|
|
536
|
+
listenerCount,
|
|
537
|
+
});
|
|
538
|
+
|
|
539
|
+
if (listenerCount > 0) {
|
|
519
540
|
this.device.setCancelableAction(cancelAndReject);
|
|
520
541
|
this.device.emit(DEVICE.PIN, this.device, type, (err, pin) => {
|
|
521
542
|
this.device.clearCancelableAction();
|
|
@@ -526,11 +547,22 @@ export class DeviceCommands {
|
|
|
526
547
|
}
|
|
527
548
|
});
|
|
528
549
|
} else {
|
|
529
|
-
|
|
550
|
+
const activeRequests = getActiveRequestsByDeviceInstance(this.device.instanceId);
|
|
551
|
+
const errorInfo = {
|
|
552
|
+
commandsInstanceId: this.instanceId,
|
|
553
|
+
deviceInstanceId: this.device.instanceId,
|
|
554
|
+
currentResponseID: this.currentResponseID,
|
|
555
|
+
listenerCount,
|
|
556
|
+
activeRequests: activeRequests.map(formatRequestContext),
|
|
557
|
+
};
|
|
558
|
+
|
|
559
|
+
LogCore.error('[DeviceCommands] [call] PIN callback not configured, cancelling request', {
|
|
560
|
+
...errorInfo,
|
|
561
|
+
});
|
|
530
562
|
reject(
|
|
531
563
|
ERRORS.TypedError(
|
|
532
564
|
HardwareErrorCode.RuntimeError,
|
|
533
|
-
|
|
565
|
+
`_promptPin: PIN callback not configured: ${JSON.stringify(errorInfo)}`
|
|
534
566
|
)
|
|
535
567
|
);
|
|
536
568
|
}
|
|
@@ -543,7 +575,7 @@ export class DeviceCommands {
|
|
|
543
575
|
cancelDeviceInPrompt(this.device, false)
|
|
544
576
|
.then(onCancel => {
|
|
545
577
|
const error = ERRORS.TypedError(
|
|
546
|
-
HardwareErrorCode.
|
|
578
|
+
HardwareErrorCode.CallQueueActionCancelled,
|
|
547
579
|
`${DEVICE.PASSPHRASE} canceled`
|
|
548
580
|
);
|
|
549
581
|
// onCancel not void
|
|
@@ -574,7 +606,9 @@ export class DeviceCommands {
|
|
|
574
606
|
}
|
|
575
607
|
);
|
|
576
608
|
} else {
|
|
577
|
-
|
|
609
|
+
LogCore.error(
|
|
610
|
+
'[DeviceCommands] [call] Passphrase callback not configured, cancelling request'
|
|
611
|
+
);
|
|
578
612
|
reject(
|
|
579
613
|
ERRORS.TypedError(
|
|
580
614
|
HardwareErrorCode.RuntimeError,
|
package/src/events/device.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import type { MessageFactoryFn } from './utils';
|
|
1
2
|
import type { PROTO } from '../constants';
|
|
2
|
-
import type {
|
|
3
|
-
import { MessageFactoryFn } from './utils';
|
|
3
|
+
import type { KnownDevice as Device, Features, SupportFeatures } from '../types/device';
|
|
4
4
|
|
|
5
5
|
export const DEVICE_EVENT = 'DEVICE_EVENT';
|
|
6
6
|
export const DEVICE = {
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import type { IBLEFirmwareReleaseInfo } from '../settings';
|
|
2
|
+
import type { EFirmwareType } from '@onekeyfe/hd-shared';
|
|
3
|
+
import type { Features } from '@onekeyfe/hd-transport';
|
|
1
4
|
import type { CommonParams, Response } from '../params';
|
|
2
5
|
import type { IDeviceBLEFirmwareStatus, IDeviceFirmwareStatus } from '../device';
|
|
3
|
-
import { IBLEFirmwareReleaseInfo } from '../settings';
|
|
4
6
|
|
|
5
7
|
export type FirmwareRelease = {
|
|
6
8
|
shouldUpdate?: boolean;
|
|
@@ -18,10 +20,12 @@ export type AllFirmwareRelease = {
|
|
|
18
20
|
ble: FirmwareRelease;
|
|
19
21
|
bootloader?: FirmwareRelease;
|
|
20
22
|
bridge?: FirmwareRelease;
|
|
23
|
+
features?: Features;
|
|
21
24
|
};
|
|
22
25
|
|
|
23
26
|
export type CheckAllFirmwareReleaseParams = {
|
|
24
27
|
checkBridgeRelease?: boolean;
|
|
28
|
+
firmwareType?: EFirmwareType;
|
|
25
29
|
};
|
|
26
30
|
|
|
27
31
|
export declare function checkAllFirmwareRelease(
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { EFirmwareType } from '@onekeyfe/hd-shared';
|
|
1
2
|
import type { CommonParams, Response } from '../params';
|
|
2
3
|
|
|
3
4
|
export type CheckBootloaderReleaseResponse = {
|
|
@@ -7,9 +8,12 @@ export type CheckBootloaderReleaseResponse = {
|
|
|
7
8
|
bootloaderMode: boolean;
|
|
8
9
|
} | null;
|
|
9
10
|
|
|
11
|
+
export type CheckBootloaderReleaseParams = {
|
|
12
|
+
willUpdateFirmwareVersion?: string;
|
|
13
|
+
firmwareType?: EFirmwareType;
|
|
14
|
+
};
|
|
15
|
+
|
|
10
16
|
export declare function checkBootloaderRelease(
|
|
11
17
|
connectId?: string,
|
|
12
|
-
params?: CommonParams &
|
|
13
|
-
willUpdateFirmwareVersion?: string;
|
|
14
|
-
}
|
|
18
|
+
params?: CommonParams & CheckBootloaderReleaseParams
|
|
15
19
|
): Response<CheckBootloaderReleaseResponse>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import type { IFirmwareReleaseInfo } from '../settings';
|
|
2
|
+
import type { EFirmwareType } from '@onekeyfe/hd-shared';
|
|
1
3
|
import type { Response } from '../params';
|
|
2
4
|
import type { IDeviceFirmwareStatus } from '../device';
|
|
3
|
-
import { IFirmwareReleaseInfo } from '../settings';
|
|
4
5
|
|
|
5
6
|
type FirmwareRelease = {
|
|
6
7
|
status: IDeviceFirmwareStatus;
|
|
@@ -12,4 +13,11 @@ type FirmwareRelease = {
|
|
|
12
13
|
bootloaderMode: boolean;
|
|
13
14
|
};
|
|
14
15
|
|
|
15
|
-
export
|
|
16
|
+
export type CheckFirmwareReleaseParams = {
|
|
17
|
+
firmwareType?: EFirmwareType;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export declare function checkFirmwareRelease(
|
|
21
|
+
connectId?: string,
|
|
22
|
+
params?: CheckFirmwareReleaseParams
|
|
23
|
+
): Response<FirmwareRelease>;
|
|
@@ -1,6 +1,12 @@
|
|
|
1
|
-
import { Success } from '@onekeyfe/hd-transport';
|
|
1
|
+
import type { Success } from '@onekeyfe/hd-transport';
|
|
2
|
+
import type { EFirmwareType } from '@onekeyfe/hd-shared';
|
|
2
3
|
import type { CommonParams, Response } from '../params';
|
|
3
4
|
|
|
5
|
+
export type DeviceFullyUploadResourceParams = {
|
|
6
|
+
binary?: ArrayBuffer;
|
|
7
|
+
firmwareType?: EFirmwareType;
|
|
8
|
+
};
|
|
9
|
+
|
|
4
10
|
export declare function deviceFullyUploadResource(
|
|
5
11
|
connectId: string,
|
|
6
12
|
params: CommonParams & {
|
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
import { Success } from '@onekeyfe/hd-transport';
|
|
1
|
+
import type { Success } from '@onekeyfe/hd-transport';
|
|
2
|
+
import type { EFirmwareType } from '@onekeyfe/hd-shared';
|
|
2
3
|
import type { Response } from '../params';
|
|
3
4
|
|
|
5
|
+
export type DeviceUpdateBootloaderParams = {
|
|
6
|
+
binary?: ArrayBuffer;
|
|
7
|
+
firmwareType?: EFirmwareType;
|
|
8
|
+
};
|
|
9
|
+
|
|
4
10
|
export declare function deviceUpdateBootloader(
|
|
5
11
|
connectId: string,
|
|
6
|
-
params?:
|
|
7
|
-
binary?: ArrayBuffer;
|
|
8
|
-
}
|
|
12
|
+
params?: DeviceUpdateBootloaderParams
|
|
9
13
|
): Response<Success>;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { EFirmwareType } from '@onekeyfe/hd-shared';
|
|
1
2
|
import type { PROTO } from '../../constants';
|
|
2
3
|
import type { Params, Response } from '../params';
|
|
3
4
|
|
|
@@ -10,10 +11,10 @@ export interface FirmwareUpdateBinaryParams {
|
|
|
10
11
|
|
|
11
12
|
export interface FirmwareUpdateParams {
|
|
12
13
|
version?: number[];
|
|
13
|
-
btcOnly?: boolean;
|
|
14
14
|
updateType: IUpdateType;
|
|
15
15
|
forcedUpdateRes?: boolean;
|
|
16
16
|
isUpdateBootloader?: boolean;
|
|
17
|
+
firmwareType?: EFirmwareType;
|
|
17
18
|
}
|
|
18
19
|
|
|
19
20
|
export declare function firmwareUpdate(
|
|
@@ -50,6 +51,8 @@ export interface FirmwareUpdateV3Params {
|
|
|
50
51
|
resourceBinary?: ArrayBuffer;
|
|
51
52
|
forcedUpdateRes?: boolean;
|
|
52
53
|
|
|
54
|
+
firmwareType?: EFirmwareType;
|
|
55
|
+
|
|
53
56
|
platform: IPlatform;
|
|
54
57
|
}
|
|
55
58
|
|