@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
@@ -1,6 +1,7 @@
1
- import { EDeviceType, EFirmwareType, ERRORS, HardwareErrorCode } from '@onekeyfe/hd-shared';
1
+ import { EFirmwareType, ERRORS, HardwareError, HardwareErrorCode } from '@onekeyfe/hd-shared';
2
2
  import semver from 'semver';
3
3
 
4
+ import { BaseMethod } from './BaseMethod';
4
5
  import { UI_REQUEST } from '../constants/ui-request';
5
6
  import { DataManager } from '../data-manager';
6
7
  import {
@@ -8,13 +9,18 @@ import {
8
9
  getBootloaderReleaseInfo,
9
10
  getFirmwareReleaseInfo,
10
11
  } from './firmware/releaseHelper';
12
+ import {
13
+ buildFirmwareUpdatePlan,
14
+ validateFirmwareUpdatePlanForceTargets,
15
+ } from './firmware/FirmwareUpdatePlan';
11
16
  import { getBridgeReleaseInfo } from '../utils/bridgeUpdate';
12
- import { getDeviceFirmwareVersion, getDeviceType, getFirmwareType } from '../utils';
13
- import { BaseMethod } from './BaseMethod';
14
17
  import {
15
- buildProtocolV2ResourceUpdatePlan,
16
- readProtocolV2ResourceInventory,
17
- } from '../protocols/protocol-v2/resources';
18
+ LoggerNames,
19
+ getDeviceFirmwareVersion,
20
+ getDeviceType,
21
+ getFirmwareType,
22
+ getLogger,
23
+ } from '../utils';
18
24
 
19
25
  import type {
20
26
  AllFirmwareRelease,
@@ -30,6 +36,7 @@ import type {
30
36
  IProtocolV2FirmwareComponent,
31
37
  IProtocolV2FirmwareComponentTarget,
32
38
  } from '../types';
39
+ import type { FirmwareUpdatePlan } from '../types/api/firmwareUpdatePlan';
33
40
 
34
41
  const UPDATE_TARGET_BY_COMPONENT_TARGET: Readonly<
35
42
  Partial<Record<IProtocolV2FirmwareComponentTarget, FirmwareUpdateV4Target>>
@@ -94,7 +101,6 @@ function buildComponentRelease({
94
101
  component,
95
102
  currentVersions,
96
103
  currentVerification,
97
- checkFirmwareHash,
98
104
  remotePayloadHash,
99
105
  releaseRequired,
100
106
  }: {
@@ -102,7 +108,6 @@ function buildComponentRelease({
102
108
  component: IProtocolV2FirmwareComponent;
103
109
  currentVersions: DeviceStateVersions;
104
110
  currentVerification: Partial<DeviceFeaturesVerify>;
105
- checkFirmwareHash: boolean;
106
111
  remotePayloadHash: string | null | undefined;
107
112
  releaseRequired: boolean;
108
113
  }): ProtocolV2FirmwareComponentRelease {
@@ -131,7 +136,7 @@ function buildComponentRelease({
131
136
  status = 'valid';
132
137
  } else {
133
138
  const currentHashKey = CURRENT_HASH_BY_COMPONENT_TARGET[componentTarget];
134
- if (!checkFirmwareHash || !currentHashKey) {
139
+ if (!currentHashKey) {
135
140
  status = 'valid';
136
141
  } else {
137
142
  const currentHash = normalizeHex(currentVerification[currentHashKey]);
@@ -170,14 +175,12 @@ type ProtocolV2FirmwareReleasePlan = {
170
175
  export function buildProtocolV2FirmwareRelease({
171
176
  currentVersions,
172
177
  currentVerification = {},
173
- checkFirmwareHash = false,
174
178
  remotePayloadHashes = {},
175
179
  firmwareType,
176
180
  release,
177
181
  }: {
178
182
  currentVersions: DeviceStateVersions;
179
183
  currentVerification?: Partial<DeviceFeaturesVerify>;
180
- checkFirmwareHash?: boolean;
181
184
  remotePayloadHashes?: Readonly<Record<string, string | null>>;
182
185
  firmwareType: EFirmwareType;
183
186
  release: IFirmwareReleaseInfo | undefined;
@@ -201,7 +204,6 @@ export function buildProtocolV2FirmwareRelease({
201
204
  component,
202
205
  currentVersions,
203
206
  currentVerification,
204
- checkFirmwareHash,
205
207
  remotePayloadHash: Object.prototype.hasOwnProperty.call(remotePayloadHashes, configKey)
206
208
  ? remotePayloadHashes[configKey]
207
209
  : normalizeHex(component.payloadHash),
@@ -228,6 +230,9 @@ export function buildProtocolV2FirmwareRelease({
228
230
  const targetsToUpdate = components.flatMap(component =>
229
231
  component.status === 'outdated' && component.updateTarget ? [component.updateTarget] : []
230
232
  );
233
+ if (targetsToUpdate.length > 0 && release.resourceBundles?.length) {
234
+ targetsToUpdate.push('resource');
235
+ }
231
236
  const uniqueTargetsToUpdate = Array.from(new Set(targetsToUpdate));
232
237
  const hasUpgrade = uniqueTargetsToUpdate.length > 0;
233
238
  const required = release.required && hasUpgrade;
@@ -252,6 +257,8 @@ export function buildProtocolV2FirmwareRelease({
252
257
  };
253
258
  }
254
259
 
260
+ const Log = getLogger(LoggerNames.Method);
261
+
255
262
  export default class CheckAllFirmwareRelease extends BaseMethod {
256
263
  getSupportedProtocols() {
257
264
  return ['V1', 'V2'] as const;
@@ -269,8 +276,13 @@ export default class CheckAllFirmwareRelease extends BaseMethod {
269
276
  }
270
277
 
271
278
  const { features } = this.device;
272
- const { checkBridgeRelease, firmwareType: firmwareTypeParams } = this
273
- .payload as CheckAllFirmwareReleaseParams;
279
+ const {
280
+ checkBridgeRelease,
281
+ firmwareType: firmwareTypeParams,
282
+ platform,
283
+ forceUpdateTargets,
284
+ } = this.payload as CheckAllFirmwareReleaseParams;
285
+ const validatedForceUpdateTargets = validateFirmwareUpdatePlanForceTargets(forceUpdateTargets);
274
286
 
275
287
  if (!features) {
276
288
  return Promise.resolve(null);
@@ -301,6 +313,32 @@ export default class CheckAllFirmwareRelease extends BaseMethod {
301
313
  firmwareType,
302
314
  });
303
315
  const bleFirmwareReleaseInfo = getBleFirmwareReleaseInfo(features);
316
+ let firmwareUpdatePlan: FirmwareUpdatePlan | undefined;
317
+ try {
318
+ firmwareUpdatePlan = buildFirmwareUpdatePlan({
319
+ features,
320
+ firmwareType,
321
+ platform: platform ?? 'web',
322
+ firmware: firmwareRelease,
323
+ ble: bleFirmwareReleaseInfo,
324
+ bootloader: bootloaderRelease,
325
+ forceUpdateTargets: validatedForceUpdateTargets,
326
+ });
327
+ } catch (error) {
328
+ if (
329
+ validatedForceUpdateTargets.length > 0 ||
330
+ !(error instanceof HardwareError) ||
331
+ error.params?.firmwareUpdateCode !== 'FirmwarePlanInvalid'
332
+ ) {
333
+ throw error;
334
+ }
335
+ // A Plan is an optional external-host capability. Release checks remain
336
+ // available for legacy and recovery flows when a Plan cannot be built.
337
+ Log.warn(
338
+ '[CheckAllFirmwareRelease] Optional firmware Plan is unavailable; using the legacy release result'
339
+ );
340
+ firmwareUpdatePlan = undefined;
341
+ }
304
342
 
305
343
  return {
306
344
  firmware: firmwareRelease,
@@ -315,21 +353,18 @@ export default class CheckAllFirmwareRelease extends BaseMethod {
315
353
  }
316
354
  : undefined,
317
355
  features,
318
- } as AllFirmwareRelease;
356
+ firmwareUpdatePlan,
357
+ } as unknown as AllFirmwareRelease;
319
358
  }
320
359
 
321
360
  private async runProtocolV2(): Promise<AllFirmwareRelease> {
322
- const { checkFirmwareHash = false, firmwareType: firmwareTypeParam } = this
323
- .payload as CheckAllFirmwareReleaseParams;
324
361
  const state = await this.device.getDeviceState({
325
- refreshSections: checkFirmwareHash
326
- ? ['identity', 'versions', 'verification']
327
- : ['identity', 'versions'],
362
+ refreshSections: ['identity', 'versions', 'verification'],
328
363
  });
329
- if (state.identity.deviceType !== 'pro2' && state.identity.deviceType !== 'neo') {
364
+ if (state.identity.deviceType !== 'pro2') {
330
365
  throw ERRORS.TypedError(
331
366
  HardwareErrorCode.DeviceNotSupportMethod,
332
- 'checkAllFirmwareRelease requires a Pro2 or Neo device for Protocol V2'
367
+ 'checkAllFirmwareRelease requires a Pro2 device for Protocol V2'
333
368
  );
334
369
  }
335
370
 
@@ -341,47 +376,16 @@ export default class CheckAllFirmwareRelease extends BaseMethod {
341
376
  );
342
377
  }
343
378
 
379
+ const { firmwareType: firmwareTypeParam } = this.payload as CheckAllFirmwareReleaseParams;
344
380
  const firmwareType =
345
381
  firmwareTypeParam ?? state.identity.firmwareType ?? EFirmwareType.Universal;
346
382
  const release = DataManager.getFirmwareLatestRelease(features, firmwareType);
347
383
  const plan = buildProtocolV2FirmwareRelease({
348
384
  currentVersions: state.versions,
349
- currentVerification: checkFirmwareHash ? state.verification : undefined,
350
- checkFirmwareHash,
385
+ currentVerification: state.verification,
351
386
  firmwareType,
352
387
  release,
353
388
  });
354
- const resourceDeviceType =
355
- state.identity.deviceType === 'neo' ? EDeviceType.Neo : EDeviceType.Pro2;
356
- const resources = DataManager.getProtocolV2Resources(resourceDeviceType);
357
- let resourceStatus: 'valid' | 'outdated' | 'unknown' = 'unknown';
358
- if (resources?.length) {
359
- const loaderMode = state.status.mode === 'bootloader' || state.status.mode === 'romloader';
360
- // Application mode rejects host access to vol0:/bundles. Resource inventory is
361
- // resolved after FirmwareUpdateV4 enters a loader instead of probing here.
362
- if (loaderMode) {
363
- try {
364
- const inventory = await readProtocolV2ResourceInventory({
365
- commands: this.device.getCommands(),
366
- resources,
367
- });
368
- resourceStatus = buildProtocolV2ResourceUpdatePlan({
369
- resources,
370
- inventory,
371
- mode: 'bootloader-recovery',
372
- }).status;
373
- } catch {
374
- resourceStatus = buildProtocolV2ResourceUpdatePlan({
375
- resources,
376
- mode: 'bootloader-recovery',
377
- }).status;
378
- }
379
- }
380
- }
381
- const targetsToUpdate = [
382
- ...plan.targetsToUpdate,
383
- ...(resourceStatus === 'outdated' ? (['resource'] as const) : []),
384
- ];
385
389
  const firmwareStatus = plan.status === 'unavailable' ? 'unknown' : plan.status;
386
390
  const emptyRelease = 'none' as const;
387
391
 
@@ -402,11 +406,8 @@ export default class CheckAllFirmwareRelease extends BaseMethod {
402
406
  },
403
407
  features,
404
408
  protocol: 'V2',
405
- deviceType: state.identity.deviceType,
409
+ deviceType: 'pro2',
406
410
  ...plan,
407
- resourceStatus,
408
- hasUpgrade: plan.hasUpgrade || resourceStatus === 'outdated',
409
- targetsToUpdate,
410
411
  };
411
412
  }
412
413
  }
@@ -10,6 +10,7 @@ import { UI_REQUEST } from '../constants/ui-request';
10
10
  import { BaseMethod } from './BaseMethod';
11
11
  import { validateParams } from './helpers/paramsValidator';
12
12
  import { getBinary } from './firmware/getBinary';
13
+ import { BOOTLOADER_POLL_INITIALIZE_TIMEOUT_MS } from './firmware/FirmwareUpdateBaseMethod';
13
14
  import { uploadFirmware } from './firmware/uploadFirmware';
14
15
  import { createUiMessage } from '../events';
15
16
  import { DeviceModelToTypes, type KnownDevice } from '../types';
@@ -78,6 +79,10 @@ export default class FirmwareUpdate extends BaseMethod<Params> {
78
79
  this.checkPromise = createDeferred();
79
80
  const env = DataManager.getSettings('env');
80
81
  const isBleReconnect = connectId && DataManager.isBleConnect(env);
82
+ // Tracks the in-flight BLE probe so interval ticks never overlap: a superseded
83
+ // Initialize left pending on the V1 transport is exactly what later times out
84
+ // and used to tear down the connection mid-firmware-upload.
85
+ let bleProbeInFlight = false;
81
86
 
82
87
  Log.log('FirmwareUpdate [checkDeviceToBootloader] isBleReconnect: ', isBleReconnect);
83
88
 
@@ -85,14 +90,18 @@ export default class FirmwareUpdate extends BaseMethod<Params> {
85
90
  const intervalTimer: ReturnType<typeof setInterval> | undefined = setInterval(
86
91
  async () => {
87
92
  if (isBleReconnect) {
93
+ if (bleProbeInFlight) return;
94
+ bleProbeInFlight = true;
88
95
  try {
89
96
  await this.device.deviceConnector?.acquire(
90
97
  this.device.originalDescriptor.id,
91
98
  null,
92
- true,
93
- this.payload.connectProtocol ?? this.device.originalDescriptor.protocolType
99
+ true
94
100
  );
95
- await this.device.initialize();
101
+ // Bound each probe so a request the rebooting device never received
102
+ // frees the slot for the next tick instead of hanging into the
103
+ // 30s reboot budget.
104
+ await this.device.initialize({ timeoutMs: BOOTLOADER_POLL_INITIALIZE_TIMEOUT_MS });
96
105
  if (this.device.isBootloader()) {
97
106
  clearInterval(intervalTimer);
98
107
  this.checkPromise?.resolve(true);
@@ -100,14 +109,13 @@ export default class FirmwareUpdate extends BaseMethod<Params> {
100
109
  } catch (e) {
101
110
  // ignore error because of device is not connected
102
111
  Log.log('catch Bluetooth error when device is restarting: ', e);
112
+ } finally {
113
+ bleProbeInFlight = false;
103
114
  }
104
115
  } else {
105
116
  const deviceDiff = await this.device.deviceConnector?.enumerate();
106
117
  const devicesDescriptor = deviceDiff?.descriptors ?? [];
107
- const { deviceList } = await DevicePool.getDevices(devicesDescriptor, connectId, {
108
- connectProtocol:
109
- this.payload.connectProtocol ?? this.device.originalDescriptor.protocolType,
110
- });
118
+ const { deviceList } = await DevicePool.getDevices(devicesDescriptor, connectId);
111
119
 
112
120
  if (deviceList.length === 1 && deviceList[0]?.isBootloader()) {
113
121
  // should update current device from cache