@onekeyfe/hd-core 1.2.0-alpha.66 → 1.2.0-alpha.67

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 (315) hide show
  1. package/__tests__/AllNetworkGetAddressBase.tracing.test.ts +0 -313
  2. package/__tests__/DeviceCommands.test.ts +13 -59
  3. package/__tests__/DeviceEventRegistration.test.ts +0 -6
  4. package/__tests__/check-all-firmware-release-protocol-v2.test.ts +3 -198
  5. package/__tests__/connectSettings.test.ts +47 -5
  6. package/__tests__/device-initialize-timeout.test.ts +56 -0
  7. package/__tests__/device-lifecycle-events.test.ts +3 -105
  8. package/__tests__/device-pool-state.test.ts +0 -22
  9. package/__tests__/device-settings.test.ts +18 -39
  10. package/__tests__/device-state-contract.test.ts +0 -1
  11. package/__tests__/device-state-mapper.test.ts +1 -13
  12. package/__tests__/device-utils.test.ts +1 -48
  13. package/__tests__/deviceSettings.test.ts +1 -11
  14. package/__tests__/firmware-update/check-all-firmware-release.test.ts +175 -0
  15. package/__tests__/firmware-update/device-update-bootloader.test.ts +87 -0
  16. package/__tests__/firmware-update/firmware-artifact-source.test.ts +119 -0
  17. package/__tests__/firmware-update/firmware-host-binding.test.ts +70 -0
  18. package/__tests__/firmware-update/firmware-preparation-error.test.ts +27 -0
  19. package/__tests__/firmware-update/firmware-update-bootloader-poll.test.ts +200 -0
  20. package/__tests__/firmware-update/firmware-update-capabilities.test.ts +13 -0
  21. package/__tests__/firmware-update/firmware-update-plan-bootloader-identity.test.ts +394 -0
  22. package/__tests__/firmware-update/firmware-update-plan.test.ts +593 -0
  23. package/__tests__/firmware-update/firmware-update-prepared-plan.test.ts +231 -0
  24. package/__tests__/firmware-update/firmware-update-v2-download-before-boot.test.ts +59 -31
  25. package/__tests__/firmware-update/firmware-update-v3-reconnect.test.ts +58 -0
  26. package/__tests__/firmware-update/firmware-upload-source.test.ts +70 -0
  27. package/__tests__/get-device-state.test.ts +12 -132
  28. package/__tests__/homescreen.test.ts +1 -41
  29. package/__tests__/kaspa-use-tweak-pro2.test.ts +2 -2
  30. package/__tests__/kaspaSignTransaction.test.ts +26 -3
  31. package/__tests__/logBlockEvent.test.ts +1 -1
  32. package/__tests__/method-protocol-support.test.ts +0 -19
  33. package/__tests__/open-wallet-session.test.ts +37 -568
  34. package/__tests__/protocol-v2-unlock-policy.test.ts +37 -300
  35. package/__tests__/protocol-v2.test.ts +1153 -1458
  36. package/__tests__/protocolV2FileWrite.test.ts +0 -152
  37. package/__tests__/protocolV2UiInteraction.test.ts +0 -63
  38. package/__tests__/public-pro2-api-boundary.test.ts +0 -1
  39. package/__tests__/search-devices.test.ts +3 -12
  40. package/__tests__/tron-sign-message-init.test.ts +2 -2
  41. package/dist/api/BaseMethod.d.ts +1 -3
  42. package/dist/api/BaseMethod.d.ts.map +1 -1
  43. package/dist/api/CheckAllFirmwareRelease.d.ts +1 -2
  44. package/dist/api/CheckAllFirmwareRelease.d.ts.map +1 -1
  45. package/dist/api/FirmwareUpdate.d.ts.map +1 -1
  46. package/dist/api/FirmwareUpdateV2.d.ts +10 -0
  47. package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
  48. package/dist/api/FirmwareUpdateV3.d.ts +7 -3
  49. package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
  50. package/dist/api/FirmwareUpdateV4.d.ts +27 -13
  51. package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
  52. package/dist/api/GetPassphraseState.d.ts.map +1 -1
  53. package/dist/api/OpenWalletSession.d.ts.map +1 -1
  54. package/dist/api/SearchDevices.d.ts.map +1 -1
  55. package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts.map +1 -1
  56. package/dist/api/device/DeviceSettings.d.ts.map +1 -1
  57. package/dist/api/device/DeviceUnlock.d.ts +2 -2
  58. package/dist/api/device/DeviceUnlock.d.ts.map +1 -1
  59. package/dist/api/device/DeviceUpdateBootloader.d.ts +5 -1
  60. package/dist/api/device/DeviceUpdateBootloader.d.ts.map +1 -1
  61. package/dist/api/firmware/FirmwareArtifactSource.d.ts +25 -0
  62. package/dist/api/firmware/FirmwareArtifactSource.d.ts.map +1 -0
  63. package/dist/api/firmware/FirmwareHostBinding.d.ts +6 -0
  64. package/dist/api/firmware/FirmwareHostBinding.d.ts.map +1 -0
  65. package/dist/api/firmware/FirmwarePreparationError.d.ts +3 -0
  66. package/dist/api/firmware/FirmwarePreparationError.d.ts.map +1 -0
  67. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts +11 -4
  68. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts.map +1 -1
  69. package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts +3 -0
  70. package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts.map +1 -0
  71. package/dist/api/firmware/FirmwareUpdatePlan.d.ts +25 -0
  72. package/dist/api/firmware/FirmwareUpdatePlan.d.ts.map +1 -0
  73. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts +32 -0
  74. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts.map +1 -0
  75. package/dist/api/firmware/getBinary.d.ts +7 -0
  76. package/dist/api/firmware/getBinary.d.ts.map +1 -1
  77. package/dist/api/firmware/progressThrottle.d.ts +3 -0
  78. package/dist/api/firmware/progressThrottle.d.ts.map +1 -0
  79. package/dist/api/firmware/updateBootloader.d.ts +2 -0
  80. package/dist/api/firmware/updateBootloader.d.ts.map +1 -1
  81. package/dist/api/firmware/uploadFirmware.d.ts +9 -1
  82. package/dist/api/firmware/uploadFirmware.d.ts.map +1 -1
  83. package/dist/api/helpers/protocolV2FileWrite.d.ts +0 -9
  84. package/dist/api/helpers/protocolV2FileWrite.d.ts.map +1 -1
  85. package/dist/api/index.d.ts +0 -2
  86. package/dist/api/index.d.ts.map +1 -1
  87. package/dist/api/kaspa/KaspaGetAddress.d.ts +1 -1
  88. package/dist/api/kaspa/KaspaSignTransaction.d.ts +1 -1
  89. package/dist/api/kaspa/KaspaSignTransaction.d.ts.map +1 -1
  90. package/dist/api/polkadot/PolkadotGetAddress.d.ts +1 -1
  91. package/dist/api/polkadot/networks.d.ts +1 -1
  92. package/dist/api/protocol-v2/ProtocolInfoRequest.d.ts.map +1 -1
  93. package/dist/api/protocol-v2/helpers.d.ts.map +1 -1
  94. package/dist/api/solana/SolSignMessage.d.ts +1 -1
  95. package/dist/api/solana/SolSignOffchainMessage.d.ts +1 -1
  96. package/dist/api/solana/SolSignTransaction.d.ts +2 -2
  97. package/dist/api/stellar/StellarSignTransaction.d.ts +1 -1
  98. package/dist/api/sui/SuiGetAddress.d.ts +1 -1
  99. package/dist/api/sui/SuiGetPublicKey.d.ts +1 -1
  100. package/dist/api/sui/SuiSignMessage.d.ts +1 -1
  101. package/dist/api/sui/SuiSignTransaction.d.ts +1 -1
  102. package/dist/api/ton/TonGetAddress.d.ts +1 -1
  103. package/dist/api/ton/TonSignMessage.d.ts +1 -1
  104. package/dist/api/ton/TonSignProof.d.ts +1 -1
  105. package/dist/api/tron/TronSignMessage.d.ts +2 -2
  106. package/dist/api/tron/TronSignTransaction.d.ts +1 -1
  107. package/dist/core/deviceEventRegistration.d.ts +0 -2
  108. package/dist/core/deviceEventRegistration.d.ts.map +1 -1
  109. package/dist/core/index.d.ts.map +1 -1
  110. package/dist/data-manager/DataManager.d.ts +4 -9
  111. package/dist/data-manager/DataManager.d.ts.map +1 -1
  112. package/dist/data-manager/TransportManager.d.ts.map +1 -1
  113. package/dist/data-manager/connectSettings.d.ts.map +1 -1
  114. package/dist/device/Device.d.ts +6 -29
  115. package/dist/device/Device.d.ts.map +1 -1
  116. package/dist/device/DeviceCommands.d.ts +4 -4
  117. package/dist/device/DeviceCommands.d.ts.map +1 -1
  118. package/dist/device/DeviceConnector.d.ts +1 -2
  119. package/dist/device/DeviceConnector.d.ts.map +1 -1
  120. package/dist/device/DevicePool.d.ts.map +1 -1
  121. package/dist/deviceProfile/protocolV2DeviceIdentity.d.ts.map +1 -1
  122. package/dist/events/device.d.ts +0 -4
  123. package/dist/events/device.d.ts.map +1 -1
  124. package/dist/events/logBlockEvent.d.ts.map +1 -1
  125. package/dist/events/ui-promise.d.ts +2 -4
  126. package/dist/events/ui-promise.d.ts.map +1 -1
  127. package/dist/events/ui-request.d.ts +2 -31
  128. package/dist/events/ui-request.d.ts.map +1 -1
  129. package/dist/events/ui-response.d.ts +2 -10
  130. package/dist/events/ui-response.d.ts.map +1 -1
  131. package/dist/index.d.ts +247 -243
  132. package/dist/index.d.ts.map +1 -1
  133. package/dist/index.js +3773 -3054
  134. package/dist/inject.d.ts +1 -6
  135. package/dist/inject.d.ts.map +1 -1
  136. package/dist/lowLevelInject.d.ts.map +1 -1
  137. package/dist/protocols/protocol-v2/features.d.ts +4 -0
  138. package/dist/protocols/protocol-v2/features.d.ts.map +1 -1
  139. package/dist/protocols/protocol-v2/firmware.d.ts.map +1 -1
  140. package/dist/protocols/protocol-v2/lockedError.d.ts +2 -0
  141. package/dist/protocols/protocol-v2/lockedError.d.ts.map +1 -0
  142. package/dist/protocols/protocol-v2/uiInteraction.d.ts +4 -7
  143. package/dist/protocols/protocol-v2/uiInteraction.d.ts.map +1 -1
  144. package/dist/protocols/protocol-v2/unlockPolicy.d.ts +3 -1
  145. package/dist/protocols/protocol-v2/unlockPolicy.d.ts.map +1 -1
  146. package/dist/protocols/protocol-v2/unlockRetry.d.ts +10 -0
  147. package/dist/protocols/protocol-v2/unlockRetry.d.ts.map +1 -0
  148. package/dist/protocols/protocol-v2/walletSession.d.ts +1 -6
  149. package/dist/protocols/protocol-v2/walletSession.d.ts.map +1 -1
  150. package/dist/topLevelInject.d.ts.map +1 -1
  151. package/dist/types/api/checkAllFirmwareRelease.d.ts +5 -3
  152. package/dist/types/api/checkAllFirmwareRelease.d.ts.map +1 -1
  153. package/dist/types/api/deviceUnlock.d.ts +1 -5
  154. package/dist/types/api/deviceUnlock.d.ts.map +1 -1
  155. package/dist/types/api/deviceUpdateBootloader.d.ts +6 -0
  156. package/dist/types/api/deviceUpdateBootloader.d.ts.map +1 -1
  157. package/dist/types/api/export.d.ts +4 -2
  158. package/dist/types/api/export.d.ts.map +1 -1
  159. package/dist/types/api/firmwareUpdate.d.ts +70 -4
  160. package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
  161. package/dist/types/api/firmwareUpdateCapabilities.d.ts +9 -0
  162. package/dist/types/api/firmwareUpdateCapabilities.d.ts.map +1 -0
  163. package/dist/types/api/firmwareUpdatePlan.d.ts +28 -0
  164. package/dist/types/api/firmwareUpdatePlan.d.ts.map +1 -0
  165. package/dist/types/api/firmwareUpdatePreparedPlan.d.ts +42 -0
  166. package/dist/types/api/firmwareUpdatePreparedPlan.d.ts.map +1 -0
  167. package/dist/types/api/index.d.ts +10 -7
  168. package/dist/types/api/index.d.ts.map +1 -1
  169. package/dist/types/api/protocolV2.d.ts +0 -3
  170. package/dist/types/api/protocolV2.d.ts.map +1 -1
  171. package/dist/types/device.d.ts +2 -2
  172. package/dist/types/device.d.ts.map +1 -1
  173. package/dist/types/params.d.ts +0 -1
  174. package/dist/types/params.d.ts.map +1 -1
  175. package/dist/types/settings.d.ts +21 -38
  176. package/dist/types/settings.d.ts.map +1 -1
  177. package/dist/utils/deviceFeaturesCompat.d.ts +1 -0
  178. package/dist/utils/deviceFeaturesCompat.d.ts.map +1 -1
  179. package/dist/utils/deviceFeaturesUtils.d.ts +0 -4
  180. package/dist/utils/deviceFeaturesUtils.d.ts.map +1 -1
  181. package/dist/utils/deviceInfoUtils.d.ts.map +1 -1
  182. package/dist/utils/deviceSettings.d.ts.map +1 -1
  183. package/dist/utils/homescreen.d.ts +0 -4
  184. package/dist/utils/homescreen.d.ts.map +1 -1
  185. package/dist/utils/index.d.ts +1 -1
  186. package/dist/utils/index.d.ts.map +1 -1
  187. package/dist/utils/patch.d.ts +1 -1
  188. package/dist/utils/patch.d.ts.map +1 -1
  189. package/dist/utils/pro2Wallpaper.d.ts +0 -10
  190. package/dist/utils/pro2Wallpaper.d.ts.map +1 -1
  191. package/package.json +4 -4
  192. package/src/api/BaseMethod.ts +10 -8
  193. package/src/api/CheckAllFirmwareRelease.ts +60 -59
  194. package/src/api/FirmwareUpdate.ts +15 -7
  195. package/src/api/FirmwareUpdateV2.ts +298 -126
  196. package/src/api/FirmwareUpdateV3.ts +265 -63
  197. package/src/api/FirmwareUpdateV4.ts +1017 -602
  198. package/src/api/GetPassphraseState.ts +1 -7
  199. package/src/api/OpenWalletSession.ts +17 -71
  200. package/src/api/SearchDevices.ts +1 -3
  201. package/src/api/allnetwork/AllNetworkGetAddress.ts +21 -21
  202. package/src/api/allnetwork/AllNetworkGetAddressBase.ts +11 -36
  203. package/src/api/device/DeviceSettings.ts +4 -5
  204. package/src/api/device/DeviceUnlock.ts +3 -8
  205. package/src/api/device/DeviceUpdateBootloader.ts +125 -6
  206. package/src/api/firmware/FirmwareArtifactSource.ts +278 -0
  207. package/src/api/firmware/FirmwareHostBinding.ts +100 -0
  208. package/src/api/firmware/FirmwarePreparationError.ts +12 -0
  209. package/src/api/firmware/FirmwareUpdateBaseMethod.ts +83 -27
  210. package/src/api/firmware/FirmwareUpdateCapabilities.ts +9 -0
  211. package/src/api/firmware/FirmwareUpdatePlan.ts +772 -0
  212. package/src/api/firmware/FirmwareUpdatePreparedPlan.ts +449 -0
  213. package/src/api/firmware/progressThrottle.ts +44 -0
  214. package/src/api/firmware/updateBootloader.ts +19 -4
  215. package/src/api/firmware/uploadFirmware.ts +144 -39
  216. package/src/api/helpers/protocolV2FileWrite.ts +63 -202
  217. package/src/api/index.ts +0 -2
  218. package/src/api/kaspa/KaspaGetAddress.ts +1 -1
  219. package/src/api/kaspa/KaspaSignTransaction.ts +13 -2
  220. package/src/api/polkadot/networks.ts +3 -3
  221. package/src/api/protocol-v2/ProtocolInfoRequest.ts +1 -3
  222. package/src/api/protocol-v2/helpers.ts +1 -1
  223. package/src/api/solana/SolSignMessage.ts +1 -1
  224. package/src/api/solana/SolSignOffchainMessage.ts +1 -1
  225. package/src/api/solana/SolSignTransaction.ts +2 -2
  226. package/src/api/sui/SuiGetAddress.ts +1 -1
  227. package/src/api/sui/SuiGetPublicKey.ts +1 -1
  228. package/src/api/sui/SuiSignMessage.ts +1 -1
  229. package/src/api/sui/SuiSignTransaction.ts +1 -1
  230. package/src/api/ton/TonGetAddress.ts +1 -1
  231. package/src/api/ton/TonSignMessage.ts +1 -1
  232. package/src/api/ton/TonSignProof.ts +1 -1
  233. package/src/api/tron/TronSignMessage.ts +2 -2
  234. package/src/api/tron/TronSignTransaction.ts +1 -1
  235. package/src/core/deviceEventRegistration.ts +0 -4
  236. package/src/core/index.ts +111 -213
  237. package/src/data/messages/messages-protocol-v2.json +0 -25
  238. package/src/data-manager/DataManager.ts +41 -113
  239. package/src/data-manager/TransportManager.ts +0 -6
  240. package/src/data-manager/connectSettings.ts +11 -0
  241. package/src/device/Device.ts +49 -274
  242. package/src/device/DeviceCommands.ts +4 -31
  243. package/src/device/DeviceConnector.ts +13 -33
  244. package/src/device/DevicePool.ts +7 -21
  245. package/src/deviceProfile/buildDeviceFeatures.ts +2 -2
  246. package/src/deviceProfile/protocolV2DeviceIdentity.ts +0 -3
  247. package/src/events/device.ts +0 -4
  248. package/src/events/logBlockEvent.ts +0 -1
  249. package/src/events/ui-promise.ts +2 -4
  250. package/src/events/ui-request.ts +2 -36
  251. package/src/events/ui-response.ts +2 -12
  252. package/src/index.ts +5 -0
  253. package/src/inject.ts +24 -60
  254. package/src/lowLevelInject.ts +8 -7
  255. package/src/protocols/protocol-v2/features.ts +7 -10
  256. package/src/protocols/protocol-v2/firmware.ts +0 -2
  257. package/src/protocols/protocol-v2/lockedError.ts +10 -0
  258. package/src/protocols/protocol-v2/uiInteraction.ts +6 -46
  259. package/src/protocols/protocol-v2/unlockPolicy.ts +105 -1
  260. package/src/protocols/protocol-v2/unlockRetry.ts +109 -0
  261. package/src/protocols/protocol-v2/walletSession.ts +36 -214
  262. package/src/topLevelInject.ts +8 -7
  263. package/src/types/api/checkAllFirmwareRelease.ts +5 -3
  264. package/src/types/api/deviceUnlock.ts +1 -12
  265. package/src/types/api/deviceUpdateBootloader.ts +6 -0
  266. package/src/types/api/export.ts +18 -1
  267. package/src/types/api/firmwareUpdate.ts +78 -6
  268. package/src/types/api/firmwareUpdateCapabilities.ts +9 -0
  269. package/src/types/api/firmwareUpdatePlan.ts +38 -0
  270. package/src/types/api/firmwareUpdatePreparedPlan.ts +53 -0
  271. package/src/types/api/index.ts +14 -13
  272. package/src/types/api/protocolV2.ts +0 -13
  273. package/src/types/device.ts +3 -15
  274. package/src/types/params.ts +1 -7
  275. package/src/types/settings.ts +22 -60
  276. package/src/utils/deviceFeaturesCompat.ts +6 -5
  277. package/src/utils/deviceFeaturesUtils.ts +3 -14
  278. package/src/utils/deviceInfoUtils.ts +0 -2
  279. package/src/utils/deviceSettings.ts +0 -3
  280. package/src/utils/homescreen.ts +6 -32
  281. package/src/utils/index.ts +1 -6
  282. package/src/utils/pro2Wallpaper.ts +8 -35
  283. package/__tests__/core-initialization.test.ts +0 -23
  284. package/__tests__/device-connector-protocol.test.ts +0 -81
  285. package/__tests__/deviceUploadNft.test.ts +0 -316
  286. package/__tests__/pro2Nft.test.ts +0 -108
  287. package/__tests__/protocol-binding.test.ts +0 -89
  288. package/__tests__/protocol-v2-resources.test.ts +0 -340
  289. package/__tests__/protocol-v2-ui-lifecycle.test.ts +0 -91
  290. package/__tests__/uiProgressThrottle.test.ts +0 -74
  291. package/__tests__/uiPromiseRegistry.test.ts +0 -115
  292. package/dist/api/DetectDeviceConnectProtocol.d.ts +0 -7
  293. package/dist/api/DetectDeviceConnectProtocol.d.ts.map +0 -1
  294. package/dist/api/protocol-v2/DeviceUploadNft.d.ts +0 -31
  295. package/dist/api/protocol-v2/DeviceUploadNft.d.ts.map +0 -1
  296. package/dist/core/uiPromiseRegistry.d.ts +0 -6
  297. package/dist/core/uiPromiseRegistry.d.ts.map +0 -1
  298. package/dist/protocols/protocol-v2/resources.d.ts +0 -30
  299. package/dist/protocols/protocol-v2/resources.d.ts.map +0 -1
  300. package/dist/protocols/protocol-v2/unlockPolicyRunner.d.ts +0 -22
  301. package/dist/protocols/protocol-v2/unlockPolicyRunner.d.ts.map +0 -1
  302. package/dist/types/api/detectDeviceConnectProtocol.d.ts +0 -4
  303. package/dist/types/api/detectDeviceConnectProtocol.d.ts.map +0 -1
  304. package/dist/utils/pro2Nft.d.ts +0 -31
  305. package/dist/utils/pro2Nft.d.ts.map +0 -1
  306. package/dist/utils/uiProgressThrottle.d.ts +0 -3
  307. package/dist/utils/uiProgressThrottle.d.ts.map +0 -1
  308. package/src/api/DetectDeviceConnectProtocol.ts +0 -18
  309. package/src/api/protocol-v2/DeviceUploadNft.ts +0 -197
  310. package/src/core/uiPromiseRegistry.ts +0 -63
  311. package/src/protocols/protocol-v2/resources.ts +0 -390
  312. package/src/protocols/protocol-v2/unlockPolicyRunner.ts +0 -131
  313. package/src/types/api/detectDeviceConnectProtocol.ts +0 -6
  314. package/src/utils/pro2Nft.ts +0 -142
  315. package/src/utils/uiProgressThrottle.ts +0 -63
@@ -9,18 +9,31 @@ import {
9
9
  getDeviceBLEFirmwareVersion,
10
10
  getDeviceBootloaderVersion,
11
11
  getDeviceFirmwareVersion,
12
+ getDeviceUUID,
12
13
  getLogger,
13
14
  } from '../utils';
14
15
  import { getBinary, getSysResourceBinary } from './firmware/getBinary';
16
+ import { normalizeFirmwarePreparationError } from './firmware/FirmwarePreparationError';
15
17
  import { DataManager } from '../data-manager';
16
18
  import { FirmwareUpdateBaseMethod } from './firmware/FirmwareUpdateBaseMethod';
17
19
  import { DevicePool } from '../device/DevicePool';
18
20
  import { DEVICE } from '../events';
19
21
  import { buildProtocolV1FeaturesPayload } from '../deviceProfile';
20
-
21
- import type { FirmwareUpdateV3Params } from '../types/api/firmwareUpdate';
22
+ import { openFirmwareByteSource } from './firmware/FirmwareArtifactSource';
23
+ import { resolveFirmwareUpdateHostBinding } from './firmware/FirmwareHostBinding';
24
+ import {
25
+ assertFirmwareUpdatePreparedPlanBinding,
26
+ assertFirmwareUpdatePreparedPlanDeviceIdentity,
27
+ getFirmwareUpdateResourceName,
28
+ } from './firmware/FirmwareUpdatePreparedPlan';
29
+
30
+ import type {
31
+ FirmwareArtifactReference,
32
+ FirmwareUpdateV3Params,
33
+ } from '../types/api/firmwareUpdate';
22
34
  import type { Deferred, EFirmwareType } from '@onekeyfe/hd-shared';
23
35
  import type { TypedResponseMessage } from '../device/DeviceCommands';
36
+ import type { FirmwareByteSource } from './firmware/FirmwareArtifactSource';
24
37
 
25
38
  const Log = getLogger(LoggerNames.Method);
26
39
 
@@ -42,6 +55,8 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU
42
55
 
43
56
  private isSwitchFirmware = false;
44
57
 
58
+ private artifactSources: FirmwareByteSource[] = [];
59
+
45
60
  init() {
46
61
  this.allowDeviceMode = [UI_REQUEST.BOOTLOADER, UI_REQUEST.NOT_INITIALIZE];
47
62
  this.requireDeviceMode = [];
@@ -62,8 +77,54 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU
62
77
  { name: 'firmwareType', type: 'string' },
63
78
  { name: 'platform', type: 'string' },
64
79
  ]);
80
+ const hostBinding =
81
+ payload.artifacts || payload.preparedPlan
82
+ ? resolveFirmwareUpdateHostBinding(payload.hostBindingGeneration)
83
+ : undefined;
84
+ if (hostBinding) {
85
+ assertFirmwareUpdatePreparedPlanBinding({
86
+ preparedPlan: payload.preparedPlan,
87
+ executor: 'v3',
88
+ platform: payload.platform,
89
+ scopeTargets: ['bootloader', 'firmware', 'resource', 'ble'],
90
+ bindings: [
91
+ ...(payload.artifacts?.bootloader
92
+ ? [
93
+ {
94
+ target: 'bootloader' as const,
95
+ artifact: payload.artifacts.bootloader,
96
+ },
97
+ ]
98
+ : []),
99
+ ...(payload.artifacts?.firmware
100
+ ? [
101
+ {
102
+ target: 'firmware' as const,
103
+ artifact: payload.artifacts.firmware,
104
+ },
105
+ ]
106
+ : []),
107
+ ...(payload.artifacts?.ble
108
+ ? [
109
+ {
110
+ target: 'ble' as const,
111
+ artifact: payload.artifacts.ble,
112
+ },
113
+ ]
114
+ : []),
115
+ ...(payload.artifacts?.resourceEntries ?? []).map(
116
+ (entry: { entryName: string; artifact: FirmwareArtifactReference }) => ({
117
+ target: 'resource' as const,
118
+ entryName: entry.entryName,
119
+ artifact: entry.artifact,
120
+ })
121
+ ),
122
+ ],
123
+ });
124
+ }
65
125
 
66
126
  this.params = {
127
+ preparedPlan: payload.preparedPlan,
67
128
  bleBinary: payload.bleBinary,
68
129
  firmwareBinary: payload.firmwareBinary,
69
130
  forcedUpdateRes: payload.forcedUpdateRes,
@@ -74,6 +135,8 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU
74
135
  resourceBinary: payload.resourceBinary,
75
136
  firmwareType: payload.firmwareType,
76
137
  platform: payload.platform,
138
+ artifactReader: hostBinding?.artifactReader ?? payload.artifactReader,
139
+ artifacts: payload.artifacts,
77
140
  };
78
141
  }
79
142
 
@@ -97,39 +160,53 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU
97
160
  if (!features) {
98
161
  throw ERRORS.TypedError(HardwareErrorCode.RuntimeError, 'Device features not available');
99
162
  }
163
+ if (this.params.preparedPlan) {
164
+ assertFirmwareUpdatePreparedPlanDeviceIdentity({
165
+ preparedPlan: this.params.preparedPlan,
166
+ deviceIdentity: getDeviceUUID(features) || undefined,
167
+ });
168
+ }
100
169
 
101
170
  const deviceFirmwareType = device.getCurrentFirmwareType();
102
171
  const firmwareType = this.params.firmwareType ?? deviceFirmwareType;
103
172
  this.isSwitchFirmware = firmwareType !== deviceFirmwareType;
104
173
 
105
174
  let resourceBinary: ArrayBuffer | null = null;
106
- let fwBinaryMap: { fileName: string; binary: ArrayBuffer }[] = [];
107
- let bootloaderBinary: ArrayBuffer | null = null;
175
+ let resourceEntries: Array<{ entryName: string; source: FirmwareByteSource }> = [];
176
+ let fwSources: Array<{ fileName: string; source: FirmwareByteSource }> = [];
177
+ let bootloaderSource: FirmwareByteSource | null = null;
108
178
  try {
109
179
  this.postTipMessage(FirmwareUpdateTipMessage.StartDownloadFirmware);
110
- resourceBinary = await this.prepareResourceBinary(firmwareType);
111
- fwBinaryMap = await this.prepareFirmwareAndBleBinary(firmwareType);
112
- bootloaderBinary = await this.prepareBootloaderBinary(firmwareType);
180
+ const resourceInput = await this.prepareResourceInput(firmwareType);
181
+ resourceBinary = resourceInput.resourceBinary;
182
+ resourceEntries = resourceInput.resourceEntries;
183
+ fwSources = await this.prepareFirmwareAndBleSources(firmwareType);
184
+ bootloaderSource = await this.prepareBootloaderSource(firmwareType);
113
185
  this.postTipMessage(FirmwareUpdateTipMessage.FinishDownloadFirmware);
114
186
  } catch (err) {
115
- throw ERRORS.TypedError(HardwareErrorCode.FirmwareUpdateDownloadFailed, err.message ?? err);
187
+ await this.closeArtifactSources();
188
+ throw normalizeFirmwarePreparationError(err);
116
189
  }
117
190
 
118
- if (!bootloaderBinary && fwBinaryMap.length === 0) {
191
+ if (!bootloaderSource && fwSources.length === 0) {
192
+ await this.closeArtifactSources();
119
193
  throw ERRORS.TypedError(
120
194
  HardwareErrorCode.FirmwareUpdateDownloadFailed,
121
195
  'No firmware to update'
122
196
  );
123
197
  }
124
198
 
125
- await this.enterBootloaderMode();
126
-
127
- const updateResult = await this.executeUpdate({
128
- resourceBinary,
129
- fwBinaryMap,
130
- bootloaderBinary,
131
- });
132
- return updateResult;
199
+ try {
200
+ await this.enterBootloaderMode();
201
+ return await this.executeUpdate({
202
+ resourceBinary,
203
+ resourceEntries,
204
+ fwSources,
205
+ bootloaderSource,
206
+ });
207
+ } finally {
208
+ await this.closeArtifactSources();
209
+ }
133
210
  }
134
211
 
135
212
  private validateDeviceAndVersion(deviceType: EDeviceType, bootloaderVersion: string) {
@@ -149,12 +226,81 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU
149
226
  }
150
227
  }
151
228
 
152
- private async prepareResourceBinary(firmwareType: EFirmwareType) {
229
+ private async openArtifactSource(
230
+ binary: ArrayBuffer | undefined,
231
+ artifact: FirmwareArtifactReference | undefined
232
+ ) {
233
+ const source = await openFirmwareByteSource({
234
+ binary,
235
+ artifact,
236
+ reader: this.params.artifactReader,
237
+ });
238
+ if (source) {
239
+ this.artifactSources.push(source);
240
+ }
241
+ return source;
242
+ }
243
+
244
+ private async closeArtifactSources() {
245
+ const sources = this.artifactSources.splice(0);
246
+ await Promise.all(sources.map(source => source.close().catch(() => undefined)));
247
+ }
248
+
249
+ private assertSdkDownloadAllowed(artifactName: string) {
250
+ if (
251
+ this.params.artifactReader ||
252
+ DataManager.getSettings('firmwareManifestMode') === 'external-only'
253
+ ) {
254
+ throw ERRORS.TypedError(
255
+ HardwareErrorCode.RuntimeError,
256
+ `${artifactName} must be prepared by the external firmware host`,
257
+ {
258
+ firmwareUpdateCode: 'FirmwareArtifactsNotPrepared',
259
+ artifactName,
260
+ }
261
+ );
262
+ }
263
+ }
264
+
265
+ private async prepareResourceInput(firmwareType: EFirmwareType) {
266
+ const preparedEntries = this.params.artifacts?.resourceEntries;
267
+ if (preparedEntries?.length && this.params.resourceBinary) {
268
+ throw ERRORS.TypedError(
269
+ HardwareErrorCode.RuntimeError,
270
+ 'Firmware resource input must not contain both archive binary and prepared entries'
271
+ );
272
+ }
273
+ if (preparedEntries?.length) {
274
+ const resourceEntries: Array<{ entryName: string; source: FirmwareByteSource }> = [];
275
+ for (const entry of preparedEntries) {
276
+ const resourceName = getFirmwareUpdateResourceName(entry.entryName);
277
+ const source = await this.openArtifactSource(undefined, entry.artifact);
278
+ if (!source) {
279
+ throw ERRORS.TypedError(
280
+ HardwareErrorCode.RuntimeError,
281
+ `Firmware resource entry ${entry.entryName} is not prepared`
282
+ );
283
+ }
284
+ resourceEntries.push({ entryName: resourceName, source });
285
+ }
286
+ return {
287
+ resourceBinary: null,
288
+ resourceEntries,
289
+ };
290
+ }
153
291
  if (this.params.resourceBinary) {
154
- return this.params.resourceBinary;
292
+ return {
293
+ resourceBinary: this.params.resourceBinary,
294
+ resourceEntries: [],
295
+ };
155
296
  }
156
297
  const { features } = this.device;
157
- if (!features) return null;
298
+ if (!features) {
299
+ return {
300
+ resourceBinary: null,
301
+ resourceEntries: [],
302
+ };
303
+ }
158
304
  const resourceUrl = DataManager.getSysResourcesLatestRelease({
159
305
  features,
160
306
  forcedUpdateRes: this.params.forcedUpdateRes,
@@ -162,16 +308,27 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU
162
308
  });
163
309
 
164
310
  if (resourceUrl) {
165
- const resource = (await getSysResourceBinary(resourceUrl)).binary;
166
- return resource;
311
+ this.assertSdkDownloadAllowed('resource');
312
+ return {
313
+ resourceBinary: (await getSysResourceBinary(resourceUrl)).binary,
314
+ resourceEntries: [],
315
+ };
167
316
  }
168
317
  Log.warn('No resource url found');
169
- return null;
318
+ return {
319
+ resourceBinary: null,
320
+ resourceEntries: [],
321
+ };
170
322
  }
171
323
 
172
- private async prepareBootloaderBinary(firmwareType: EFirmwareType): Promise<ArrayBuffer | null> {
173
- if (this.params.bootloaderBinary) {
174
- return this.params.bootloaderBinary;
324
+ private async prepareBootloaderSource(
325
+ firmwareType: EFirmwareType
326
+ ): Promise<FirmwareByteSource | null> {
327
+ if (this.params.bootloaderBinary || this.params.artifacts?.bootloader) {
328
+ return this.openArtifactSource(
329
+ this.params.bootloaderBinary,
330
+ this.params.artifacts?.bootloader
331
+ );
175
332
  }
176
333
  const { features } = this.device;
177
334
  if (!features) return null;
@@ -179,23 +336,35 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU
179
336
  if (this.params.bootloaderVersion) {
180
337
  const bootResourceUrl = DataManager.getBootloaderResource(features, firmwareType);
181
338
  if (bootResourceUrl) {
339
+ this.assertSdkDownloadAllowed('bootloader');
182
340
  const bootBinary = (await getSysResourceBinary(bootResourceUrl)).binary;
183
- return bootBinary;
341
+ return this.openArtifactSource(bootBinary, undefined);
184
342
  }
185
343
  }
186
344
  return null;
187
345
  }
188
346
 
189
- private async prepareFirmwareAndBleBinary(firmwareType: EFirmwareType) {
190
- const fwBinaryMap: { fileName: string; binary: ArrayBuffer }[] = [];
191
- if (this.params.firmwareBinary) {
192
- fwBinaryMap.push({
347
+ private async prepareFirmwareAndBleSources(firmwareType: EFirmwareType) {
348
+ const fwSources: Array<{ fileName: string; source: FirmwareByteSource }> = [];
349
+ if (this.params.firmwareBinary || this.params.artifacts?.firmware) {
350
+ const source = await this.openArtifactSource(
351
+ this.params.firmwareBinary,
352
+ this.params.artifacts?.firmware
353
+ );
354
+ if (!source) {
355
+ throw ERRORS.TypedError(
356
+ HardwareErrorCode.RuntimeError,
357
+ 'Firmware artifact is not prepared'
358
+ );
359
+ }
360
+ fwSources.push({
193
361
  fileName: 'firmware.bin',
194
- binary: this.params.firmwareBinary,
362
+ source,
195
363
  });
196
364
  } else if (this.params.firmwareVersion) {
197
365
  const { features } = this.device;
198
366
  if (features) {
367
+ this.assertSdkDownloadAllowed('firmware');
199
368
  const firmwareBinary = (
200
369
  await getBinary({
201
370
  features,
@@ -205,44 +374,65 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU
205
374
  firmwareType,
206
375
  })
207
376
  ).binary;
208
- fwBinaryMap.push({
377
+ const source = await this.openArtifactSource(firmwareBinary, undefined);
378
+ if (!source) {
379
+ throw ERRORS.TypedError(
380
+ HardwareErrorCode.RuntimeError,
381
+ 'Firmware binary is not prepared'
382
+ );
383
+ }
384
+ fwSources.push({
209
385
  fileName: 'firmware.bin',
210
- binary: firmwareBinary,
386
+ source,
211
387
  });
212
388
  }
213
389
  }
214
390
 
215
- if (this.params.bleBinary) {
216
- fwBinaryMap.push({
391
+ if (this.params.bleBinary || this.params.artifacts?.ble) {
392
+ const source = await this.openArtifactSource(
393
+ this.params.bleBinary,
394
+ this.params.artifacts?.ble
395
+ );
396
+ if (!source) {
397
+ throw ERRORS.TypedError(HardwareErrorCode.RuntimeError, 'BLE artifact is not prepared');
398
+ }
399
+ fwSources.push({
217
400
  fileName: 'ble-firmware.bin',
218
- binary: this.params.bleBinary,
401
+ source,
219
402
  });
220
403
  } else if (this.params.bleVersion) {
221
404
  const { features } = this.device;
222
405
  if (features) {
406
+ this.assertSdkDownloadAllowed('ble');
223
407
  const bleBinary = await getBinary({
224
408
  features,
225
409
  version: this.params.bleVersion,
226
410
  updateType: 'ble',
227
411
  firmwareType,
228
412
  });
229
- fwBinaryMap.push({
413
+ const source = await this.openArtifactSource(bleBinary.binary, undefined);
414
+ if (!source) {
415
+ throw ERRORS.TypedError(HardwareErrorCode.RuntimeError, 'BLE binary is not prepared');
416
+ }
417
+ fwSources.push({
230
418
  fileName: 'ble-firmware.bin',
231
- binary: bleBinary.binary,
419
+ source,
232
420
  });
233
421
  }
234
422
  }
235
- return fwBinaryMap;
423
+ return fwSources;
236
424
  }
237
425
 
238
426
  private async executeUpdate({
239
427
  resourceBinary,
240
- fwBinaryMap,
241
- bootloaderBinary,
428
+ resourceEntries,
429
+ fwSources,
430
+ bootloaderSource,
242
431
  }: {
243
432
  resourceBinary: ArrayBuffer | null;
244
- fwBinaryMap: { fileName: string; binary: ArrayBuffer }[];
245
- bootloaderBinary: ArrayBuffer | null;
433
+ resourceEntries: Array<{ entryName: string; source: FirmwareByteSource }>;
434
+ fwSources: Array<{ fileName: string; source: FirmwareByteSource }>;
435
+ bootloaderSource: FirmwareByteSource | null;
246
436
  }) {
247
437
  let totalSize = 0;
248
438
  let processedSize = 0;
@@ -250,11 +440,14 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU
250
440
  if (resourceBinary) {
251
441
  totalSize += resourceBinary.byteLength;
252
442
  }
253
- for (const fwbinary of fwBinaryMap) {
254
- totalSize += fwbinary.binary.byteLength;
443
+ for (const entry of resourceEntries) {
444
+ totalSize += entry.source.size;
445
+ }
446
+ for (const firmware of fwSources) {
447
+ totalSize += firmware.source.size;
255
448
  }
256
- if (bootloaderBinary) {
257
- totalSize += bootloaderBinary.byteLength;
449
+ if (bootloaderSource) {
450
+ totalSize += bootloaderSource.size;
258
451
  }
259
452
 
260
453
  this.postTipMessage(FirmwareUpdateTipMessage.StartTransferData);
@@ -277,9 +470,18 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU
277
470
  }
278
471
  }
279
472
 
280
- if (bootloaderBinary) {
281
- processedSize = await this.emmcCommonUpdateProcess({
282
- payload: bootloaderBinary,
473
+ for (const entry of resourceEntries) {
474
+ processedSize = await this.emmcCommonUpdateProcessFromSource({
475
+ source: entry.source,
476
+ filePath: `0:res/${entry.entryName}`,
477
+ processedSize,
478
+ totalSize,
479
+ });
480
+ }
481
+
482
+ if (bootloaderSource) {
483
+ processedSize = await this.emmcCommonUpdateProcessFromSource({
484
+ source: bootloaderSource,
283
485
  filePath: `0:boot/bootloader.bin`,
284
486
  processedSize,
285
487
  totalSize,
@@ -288,11 +490,11 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU
288
490
 
289
491
  await this.createUpdatesFolderIfNotExists(`0:updates/`);
290
492
 
291
- for (const fwbinary of fwBinaryMap) {
292
- if (fwbinary) {
293
- processedSize = await this.emmcCommonUpdateProcess({
294
- payload: fwbinary.binary,
295
- filePath: `0:updates/${fwbinary.fileName}`,
493
+ for (const firmware of fwSources) {
494
+ if (firmware) {
495
+ processedSize = await this.emmcCommonUpdateProcessFromSource({
496
+ source: firmware.source,
497
+ filePath: `0:updates/${firmware.fileName}`,
296
498
  processedSize,
297
499
  totalSize,
298
500
  });
@@ -503,8 +705,7 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU
503
705
  await this.device.deviceConnector?.acquire(
504
706
  this.device.originalDescriptor.id,
505
707
  null,
506
- true,
507
- this.payload.connectProtocol ?? this.device.originalDescriptor.protocolType
708
+ true
508
709
  );
509
710
  const typedCall = this.device.getCommands().typedCall.bind(this.device.getCommands());
510
711
  await Promise.race([
@@ -541,14 +742,15 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU
541
742
  webUsbCheckCount = 0;
542
743
  }
543
744
 
544
- const { deviceList } = await DevicePool.getDevices(devicesDescriptor, this.connectId, {
545
- connectProtocol:
546
- this.payload.connectProtocol ?? this.device.originalDescriptor.protocolType,
547
- });
745
+ const { deviceList } = await DevicePool.getDevices(devicesDescriptor, this.connectId);
548
746
 
549
747
  if (deviceList.length === 1) {
550
748
  this.device.updateFromCache(deviceList[0]);
551
- await this.device.acquire();
749
+ // Reconnect failures are expected while installation still owns USB.
750
+ // Keep them in this polling loop instead of rejecting the active firmware run.
751
+ await this.device.acquire(undefined, {
752
+ throwOnRunPromiseError: true,
753
+ });
552
754
  this.device.commands.disposed = false;
553
755
  this.device.getCommands().mainId = this.device.mainId ?? '';
554
756
  return;