@onekeyfe/hd-core 1.2.0-alpha.2 → 1.2.0-alpha.21

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 (406) hide show
  1. package/__tests__/AllNetworkGetAddressBase.tracing.test.ts +75 -0
  2. package/__tests__/DeviceCommands.test.ts +285 -0
  3. package/__tests__/DeviceEventRegistration.test.ts +43 -0
  4. package/__tests__/connectSettings.test.ts +19 -0
  5. package/__tests__/core-dispose.test.ts +34 -0
  6. package/__tests__/core-error-output.test.ts +39 -0
  7. package/__tests__/device-features-state.test.ts +78 -0
  8. package/__tests__/device-identity.test.ts +30 -0
  9. package/__tests__/device-lifecycle-events.test.ts +117 -0
  10. package/__tests__/device-pool-state.test.ts +132 -0
  11. package/__tests__/device-settings.test.ts +391 -0
  12. package/__tests__/device-state-contract.test.ts +27 -0
  13. package/__tests__/device-state-events.test.ts +162 -0
  14. package/__tests__/device-state-mapper.test.ts +241 -0
  15. package/__tests__/device-state-projector.test.ts +94 -0
  16. package/__tests__/device-state-store.test.ts +82 -0
  17. package/__tests__/device-utils.test.ts +106 -0
  18. package/__tests__/device-wallet-session-store.test.ts +213 -0
  19. package/__tests__/deviceFeaturesUtils.test.ts +39 -0
  20. package/__tests__/deviceSettings.test.ts +103 -0
  21. package/__tests__/evmLedgerLegacySafety.test.ts +10 -6
  22. package/__tests__/evmSignTypedData.test.ts +80 -0
  23. package/__tests__/filesystemValidation.test.ts +53 -0
  24. package/__tests__/firmware-update/firmware-update-v2-download-before-boot.test.ts +402 -0
  25. package/__tests__/get-device-state.test.ts +410 -0
  26. package/__tests__/homescreen.test.ts +24 -0
  27. package/__tests__/kaspaSignTransaction.test.ts +591 -0
  28. package/__tests__/logBlockEvent.test.ts +26 -0
  29. package/__tests__/networkUtils.test.ts +386 -0
  30. package/__tests__/open-wallet-session-error-response.test.ts +43 -0
  31. package/__tests__/open-wallet-session.test.ts +559 -0
  32. package/__tests__/preInitialize.test.ts +33 -0
  33. package/__tests__/pro2Wallpaper.test.ts +50 -0
  34. package/__tests__/protocol-v2-bootloader-mode.test.ts +37 -0
  35. package/__tests__/protocol-v2-firmware-targets.test.ts +19 -0
  36. package/__tests__/protocol-v2.test.ts +3954 -1191
  37. package/__tests__/protocolV2FileWrite.test.ts +92 -0
  38. package/__tests__/protocolV2UiInteraction.test.ts +266 -0
  39. package/__tests__/public-device-state-api.test.ts +257 -0
  40. package/__tests__/public-pro2-api-boundary.test.ts +110 -0
  41. package/__tests__/refresh-device-state.test.ts +101 -0
  42. package/__tests__/request-context-logging.test.ts +16 -0
  43. package/__tests__/search-devices.test.ts +136 -0
  44. package/dist/api/BaseMethod.d.ts +8 -0
  45. package/dist/api/BaseMethod.d.ts.map +1 -1
  46. package/dist/api/CheckBootloaderRelease.d.ts.map +1 -1
  47. package/dist/api/CheckFirmwareRelease.d.ts.map +1 -1
  48. package/dist/api/ClearSessionCache.d.ts +9 -0
  49. package/dist/api/ClearSessionCache.d.ts.map +1 -0
  50. package/dist/api/DirList.d.ts.map +1 -1
  51. package/dist/api/FileRead.d.ts.map +1 -1
  52. package/dist/api/FileWrite.d.ts +1 -0
  53. package/dist/api/FileWrite.d.ts.map +1 -1
  54. package/dist/api/FirmwareUpdateV2.d.ts +2 -2
  55. package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
  56. package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
  57. package/dist/api/FirmwareUpdateV4.d.ts +25 -5
  58. package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
  59. package/dist/api/GetDeviceState.d.ts +7 -0
  60. package/dist/api/GetDeviceState.d.ts.map +1 -0
  61. package/dist/api/GetFeatures.d.ts +1 -1
  62. package/dist/api/GetFeatures.d.ts.map +1 -1
  63. package/dist/api/GetOnekeyFeatures.d.ts.map +1 -1
  64. package/dist/api/GetPassphraseState.d.ts +1 -6
  65. package/dist/api/GetPassphraseState.d.ts.map +1 -1
  66. package/dist/api/OpenWalletSession.d.ts +14 -0
  67. package/dist/api/OpenWalletSession.d.ts.map +1 -0
  68. package/dist/api/PathInfo.d.ts.map +1 -1
  69. package/dist/api/PromptWebDeviceAccess.d.ts.map +1 -1
  70. package/dist/api/SearchDevices.d.ts +3 -0
  71. package/dist/api/SearchDevices.d.ts.map +1 -1
  72. package/dist/api/UploadPortfolio.d.ts +17 -0
  73. package/dist/api/UploadPortfolio.d.ts.map +1 -0
  74. package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts.map +1 -1
  75. package/dist/api/device/DeviceCancel.d.ts.map +1 -1
  76. package/dist/api/device/DeviceChangePin.d.ts.map +1 -1
  77. package/dist/api/device/DeviceFullyUploadResource.d.ts +1 -2
  78. package/dist/api/device/DeviceFullyUploadResource.d.ts.map +1 -1
  79. package/dist/api/device/DeviceLock.d.ts.map +1 -1
  80. package/dist/api/device/DeviceRebootToBoardloader.d.ts.map +1 -1
  81. package/dist/api/device/DeviceRebootToBootloader.d.ts.map +1 -1
  82. package/dist/api/device/DeviceSettings.d.ts.map +1 -1
  83. package/dist/api/device/DeviceUnlock.d.ts +1 -1
  84. package/dist/api/device/DeviceUnlock.d.ts.map +1 -1
  85. package/dist/api/device/DeviceUpdateBootloader.d.ts.map +1 -1
  86. package/dist/api/device/DeviceWipe.d.ts.map +1 -1
  87. package/dist/api/evm/EVMSignTypedData.d.ts.map +1 -1
  88. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts +1 -0
  89. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts.map +1 -1
  90. package/dist/api/firmware/getBinary.d.ts +11 -3
  91. package/dist/api/firmware/getBinary.d.ts.map +1 -1
  92. package/dist/api/firmware/progressThrottle.d.ts +3 -0
  93. package/dist/api/firmware/progressThrottle.d.ts.map +1 -0
  94. package/dist/api/helpers/filesystemValidation.d.ts +3 -0
  95. package/dist/api/helpers/filesystemValidation.d.ts.map +1 -1
  96. package/dist/api/helpers/paramsValidator.d.ts +1 -0
  97. package/dist/api/helpers/paramsValidator.d.ts.map +1 -1
  98. package/dist/api/helpers/protocolV2FileWrite.d.ts +33 -0
  99. package/dist/api/helpers/protocolV2FileWrite.d.ts.map +1 -0
  100. package/dist/api/index.d.ts +12 -19
  101. package/dist/api/index.d.ts.map +1 -1
  102. package/dist/api/kaspa/KaspaSignTransaction.d.ts +5 -1
  103. package/dist/api/kaspa/KaspaSignTransaction.d.ts.map +1 -1
  104. package/dist/api/kaspa/helpers/TransferSerialize.d.ts.map +1 -1
  105. package/dist/api/protocol-v2/DeviceFactoryInfoGet.d.ts +6 -0
  106. package/dist/api/protocol-v2/DeviceFactoryInfoGet.d.ts.map +1 -0
  107. package/dist/api/protocol-v2/DeviceFactoryInfoSet.d.ts +7 -0
  108. package/dist/api/protocol-v2/DeviceFactoryInfoSet.d.ts.map +1 -0
  109. package/dist/api/protocol-v2/DeviceFirmwareUpdate.d.ts +1 -1
  110. package/dist/api/protocol-v2/DeviceFirmwareUpdate.d.ts.map +1 -1
  111. package/dist/api/protocol-v2/DeviceGetFirmwareUpdateStatus.d.ts +3 -2
  112. package/dist/api/protocol-v2/DeviceGetFirmwareUpdateStatus.d.ts.map +1 -1
  113. package/dist/api/protocol-v2/DeviceGetOnboardingStatus.d.ts +1 -1
  114. package/dist/api/protocol-v2/DeviceGetOnboardingStatus.d.ts.map +1 -1
  115. package/dist/api/protocol-v2/DeviceInfoGet.d.ts +28 -0
  116. package/dist/api/protocol-v2/DeviceInfoGet.d.ts.map +1 -0
  117. package/dist/api/protocol-v2/DeviceReboot.d.ts.map +1 -1
  118. package/dist/api/protocol-v2/DeviceStatusGet.d.ts +6 -0
  119. package/dist/api/protocol-v2/DeviceStatusGet.d.ts.map +1 -0
  120. package/dist/api/protocol-v2/DeviceUploadWallpaper.d.ts +26 -0
  121. package/dist/api/protocol-v2/DeviceUploadWallpaper.d.ts.map +1 -0
  122. package/dist/api/protocol-v2/FilesystemFormat.d.ts.map +1 -1
  123. package/dist/api/protocol-v2/{FilesystemFixPermission.d.ts → FilesystemPermissionFix.d.ts} +2 -2
  124. package/dist/api/protocol-v2/FilesystemPermissionFix.d.ts.map +1 -0
  125. package/dist/api/protocol-v2/ProtocolInfoRequest.d.ts +6 -0
  126. package/dist/api/protocol-v2/ProtocolInfoRequest.d.ts.map +1 -0
  127. package/dist/api/protocol-v2/helpers.d.ts +27 -19
  128. package/dist/api/protocol-v2/helpers.d.ts.map +1 -1
  129. package/dist/api/ton/TonSignData.d.ts +1 -5
  130. package/dist/api/ton/TonSignData.d.ts.map +1 -1
  131. package/dist/api/utils.d.ts +2 -1
  132. package/dist/api/utils.d.ts.map +1 -1
  133. package/dist/constants/index.d.ts +2 -1
  134. package/dist/constants/index.d.ts.map +1 -1
  135. package/dist/core/RequestQueue.d.ts.map +1 -1
  136. package/dist/core/deviceEventRegistration.d.ts +11 -0
  137. package/dist/core/deviceEventRegistration.d.ts.map +1 -0
  138. package/dist/core/index.d.ts +3 -1
  139. package/dist/core/index.d.ts.map +1 -1
  140. package/dist/data-manager/DataManager.d.ts +1 -1
  141. package/dist/data-manager/DataManager.d.ts.map +1 -1
  142. package/dist/data-manager/connectSettings.d.ts.map +1 -1
  143. package/dist/device/Device.d.ts +35 -11
  144. package/dist/device/Device.d.ts.map +1 -1
  145. package/dist/device/DeviceCommands.d.ts +8 -6
  146. package/dist/device/DeviceCommands.d.ts.map +1 -1
  147. package/dist/device/DeviceFeaturesState.d.ts +3 -0
  148. package/dist/device/DeviceFeaturesState.d.ts.map +1 -0
  149. package/dist/device/DevicePool.d.ts +4 -2
  150. package/dist/device/DevicePool.d.ts.map +1 -1
  151. package/dist/device/DeviceStateMapper.d.ts +13 -0
  152. package/dist/device/DeviceStateMapper.d.ts.map +1 -0
  153. package/dist/device/DeviceStateProjector.d.ts +7 -0
  154. package/dist/device/DeviceStateProjector.d.ts.map +1 -0
  155. package/dist/device/DeviceStateStore.d.ts +21 -0
  156. package/dist/device/DeviceStateStore.d.ts.map +1 -0
  157. package/dist/device/DeviceWalletSessionStore.d.ts +20 -0
  158. package/dist/device/DeviceWalletSessionStore.d.ts.map +1 -0
  159. package/dist/device/cloneDeviceState.d.ts +2 -0
  160. package/dist/device/cloneDeviceState.d.ts.map +1 -0
  161. package/dist/device/deviceIdentity.d.ts +5 -0
  162. package/dist/device/deviceIdentity.d.ts.map +1 -0
  163. package/dist/deviceProfile/buildDeviceFeatures.d.ts +9 -3
  164. package/dist/deviceProfile/buildDeviceFeatures.d.ts.map +1 -1
  165. package/dist/deviceProfile/index.d.ts +0 -1
  166. package/dist/deviceProfile/index.d.ts.map +1 -1
  167. package/dist/events/device.d.ts +11 -2
  168. package/dist/events/device.d.ts.map +1 -1
  169. package/dist/events/logBlockEvent.d.ts.map +1 -1
  170. package/dist/events/ui-request.d.ts +18 -2
  171. package/dist/events/ui-request.d.ts.map +1 -1
  172. package/dist/index.d.ts +1361 -609
  173. package/dist/index.js +5898 -2860
  174. package/dist/inject.d.ts.map +1 -1
  175. package/dist/protocols/protocol-v2/deviceSession.d.ts +7 -0
  176. package/dist/protocols/protocol-v2/deviceSession.d.ts.map +1 -0
  177. package/dist/protocols/protocol-v2/features.d.ts +23 -28
  178. package/dist/protocols/protocol-v2/features.d.ts.map +1 -1
  179. package/dist/protocols/protocol-v2/firmware.d.ts +11 -9
  180. package/dist/protocols/protocol-v2/firmware.d.ts.map +1 -1
  181. package/dist/protocols/protocol-v2/index.d.ts +3 -2
  182. package/dist/protocols/protocol-v2/index.d.ts.map +1 -1
  183. package/dist/protocols/protocol-v2/lockedError.d.ts +2 -0
  184. package/dist/protocols/protocol-v2/lockedError.d.ts.map +1 -0
  185. package/dist/protocols/protocol-v2/settingsUnlockPolicy.d.ts +16 -0
  186. package/dist/protocols/protocol-v2/settingsUnlockPolicy.d.ts.map +1 -0
  187. package/dist/protocols/protocol-v2/uiInteraction.d.ts +39 -0
  188. package/dist/protocols/protocol-v2/uiInteraction.d.ts.map +1 -0
  189. package/dist/protocols/protocol-v2/unlockRetry.d.ts +11 -0
  190. package/dist/protocols/protocol-v2/unlockRetry.d.ts.map +1 -0
  191. package/dist/protocols/protocol-v2/walletSession.d.ts +19 -0
  192. package/dist/protocols/protocol-v2/walletSession.d.ts.map +1 -0
  193. package/dist/types/api/checkAllFirmwareRelease.d.ts +1 -2
  194. package/dist/types/api/checkAllFirmwareRelease.d.ts.map +1 -1
  195. package/dist/types/api/deviceSettings.d.ts +11 -2
  196. package/dist/types/api/deviceSettings.d.ts.map +1 -1
  197. package/dist/types/api/deviceUnlock.d.ts +2 -2
  198. package/dist/types/api/deviceUnlock.d.ts.map +1 -1
  199. package/dist/types/api/firmwareUpdate.d.ts +6 -6
  200. package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
  201. package/dist/types/api/getDeviceState.d.ts +12 -0
  202. package/dist/types/api/getDeviceState.d.ts.map +1 -0
  203. package/dist/types/api/getFeatures.d.ts.map +1 -1
  204. package/dist/types/api/getOnekeyFeatures.d.ts.map +1 -1
  205. package/dist/types/api/getPassphraseState.d.ts +2 -10
  206. package/dist/types/api/getPassphraseState.d.ts.map +1 -1
  207. package/dist/types/api/index.d.ts +22 -25
  208. package/dist/types/api/index.d.ts.map +1 -1
  209. package/dist/types/api/kaspaSignTransaction.d.ts +27 -2
  210. package/dist/types/api/kaspaSignTransaction.d.ts.map +1 -1
  211. package/dist/types/api/openWalletSession.d.ts +41 -0
  212. package/dist/types/api/openWalletSession.d.ts.map +1 -0
  213. package/dist/types/api/protocolV2.d.ts +23 -28
  214. package/dist/types/api/protocolV2.d.ts.map +1 -1
  215. package/dist/types/api/sessionCache.d.ts +10 -0
  216. package/dist/types/api/sessionCache.d.ts.map +1 -0
  217. package/dist/types/device.d.ts +121 -5
  218. package/dist/types/device.d.ts.map +1 -1
  219. package/dist/types/params.d.ts +1 -0
  220. package/dist/types/params.d.ts.map +1 -1
  221. package/dist/types/settings.d.ts +21 -1
  222. package/dist/types/settings.d.ts.map +1 -1
  223. package/dist/utils/assets.d.ts +2 -1
  224. package/dist/utils/assets.d.ts.map +1 -1
  225. package/dist/utils/deviceFeaturesCompat.d.ts +13 -0
  226. package/dist/utils/deviceFeaturesCompat.d.ts.map +1 -0
  227. package/dist/utils/deviceFeaturesUtils.d.ts +13 -3
  228. package/dist/utils/deviceFeaturesUtils.d.ts.map +1 -1
  229. package/dist/utils/deviceInfoUtils.d.ts +9 -8
  230. package/dist/utils/deviceInfoUtils.d.ts.map +1 -1
  231. package/dist/utils/deviceSettings.d.ts +38 -7
  232. package/dist/utils/deviceSettings.d.ts.map +1 -1
  233. package/dist/utils/deviceVersionUtils.d.ts +6 -5
  234. package/dist/utils/deviceVersionUtils.d.ts.map +1 -1
  235. package/dist/utils/homescreen.d.ts.map +1 -1
  236. package/dist/utils/index.d.ts +5 -2
  237. package/dist/utils/index.d.ts.map +1 -1
  238. package/dist/utils/networkUtils.d.ts +9 -1
  239. package/dist/utils/networkUtils.d.ts.map +1 -1
  240. package/dist/utils/patch.d.ts +1 -1
  241. package/dist/utils/patch.d.ts.map +1 -1
  242. package/dist/utils/pro2Wallpaper.d.ts +12 -0
  243. package/dist/utils/pro2Wallpaper.d.ts.map +1 -0
  244. package/dist/utils/tracing.d.ts.map +1 -1
  245. package/package.json +4 -4
  246. package/src/api/BaseMethod.ts +36 -9
  247. package/src/api/CheckBootloaderRelease.ts +1 -2
  248. package/src/api/CheckFirmwareRelease.ts +1 -2
  249. package/src/api/ClearSessionCache.ts +28 -0
  250. package/src/api/DirList.ts +5 -3
  251. package/src/api/DirMake.ts +3 -3
  252. package/src/api/DirRemove.ts +3 -3
  253. package/src/api/FileDelete.ts +3 -3
  254. package/src/api/FileRead.ts +23 -7
  255. package/src/api/FileWrite.ts +23 -168
  256. package/src/api/FirmwareUpdate.ts +4 -4
  257. package/src/api/FirmwareUpdateV2.ts +133 -45
  258. package/src/api/FirmwareUpdateV3.ts +3 -5
  259. package/src/api/FirmwareUpdateV4.ts +1138 -357
  260. package/src/api/GetDeviceState.ts +55 -0
  261. package/src/api/GetFeatures.ts +8 -3
  262. package/src/api/GetOnekeyFeatures.ts +3 -72
  263. package/src/api/GetPassphraseState.ts +11 -18
  264. package/src/api/OpenWalletSession.ts +221 -0
  265. package/src/api/PathInfo.ts +5 -3
  266. package/src/api/PromptWebDeviceAccess.ts +2 -3
  267. package/src/api/SearchDevices.ts +29 -4
  268. package/src/api/UploadPortfolio.ts +40 -0
  269. package/src/api/alephium/AlephiumSignTransaction.ts +2 -2
  270. package/src/api/allnetwork/AllNetworkGetAddressBase.ts +4 -8
  271. package/src/api/benfen/BenfenGetAddress.ts +1 -1
  272. package/src/api/btc/BTCGetPublicKey.ts +1 -1
  273. package/src/api/cardano/CardanoSignMessage.ts +1 -1
  274. package/src/api/cardano/CardanoSignTransaction.ts +1 -1
  275. package/src/api/device/DeviceCancel.ts +1 -0
  276. package/src/api/device/DeviceChangePin.ts +24 -0
  277. package/src/api/device/DeviceFullyUploadResource.ts +4 -5
  278. package/src/api/device/DeviceLock.ts +1 -0
  279. package/src/api/device/DeviceRebootToBoardloader.ts +5 -4
  280. package/src/api/device/DeviceRebootToBootloader.ts +5 -4
  281. package/src/api/device/DeviceSettings.ts +183 -1
  282. package/src/api/device/DeviceUnlock.ts +11 -1
  283. package/src/api/device/DeviceUpdateBootloader.ts +1 -2
  284. package/src/api/device/DeviceWipe.ts +19 -0
  285. package/src/api/evm/EVMSignTypedData.ts +3 -5
  286. package/src/api/evm/legacyV1/getAddress.ts +2 -2
  287. package/src/api/evm/legacyV1/getPublicKey.ts +2 -2
  288. package/src/api/evm/legacyV1/signMessage.ts +2 -2
  289. package/src/api/evm/legacyV1/signTypedData.ts +2 -2
  290. package/src/api/evm/legacyV1/signTypedHash.ts +2 -2
  291. package/src/api/evm/legacyV1/verifyMessage.ts +2 -2
  292. package/src/api/firmware/FirmwareUpdateBaseMethod.ts +21 -7
  293. package/src/api/firmware/getBinary.ts +8 -3
  294. package/src/api/firmware/progressThrottle.ts +44 -0
  295. package/src/api/helpers/batchGetPublickeys.ts +2 -2
  296. package/src/api/helpers/filesystemValidation.ts +61 -0
  297. package/src/api/helpers/paramsValidator.ts +1 -1
  298. package/src/api/helpers/protocolV2FileWrite.ts +193 -0
  299. package/src/api/index.ts +14 -20
  300. package/src/api/kaspa/KaspaSignTransaction.ts +341 -22
  301. package/src/api/kaspa/helpers/TransferSerialize.ts +14 -0
  302. package/src/api/nervos/NervosSignTransaction.ts +2 -2
  303. package/src/api/nexa/NexaSignTransaction.ts +1 -1
  304. package/src/api/protocol-v2/{FactoryGetDeviceInfo.ts → DeviceFactoryInfoGet.ts} +4 -4
  305. package/src/api/protocol-v2/DeviceFactoryInfoSet.ts +32 -0
  306. package/src/api/protocol-v2/DeviceFirmwareUpdate.ts +7 -9
  307. package/src/api/protocol-v2/DeviceGetFirmwareUpdateStatus.ts +41 -6
  308. package/src/api/protocol-v2/DeviceGetOnboardingStatus.ts +6 -4
  309. package/src/api/protocol-v2/DeviceInfoGet.ts +145 -0
  310. package/src/api/protocol-v2/DeviceReboot.ts +5 -3
  311. package/src/api/protocol-v2/DeviceStatusGet.ts +16 -0
  312. package/src/api/protocol-v2/DeviceUploadWallpaper.ts +131 -0
  313. package/src/api/protocol-v2/FilesystemFormat.ts +5 -2
  314. package/src/api/protocol-v2/{FilesystemFixPermission.ts → FilesystemPermissionFix.ts} +3 -3
  315. package/src/api/protocol-v2/Ping.ts +1 -1
  316. package/src/api/protocol-v2/{GetProtoVersion.ts → ProtocolInfoRequest.ts} +3 -3
  317. package/src/api/protocol-v2/helpers.ts +58 -62
  318. package/src/api/ton/TonSignData.ts +1 -5
  319. package/src/api/utils.ts +7 -3
  320. package/src/constants/index.ts +7 -1
  321. package/src/core/RequestQueue.ts +1 -0
  322. package/src/core/deviceEventRegistration.ts +23 -0
  323. package/src/core/index.ts +140 -35
  324. package/src/data/messages/messages-protocol-v2.json +825 -709
  325. package/src/data/messages/messages.json +286 -1
  326. package/src/data-manager/DataManager.ts +13 -6
  327. package/src/data-manager/connectSettings.ts +4 -0
  328. package/src/device/Device.ts +480 -192
  329. package/src/device/DeviceCommands.ts +81 -25
  330. package/src/device/DeviceFeaturesState.ts +25 -0
  331. package/src/device/DevicePool.ts +67 -19
  332. package/src/device/DeviceStateMapper.ts +349 -0
  333. package/src/device/DeviceStateProjector.ts +95 -0
  334. package/src/device/DeviceStateStore.ts +201 -0
  335. package/src/device/DeviceWalletSessionStore.ts +105 -0
  336. package/src/device/cloneDeviceState.ts +39 -0
  337. package/src/device/deviceIdentity.ts +18 -0
  338. package/src/deviceProfile/buildDeviceFeatures.ts +235 -210
  339. package/src/deviceProfile/index.ts +0 -1
  340. package/src/events/device.ts +17 -1
  341. package/src/events/logBlockEvent.ts +8 -1
  342. package/src/events/ui-request.ts +24 -2
  343. package/src/inject.ts +23 -34
  344. package/src/protocols/protocol-v2/deviceSession.ts +24 -0
  345. package/src/protocols/protocol-v2/features.ts +68 -82
  346. package/src/protocols/protocol-v2/firmware.ts +12 -36
  347. package/src/protocols/protocol-v2/index.ts +3 -1
  348. package/src/protocols/protocol-v2/lockedError.ts +10 -0
  349. package/src/protocols/protocol-v2/settingsUnlockPolicy.ts +61 -0
  350. package/src/protocols/protocol-v2/uiInteraction.ts +210 -0
  351. package/src/protocols/protocol-v2/unlockRetry.ts +76 -0
  352. package/src/protocols/protocol-v2/walletSession.ts +107 -0
  353. package/src/types/api/checkAllFirmwareRelease.ts +1 -2
  354. package/src/types/api/deviceSettings.ts +26 -2
  355. package/src/types/api/deviceUnlock.ts +5 -2
  356. package/src/types/api/firmwareUpdate.ts +28 -20
  357. package/src/types/api/getDeviceState.ts +19 -0
  358. package/src/types/api/getFeatures.ts +3 -0
  359. package/src/types/api/getOnekeyFeatures.ts +3 -0
  360. package/src/types/api/getPassphraseState.ts +8 -11
  361. package/src/types/api/index.ts +30 -53
  362. package/src/types/api/kaspaSignTransaction.ts +40 -2
  363. package/src/types/api/openWalletSession.ts +64 -0
  364. package/src/types/api/protocolV2.ts +58 -55
  365. package/src/types/api/sessionCache.ts +14 -0
  366. package/src/types/device.ts +170 -4
  367. package/src/types/params.ts +4 -0
  368. package/src/types/settings.ts +42 -30
  369. package/src/utils/assets.ts +4 -1
  370. package/src/utils/deviceFeaturesCompat.ts +173 -0
  371. package/src/utils/deviceFeaturesUtils.ts +68 -24
  372. package/src/utils/deviceInfoUtils.ts +26 -64
  373. package/src/utils/deviceSettings.ts +161 -39
  374. package/src/utils/deviceVersionUtils.ts +25 -44
  375. package/src/utils/findDefectiveBatchDevice.ts +3 -3
  376. package/src/utils/homescreen.ts +10 -0
  377. package/src/utils/index.ts +21 -1
  378. package/src/utils/networkUtils.ts +270 -14
  379. package/src/utils/pro2Wallpaper.ts +109 -0
  380. package/src/utils/tracing.ts +3 -1
  381. package/dist/api/GetDeviceInfo.d.ts +0 -9
  382. package/dist/api/GetDeviceInfo.d.ts.map +0 -1
  383. package/dist/api/protocol-v2/DevReboot.d.ts +0 -7
  384. package/dist/api/protocol-v2/DevReboot.d.ts.map +0 -1
  385. package/dist/api/protocol-v2/DeviceGetDeviceInfo.d.ts +0 -29
  386. package/dist/api/protocol-v2/DeviceGetDeviceInfo.d.ts.map +0 -1
  387. package/dist/api/protocol-v2/FactoryDeviceInfoSettings.d.ts +0 -7
  388. package/dist/api/protocol-v2/FactoryDeviceInfoSettings.d.ts.map +0 -1
  389. package/dist/api/protocol-v2/FactoryGetDeviceInfo.d.ts +0 -6
  390. package/dist/api/protocol-v2/FactoryGetDeviceInfo.d.ts.map +0 -1
  391. package/dist/api/protocol-v2/FilesystemDiskControl.d.ts +0 -13
  392. package/dist/api/protocol-v2/FilesystemDiskControl.d.ts.map +0 -1
  393. package/dist/api/protocol-v2/FilesystemFixPermission.d.ts.map +0 -1
  394. package/dist/api/protocol-v2/GetProtoVersion.d.ts +0 -6
  395. package/dist/api/protocol-v2/GetProtoVersion.d.ts.map +0 -1
  396. package/dist/deviceProfile/buildDeviceProfile.d.ts +0 -21
  397. package/dist/deviceProfile/buildDeviceProfile.d.ts.map +0 -1
  398. package/dist/types/api/getDeviceInfo.d.ts +0 -85
  399. package/dist/types/api/getDeviceInfo.d.ts.map +0 -1
  400. package/src/api/GetDeviceInfo.ts +0 -145
  401. package/src/api/protocol-v2/DevReboot.ts +0 -24
  402. package/src/api/protocol-v2/DeviceGetDeviceInfo.ts +0 -118
  403. package/src/api/protocol-v2/FactoryDeviceInfoSettings.ts +0 -29
  404. package/src/api/protocol-v2/FilesystemDiskControl.ts +0 -50
  405. package/src/deviceProfile/buildDeviceProfile.ts +0 -334
  406. package/src/types/api/getDeviceInfo.ts +0 -99
@@ -1 +1 @@
1
- {"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../../src/utils/tracing.ts"],"names":[],"mappings":"AAmBA,wBAAgB,qBAAqB,IAAI,MAAM,CAI9C;AASD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAK/E;AAOD,MAAM,WAAW,cAAc;IAE7B,UAAU,EAAE,MAAM,CAAC;IAEnB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,UAAU,EAAE,MAAM,CAAC;IAEnB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,SAAS,EAAE,MAAM,CAAC;IAElB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,CAAC;IAEnE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAKD,MAAM,WAAW,iBAAiB;IAEhC,aAAa,EAAE,MAAM,CAAC;IAEtB,SAAS,EAAE,MAAM,CAAC;IAElB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC7C;AAWD,wBAAgB,uBAAuB,IAAI,iBAAiB,CAW3D;AAQD,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;IACR,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,GACA,cAAc,CAyBhB;AAKD,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAK/F;AAKD,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAuB9E;AAOD,wBAAgB,iCAAiC,CAAC,gBAAgB,EAAE,MAAM,GAAG,cAAc,EAAE,CAI5F;AAOD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAmBpE;AAOD,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAW9D"}
1
+ {"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../../src/utils/tracing.ts"],"names":[],"mappings":"AAmBA,wBAAgB,qBAAqB,IAAI,MAAM,CAI9C;AASD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAK/E;AAOD,MAAM,WAAW,cAAc;IAE7B,UAAU,EAAE,MAAM,CAAC;IAEnB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,UAAU,EAAE,MAAM,CAAC;IAEnB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,SAAS,EAAE,MAAM,CAAC;IAElB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,CAAC;IAEnE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAKD,MAAM,WAAW,iBAAiB;IAEhC,aAAa,EAAE,MAAM,CAAC;IAEtB,SAAS,EAAE,MAAM,CAAC;IAElB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC7C;AAWD,wBAAgB,uBAAuB,IAAI,iBAAiB,CAW3D;AAQD,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;IACR,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,GACA,cAAc,CAyBhB;AAKD,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAK/F;AAKD,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAyB9E;AAOD,wBAAgB,iCAAiC,CAAC,gBAAgB,EAAE,MAAM,GAAG,cAAc,EAAE,CAI5F;AAOD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAmBpE;AAOD,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAW9D"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onekeyfe/hd-core",
3
- "version": "1.2.0-alpha.2",
3
+ "version": "1.2.0-alpha.21",
4
4
  "description": "Core processes and APIs for communicating with OneKey hardware devices.",
5
5
  "author": "OneKey",
6
6
  "homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
@@ -25,8 +25,8 @@
25
25
  "url": "https://github.com/OneKeyHQ/hardware-js-sdk/issues"
26
26
  },
27
27
  "dependencies": {
28
- "@onekeyfe/hd-shared": "1.2.0-alpha.2",
29
- "@onekeyfe/hd-transport": "1.2.0-alpha.2",
28
+ "@onekeyfe/hd-shared": "1.2.0-alpha.21",
29
+ "@onekeyfe/hd-transport": "1.2.0-alpha.21",
30
30
  "axios": "1.15.2",
31
31
  "bignumber.js": "^9.0.2",
32
32
  "bytebuffer": "^5.0.1",
@@ -44,5 +44,5 @@
44
44
  "@types/w3c-web-usb": "^1.0.10",
45
45
  "@types/web-bluetooth": "^0.0.21"
46
46
  },
47
- "gitHead": "6c183b7f7027f4b4d3db4f427f6360351a6c6680"
47
+ "gitHead": "efe594367fb3b196a5126baee7e2aba3e94986cd"
48
48
  }
@@ -1,15 +1,18 @@
1
1
  import semver from 'semver';
2
2
  import {
3
+ ERRORS,
4
+ HardwareErrorCode,
3
5
  createDeviceNotSupportMethodError,
4
6
  createNeedUpgradeFirmwareHardwareError,
5
7
  } from '@onekeyfe/hd-shared';
8
+ import { Enum_SafetyCheckLevel } from '@onekeyfe/hd-transport';
6
9
 
7
10
  import { createDeviceMessage } from '../events/device';
8
11
  import { UI_REQUEST } from '../constants/ui-request';
9
12
  import { DEVICE, FIRMWARE, createFirmwareMessage, createUiMessage } from '../events';
10
13
  import { getHDPath, toHardened } from './helpers/pathUtils';
11
14
  import { getBleFirmwareReleaseInfo, getFirmwareReleaseInfo } from './firmware/releaseHelper';
12
- import { LoggerNames, getFirmwareType, getLogger, isMethodVersionRangeUnsupported } from '../utils';
15
+ import { LoggerNames, getLogger, isMethodVersionRangeUnsupported } from '../utils';
13
16
  import { generateInstanceId } from '../utils/tracing';
14
17
  import { DeviceModelToTypes } from '../types';
15
18
 
@@ -17,9 +20,13 @@ import type { Device } from '../device/Device';
17
20
  import type DeviceConnector from '../device/DeviceConnector';
18
21
  import type { DeviceFirmwareRange, KnownDevice } from '../types';
19
22
  import type { CoreMessage } from '../events';
23
+ import type { ProtocolV2InteractionDescriptor } from '../protocols/protocol-v2/uiInteraction';
20
24
  import type { RequestContext } from '../utils/tracing';
21
25
  import type { CoreContext } from '../core';
22
26
 
27
+ export type UnlockPolicy = 'none' | 'retry-on-locked';
28
+ export type ProtocolV2UiMode = 'auto' | 'none';
29
+
23
30
  const Log = getLogger(LoggerNames.Method);
24
31
 
25
32
  const isEvmLedgerLegacyPathWithHighIndex = (path: unknown) => {
@@ -48,6 +55,8 @@ const isEvmLedgerLegacyPathWithHighIndex = (path: unknown) => {
48
55
  const EVM_LEDGER_LEGACY_METHODS = ['evmGetAddress', 'evmGetPublicKey'];
49
56
 
50
57
  export abstract class BaseMethod<Params = undefined> {
58
+ abortSignal?: AbortSignal;
59
+
51
60
  responseID: number;
52
61
 
53
62
  // @ts-expect-error
@@ -155,13 +164,31 @@ export abstract class BaseMethod<Params = undefined> {
155
164
  strictCheckDeviceSupport = false;
156
165
 
157
166
  /**
158
- * 方法是否仅支持 Protocol V2 设备(Pro2)。
159
- * core 调度在设备协议确定(acquire + initialize)后统一守卫,
160
- * V2 设备直接抛出 NotSupport 错误,方法内部不必重复判断。
167
+ * Whether this method supports Protocol V2 devices (Pro2) only.
168
+ * Core enforces this after the protocol is established during acquire and initialize,
169
+ * so implementations do not need to repeat the check.
161
170
  * @default false
162
171
  */
163
172
  requireProtocolV2 = false;
164
173
 
174
+ /** Core unlocks and retries Protocol V2 business methods once when the device is locked. */
175
+ unlockPolicy: UnlockPolicy = 'retry-on-locked';
176
+
177
+ /** Non-blocking Protocol V2 interaction synthesized by the SDK. */
178
+ protocolV2UiInteraction?: ProtocolV2InteractionDescriptor;
179
+
180
+ /** Special background methods may suppress all synthesized Protocol V2 UI events. */
181
+ protocolV2UiMode: ProtocolV2UiMode = 'auto';
182
+
183
+ protected throwIfAborted() {
184
+ if (this.abortSignal?.aborted) {
185
+ throw ERRORS.TypedError(
186
+ HardwareErrorCode.CallQueueActionCancelled,
187
+ 'Hardware operation cancelled'
188
+ );
189
+ }
190
+ }
191
+
165
192
  // @ts-expect-error: strictPropertyInitialization
166
193
  postMessage: (message: CoreMessage) => void;
167
194
 
@@ -225,11 +252,11 @@ export abstract class BaseMethod<Params = undefined> {
225
252
  }
226
253
 
227
254
  checkFirmwareRelease() {
228
- // 固件 release 元数据(DataManager remote config)目前只覆盖 Protocol V1 设备;
229
- // Pro2 的更新流程由 firmwareUpdateV4 自行管理,这里显式跳过而不是依赖 features 为空。
255
+ // DataManager release metadata currently covers Protocol V1 devices only.
256
+ // firmwareUpdateV4 manages Pro2 updates, so skip them explicitly.
230
257
  if (!this.device || this.device.isProtocolV2()) return;
231
258
  if (!this.device.features) return;
232
- const firmwareType = getFirmwareType(this.device.features);
259
+ const firmwareType = this.device.getCurrentFirmwareType();
233
260
  const releaseInfo = getFirmwareReleaseInfo(this.device.features, firmwareType);
234
261
  this.postMessage(
235
262
  createFirmwareMessage(FIRMWARE.RELEASE_INFO, {
@@ -333,10 +360,10 @@ export abstract class BaseMethod<Params = undefined> {
333
360
  if (this.shouldPromptSafetyCheckForEvmLedgerLegacyPath()) {
334
361
  checkFlag = true;
335
362
  }
336
- if (checkFlag && this.device.getCurrentSafetyChecks() === 'Strict') {
363
+ if (checkFlag && this.device.getCurrentSafetyChecks() === Enum_SafetyCheckLevel.Strict) {
337
364
  Log.debug('will change safety_checks level');
338
365
  await this.device.commands.typedCall('ApplySettings', 'Success', {
339
- safety_checks: 'PromptTemporarily',
366
+ safety_checks: Enum_SafetyCheckLevel.PromptTemporarily,
340
367
  });
341
368
  this.temporarySafetyCheckPrompted = true;
342
369
  return true;
@@ -1,7 +1,6 @@
1
1
  import { BaseMethod } from './BaseMethod';
2
2
  import { UI_REQUEST } from '../constants/ui-request';
3
3
  import { getBootloaderReleaseInfo } from './firmware/releaseHelper';
4
- import { getFirmwareType } from '../utils';
5
4
 
6
5
  import type { CheckBootloaderReleaseParams } from '../types/api/checkBootloaderRelease';
7
6
 
@@ -19,7 +18,7 @@ export default class CheckBootloaderRelease extends BaseMethod {
19
18
  const { features } = this.device;
20
19
  const payload = this.payload as CheckBootloaderReleaseParams;
21
20
 
22
- const deviceFirmwareType = getFirmwareType(features);
21
+ const deviceFirmwareType = this.device.getCurrentFirmwareType();
23
22
  const firmwareType = payload.firmwareType ?? deviceFirmwareType;
24
23
 
25
24
  const releaseInfo = getBootloaderReleaseInfo({
@@ -1,7 +1,6 @@
1
1
  import { BaseMethod } from './BaseMethod';
2
2
  import { UI_REQUEST } from '../constants/ui-request';
3
3
  import { getFirmwareReleaseInfo } from './firmware/releaseHelper';
4
- import { getFirmwareType } from '../utils';
5
4
 
6
5
  import type { CheckFirmwareReleaseParams } from '../types/api/checkFirmwareRelease';
7
6
 
@@ -20,7 +19,7 @@ export default class CheckFirmwareRelease extends BaseMethod {
20
19
  const payload = this.payload as CheckFirmwareReleaseParams;
21
20
 
22
21
  if (this.device.features) {
23
- const deviceFirmwareType = getFirmwareType(this.device.features);
22
+ const deviceFirmwareType = this.device.getCurrentFirmwareType();
24
23
  const firmwareType = payload.firmwareType ?? deviceFirmwareType;
25
24
 
26
25
  const releaseInfo = getFirmwareReleaseInfo(this.device.features, firmwareType);
@@ -0,0 +1,28 @@
1
+ import { BaseMethod } from './BaseMethod';
2
+ import { deviceWalletSessionStore } from '../device/DeviceWalletSessionStore';
3
+
4
+ import type { ClearSessionCacheParams } from '../types/api/sessionCache';
5
+
6
+ export default class ClearSessionCache extends BaseMethod<ClearSessionCacheParams> {
7
+ init() {
8
+ this.useDevice = false;
9
+ this.useDevicePassphraseState = false;
10
+ this.skipForceUpdateCheck = true;
11
+ this.params = {
12
+ deviceId: this.payload.deviceId,
13
+ passphraseState: this.payload.passphraseState,
14
+ };
15
+ }
16
+
17
+ run() {
18
+ const { deviceId, passphraseState } = this.params;
19
+ if (!deviceId) {
20
+ deviceWalletSessionStore.clear();
21
+ } else if (!passphraseState) {
22
+ deviceWalletSessionStore.deleteDevice(deviceId);
23
+ } else {
24
+ deviceWalletSessionStore.delete(deviceId, passphraseState);
25
+ }
26
+ return Promise.resolve({ cleared: true as const });
27
+ }
28
+ }
@@ -1,7 +1,7 @@
1
1
  import { BaseMethod } from './BaseMethod';
2
2
  import {
3
- validateNonEmptyString,
4
3
  validateOptionalNonNegativeInteger,
4
+ validateProtocolV2FilesystemPath,
5
5
  } from './helpers/filesystemValidation';
6
6
 
7
7
  export type DirListParams = {
@@ -11,12 +11,14 @@ export type DirListParams = {
11
11
 
12
12
  export default class DirList extends BaseMethod<DirListParams> {
13
13
  init() {
14
- // Protocol V2 (Pro2) 专属方法,core 调度层统一做非 V2 设备守卫
14
+ // Protocol V2 (Pro2) only; Core rejects non-V2 devices.
15
15
  this.requireProtocolV2 = true;
16
16
  this.skipForceUpdateCheck = true;
17
17
  this.useDevicePassphraseState = false;
18
18
  this.params = {
19
- path: validateNonEmptyString(this.payload.path, 'path'),
19
+ path: validateProtocolV2FilesystemPath(this.payload.path, 'path', {
20
+ allowVolumeRoot: true,
21
+ }),
20
22
  depth: validateOptionalNonNegativeInteger(this.payload.depth, 'depth'),
21
23
  };
22
24
  }
@@ -1,5 +1,5 @@
1
1
  import { BaseMethod } from './BaseMethod';
2
- import { validateNonEmptyString } from './helpers/filesystemValidation';
2
+ import { validateProtocolV2FilesystemPath } from './helpers/filesystemValidation';
3
3
 
4
4
  export type DirMakeParams = {
5
5
  path: string;
@@ -7,11 +7,11 @@ export type DirMakeParams = {
7
7
 
8
8
  export default class DirMake extends BaseMethod<DirMakeParams> {
9
9
  init() {
10
- // Protocol V2 (Pro2) 专属方法,core 调度层统一做非 V2 设备守卫
10
+ // Protocol V2 (Pro2) only; Core rejects non-V2 devices.
11
11
  this.requireProtocolV2 = true;
12
12
  this.skipForceUpdateCheck = true;
13
13
  this.useDevicePassphraseState = false;
14
- this.params = { path: validateNonEmptyString(this.payload.path, 'path') };
14
+ this.params = { path: validateProtocolV2FilesystemPath(this.payload.path, 'path') };
15
15
  }
16
16
 
17
17
  async run() {
@@ -1,5 +1,5 @@
1
1
  import { BaseMethod } from './BaseMethod';
2
- import { validateNonEmptyString } from './helpers/filesystemValidation';
2
+ import { validateProtocolV2FilesystemPath } from './helpers/filesystemValidation';
3
3
 
4
4
  export type DirRemoveParams = {
5
5
  path: string;
@@ -7,11 +7,11 @@ export type DirRemoveParams = {
7
7
 
8
8
  export default class DirRemove extends BaseMethod<DirRemoveParams> {
9
9
  init() {
10
- // Protocol V2 (Pro2) 专属方法,core 调度层统一做非 V2 设备守卫
10
+ // Protocol V2 (Pro2) only; Core rejects non-V2 devices.
11
11
  this.requireProtocolV2 = true;
12
12
  this.skipForceUpdateCheck = true;
13
13
  this.useDevicePassphraseState = false;
14
- this.params = { path: validateNonEmptyString(this.payload.path, 'path') };
14
+ this.params = { path: validateProtocolV2FilesystemPath(this.payload.path, 'path') };
15
15
  }
16
16
 
17
17
  async run() {
@@ -1,5 +1,5 @@
1
1
  import { BaseMethod } from './BaseMethod';
2
- import { validateNonEmptyString } from './helpers/filesystemValidation';
2
+ import { validateProtocolV2FilesystemPath } from './helpers/filesystemValidation';
3
3
 
4
4
  export type FileDeleteParams = {
5
5
  path: string;
@@ -7,11 +7,11 @@ export type FileDeleteParams = {
7
7
 
8
8
  export default class FileDelete extends BaseMethod<FileDeleteParams> {
9
9
  init() {
10
- // Protocol V2 (Pro2) 专属方法,core 调度层统一做非 V2 设备守卫
10
+ // Protocol V2 (Pro2) only; Core rejects non-V2 devices.
11
11
  this.requireProtocolV2 = true;
12
12
  this.skipForceUpdateCheck = true;
13
13
  this.useDevicePassphraseState = false;
14
- this.params = { path: validateNonEmptyString(this.payload.path, 'path') };
14
+ this.params = { path: validateProtocolV2FilesystemPath(this.payload.path, 'path') };
15
15
  }
16
16
 
17
17
  async run() {
@@ -1,15 +1,15 @@
1
1
  import {
2
- PROTOCOL_V2_BLE_FILE_CHUNK_SIZE,
2
+ PROTOCOL_V2_BLE_FILE_READ_CHUNK_SIZE,
3
3
  PROTOCOL_V2_WEBUSB_FILE_CHUNK_SIZE,
4
4
  } from '@onekeyfe/hd-transport';
5
5
  import { ERRORS, HardwareErrorCode } from '@onekeyfe/hd-shared';
6
6
 
7
7
  import { BaseMethod } from './BaseMethod';
8
8
  import {
9
- validateNonEmptyString,
10
9
  validateNonNegativeInteger,
11
10
  validateOptionalNonNegativeInteger,
12
11
  validateOptionalPercentage,
12
+ validateProtocolV2FilesystemPath,
13
13
  } from './helpers/filesystemValidation';
14
14
  import { hexToBytes, isHexString, stripHexPrefix } from './helpers/hexUtils';
15
15
  import { DataManager } from '../data-manager';
@@ -27,7 +27,7 @@ const MIN_FILE_READ_CHUNK_SIZE = 64;
27
27
  function getProtocolV2FileReadChunkLimit() {
28
28
  const env = DataManager.getSettings('env');
29
29
  if (env && DataManager.isBleConnect(env)) {
30
- return PROTOCOL_V2_BLE_FILE_CHUNK_SIZE;
30
+ return PROTOCOL_V2_BLE_FILE_READ_CHUNK_SIZE;
31
31
  }
32
32
  return PROTOCOL_V2_WEBUSB_FILE_CHUNK_SIZE;
33
33
  }
@@ -69,13 +69,30 @@ function toUint8Array(value: unknown): Uint8Array {
69
69
  return new Uint8Array(0);
70
70
  }
71
71
 
72
+ function getDeviceTransferProgress(
73
+ bytesBeforeChunk: number,
74
+ bytesAfterChunk: number,
75
+ totalBytes: number
76
+ ) {
77
+ if (!Number.isFinite(totalBytes) || totalBytes <= 0) {
78
+ return 100;
79
+ }
80
+ if (bytesBeforeChunk <= 0 && bytesAfterChunk < totalBytes) {
81
+ return 0;
82
+ }
83
+ if (bytesAfterChunk >= totalBytes) {
84
+ return 100;
85
+ }
86
+ return Math.min(Math.max(Math.ceil((bytesAfterChunk / totalBytes) * 100), 1), 99);
87
+ }
88
+
72
89
  export default class FileRead extends BaseMethod<FileReadParams> {
73
90
  init() {
74
- // Protocol V2 (Pro2) 专属方法,core 调度层统一做非 V2 设备守卫
91
+ // Protocol V2 (Pro2) only; Core rejects non-V2 devices.
75
92
  this.requireProtocolV2 = true;
76
93
  this.skipForceUpdateCheck = true;
77
94
  this.useDevicePassphraseState = false;
78
- const path = validateNonEmptyString(this.payload.path, 'path');
95
+ const path = validateProtocolV2FilesystemPath(this.payload.path, 'path');
79
96
  this.params = {
80
97
  path,
81
98
  offset: validateNonNegativeInteger(this.payload.offset, 'offset', 0),
@@ -123,8 +140,7 @@ export default class FileRead extends BaseMethod<FileReadParams> {
123
140
  const readLen = Math.min(chunkSize, totalLength - read);
124
141
  const offset = startOffset + read;
125
142
  const progress =
126
- this.params.uiPercentage ??
127
- Math.min(Math.ceil(((read + readLen) / Math.max(totalLength, 1)) * 100), 99);
143
+ this.params.uiPercentage ?? getDeviceTransferProgress(read, read + readLen, totalLength);
128
144
  const res = await this.device.commands.typedCall('FilesystemFileRead', 'FilesystemFile', {
129
145
  file: {
130
146
  path: this.params.path,
@@ -1,19 +1,13 @@
1
- import {
2
- PROTOCOL_V2_BLE_FILE_CHUNK_SIZE,
3
- PROTOCOL_V2_WEBUSB_FILE_CHUNK_SIZE,
4
- } from '@onekeyfe/hd-transport';
5
- import { ERRORS, HardwareErrorCode } from '@onekeyfe/hd-shared';
6
-
7
1
  import { BaseMethod } from './BaseMethod';
8
2
  import {
9
- validateNonEmptyString,
10
3
  validateNonNegativeInteger,
11
4
  validateOptionalNonNegativeInteger,
12
5
  validateOptionalPercentage,
6
+ validateProtocolV2FilesystemPath,
13
7
  validateRequiredData,
14
8
  } from './helpers/filesystemValidation';
9
+ import { writeProtocolV2File } from './helpers/protocolV2FileWrite';
15
10
  import { UI_REQUEST, createUiMessage } from '../events/ui-request';
16
- import { DataManager } from '../data-manager';
17
11
 
18
12
  export type FileWriteParams = {
19
13
  path: string;
@@ -24,74 +18,19 @@ export type FileWriteParams = {
24
18
  chunkLen?: number;
25
19
  overwrite?: boolean;
26
20
  append?: boolean;
21
+ emitProgress?: boolean;
27
22
  uiPercentage?: number;
28
23
  timeoutMs?: number | string;
29
24
  };
30
25
 
31
- const MIN_FILE_CHUNK_SIZE = 64;
32
-
33
- function getProtocolV2FileChunkLimit() {
34
- const env = DataManager.getSettings('env');
35
- if (env && DataManager.isBleConnect(env)) {
36
- return PROTOCOL_V2_BLE_FILE_CHUNK_SIZE;
37
- }
38
- return PROTOCOL_V2_WEBUSB_FILE_CHUNK_SIZE;
39
- }
40
-
41
- async function dataToUint8Array(data: FileWriteParams['data'] | Blob): Promise<Uint8Array> {
42
- if (typeof data === 'string') {
43
- return new TextEncoder().encode(data);
44
- }
45
-
46
- if (data instanceof ArrayBuffer) {
47
- return new Uint8Array(data);
48
- }
49
-
50
- if (ArrayBuffer.isView(data)) {
51
- return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
52
- }
53
-
54
- if (typeof Blob !== 'undefined' && data instanceof Blob) {
55
- return new Uint8Array(await data.arrayBuffer());
56
- }
57
-
58
- throw ERRORS.TypedError(
59
- HardwareErrorCode.CallMethodInvalidParameter,
60
- 'Unsupported FilesystemFileWrite data'
61
- );
62
- }
63
-
64
- function normalizeChunkSize(value: unknown, maxChunkSize: number): number {
65
- const numeric = Number(value);
66
- if (!Number.isFinite(numeric) || numeric <= 0) return maxChunkSize;
67
- return Math.min(Math.max(Math.floor(numeric), MIN_FILE_CHUNK_SIZE), maxChunkSize);
68
- }
69
-
70
- function getConfirmedProgress(
71
- processedByte: number,
72
- totalSize: number,
73
- written: number,
74
- dataLength: number
75
- ) {
76
- if (Number.isFinite(processedByte) && Number.isFinite(totalSize) && totalSize > 0) {
77
- if (processedByte >= totalSize) return 100;
78
- return Math.min(Math.max(Math.floor((processedByte / totalSize) * 100), 0), 99);
79
- }
80
- if (dataLength > 0) {
81
- if (written >= dataLength) return 100;
82
- return Math.min(Math.max(Math.floor((written / dataLength) * 100), 0), 99);
83
- }
84
- return 100;
85
- }
86
-
87
26
  export default class FileWrite extends BaseMethod<FileWriteParams> {
88
27
  init() {
89
- // Protocol V2 (Pro2) 专属方法,core 调度层统一做非 V2 设备守卫
28
+ // Protocol V2 (Pro2) only; Core rejects non-V2 devices.
90
29
  this.requireProtocolV2 = true;
91
30
  this.skipForceUpdateCheck = true;
92
31
  this.useDevicePassphraseState = false;
93
32
  validateRequiredData(this.payload.data, 'data');
94
- const path = validateNonEmptyString(this.payload.path, 'path');
33
+ const path = validateProtocolV2FilesystemPath(this.payload.path, 'path');
95
34
  const offset = validateNonNegativeInteger(this.payload.offset, 'offset', 0);
96
35
  this.params = {
97
36
  path,
@@ -102,115 +41,31 @@ export default class FileWrite extends BaseMethod<FileWriteParams> {
102
41
  chunkLen: validateOptionalNonNegativeInteger(this.payload.chunkLen, 'chunkLen'),
103
42
  overwrite: this.payload.overwrite ?? offset === 0,
104
43
  append: this.payload.append ?? false,
44
+ emitProgress: this.payload.emitProgress ?? true,
105
45
  uiPercentage: validateOptionalPercentage(this.payload.uiPercentage, 'uiPercentage'),
106
46
  timeoutMs: validateOptionalNonNegativeInteger(this.payload.timeoutMs, 'timeoutMs'),
107
47
  };
108
48
  }
109
49
 
110
50
  async run() {
111
- const data = await dataToUint8Array(this.params.data);
112
- const dataLength = data.byteLength;
113
- const offsetValue = Number(this.params.offset ?? 0);
114
- const startOffset = Number.isFinite(offsetValue) && offsetValue > 0 ? offsetValue : 0;
115
- const payloadTotalSize = Number(this.params.totalSize);
116
- const totalSize =
117
- Number.isFinite(payloadTotalSize) && payloadTotalSize > 0
118
- ? payloadTotalSize
119
- : startOffset + dataLength;
120
-
121
- if (totalSize < startOffset + dataLength) {
122
- throw ERRORS.TypedError(
123
- HardwareErrorCode.RuntimeError,
124
- `FilesystemFileWrite totalSize ${totalSize} is smaller than offset + data length ${
125
- startOffset + dataLength
126
- }`
127
- );
128
- }
129
-
130
- const chunkSize = normalizeChunkSize(
131
- this.params.chunkSize ?? this.params.chunkLen,
132
- getProtocolV2FileChunkLimit()
133
- );
134
- const overwrite = this.params.overwrite ?? false;
135
- const append = this.params.append ?? false;
136
- let written = 0;
137
- let chunkIndex = 0;
138
- let lastMessage: Record<string, unknown> | undefined;
139
- const startTime = Date.now();
140
- const timeoutMs =
141
- this.params.timeoutMs === undefined ? undefined : Number(this.params.timeoutMs);
142
-
143
- while (written < dataLength) {
144
- const chunkEnd = Math.min(written + chunkSize, dataLength);
145
- const chunk = data.slice(written, chunkEnd);
146
- const offset = startOffset + written;
147
- const isFirstChunk = chunkIndex === 0;
148
- const progress =
149
- this.params.uiPercentage ??
150
- Math.min(Math.ceil(((written + chunk.byteLength) / dataLength) * 100), 99);
151
-
152
- const res = await this.device.commands.typedCall(
153
- 'FilesystemFileWrite',
154
- 'FilesystemFile',
155
- {
156
- file: {
157
- path: this.params.path,
158
- offset,
159
- total_size: totalSize,
160
- data: chunk,
161
- },
162
- overwrite: isFirstChunk ? overwrite : false,
163
- append,
164
- ui_percentage: progress,
165
- },
166
- {
167
- timeoutMs,
168
- }
169
- );
170
-
171
- lastMessage = res.message;
172
- const processedByte = Number(res.message?.processed_byte);
173
- if (Number.isFinite(processedByte) && processedByte > offset) {
174
- written = processedByte - startOffset;
175
- } else {
176
- written += chunk.byteLength;
177
- }
178
-
179
- if (written > dataLength) {
180
- throw ERRORS.TypedError(
181
- HardwareErrorCode.RuntimeError,
182
- `FilesystemFileWrite invalid processed_byte ${processedByte}`
183
- );
184
- }
185
-
186
- const confirmedProcessedByte =
187
- Number.isFinite(processedByte) && processedByte > offset
188
- ? processedByte
189
- : startOffset + written;
190
- if (typeof this.postMessage === 'function') {
191
- const elapsedMs = Date.now() - startTime;
192
- const transferredBytes = Math.min(written, dataLength);
193
- this.postMessage(
194
- createUiMessage(UI_REQUEST.DEVICE_PROGRESS, {
195
- progress: getConfirmedProgress(confirmedProcessedByte, totalSize, written, dataLength),
196
- transferredBytes,
197
- totalBytes: dataLength,
198
- rateBytesPerSecond:
199
- elapsedMs > 0 ? Math.round((transferredBytes / elapsedMs) * 1000) : undefined,
200
- elapsedMs,
201
- })
202
- );
203
- }
204
- chunkIndex += 1;
205
- }
206
-
207
- return Promise.resolve({
208
- ...lastMessage,
51
+ return writeProtocolV2File({
52
+ commands: this.device.commands,
209
53
  path: this.params.path,
210
- offset: startOffset,
211
- total_size: totalSize,
212
- processed_byte: startOffset + written,
213
- chunks: chunkIndex,
54
+ data: this.params.data,
55
+ offset: this.params.offset,
56
+ totalSize: this.params.totalSize,
57
+ chunkSize: this.params.chunkSize,
58
+ chunkLen: this.params.chunkLen,
59
+ overwrite: this.params.overwrite,
60
+ append: this.params.append,
61
+ uiPercentage: this.params.uiPercentage,
62
+ timeoutMs: this.params.timeoutMs === undefined ? undefined : Number(this.params.timeoutMs),
63
+ throwIfAborted: () => this.throwIfAborted(),
64
+ onProgress: payload => {
65
+ if (this.params.emitProgress && typeof this.postMessage === 'function') {
66
+ this.postMessage(createUiMessage(UI_REQUEST.DEVICE_PROGRESS, payload));
67
+ }
68
+ },
214
69
  });
215
70
  }
216
71
  }
@@ -14,7 +14,7 @@ import { uploadFirmware } from './firmware/uploadFirmware';
14
14
  import { createUiMessage } from '../events';
15
15
  import { DeviceModelToTypes, type KnownDevice } from '../types';
16
16
  import { isEnteredManuallyBoot } from './firmware/bootloaderHelper';
17
- import { LoggerNames, getDeviceUUID, getLogger, wait } from '../utils';
17
+ import { LoggerNames, getLogger, wait } from '../utils';
18
18
  import { DataManager } from '../data-manager';
19
19
  import { DevicePool } from '../device/DevicePool';
20
20
 
@@ -133,7 +133,7 @@ export default class FirmwareUpdate extends BaseMethod<Params> {
133
133
  const { features, commands } = device;
134
134
  const deviceType = device.getCurrentDeviceType();
135
135
 
136
- // Protocol V2 (Pro2) 固件升级走 DeviceFirmwareUpdate 流程,禁止进入 legacy 入口
136
+ // Protocol V2 (Pro2) uses DeviceFirmwareUpdate and must not enter this legacy flow.
137
137
  if (device.isProtocolV2()) {
138
138
  throw ERRORS.TypedError(
139
139
  HardwareErrorCode.RuntimeError,
@@ -142,7 +142,7 @@ export default class FirmwareUpdate extends BaseMethod<Params> {
142
142
  }
143
143
 
144
144
  if (!device.isBootloader() && features) {
145
- const uuid = getDeviceUUID(features);
145
+ const serialNo = device.getCurrentSerialNo();
146
146
  // should go to bootloader mode manually
147
147
  if (isEnteredManuallyBoot(features, params.updateType)) {
148
148
  return Promise.reject(ERRORS.TypedError(HardwareErrorCode.FirmwareUpdateManuallyEnterBoot));
@@ -161,7 +161,7 @@ export default class FirmwareUpdate extends BaseMethod<Params> {
161
161
 
162
162
  // force clean classic device cache so that the device can initialize again
163
163
  if (DeviceModelToTypes.model_classic.includes(deviceType)) {
164
- DevicePool.clearDeviceCache(uuid);
164
+ DevicePool.clearDeviceCache(serialNo);
165
165
  }
166
166
  delete DevicePool.devicesCache[''];
167
167
  await this.checkPromise?.promise;