@onekeyfe/hd-core 1.2.0-alpha.17 → 1.2.0-alpha.19

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 (154) hide show
  1. package/__tests__/DeviceEventRegistration.test.ts +3 -0
  2. package/__tests__/device-features-state.test.ts +78 -0
  3. package/__tests__/device-identity.test.ts +30 -0
  4. package/__tests__/device-pool-state.test.ts +113 -0
  5. package/__tests__/device-settings.test.ts +108 -0
  6. package/__tests__/device-state-contract.test.ts +27 -0
  7. package/__tests__/device-state-events.test.ts +163 -0
  8. package/__tests__/device-state-mapper.test.ts +222 -0
  9. package/__tests__/device-state-projector.test.ts +94 -0
  10. package/__tests__/device-state-store.test.ts +115 -0
  11. package/__tests__/device-wallet-session-store.test.ts +46 -0
  12. package/__tests__/deviceFeaturesUtils.test.ts +13 -1
  13. package/__tests__/deviceSettings.test.ts +54 -0
  14. package/__tests__/get-device-state.test.ts +367 -0
  15. package/__tests__/kaspaSignTransaction.test.ts +591 -0
  16. package/__tests__/logBlockEvent.test.ts +13 -0
  17. package/__tests__/protocol-v2.test.ts +358 -413
  18. package/__tests__/public-device-state-api.test.ts +153 -0
  19. package/__tests__/refresh-device-state.test.ts +101 -0
  20. package/__tests__/request-context-logging.test.ts +16 -0
  21. package/__tests__/search-devices.test.ts +93 -0
  22. package/dist/api/ClearSessionCache.d.ts.map +1 -1
  23. package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
  24. package/dist/api/GetDeviceState.d.ts +7 -0
  25. package/dist/api/GetDeviceState.d.ts.map +1 -0
  26. package/dist/api/GetFeatures.d.ts +1 -1
  27. package/dist/api/GetFeatures.d.ts.map +1 -1
  28. package/dist/api/GetOnekeyFeatures.d.ts.map +1 -1
  29. package/dist/api/GetPassphraseState.d.ts.map +1 -1
  30. package/dist/api/SearchDevices.d.ts.map +1 -1
  31. package/dist/api/device/DeviceRebootToBoardloader.d.ts.map +1 -1
  32. package/dist/api/device/DeviceRebootToBootloader.d.ts.map +1 -1
  33. package/dist/api/device/DeviceSettings.d.ts.map +1 -1
  34. package/dist/api/index.d.ts +1 -4
  35. package/dist/api/index.d.ts.map +1 -1
  36. package/dist/api/internal.d.ts +4 -0
  37. package/dist/api/internal.d.ts.map +1 -0
  38. package/dist/api/kaspa/KaspaSignTransaction.d.ts +5 -1
  39. package/dist/api/kaspa/KaspaSignTransaction.d.ts.map +1 -1
  40. package/dist/api/kaspa/helpers/TransferSerialize.d.ts.map +1 -1
  41. package/dist/api/protocol-v2/DeviceInfoGet.d.ts +0 -1
  42. package/dist/api/protocol-v2/DeviceInfoGet.d.ts.map +1 -1
  43. package/dist/api/protocol-v2/DeviceReboot.d.ts.map +1 -1
  44. package/dist/api/protocol-v2/DeviceSettingsGet.d.ts.map +1 -1
  45. package/dist/api/protocol-v2/DeviceSettingsSet.d.ts.map +1 -1
  46. package/dist/api/protocol-v2/DeviceStatusGet.d.ts.map +1 -1
  47. package/dist/api/utils.d.ts +2 -1
  48. package/dist/api/utils.d.ts.map +1 -1
  49. package/dist/constants/index.d.ts +1 -1
  50. package/dist/constants/index.d.ts.map +1 -1
  51. package/dist/core/index.d.ts.map +1 -1
  52. package/dist/device/Device.d.ts +22 -3
  53. package/dist/device/Device.d.ts.map +1 -1
  54. package/dist/device/DeviceCommands.d.ts +4 -4
  55. package/dist/device/DeviceFeaturesState.d.ts +4 -0
  56. package/dist/device/DeviceFeaturesState.d.ts.map +1 -0
  57. package/dist/device/DevicePool.d.ts +1 -0
  58. package/dist/device/DevicePool.d.ts.map +1 -1
  59. package/dist/device/DeviceStateMapper.d.ts +13 -0
  60. package/dist/device/DeviceStateMapper.d.ts.map +1 -0
  61. package/dist/device/DeviceStateProjector.d.ts +8 -0
  62. package/dist/device/DeviceStateProjector.d.ts.map +1 -0
  63. package/dist/device/DeviceStateStore.d.ts +23 -0
  64. package/dist/device/DeviceStateStore.d.ts.map +1 -0
  65. package/dist/device/deviceIdentity.d.ts +5 -0
  66. package/dist/device/deviceIdentity.d.ts.map +1 -0
  67. package/dist/deviceProfile/buildDeviceFeatures.d.ts.map +1 -1
  68. package/dist/deviceProfile/index.d.ts +0 -1
  69. package/dist/deviceProfile/index.d.ts.map +1 -1
  70. package/dist/events/device.d.ts +7 -2
  71. package/dist/events/device.d.ts.map +1 -1
  72. package/dist/index.d.ts +722 -648
  73. package/dist/index.js +1863 -1033
  74. package/dist/inject.d.ts.map +1 -1
  75. package/dist/protocols/protocol-v2/features.d.ts +1 -0
  76. package/dist/protocols/protocol-v2/features.d.ts.map +1 -1
  77. package/dist/protocols/protocol-v2/index.d.ts +1 -1
  78. package/dist/protocols/protocol-v2/index.d.ts.map +1 -1
  79. package/dist/protocols/protocol-v2/walletSession.d.ts.map +1 -1
  80. package/dist/types/api/deviceSettings.d.ts +8 -0
  81. package/dist/types/api/deviceSettings.d.ts.map +1 -1
  82. package/dist/types/api/getDeviceState.d.ts +12 -0
  83. package/dist/types/api/getDeviceState.d.ts.map +1 -0
  84. package/dist/types/api/index.d.ts +4 -7
  85. package/dist/types/api/index.d.ts.map +1 -1
  86. package/dist/types/api/kaspaSignTransaction.d.ts +27 -2
  87. package/dist/types/api/kaspaSignTransaction.d.ts.map +1 -1
  88. package/dist/types/api/protocolV2.d.ts +1 -6
  89. package/dist/types/api/protocolV2.d.ts.map +1 -1
  90. package/dist/types/device.d.ts +121 -1
  91. package/dist/types/device.d.ts.map +1 -1
  92. package/dist/utils/deviceFeaturesUtils.d.ts.map +1 -1
  93. package/dist/utils/deviceSettings.d.ts.map +1 -1
  94. package/dist/utils/patch.d.ts +1 -1
  95. package/dist/utils/patch.d.ts.map +1 -1
  96. package/dist/utils/tracing.d.ts.map +1 -1
  97. package/package.json +4 -4
  98. package/src/api/ClearSessionCache.ts +4 -0
  99. package/src/api/FirmwareUpdateV4.ts +15 -7
  100. package/src/api/GetDeviceState.ts +55 -0
  101. package/src/api/GetFeatures.ts +8 -3
  102. package/src/api/GetOnekeyFeatures.ts +3 -72
  103. package/src/api/GetPassphraseState.ts +3 -1
  104. package/src/api/SearchDevices.ts +25 -4
  105. package/src/api/device/DeviceRebootToBoardloader.ts +1 -0
  106. package/src/api/device/DeviceRebootToBootloader.ts +1 -0
  107. package/src/api/device/DeviceSettings.ts +28 -0
  108. package/src/api/index.ts +1 -4
  109. package/src/api/internal.ts +9 -0
  110. package/src/api/kaspa/KaspaSignTransaction.ts +341 -22
  111. package/src/api/kaspa/helpers/TransferSerialize.ts +14 -0
  112. package/src/api/protocol-v2/DeviceInfoGet.ts +3 -5
  113. package/src/api/protocol-v2/DeviceReboot.ts +3 -1
  114. package/src/api/protocol-v2/DeviceSettingsGet.ts +3 -1
  115. package/src/api/protocol-v2/DeviceSettingsSet.ts +2 -0
  116. package/src/api/protocol-v2/DeviceStatusGet.ts +1 -0
  117. package/src/api/utils.ts +9 -3
  118. package/src/constants/index.ts +1 -4
  119. package/src/core/index.ts +7 -1
  120. package/src/data/messages/messages-protocol-v2.json +22 -13
  121. package/src/data/messages/messages.json +286 -1
  122. package/src/device/Device.ts +256 -78
  123. package/src/device/DeviceFeaturesState.ts +34 -0
  124. package/src/device/DevicePool.ts +35 -9
  125. package/src/device/DeviceStateMapper.ts +364 -0
  126. package/src/device/DeviceStateProjector.ts +92 -0
  127. package/src/device/DeviceStateStore.ts +242 -0
  128. package/src/device/deviceIdentity.ts +18 -0
  129. package/src/deviceProfile/buildDeviceFeatures.ts +166 -109
  130. package/src/deviceProfile/index.ts +0 -1
  131. package/src/events/device.ts +13 -1
  132. package/src/events/logBlockEvent.ts +1 -1
  133. package/src/inject.ts +4 -5
  134. package/src/protocols/protocol-v2/features.ts +18 -9
  135. package/src/protocols/protocol-v2/index.ts +1 -0
  136. package/src/protocols/protocol-v2/walletSession.ts +5 -7
  137. package/src/types/api/deviceSettings.ts +8 -0
  138. package/src/types/api/getDeviceState.ts +19 -0
  139. package/src/types/api/index.ts +3 -20
  140. package/src/types/api/kaspaSignTransaction.ts +40 -2
  141. package/src/types/api/protocolV2.ts +0 -24
  142. package/src/types/device.ts +148 -1
  143. package/src/utils/deviceFeaturesUtils.ts +5 -1
  144. package/src/utils/deviceSettings.ts +41 -0
  145. package/src/utils/tracing.ts +3 -1
  146. package/dist/api/GetDeviceInfo.d.ts +0 -9
  147. package/dist/api/GetDeviceInfo.d.ts.map +0 -1
  148. package/dist/deviceProfile/buildDeviceProfile.d.ts +0 -22
  149. package/dist/deviceProfile/buildDeviceProfile.d.ts.map +0 -1
  150. package/dist/types/api/getDeviceInfo.d.ts +0 -88
  151. package/dist/types/api/getDeviceInfo.d.ts.map +0 -1
  152. package/src/api/GetDeviceInfo.ts +0 -152
  153. package/src/deviceProfile/buildDeviceProfile.ts +0 -370
  154. package/src/types/api/getDeviceInfo.ts +0 -106
@@ -1,83 +1,21 @@
1
1
  import semver from 'semver';
2
+ import { createDeviceNotSupportMethodError } from '@onekeyfe/hd-shared';
2
3
 
3
4
  import { UI_REQUEST } from '../constants/ui-request';
4
5
  import { fixVersion } from '../utils/deviceFeaturesUtils';
5
- import { PROTOCOL_V2_DEVICE_INFO_REQUEST } from '../protocols/protocol-v2';
6
- import { requestProtocolV2DeviceInfo } from '../protocols/protocol-v2/features';
7
6
  import { BaseMethod } from './BaseMethod';
8
7
 
9
8
  import type { OnekeyFeatures } from '../types';
10
9
 
11
- const ONEKEY_FEATURE_KEYS: Array<keyof OnekeyFeatures> = [
12
- 'onekey_device_type',
13
- 'onekey_board_version',
14
- 'onekey_boot_version',
15
- 'onekey_firmware_version',
16
- 'onekey_board_hash',
17
- 'onekey_boot_hash',
18
- 'onekey_firmware_hash',
19
- 'onekey_board_build_id',
20
- 'onekey_boot_build_id',
21
- 'onekey_firmware_build_id',
22
- 'onekey_serial_no',
23
- 'onekey_ble_name',
24
- 'onekey_ble_version',
25
- 'onekey_ble_build_id',
26
- 'onekey_ble_hash',
27
- 'onekey_se_type',
28
- 'onekey_se01_state',
29
- 'onekey_se02_state',
30
- 'onekey_se03_state',
31
- 'onekey_se04_state',
32
- 'onekey_se01_version',
33
- 'onekey_se02_version',
34
- 'onekey_se03_version',
35
- 'onekey_se04_version',
36
- 'onekey_se01_hash',
37
- 'onekey_se02_hash',
38
- 'onekey_se03_hash',
39
- 'onekey_se04_hash',
40
- 'onekey_se01_build_id',
41
- 'onekey_se02_build_id',
42
- 'onekey_se03_build_id',
43
- 'onekey_se04_build_id',
44
- 'onekey_se01_boot_version',
45
- 'onekey_se02_boot_version',
46
- 'onekey_se03_boot_version',
47
- 'onekey_se04_boot_version',
48
- 'onekey_se01_boot_hash',
49
- 'onekey_se02_boot_hash',
50
- 'onekey_se03_boot_hash',
51
- 'onekey_se04_boot_hash',
52
- 'onekey_se01_boot_build_id',
53
- 'onekey_se02_boot_build_id',
54
- 'onekey_se03_boot_build_id',
55
- 'onekey_se04_boot_build_id',
56
- ];
57
-
58
10
  function normalizeOnekeyFirmwareVersion(message: OnekeyFeatures) {
59
11
  if (message.onekey_firmware_version && !semver.valid(message.onekey_firmware_version)) {
60
12
  message.onekey_firmware_version = fixVersion(message.onekey_firmware_version);
61
13
  }
62
14
  }
63
15
 
64
- function pickOnekeyFeatures(features?: OnekeyFeatures | null): OnekeyFeatures {
65
- const message: OnekeyFeatures = {};
66
- if (!features) return message;
67
-
68
- for (const key of ONEKEY_FEATURE_KEYS) {
69
- const value = features[key];
70
- if (value !== undefined && value !== null) {
71
- (message as Record<string, unknown>)[key] = value;
72
- }
73
- }
74
-
75
- normalizeOnekeyFirmwareVersion(message);
76
- return message;
77
- }
78
-
79
16
  export default class GetOnekeyFeatures extends BaseMethod {
80
17
  init() {
18
+ this.unlockPolicy = 'none';
81
19
  this.allowDeviceMode = [
82
20
  ...this.allowDeviceMode,
83
21
  UI_REQUEST.NOT_INITIALIZE,
@@ -89,14 +27,7 @@ export default class GetOnekeyFeatures extends BaseMethod {
89
27
 
90
28
  async run() {
91
29
  if (this.device.isProtocolV2()) {
92
- // V2 没有 OnekeyGetFeatures 消息:
93
- // 取完整 DeviceInfoGet(含 SE/hash/build_id)后刷新结构化 features 缓存。
94
- const deviceInfo = await requestProtocolV2DeviceInfo({
95
- commands: this.device.commands,
96
- request: PROTOCOL_V2_DEVICE_INFO_REQUEST,
97
- });
98
- const features = this.device.updateProtocolV2Features(deviceInfo);
99
- return pickOnekeyFeatures(features as OnekeyFeatures);
30
+ throw createDeviceNotSupportMethodError(this.name, this.device.getCurrentFirmwareType());
100
31
  }
101
32
 
102
33
  const { message } = await this.device.commands.typedCall('OnekeyGetFeatures', 'OnekeyFeatures');
@@ -21,7 +21,9 @@ export default class GetPassphraseState extends BaseMethod {
21
21
  const deviceType = this.device.getCurrentDeviceType();
22
22
 
23
23
  if (deviceType === EDeviceType.Pro2) {
24
- return Promise.resolve(passphraseProtection === true ? passphraseState : undefined);
24
+ // Protocol V2 的钱包身份由 DeviceSession 返回的 btc_test_address 决定,
25
+ // 不依赖固件 passphrase_enabled 状态。
26
+ return Promise.resolve(passphraseState);
25
27
  }
26
28
 
27
29
  return Promise.resolve(
@@ -1,11 +1,13 @@
1
1
  import { BaseMethod } from './BaseMethod';
2
2
  import TransportManager from '../data-manager/TransportManager';
3
3
  import { DataManager } from '../data-manager';
4
- import { getDeviceTypeByBleName } from '../utils';
4
+ import { LoggerNames, getDeviceTypeByBleName, getLogger } from '../utils';
5
5
  import { DevicePool } from '../device/DevicePool';
6
6
 
7
7
  import type DeviceConnector from '../device/DeviceConnector';
8
8
 
9
+ const Log = getLogger(LoggerNames.DevicePool);
10
+
9
11
  export default class SearchDevices extends BaseMethod {
10
12
  connector?: DeviceConnector;
11
13
 
@@ -47,9 +49,28 @@ export default class SearchDevices extends BaseMethod {
47
49
  return devices;
48
50
  }
49
51
 
50
- const { deviceList } = await DevicePool.getDevices(devicesDescriptor, undefined, {
51
- connectProtocol: this.payload.connectProtocol,
52
- });
52
+ const deviceList = [];
53
+ for (const descriptor of devicesDescriptor) {
54
+ try {
55
+ // 设备发现是尽力而为的操作。浏览器可能保留已经离线、忙碌或尚未就绪的
56
+ // WebUSB 授权记录,单个描述符初始化失败不应中断其余设备的发现。
57
+ const result = await DevicePool.getDevices([descriptor], descriptor.path, {
58
+ connectProtocol: this.payload.connectProtocol,
59
+ refreshRuntimeState: true,
60
+ });
61
+ deviceList.push(...result.deviceList);
62
+ } catch (error) {
63
+ const errorCode =
64
+ error && typeof error === 'object' && 'errorCode' in error
65
+ ? (error as { errorCode?: unknown }).errorCode
66
+ : undefined;
67
+ Log.debug('Skip unavailable device during search', {
68
+ path: descriptor.path,
69
+ ...(errorCode !== undefined ? { errorCode } : {}),
70
+ });
71
+ }
72
+ }
73
+
53
74
  return deviceList.map(device => device.toMessageObject());
54
75
  }
55
76
  }
@@ -28,6 +28,7 @@ export default class DeviceRebootToBoardloader extends BaseMethod<RebootToBoardl
28
28
  const res = await this.device.commands.typedCall('DeviceReboot', 'Success', {
29
29
  reboot_type: DeviceRebootType.Romloader,
30
30
  });
31
+ this.device.markProtocolV2Reboot(DeviceRebootType.Romloader);
31
32
  return Promise.resolve(res.message);
32
33
  }
33
34
 
@@ -28,6 +28,7 @@ export default class DeviceRebootToBootloader extends BaseMethod<RebootToBootloa
28
28
  const res = await this.device.commands.typedCall('DeviceReboot', 'Success', {
29
29
  reboot_type: DeviceRebootType.Bootloader,
30
30
  });
31
+ this.device.markProtocolV2Reboot(DeviceRebootType.Bootloader);
31
32
  return Promise.resolve(res.message);
32
33
  }
33
34
 
@@ -1,7 +1,13 @@
1
1
  import { HardwareErrorCode, TypedError } from '@onekeyfe/hd-shared';
2
2
 
3
3
  import { BaseMethod } from '../BaseMethod';
4
+ import { invalidParameter } from '../helpers/filesystemValidation';
4
5
  import { validateParams } from '../helpers/paramsValidator';
6
+ import {
7
+ mapApplySettingsToState,
8
+ mapCommonSettingsToProtocolV2,
9
+ mapDeviceSettingsToState,
10
+ } from '../../device/DeviceStateMapper';
5
11
  import { LANGUAGE_LABELS } from '../../utils/deviceSettings';
6
12
 
7
13
  import type { ApplySettings } from '@onekeyfe/hd-transport';
@@ -24,7 +30,15 @@ export default class DeviceSettings extends BaseMethod<ApplySettings> {
24
30
  { name: 'experimentalFeatures', type: 'boolean' },
25
31
  { name: 'autoShutdownDelayMs', type: 'number' },
26
32
  { name: 'changeBrightness', type: 'boolean' },
33
+ { name: 'brightness', type: 'number' },
27
34
  { name: 'hapticFeedback', type: 'boolean' },
35
+ { name: 'bluetoothEnabled', type: 'boolean' },
36
+ { name: 'animationEnabled', type: 'boolean' },
37
+ { name: 'tapToWake', type: 'boolean' },
38
+ { name: 'deviceNameDisplayEnabled', type: 'boolean' },
39
+ { name: 'fidoEnabled', type: 'boolean' },
40
+ { name: 'usbLockEnabled', type: 'boolean' },
41
+ { name: 'randomKeypad', type: 'boolean' },
28
42
  ]);
29
43
 
30
44
  // init params
@@ -60,9 +74,23 @@ export default class DeviceSettings extends BaseMethod<ApplySettings> {
60
74
 
61
75
  async run() {
62
76
  try {
77
+ if (this.device.isProtocolV2()) {
78
+ const settings = mapCommonSettingsToProtocolV2(this.payload);
79
+ if (Object.keys(settings).length === 0) {
80
+ throw invalidParameter('No Protocol V2 compatible setting provided.');
81
+ }
82
+
83
+ const res = await this.device.commands.typedCall('DeviceSettingsSet', 'Success', {
84
+ settings,
85
+ });
86
+ this.device.updateState(mapDeviceSettingsToState(settings), 'apply-settings');
87
+ return res.message;
88
+ }
89
+
63
90
  const res = await this.device.commands.typedCall('ApplySettings', 'Success', {
64
91
  ...this.params,
65
92
  });
93
+ this.device.updateState(mapApplySettingsToState(this.params), 'apply-settings');
66
94
  return res.message;
67
95
  } catch (error) {
68
96
  if (error.message?.toLowerCase().includes('no setting provided')) {
package/src/api/index.ts CHANGED
@@ -3,7 +3,7 @@ export { default as preInitialize } from './device/PreInitialize';
3
3
 
4
4
  export { default as searchDevices } from './SearchDevices';
5
5
  export { default as getFeatures } from './GetFeatures';
6
- export { default as getDeviceInfo } from './GetDeviceInfo';
6
+ export { default as getDeviceState } from './GetDeviceState';
7
7
  export { default as getOnekeyFeatures } from './GetOnekeyFeatures';
8
8
  export { default as getPassphraseState } from './GetPassphraseState';
9
9
  export { default as getLogs } from './GetLogs';
@@ -47,15 +47,12 @@ export { default as promptWebDeviceAccess } from './PromptWebDeviceAccess';
47
47
  export { default as protocolInfoRequest } from './protocol-v2/ProtocolInfoRequest';
48
48
  export { default as ping } from './protocol-v2/Ping';
49
49
  export { default as deviceReboot } from './protocol-v2/DeviceReboot';
50
- export { default as deviceInfoGet } from './protocol-v2/DeviceInfoGet';
51
- export { default as deviceStatusGet } from './protocol-v2/DeviceStatusGet';
52
50
  export { default as deviceGetOnboardingStatus } from './protocol-v2/DeviceGetOnboardingStatus';
53
51
  export { default as deviceSessionOpen } from './protocol-v2/DeviceSessionOpen';
54
52
  export { default as deviceFirmwareUpdate } from './protocol-v2/DeviceFirmwareUpdate';
55
53
  export { default as deviceGetFirmwareUpdateStatus } from './protocol-v2/DeviceGetFirmwareUpdateStatus';
56
54
  export { default as deviceFactoryInfoSet } from './protocol-v2/DeviceFactoryInfoSet';
57
55
  export { default as deviceFactoryInfoGet } from './protocol-v2/DeviceFactoryInfoGet';
58
- export { default as deviceSettingsGet } from './protocol-v2/DeviceSettingsGet';
59
56
  export { default as deviceSettingsSet } from './protocol-v2/DeviceSettingsSet';
60
57
  export { default as deviceSettingsPageShow } from './protocol-v2/DeviceSettingsPageShow';
61
58
  export { default as deviceUploadWallpaper } from './protocol-v2/DeviceUploadWallpaper';
@@ -0,0 +1,9 @@
1
+ /**
2
+ * SDK 内部原生命令注册表。
3
+ *
4
+ * 这些方法允许开发工具通过低层 `call` 调试 Protocol V2,但不会进入
5
+ * `CoreApi` 或公开的便捷方法集合;业务接入仍应使用统一 DeviceState API。
6
+ */
7
+ export { default as deviceInfoGet } from './protocol-v2/DeviceInfoGet';
8
+ export { default as deviceStatusGet } from './protocol-v2/DeviceStatusGet';
9
+ export { default as deviceSettingsGet } from './protocol-v2/DeviceSettingsGet';