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

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 (316) hide show
  1. package/__tests__/AllNetworkGetAddressBase.tracing.test.ts +313 -0
  2. package/__tests__/DeviceCommands.test.ts +59 -13
  3. package/__tests__/DeviceEventRegistration.test.ts +6 -0
  4. package/__tests__/check-all-firmware-release-protocol-v2.test.ts +226 -3
  5. package/__tests__/connectSettings.test.ts +5 -47
  6. package/__tests__/core-initialization.test.ts +23 -0
  7. package/__tests__/device-connector-protocol.test.ts +81 -0
  8. package/__tests__/device-lifecycle-events.test.ts +105 -3
  9. package/__tests__/device-pool-state.test.ts +22 -0
  10. package/__tests__/device-settings.test.ts +39 -18
  11. package/__tests__/device-state-contract.test.ts +1 -0
  12. package/__tests__/device-state-mapper.test.ts +13 -1
  13. package/__tests__/device-utils.test.ts +48 -1
  14. package/__tests__/deviceSettings.test.ts +11 -1
  15. package/__tests__/deviceUploadNft.test.ts +316 -0
  16. package/__tests__/firmware-update/firmware-update-v2-download-before-boot.test.ts +31 -59
  17. package/__tests__/get-device-state.test.ts +132 -12
  18. package/__tests__/homescreen.test.ts +41 -1
  19. package/__tests__/kaspa-use-tweak-pro2.test.ts +2 -2
  20. package/__tests__/kaspaSignTransaction.test.ts +3 -26
  21. package/__tests__/logBlockEvent.test.ts +1 -1
  22. package/__tests__/method-protocol-support.test.ts +19 -0
  23. package/__tests__/open-wallet-session.test.ts +568 -37
  24. package/__tests__/pro2Nft.test.ts +108 -0
  25. package/__tests__/protocol-binding.test.ts +89 -0
  26. package/__tests__/protocol-v2-firmware-targets.test.ts +33 -1
  27. package/__tests__/protocol-v2-resources.test.ts +343 -0
  28. package/__tests__/protocol-v2-ui-lifecycle.test.ts +91 -0
  29. package/__tests__/protocol-v2-unlock-policy.test.ts +300 -37
  30. package/__tests__/protocol-v2.test.ts +1586 -1213
  31. package/__tests__/protocolV2FileWrite.test.ts +193 -0
  32. package/__tests__/protocolV2UiInteraction.test.ts +63 -0
  33. package/__tests__/public-pro2-api-boundary.test.ts +1 -0
  34. package/__tests__/search-devices.test.ts +12 -3
  35. package/__tests__/tron-sign-message-init.test.ts +2 -2
  36. package/__tests__/uiProgressThrottle.test.ts +74 -0
  37. package/__tests__/uiPromiseRegistry.test.ts +115 -0
  38. package/dist/api/BaseMethod.d.ts +3 -1
  39. package/dist/api/BaseMethod.d.ts.map +1 -1
  40. package/dist/api/CheckAllFirmwareRelease.d.ts +3 -1
  41. package/dist/api/CheckAllFirmwareRelease.d.ts.map +1 -1
  42. package/dist/api/DetectDeviceConnectProtocol.d.ts +7 -0
  43. package/dist/api/DetectDeviceConnectProtocol.d.ts.map +1 -0
  44. package/dist/api/FirmwareUpdate.d.ts.map +1 -1
  45. package/dist/api/FirmwareUpdateV2.d.ts +0 -10
  46. package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
  47. package/dist/api/FirmwareUpdateV3.d.ts +3 -7
  48. package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
  49. package/dist/api/FirmwareUpdateV4.d.ts +15 -27
  50. package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
  51. package/dist/api/GetPassphraseState.d.ts.map +1 -1
  52. package/dist/api/OpenWalletSession.d.ts.map +1 -1
  53. package/dist/api/SearchDevices.d.ts.map +1 -1
  54. package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts.map +1 -1
  55. package/dist/api/device/DeviceSettings.d.ts.map +1 -1
  56. package/dist/api/device/DeviceUnlock.d.ts +2 -2
  57. package/dist/api/device/DeviceUnlock.d.ts.map +1 -1
  58. package/dist/api/device/DeviceUpdateBootloader.d.ts +1 -5
  59. package/dist/api/device/DeviceUpdateBootloader.d.ts.map +1 -1
  60. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts +4 -11
  61. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts.map +1 -1
  62. package/dist/api/firmware/getBinary.d.ts +0 -7
  63. package/dist/api/firmware/getBinary.d.ts.map +1 -1
  64. package/dist/api/firmware/updateBootloader.d.ts +0 -2
  65. package/dist/api/firmware/updateBootloader.d.ts.map +1 -1
  66. package/dist/api/firmware/uploadFirmware.d.ts +1 -9
  67. package/dist/api/firmware/uploadFirmware.d.ts.map +1 -1
  68. package/dist/api/helpers/protocolV2FileWrite.d.ts +9 -0
  69. package/dist/api/helpers/protocolV2FileWrite.d.ts.map +1 -1
  70. package/dist/api/index.d.ts +2 -0
  71. package/dist/api/index.d.ts.map +1 -1
  72. package/dist/api/kaspa/KaspaGetAddress.d.ts +1 -1
  73. package/dist/api/kaspa/KaspaSignTransaction.d.ts +1 -1
  74. package/dist/api/kaspa/KaspaSignTransaction.d.ts.map +1 -1
  75. package/dist/api/polkadot/PolkadotGetAddress.d.ts +1 -1
  76. package/dist/api/polkadot/networks.d.ts +1 -1
  77. package/dist/api/protocol-v2/DeviceUploadNft.d.ts +31 -0
  78. package/dist/api/protocol-v2/DeviceUploadNft.d.ts.map +1 -0
  79. package/dist/api/protocol-v2/ProtocolInfoRequest.d.ts.map +1 -1
  80. package/dist/api/protocol-v2/helpers.d.ts.map +1 -1
  81. package/dist/api/solana/SolSignMessage.d.ts +1 -1
  82. package/dist/api/solana/SolSignOffchainMessage.d.ts +1 -1
  83. package/dist/api/solana/SolSignTransaction.d.ts +2 -2
  84. package/dist/api/stellar/StellarSignTransaction.d.ts +1 -1
  85. package/dist/api/sui/SuiGetAddress.d.ts +1 -1
  86. package/dist/api/sui/SuiGetPublicKey.d.ts +1 -1
  87. package/dist/api/sui/SuiSignMessage.d.ts +1 -1
  88. package/dist/api/sui/SuiSignTransaction.d.ts +1 -1
  89. package/dist/api/ton/TonGetAddress.d.ts +1 -1
  90. package/dist/api/ton/TonSignMessage.d.ts +1 -1
  91. package/dist/api/ton/TonSignProof.d.ts +1 -1
  92. package/dist/api/tron/TronSignMessage.d.ts +2 -2
  93. package/dist/api/tron/TronSignTransaction.d.ts +1 -1
  94. package/dist/core/deviceEventRegistration.d.ts +2 -0
  95. package/dist/core/deviceEventRegistration.d.ts.map +1 -1
  96. package/dist/core/index.d.ts.map +1 -1
  97. package/dist/core/uiPromiseRegistry.d.ts +6 -0
  98. package/dist/core/uiPromiseRegistry.d.ts.map +1 -0
  99. package/dist/data-manager/DataManager.d.ts +9 -4
  100. package/dist/data-manager/DataManager.d.ts.map +1 -1
  101. package/dist/data-manager/TransportManager.d.ts.map +1 -1
  102. package/dist/data-manager/connectSettings.d.ts.map +1 -1
  103. package/dist/device/Device.d.ts +29 -6
  104. package/dist/device/Device.d.ts.map +1 -1
  105. package/dist/device/DeviceCommands.d.ts +4 -4
  106. package/dist/device/DeviceCommands.d.ts.map +1 -1
  107. package/dist/device/DeviceConnector.d.ts +2 -1
  108. package/dist/device/DeviceConnector.d.ts.map +1 -1
  109. package/dist/device/DevicePool.d.ts.map +1 -1
  110. package/dist/deviceProfile/protocolV2DeviceIdentity.d.ts.map +1 -1
  111. package/dist/events/device.d.ts +4 -0
  112. package/dist/events/device.d.ts.map +1 -1
  113. package/dist/events/logBlockEvent.d.ts.map +1 -1
  114. package/dist/events/ui-promise.d.ts +4 -2
  115. package/dist/events/ui-promise.d.ts.map +1 -1
  116. package/dist/events/ui-request.d.ts +31 -2
  117. package/dist/events/ui-request.d.ts.map +1 -1
  118. package/dist/events/ui-response.d.ts +10 -2
  119. package/dist/events/ui-response.d.ts.map +1 -1
  120. package/dist/index.d.ts +243 -247
  121. package/dist/index.d.ts.map +1 -1
  122. package/dist/index.js +3135 -3785
  123. package/dist/inject.d.ts +6 -1
  124. package/dist/inject.d.ts.map +1 -1
  125. package/dist/lowLevelInject.d.ts.map +1 -1
  126. package/dist/protocols/protocol-v2/features.d.ts +0 -4
  127. package/dist/protocols/protocol-v2/features.d.ts.map +1 -1
  128. package/dist/protocols/protocol-v2/firmware.d.ts.map +1 -1
  129. package/dist/protocols/protocol-v2/resources.d.ts +30 -0
  130. package/dist/protocols/protocol-v2/resources.d.ts.map +1 -0
  131. package/dist/protocols/protocol-v2/uiInteraction.d.ts +7 -4
  132. package/dist/protocols/protocol-v2/uiInteraction.d.ts.map +1 -1
  133. package/dist/protocols/protocol-v2/unlockPolicy.d.ts +1 -3
  134. package/dist/protocols/protocol-v2/unlockPolicy.d.ts.map +1 -1
  135. package/dist/protocols/protocol-v2/unlockPolicyRunner.d.ts +22 -0
  136. package/dist/protocols/protocol-v2/unlockPolicyRunner.d.ts.map +1 -0
  137. package/dist/protocols/protocol-v2/walletSession.d.ts +6 -1
  138. package/dist/protocols/protocol-v2/walletSession.d.ts.map +1 -1
  139. package/dist/topLevelInject.d.ts.map +1 -1
  140. package/dist/types/api/checkAllFirmwareRelease.d.ts +3 -5
  141. package/dist/types/api/checkAllFirmwareRelease.d.ts.map +1 -1
  142. package/dist/types/api/detectDeviceConnectProtocol.d.ts +4 -0
  143. package/dist/types/api/detectDeviceConnectProtocol.d.ts.map +1 -0
  144. package/dist/types/api/deviceUnlock.d.ts +5 -1
  145. package/dist/types/api/deviceUnlock.d.ts.map +1 -1
  146. package/dist/types/api/deviceUpdateBootloader.d.ts +0 -6
  147. package/dist/types/api/deviceUpdateBootloader.d.ts.map +1 -1
  148. package/dist/types/api/export.d.ts +2 -4
  149. package/dist/types/api/export.d.ts.map +1 -1
  150. package/dist/types/api/firmwareUpdate.d.ts +4 -70
  151. package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
  152. package/dist/types/api/index.d.ts +7 -10
  153. package/dist/types/api/index.d.ts.map +1 -1
  154. package/dist/types/api/protocolV2.d.ts +3 -0
  155. package/dist/types/api/protocolV2.d.ts.map +1 -1
  156. package/dist/types/device.d.ts +2 -2
  157. package/dist/types/device.d.ts.map +1 -1
  158. package/dist/types/params.d.ts +1 -0
  159. package/dist/types/params.d.ts.map +1 -1
  160. package/dist/types/settings.d.ts +38 -21
  161. package/dist/types/settings.d.ts.map +1 -1
  162. package/dist/utils/deviceFeaturesCompat.d.ts +0 -1
  163. package/dist/utils/deviceFeaturesCompat.d.ts.map +1 -1
  164. package/dist/utils/deviceFeaturesUtils.d.ts +4 -0
  165. package/dist/utils/deviceFeaturesUtils.d.ts.map +1 -1
  166. package/dist/utils/deviceInfoUtils.d.ts.map +1 -1
  167. package/dist/utils/deviceSettings.d.ts.map +1 -1
  168. package/dist/utils/homescreen.d.ts +4 -0
  169. package/dist/utils/homescreen.d.ts.map +1 -1
  170. package/dist/utils/index.d.ts +1 -1
  171. package/dist/utils/index.d.ts.map +1 -1
  172. package/dist/utils/patch.d.ts +1 -1
  173. package/dist/utils/patch.d.ts.map +1 -1
  174. package/dist/utils/pro2Nft.d.ts +31 -0
  175. package/dist/utils/pro2Nft.d.ts.map +1 -0
  176. package/dist/utils/pro2Wallpaper.d.ts +10 -0
  177. package/dist/utils/pro2Wallpaper.d.ts.map +1 -1
  178. package/dist/utils/uiProgressThrottle.d.ts +3 -0
  179. package/dist/utils/uiProgressThrottle.d.ts.map +1 -0
  180. package/package.json +4 -4
  181. package/src/api/BaseMethod.ts +8 -10
  182. package/src/api/CheckAllFirmwareRelease.ts +78 -64
  183. package/src/api/DetectDeviceConnectProtocol.ts +18 -0
  184. package/src/api/FirmwareUpdate.ts +7 -15
  185. package/src/api/FirmwareUpdateV2.ts +126 -298
  186. package/src/api/FirmwareUpdateV3.ts +63 -265
  187. package/src/api/FirmwareUpdateV4.ts +645 -1018
  188. package/src/api/GetPassphraseState.ts +7 -1
  189. package/src/api/OpenWalletSession.ts +71 -17
  190. package/src/api/SearchDevices.ts +3 -1
  191. package/src/api/allnetwork/AllNetworkGetAddress.ts +21 -21
  192. package/src/api/allnetwork/AllNetworkGetAddressBase.ts +36 -11
  193. package/src/api/device/DeviceSettings.ts +5 -4
  194. package/src/api/device/DeviceUnlock.ts +8 -3
  195. package/src/api/device/DeviceUpdateBootloader.ts +6 -125
  196. package/src/api/firmware/FirmwareUpdateBaseMethod.ts +27 -83
  197. package/src/api/firmware/updateBootloader.ts +4 -19
  198. package/src/api/firmware/uploadFirmware.ts +39 -144
  199. package/src/api/helpers/protocolV2FileWrite.ts +252 -63
  200. package/src/api/index.ts +2 -0
  201. package/src/api/kaspa/KaspaGetAddress.ts +1 -1
  202. package/src/api/kaspa/KaspaSignTransaction.ts +2 -13
  203. package/src/api/polkadot/networks.ts +3 -3
  204. package/src/api/protocol-v2/DeviceUploadNft.ts +197 -0
  205. package/src/api/protocol-v2/ProtocolInfoRequest.ts +3 -1
  206. package/src/api/protocol-v2/helpers.ts +1 -1
  207. package/src/api/solana/SolSignMessage.ts +1 -1
  208. package/src/api/solana/SolSignOffchainMessage.ts +1 -1
  209. package/src/api/solana/SolSignTransaction.ts +2 -2
  210. package/src/api/sui/SuiGetAddress.ts +1 -1
  211. package/src/api/sui/SuiGetPublicKey.ts +1 -1
  212. package/src/api/sui/SuiSignMessage.ts +1 -1
  213. package/src/api/sui/SuiSignTransaction.ts +1 -1
  214. package/src/api/ton/TonGetAddress.ts +1 -1
  215. package/src/api/ton/TonSignMessage.ts +1 -1
  216. package/src/api/ton/TonSignProof.ts +1 -1
  217. package/src/api/tron/TronSignMessage.ts +2 -2
  218. package/src/api/tron/TronSignTransaction.ts +1 -1
  219. package/src/core/deviceEventRegistration.ts +4 -0
  220. package/src/core/index.ts +213 -111
  221. package/src/core/uiPromiseRegistry.ts +63 -0
  222. package/src/data/messages/messages-protocol-v2.json +25 -0
  223. package/src/data-manager/DataManager.ts +113 -41
  224. package/src/data-manager/TransportManager.ts +6 -0
  225. package/src/data-manager/connectSettings.ts +0 -11
  226. package/src/device/Device.ts +274 -49
  227. package/src/device/DeviceCommands.ts +31 -4
  228. package/src/device/DeviceConnector.ts +33 -13
  229. package/src/device/DevicePool.ts +21 -7
  230. package/src/deviceProfile/buildDeviceFeatures.ts +2 -2
  231. package/src/deviceProfile/protocolV2DeviceIdentity.ts +3 -0
  232. package/src/events/device.ts +4 -0
  233. package/src/events/logBlockEvent.ts +1 -0
  234. package/src/events/ui-promise.ts +4 -2
  235. package/src/events/ui-request.ts +36 -2
  236. package/src/events/ui-response.ts +12 -2
  237. package/src/index.ts +0 -5
  238. package/src/inject.ts +60 -24
  239. package/src/lowLevelInject.ts +7 -8
  240. package/src/protocols/protocol-v2/features.ts +10 -7
  241. package/src/protocols/protocol-v2/firmware.ts +2 -0
  242. package/src/protocols/protocol-v2/resources.ts +394 -0
  243. package/src/protocols/protocol-v2/uiInteraction.ts +46 -6
  244. package/src/protocols/protocol-v2/unlockPolicy.ts +1 -105
  245. package/src/protocols/protocol-v2/unlockPolicyRunner.ts +131 -0
  246. package/src/protocols/protocol-v2/walletSession.ts +214 -36
  247. package/src/topLevelInject.ts +7 -8
  248. package/src/types/api/checkAllFirmwareRelease.ts +3 -5
  249. package/src/types/api/detectDeviceConnectProtocol.ts +6 -0
  250. package/src/types/api/deviceUnlock.ts +12 -1
  251. package/src/types/api/deviceUpdateBootloader.ts +0 -6
  252. package/src/types/api/export.ts +1 -18
  253. package/src/types/api/firmwareUpdate.ts +6 -78
  254. package/src/types/api/index.ts +13 -14
  255. package/src/types/api/protocolV2.ts +13 -0
  256. package/src/types/device.ts +15 -3
  257. package/src/types/params.ts +7 -1
  258. package/src/types/settings.ts +61 -22
  259. package/src/utils/deviceFeaturesCompat.ts +5 -6
  260. package/src/utils/deviceFeaturesUtils.ts +14 -3
  261. package/src/utils/deviceInfoUtils.ts +2 -0
  262. package/src/utils/deviceSettings.ts +3 -0
  263. package/src/utils/homescreen.ts +32 -6
  264. package/src/utils/index.ts +6 -1
  265. package/src/utils/pro2Nft.ts +142 -0
  266. package/src/utils/pro2Wallpaper.ts +35 -8
  267. package/src/utils/uiProgressThrottle.ts +63 -0
  268. package/__tests__/device-initialize-timeout.test.ts +0 -56
  269. package/__tests__/firmware-update/check-all-firmware-release.test.ts +0 -175
  270. package/__tests__/firmware-update/device-update-bootloader.test.ts +0 -87
  271. package/__tests__/firmware-update/firmware-artifact-source.test.ts +0 -119
  272. package/__tests__/firmware-update/firmware-host-binding.test.ts +0 -70
  273. package/__tests__/firmware-update/firmware-preparation-error.test.ts +0 -27
  274. package/__tests__/firmware-update/firmware-update-bootloader-poll.test.ts +0 -200
  275. package/__tests__/firmware-update/firmware-update-capabilities.test.ts +0 -13
  276. package/__tests__/firmware-update/firmware-update-plan-bootloader-identity.test.ts +0 -394
  277. package/__tests__/firmware-update/firmware-update-plan.test.ts +0 -593
  278. package/__tests__/firmware-update/firmware-update-prepared-plan.test.ts +0 -231
  279. package/__tests__/firmware-update/firmware-update-v3-reconnect.test.ts +0 -58
  280. package/__tests__/firmware-update/firmware-upload-source.test.ts +0 -70
  281. package/dist/api/firmware/FirmwareArtifactSource.d.ts +0 -25
  282. package/dist/api/firmware/FirmwareArtifactSource.d.ts.map +0 -1
  283. package/dist/api/firmware/FirmwareHostBinding.d.ts +0 -6
  284. package/dist/api/firmware/FirmwareHostBinding.d.ts.map +0 -1
  285. package/dist/api/firmware/FirmwarePreparationError.d.ts +0 -3
  286. package/dist/api/firmware/FirmwarePreparationError.d.ts.map +0 -1
  287. package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts +0 -3
  288. package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts.map +0 -1
  289. package/dist/api/firmware/FirmwareUpdatePlan.d.ts +0 -25
  290. package/dist/api/firmware/FirmwareUpdatePlan.d.ts.map +0 -1
  291. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts +0 -32
  292. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts.map +0 -1
  293. package/dist/api/firmware/progressThrottle.d.ts +0 -3
  294. package/dist/api/firmware/progressThrottle.d.ts.map +0 -1
  295. package/dist/protocols/protocol-v2/lockedError.d.ts +0 -2
  296. package/dist/protocols/protocol-v2/lockedError.d.ts.map +0 -1
  297. package/dist/protocols/protocol-v2/unlockRetry.d.ts +0 -10
  298. package/dist/protocols/protocol-v2/unlockRetry.d.ts.map +0 -1
  299. package/dist/types/api/firmwareUpdateCapabilities.d.ts +0 -9
  300. package/dist/types/api/firmwareUpdateCapabilities.d.ts.map +0 -1
  301. package/dist/types/api/firmwareUpdatePlan.d.ts +0 -28
  302. package/dist/types/api/firmwareUpdatePlan.d.ts.map +0 -1
  303. package/dist/types/api/firmwareUpdatePreparedPlan.d.ts +0 -42
  304. package/dist/types/api/firmwareUpdatePreparedPlan.d.ts.map +0 -1
  305. package/src/api/firmware/FirmwareArtifactSource.ts +0 -278
  306. package/src/api/firmware/FirmwareHostBinding.ts +0 -100
  307. package/src/api/firmware/FirmwarePreparationError.ts +0 -12
  308. package/src/api/firmware/FirmwareUpdateCapabilities.ts +0 -9
  309. package/src/api/firmware/FirmwareUpdatePlan.ts +0 -772
  310. package/src/api/firmware/FirmwareUpdatePreparedPlan.ts +0 -449
  311. package/src/api/firmware/progressThrottle.ts +0 -44
  312. package/src/protocols/protocol-v2/lockedError.ts +0 -10
  313. package/src/protocols/protocol-v2/unlockRetry.ts +0 -109
  314. package/src/types/api/firmwareUpdateCapabilities.ts +0 -9
  315. package/src/types/api/firmwareUpdatePlan.ts +0 -38
  316. package/src/types/api/firmwareUpdatePreparedPlan.ts +0 -53
@@ -14,45 +14,18 @@ import { BaseMethod } from './BaseMethod';
14
14
  import { validateParams } from './helpers/paramsValidator';
15
15
  import { DevicePool } from '../device/DevicePool';
16
16
  import { getBinary, getInfo, getSysResourceBinary } from './firmware/getBinary';
17
- import { normalizeFirmwarePreparationError } from './firmware/FirmwarePreparationError';
18
- import {
19
- updateResources,
20
- updateResourcesFromSources,
21
- uploadFirmwareFromSource,
22
- } from './firmware/uploadFirmware';
23
- import { BOOTLOADER_POLL_INITIALIZE_TIMEOUT_MS } from './firmware/FirmwareUpdateBaseMethod';
24
- import { LoggerNames, getDeviceType, getDeviceUUID, getLogger, wait } from '../utils';
25
- import { resolveDeviceBootloaderMode } from '../utils/deviceFeaturesCompat';
17
+ import { updateResources, uploadFirmware } from './firmware/uploadFirmware';
18
+ import { LoggerNames, getLogger, wait } from '../utils';
26
19
  import { FirmwareUpdateTipMessage, createUiMessage } from '../events/ui-request';
27
20
  import { DeviceModelToTypes } from '../types';
28
21
  import { DataManager } from '../data-manager';
29
22
  import { DEVICE } from '../events';
30
- import { type FirmwareByteSource, openFirmwareByteSource } from './firmware/FirmwareArtifactSource';
31
- import { resolveFirmwareUpdateHostBinding } from './firmware/FirmwareHostBinding';
32
- import {
33
- assertFirmwareUpdatePreparedPlanBinding,
34
- assertFirmwareUpdatePreparedPlanDeviceIdentity,
35
- getFirmwareUpdateResourceName,
36
- } from './firmware/FirmwareUpdatePreparedPlan';
37
23
 
38
24
  import type { Features, KnownDevice } from '../types';
39
25
  import type { FirmwareBinary } from './firmware/getBinary';
40
- import type {
41
- FirmwareArtifactReader,
42
- FirmwareArtifactReference,
43
- } from '../types/api/firmwareUpdate';
44
- import type { FirmwareUpdatePreparedPlan } from '../types/api/firmwareUpdatePreparedPlan';
45
26
 
46
27
  type Params = {
47
28
  binary?: ArrayBuffer;
48
- artifact?: FirmwareArtifactReference;
49
- resourceEntries?: Array<{
50
- entryName: string;
51
- artifact: FirmwareArtifactReference;
52
- }>;
53
- artifactReader?: FirmwareArtifactReader;
54
- preparedPlan?: FirmwareUpdatePreparedPlan;
55
- platform?: FirmwareUpdatePreparedPlan['platform'];
56
29
  version?: number[];
57
30
  updateType: 'firmware' | 'ble';
58
31
  forcedUpdateRes?: boolean;
@@ -133,13 +106,6 @@ const normalizeFirmwareBinary = (binary: unknown): FirmwareBinary | undefined =>
133
106
  return normalized.buffer;
134
107
  };
135
108
 
136
- const toArrayBuffer = (binary: FirmwareBinary): ArrayBuffer => {
137
- if (binary instanceof ArrayBuffer) {
138
- return binary;
139
- }
140
- return new Uint8Array(binary.buffer, binary.byteOffset, binary.byteLength).slice().buffer;
141
- };
142
-
143
109
  export default class FirmwareUpdateV2 extends BaseMethod<Params> {
144
110
  checkPromise: Deferred<any> | null = null;
145
111
 
@@ -186,32 +152,6 @@ export default class FirmwareUpdateV2 extends BaseMethod<Params> {
186
152
  binary: payload.binary,
187
153
  };
188
154
  }
189
-
190
- if ('artifact' in payload) {
191
- const hostBinding = resolveFirmwareUpdateHostBinding(payload.hostBindingGeneration);
192
- const target = payload.isUpdateBootloader ? 'bootloader' : payload.updateType;
193
- const resourceBindings = (payload.resourceEntries ?? []).map(
194
- (entry: { entryName: string; artifact: FirmwareArtifactReference }) => ({
195
- target: 'resource' as const,
196
- entryName: entry.entryName,
197
- artifact: entry.artifact,
198
- })
199
- );
200
- assertFirmwareUpdatePreparedPlanBinding({
201
- preparedPlan: payload.preparedPlan,
202
- executor: 'v2',
203
- platform: payload.platform,
204
- scopeTargets: [target, ...(target === 'firmware' ? (['resource'] as const) : [])],
205
- bindings: [{ target, artifact: payload.artifact }, ...resourceBindings],
206
- });
207
- this.params = {
208
- ...this.params,
209
- preparedPlan: payload.preparedPlan,
210
- artifact: payload.artifact,
211
- resourceEntries: payload.resourceEntries,
212
- artifactReader: hostBinding.artifactReader,
213
- };
214
- }
215
155
  }
216
156
 
217
157
  postTipMessage = (message: string) => {
@@ -247,10 +187,6 @@ export default class FirmwareUpdateV2 extends BaseMethod<Params> {
247
187
  this.checkPromise = createDeferred();
248
188
  const env = DataManager.getSettings('env');
249
189
  const isBleReconnect = connectId && DataManager.isBleConnect(env);
250
- // Tracks the in-flight BLE probe so interval ticks never overlap: a superseded
251
- // Initialize left pending on the V1 transport is exactly what later times out
252
- // and used to tear down the connection mid-firmware-upload.
253
- let bleProbeInFlight = false;
254
190
 
255
191
  Log.log('FirmwareUpdateV2 [checkDeviceToBootloader] isBleReconnect: ', isBleReconnect);
256
192
 
@@ -298,18 +234,14 @@ export default class FirmwareUpdateV2 extends BaseMethod<Params> {
298
234
  }
299
235
 
300
236
  if (isBleReconnect) {
301
- if (bleProbeInFlight) return;
302
- bleProbeInFlight = true;
303
237
  try {
304
238
  await this.device.deviceConnector?.acquire(
305
239
  this.device.originalDescriptor.id,
306
240
  null,
307
- true
241
+ true,
242
+ this.payload.connectProtocol ?? this.device.originalDescriptor.protocolType
308
243
  );
309
- // Bound each probe so a request the rebooting device never received
310
- // frees the slot for the next tick instead of hanging into the
311
- // 30s reboot budget.
312
- await this.device.initialize({ timeoutMs: BOOTLOADER_POLL_INITIALIZE_TIMEOUT_MS });
244
+ await this.device.initialize();
313
245
  if (this.device.isBootloader()) {
314
246
  clearInterval(intervalTimer);
315
247
  this.checkPromise?.resolve(true);
@@ -317,8 +249,6 @@ export default class FirmwareUpdateV2 extends BaseMethod<Params> {
317
249
  } catch (e) {
318
250
  // ignore error because of device is not connected
319
251
  Log.log('catch Bluetooth error when device is restarting: ', e);
320
- } finally {
321
- bleProbeInFlight = false;
322
252
  }
323
253
  } else {
324
254
  await this._checkDeviceInBootloaderMode(connectId, intervalTimer, timeoutTimer);
@@ -343,7 +273,9 @@ export default class FirmwareUpdateV2 extends BaseMethod<Params> {
343
273
  ) {
344
274
  const deviceDiff = await this.device.deviceConnector?.enumerate();
345
275
  const devicesDescriptor = deviceDiff?.descriptors ?? [];
346
- const { deviceList } = await DevicePool.getDevices(devicesDescriptor, connectId);
276
+ const { deviceList } = await DevicePool.getDevices(devicesDescriptor, connectId, {
277
+ connectProtocol: this.payload.connectProtocol ?? this.device.originalDescriptor.protocolType,
278
+ });
347
279
 
348
280
  if (deviceList.length === 1 && deviceList[0]?.isBootloader()) {
349
281
  // should update current device from cache
@@ -412,255 +344,151 @@ export default class FirmwareUpdateV2 extends BaseMethod<Params> {
412
344
  const { features, commands } = device;
413
345
  const deviceType = device.getCurrentDeviceType();
414
346
 
415
- // Protocol V2 (Pro2) uses DeviceFirmwareUpdate and must not enter this legacy flow.
416
- if (device.isProtocolV2()) {
417
- throw ERRORS.TypedError(
418
- HardwareErrorCode.RuntimeError,
419
- 'Protocol V2 firmware update must use firmwareUpdateV4'
420
- );
421
- }
422
- if (params.preparedPlan) {
423
- assertFirmwareUpdatePreparedPlanDeviceIdentity({
424
- preparedPlan: params.preparedPlan,
425
- deviceIdentity: getDeviceUUID(features) || undefined,
426
- bootloaderMode: resolveDeviceBootloaderMode(features),
427
- deviceModel: String(getDeviceType(features)),
428
- });
429
- }
430
-
431
347
  const deviceFirmwareType = device.getCurrentFirmwareType();
432
348
  const firmwareType = params.firmwareType ?? deviceFirmwareType;
433
349
 
434
350
  this.checkVersionForCopyTouchResource(features, firmwareType);
435
351
 
436
- let preparedSource: FirmwareByteSource | undefined;
437
- try {
438
- const acquireFirmwareSource = async (): Promise<FirmwareByteSource> => {
439
- try {
440
- if (preparedSource) {
441
- return preparedSource;
442
- }
352
+ let preparedBinary: FirmwareBinary | undefined;
353
+ const acquireFirmwareBinary = async (): Promise<FirmwareBinary> => {
354
+ try {
355
+ if (preparedBinary) {
356
+ return preparedBinary;
357
+ }
443
358
 
444
- if (params.binary !== undefined) {
445
- const binary = normalizeFirmwareBinary(params.binary);
446
- if (!binary) {
447
- throw new Error('firmware binary is empty or invalid');
448
- }
449
- const source = await openFirmwareByteSource({
450
- binary: toArrayBuffer(binary),
451
- });
452
- if (!source) {
453
- throw new Error('firmware binary is empty or invalid');
454
- }
455
- preparedSource = source;
456
- return source;
359
+ if (params.binary !== undefined) {
360
+ preparedBinary = normalizeFirmwareBinary(params.binary);
361
+ if (!preparedBinary) {
362
+ throw new Error('firmware binary is empty or invalid');
457
363
  }
364
+ return preparedBinary;
365
+ }
458
366
 
459
- if (params.artifact) {
460
- const source = await openFirmwareByteSource({
461
- artifact: params.artifact,
462
- reader: params.artifactReader,
463
- });
464
- if (!source) {
465
- throw new Error('firmware artifact is not prepared');
466
- }
467
- preparedSource = source;
468
- return source;
469
- }
367
+ if (!device.features) {
368
+ throw ERRORS.TypedError(
369
+ HardwareErrorCode.RuntimeError,
370
+ 'no features found for this device'
371
+ );
372
+ }
470
373
 
471
- if (!device.features) {
472
- throw ERRORS.TypedError(
473
- HardwareErrorCode.RuntimeError,
474
- 'no features found for this device'
475
- );
476
- }
374
+ this.postTipMessage('DownloadFirmware');
375
+ const firmware = await getBinary({
376
+ features: device.features,
377
+ version: params.version,
378
+ updateType: params.updateType,
379
+ isUpdateBootloader: params.isUpdateBootloader,
380
+ firmwareType,
381
+ requestOptions: FIRMWARE_DOWNLOAD_REQUEST_OPTIONS,
382
+ });
383
+ preparedBinary = normalizeFirmwareBinary(firmware.binary);
384
+ if (!preparedBinary) {
385
+ throw new Error('downloaded firmware binary is empty or invalid');
386
+ }
387
+ this.postTipMessage('DownloadFirmwareSuccess');
388
+ return preparedBinary;
389
+ } catch (err) {
390
+ throw ERRORS.TypedError(HardwareErrorCode.FirmwareUpdateDownloadFailed, err.message ?? err);
391
+ }
392
+ };
477
393
 
478
- if (
479
- params.artifactReader ||
480
- DataManager.getSettings('firmwareManifestMode') === 'external-only'
481
- ) {
482
- throw ERRORS.TypedError(
483
- HardwareErrorCode.RuntimeError,
484
- 'Firmware must be prepared by the external firmware host',
485
- {
486
- firmwareUpdateCode: 'FirmwareArtifactsNotPrepared',
487
- artifactName: 'firmware',
488
- }
489
- );
490
- }
394
+ if (!device.isBootloader() && features) {
395
+ const serialNo = device.getCurrentSerialNo();
396
+ // should go to bootloader mode manually
397
+ if (this.isEnteredManuallyBoot()) {
398
+ return Promise.reject(ERRORS.TypedError(HardwareErrorCode.FirmwareUpdateManuallyEnterBoot));
399
+ }
491
400
 
492
- this.postTipMessage('DownloadFirmware');
493
- const firmware = await getBinary({
494
- features: device.features,
495
- version: params.version,
496
- updateType: params.updateType,
497
- isUpdateBootloader: params.isUpdateBootloader,
498
- firmwareType,
499
- requestOptions: FIRMWARE_DOWNLOAD_REQUEST_OPTIONS,
500
- });
501
- const binary = normalizeFirmwareBinary(firmware.binary);
502
- if (!binary) {
503
- throw new Error('downloaded firmware binary is empty or invalid');
504
- }
505
- const source = await openFirmwareByteSource({
506
- binary: toArrayBuffer(binary),
507
- });
508
- if (!source) {
509
- throw new Error('downloaded firmware binary is empty or invalid');
401
+ // check & upgrade firmware resource
402
+ if (this.isSupportResourceUpdate(params.updateType)) {
403
+ this.postTipMessage('CheckLatestUiResource');
404
+ const resourceUrl = DataManager.getSysResourcesLatestRelease({
405
+ features,
406
+ forcedUpdateRes: params.forcedUpdateRes,
407
+ firmwareType,
408
+ });
409
+ if (resourceUrl) {
410
+ this.postTipMessage('DownloadLatestUiResource');
411
+ const resource = await getSysResourceBinary(resourceUrl);
412
+ this.postTipMessage('DownloadLatestUiResourceSuccess');
413
+ if (resource) {
414
+ await updateResources(
415
+ this.device.getCommands().typedCall.bind(this.device.getCommands()),
416
+ this.postMessage,
417
+ device,
418
+ resource.binary
419
+ );
510
420
  }
511
- preparedSource = source;
512
- this.postTipMessage('DownloadFirmwareSuccess');
513
- return source;
514
- } catch (err) {
515
- throw normalizeFirmwarePreparationError(err);
516
421
  }
517
- };
422
+ }
518
423
 
519
- if (!device.isBootloader() && features) {
520
- const serialNo = device.getCurrentSerialNo();
521
- // should go to bootloader mode manually
522
- if (this.isEnteredManuallyBoot()) {
523
- throw ERRORS.TypedError(HardwareErrorCode.FirmwareUpdateManuallyEnterBoot);
424
+ // check if the device commands has been disposed
425
+ this.device?.commands?.checkDisposed();
426
+
427
+ // A failed firmware download must leave the device in normal mode.
428
+ await acquireFirmwareBinary();
429
+
430
+ // The request may outlive the current transport command instance.
431
+ this.device?.commands?.checkDisposed();
432
+
433
+ // auto go to bootloader mode
434
+ try {
435
+ this.postTipMessage('AutoRebootToBootloader');
436
+ const bootRes = await commands.typedCall('DeviceBackToBoot', 'Success');
437
+ // @ts-expect-error
438
+ if (bootRes.type === 'CallMethodError') {
439
+ throw ERRORS.TypedError(HardwareErrorCode.FirmwareUpdateAutoEnterBootFailure);
524
440
  }
441
+ this.postTipMessage('GoToBootloaderSuccess');
442
+ this.checkDeviceToBootloader(this.payload.connectId);
525
443
 
526
- // All network-backed input must be ready before the first device mutation.
527
- await acquireFirmwareSource();
528
-
529
- // check & upgrade firmware resource
530
- if (this.isSupportResourceUpdate(params.updateType)) {
531
- this.postTipMessage('CheckLatestUiResource');
532
- const resourceUrl = DataManager.getSysResourcesLatestRelease({
533
- features,
534
- forcedUpdateRes: params.forcedUpdateRes,
535
- firmwareType,
536
- });
537
- if (resourceUrl) {
538
- this.postTipMessage('DownloadLatestUiResource');
539
- if (params.resourceEntries?.length) {
540
- const sources: Array<{
541
- entryName: string;
542
- source: FirmwareByteSource;
543
- }> = [];
544
- try {
545
- for (const entry of params.resourceEntries) {
546
- const resourceName = getFirmwareUpdateResourceName(entry.entryName);
547
- const source = await openFirmwareByteSource({
548
- artifact: entry.artifact,
549
- reader: params.artifactReader,
550
- });
551
- if (!source) {
552
- throw new Error('Firmware resource entry is not prepared');
553
- }
554
- sources.push({ entryName: resourceName, source });
555
- }
556
- await updateResourcesFromSources(
557
- this.device.getCommands().typedCall.bind(this.device.getCommands()),
558
- this.postMessage,
559
- device,
560
- sources.map(entry => ({
561
- entryName: entry.entryName,
562
- source: entry.source,
563
- }))
564
- );
565
- } finally {
566
- await Promise.all(
567
- sources.map(entry => entry.source.close().catch(() => undefined))
568
- );
569
- }
570
- this.postTipMessage('DownloadLatestUiResourceSuccess');
571
- } else {
572
- if (
573
- params.artifactReader ||
574
- DataManager.getSettings('firmwareManifestMode') === 'external-only'
575
- ) {
576
- throw ERRORS.TypedError(
577
- HardwareErrorCode.RuntimeError,
578
- 'Firmware resource must be prepared by the external firmware host',
579
- {
580
- firmwareUpdateCode: 'FirmwareArtifactsNotPrepared',
581
- artifactName: 'resource',
582
- }
583
- );
584
- }
585
- const resourceBinary: ArrayBuffer | Buffer = (await getSysResourceBinary(resourceUrl))
586
- .binary;
587
- this.postTipMessage('DownloadLatestUiResourceSuccess');
588
- await updateResources(
589
- this.device.getCommands().typedCall.bind(this.device.getCommands()),
590
- this.postMessage,
591
- device,
592
- resourceBinary
593
- );
594
- }
595
- }
444
+ // force clean classic device cache so that the device can initialize again
445
+ if (DeviceModelToTypes.model_classic.includes(deviceType)) {
446
+ DevicePool.clearDeviceCache(serialNo);
596
447
  }
448
+ delete DevicePool.devicesCache[''];
449
+ await this.checkPromise?.promise;
450
+ this.checkPromise = null;
597
451
 
598
- // The request may outlive the current transport command instance.
452
+ // check if the device commands has been disposed
599
453
  this.device?.commands?.checkDisposed();
600
454
 
601
- // auto go to bootloader mode
602
- try {
603
- this.postTipMessage('AutoRebootToBootloader');
604
- const bootRes = await commands.typedCall('DeviceBackToBoot', 'Success');
605
- // @ts-expect-error
606
- if (bootRes.type === 'CallMethodError') {
607
- throw ERRORS.TypedError(HardwareErrorCode.FirmwareUpdateAutoEnterBootFailure);
608
- }
609
- this.postTipMessage('GoToBootloaderSuccess');
610
- this.checkDeviceToBootloader(this.payload.connectId);
611
-
612
- // force clean classic device cache so that the device can initialize again
613
- if (DeviceModelToTypes.model_classic.includes(deviceType)) {
614
- DevicePool.clearDeviceCache(serialNo);
615
- }
616
- delete DevicePool.devicesCache[''];
617
- await this.checkPromise?.promise;
618
- this.checkPromise = null;
619
-
620
- // check if the device commands has been disposed
621
- this.device?.commands?.checkDisposed();
622
-
623
- /**
624
- * Touch 1 with bootloader v2.5.0 issue: BLE chip need more time for looking up name, here change the delay time to 3000ms after rebooting.
625
- */
626
- const isTouch = DeviceModelToTypes.model_touch.includes(deviceType);
627
- await wait(isTouch ? 3000 : 1500);
628
- } catch (e) {
629
- if (e instanceof HardwareError) {
630
- return Promise.reject(e);
631
- }
632
- console.log('auto go to bootloader mode failed: ', e);
633
- return Promise.reject(
634
- ERRORS.TypedError(HardwareErrorCode.FirmwareUpdateAutoEnterBootFailure)
635
- );
455
+ /**
456
+ * Touch 1 with bootloader v2.5.0 issue: BLE chip need more time for looking up name, here change the delay time to 3000ms after rebooting.
457
+ */
458
+ const isTouch = DeviceModelToTypes.model_touch.includes(deviceType);
459
+ await wait(isTouch ? 3000 : 1500);
460
+ } catch (e) {
461
+ if (e instanceof HardwareError) {
462
+ return Promise.reject(e);
636
463
  }
464
+ console.log('auto go to bootloader mode failed: ', e);
465
+ return Promise.reject(
466
+ ERRORS.TypedError(HardwareErrorCode.FirmwareUpdateAutoEnterBootFailure)
467
+ );
637
468
  }
469
+ }
638
470
 
639
- // Devices already in bootloader mode still acquire through the same helper.
640
- const source = await acquireFirmwareSource();
641
-
642
- // check if the device commands has been disposed
643
- this.device?.commands?.checkDisposed();
471
+ // Devices already in bootloader mode still acquire through the same helper.
472
+ const binary = await acquireFirmwareBinary();
644
473
 
645
- await this.device.acquire();
474
+ // check if the device commands has been disposed
475
+ this.device?.commands?.checkDisposed();
646
476
 
647
- const response = await uploadFirmwareFromSource(
648
- params.updateType,
649
- this.device.getCommands().typedCall.bind(this.device.getCommands()),
650
- this.postMessage,
651
- device,
652
- source,
653
- true,
654
- params.isUpdateBootloader
655
- );
477
+ await this.device.acquire();
656
478
 
657
- if (this.connectId) {
658
- DevicePool.clearDeviceCache(this.connectId);
659
- }
479
+ const response = await uploadFirmware(
480
+ params.updateType,
481
+ this.device.getCommands().typedCall.bind(this.device.getCommands()),
482
+ this.postMessage,
483
+ device,
484
+ { payload: binary, rebootOnSuccess: true },
485
+ params.isUpdateBootloader
486
+ );
660
487
 
661
- return response;
662
- } finally {
663
- await preparedSource?.close().catch(() => undefined);
488
+ if (this.connectId) {
489
+ DevicePool.clearDeviceCache(this.connectId);
664
490
  }
491
+
492
+ return response;
665
493
  }
666
494
  }