@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.
Files changed (102) hide show
  1. package/dist/api/BaseMethod.d.ts +9 -4
  2. package/dist/api/BaseMethod.d.ts.map +1 -1
  3. package/dist/api/CheckAllFirmwareRelease.d.ts +1 -1
  4. package/dist/api/CheckAllFirmwareRelease.d.ts.map +1 -1
  5. package/dist/api/CheckBootloaderRelease.d.ts.map +1 -1
  6. package/dist/api/CheckFirmwareRelease.d.ts.map +1 -1
  7. package/dist/api/FirmwareUpdate.d.ts +1 -1
  8. package/dist/api/FirmwareUpdate.d.ts.map +1 -1
  9. package/dist/api/FirmwareUpdateV2.d.ts +3 -2
  10. package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
  11. package/dist/api/FirmwareUpdateV3.d.ts +2 -2
  12. package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
  13. package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts +2 -2
  14. package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts.map +1 -1
  15. package/dist/api/device/DeviceFullyUploadResource.d.ts.map +1 -1
  16. package/dist/api/device/DeviceUpdateBootloader.d.ts +6 -1
  17. package/dist/api/device/DeviceUpdateBootloader.d.ts.map +1 -1
  18. package/dist/api/firmware/getBinary.d.ts +6 -3
  19. package/dist/api/firmware/getBinary.d.ts.map +1 -1
  20. package/dist/api/firmware/releaseHelper.d.ts +7 -2
  21. package/dist/api/firmware/releaseHelper.d.ts.map +1 -1
  22. package/dist/api/firmware/updateBootloader.d.ts +7 -2
  23. package/dist/api/firmware/updateBootloader.d.ts.map +1 -1
  24. package/dist/api/firmware/uploadFirmware.d.ts +4 -4
  25. package/dist/api/firmware/uploadFirmware.d.ts.map +1 -1
  26. package/dist/api/sui/SuiSignTransaction.d.ts +1 -1
  27. package/dist/api/sui/SuiSignTransaction.d.ts.map +1 -1
  28. package/dist/core/index.d.ts +3 -0
  29. package/dist/core/index.d.ts.map +1 -1
  30. package/dist/data-manager/DataManager.d.ts +16 -9
  31. package/dist/data-manager/DataManager.d.ts.map +1 -1
  32. package/dist/device/Device.d.ts +5 -2
  33. package/dist/device/Device.d.ts.map +1 -1
  34. package/dist/device/DeviceCommands.d.ts +6 -4
  35. package/dist/device/DeviceCommands.d.ts.map +1 -1
  36. package/dist/events/device.d.ts +2 -2
  37. package/dist/events/device.d.ts.map +1 -1
  38. package/dist/index.d.ts +96 -28
  39. package/dist/index.js +543 -132
  40. package/dist/types/api/checkAllFirmwareRelease.d.ts +5 -1
  41. package/dist/types/api/checkAllFirmwareRelease.d.ts.map +1 -1
  42. package/dist/types/api/checkBootloaderRelease.d.ts +5 -2
  43. package/dist/types/api/checkBootloaderRelease.d.ts.map +1 -1
  44. package/dist/types/api/checkFirmwareRelease.d.ts +6 -2
  45. package/dist/types/api/checkFirmwareRelease.d.ts.map +1 -1
  46. package/dist/types/api/deviceFullyUploadResource.d.ts +6 -1
  47. package/dist/types/api/deviceFullyUploadResource.d.ts.map +1 -1
  48. package/dist/types/api/deviceUpdateBootloader.d.ts +6 -3
  49. package/dist/types/api/deviceUpdateBootloader.d.ts.map +1 -1
  50. package/dist/types/api/firmwareUpdate.d.ts +3 -1
  51. package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
  52. package/dist/types/api/index.d.ts +128 -128
  53. package/dist/types/api/index.d.ts.map +1 -1
  54. package/dist/types/device.d.ts +4 -1
  55. package/dist/types/device.d.ts.map +1 -1
  56. package/dist/types/settings.d.ts +3 -0
  57. package/dist/types/settings.d.ts.map +1 -1
  58. package/dist/utils/deviceFeaturesUtils.d.ts +7 -5
  59. package/dist/utils/deviceFeaturesUtils.d.ts.map +1 -1
  60. package/dist/utils/index.d.ts +1 -0
  61. package/dist/utils/index.d.ts.map +1 -1
  62. package/dist/utils/patch.d.ts +1 -1
  63. package/dist/utils/patch.d.ts.map +1 -1
  64. package/dist/utils/release.d.ts +1 -1
  65. package/dist/utils/release.d.ts.map +1 -1
  66. package/dist/utils/tracing.d.ts +34 -0
  67. package/dist/utils/tracing.d.ts.map +1 -0
  68. package/package.json +4 -4
  69. package/src/api/BaseMethod.ts +55 -8
  70. package/src/api/CheckAllFirmwareRelease.ts +14 -6
  71. package/src/api/CheckBootloaderRelease.ts +13 -2
  72. package/src/api/CheckFirmwareRelease.ts +9 -2
  73. package/src/api/FirmwareUpdate.ts +7 -5
  74. package/src/api/FirmwareUpdateV2.ts +26 -14
  75. package/src/api/FirmwareUpdateV3.ts +31 -18
  76. package/src/api/allnetwork/AllNetworkGetAddressBase.ts +56 -26
  77. package/src/api/device/DeviceFullyUploadResource.ts +8 -2
  78. package/src/api/device/DeviceUpdateBootloader.ts +21 -5
  79. package/src/api/firmware/getBinary.ts +15 -4
  80. package/src/api/firmware/releaseHelper.ts +22 -11
  81. package/src/api/firmware/updateBootloader.ts +17 -9
  82. package/src/api/firmware/uploadFirmware.ts +51 -15
  83. package/src/api/sui/SuiSignTransaction.ts +7 -1
  84. package/src/core/index.ts +111 -8
  85. package/src/data/messages/messages.json +11 -1
  86. package/src/data-manager/DataManager.ts +126 -22
  87. package/src/device/Device.ts +24 -3
  88. package/src/device/DeviceCommands.ts +42 -8
  89. package/src/events/device.ts +2 -2
  90. package/src/types/api/checkAllFirmwareRelease.ts +5 -1
  91. package/src/types/api/checkBootloaderRelease.ts +7 -3
  92. package/src/types/api/checkFirmwareRelease.ts +10 -2
  93. package/src/types/api/deviceFullyUploadResource.ts +7 -1
  94. package/src/types/api/deviceUpdateBootloader.ts +8 -4
  95. package/src/types/api/firmwareUpdate.ts +4 -1
  96. package/src/types/api/index.ts +128 -161
  97. package/src/types/device.ts +7 -1
  98. package/src/types/settings.ts +37 -0
  99. package/src/utils/deviceFeaturesUtils.ts +22 -10
  100. package/src/utils/index.ts +1 -0
  101. package/src/utils/release.ts +2 -1
  102. 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 type IFirmwareField = 'firmware' | 'firmware-v2' | 'firmware-v7';
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 = (features: Features): IDeviceFirmwareStatus => {
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({ features, updateType: 'firmware' });
116
+ const firmwareUpdateField = getFirmwareUpdateField({
117
+ features,
118
+ updateType: 'firmware',
119
+ firmwareType,
120
+ });
85
121
  const targetDeviceConfigList = this.deviceMap[deviceType]?.[firmwareUpdateField] ?? [];
86
- const currentVersion = deviceFirmwareVersion.join('.');
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 = (features: Features, forcedUpdateRes?: boolean) => {
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 = (features: Features): IVersionArray | undefined => {
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 = (features: Features): IVersionArray | undefined => {
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,
@@ -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
- Log.debug('[DeviceCommands] [call] Received', res.type);
233
+ LogCore.debug('[DeviceCommands] [call] Received', res.type);
221
234
  return res;
222
235
  } catch (error) {
223
- Log.debug('[DeviceCommands] [call] Received error', error);
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.ActionCancelled,
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
- if (this.device.listenerCount(DEVICE.PIN) > 0) {
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
- console.warn('[DeviceCommands] [call] PIN callback not configured, cancelling request');
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
- '_promptPin: PIN callback not configured'
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.ActionCancelled,
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
- Log.error('[DeviceCommands] [call] Passphrase callback not configured, cancelling request');
609
+ LogCore.error(
610
+ '[DeviceCommands] [call] Passphrase callback not configured, cancelling request'
611
+ );
578
612
  reject(
579
613
  ERRORS.TypedError(
580
614
  HardwareErrorCode.RuntimeError,
@@ -1,6 +1,6 @@
1
+ import type { MessageFactoryFn } from './utils';
1
2
  import type { PROTO } from '../constants';
2
- import type { Features, KnownDevice as Device, SupportFeatures } from '../types/device';
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 declare function checkFirmwareRelease(connectId?: string): Response<FirmwareRelease>;
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