@onetokenfe/hd-core 1.1.23

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 (382) hide show
  1. package/.eslintrc +6 -0
  2. package/README.md +32 -0
  3. package/__tests__/benfen.test.ts +68 -0
  4. package/__tests__/checkBootloaderReleast.test.ts +115 -0
  5. package/__tests__/evmSignTransaction.test.ts +419 -0
  6. package/jest.config.js +6 -0
  7. package/package.json +48 -0
  8. package/src/api/BaseMethod.ts +275 -0
  9. package/src/api/CheckAllFirmwareRelease.ts +73 -0
  10. package/src/api/CheckBLEFirmwareRelease.ts +23 -0
  11. package/src/api/CheckBootloaderRelease.ts +32 -0
  12. package/src/api/CheckBridgeRelease.ts +28 -0
  13. package/src/api/CheckBridgeStatus.ts +32 -0
  14. package/src/api/CheckFirmwareRelease.ts +31 -0
  15. package/src/api/CheckFirmwareTypeAvailable.tsx +30 -0
  16. package/src/api/CipherKeyValue.ts +68 -0
  17. package/src/api/FirmwareUpdate.ts +219 -0
  18. package/src/api/FirmwareUpdateV2.ts +408 -0
  19. package/src/api/FirmwareUpdateV3.ts +560 -0
  20. package/src/api/GetFeatures.ts +23 -0
  21. package/src/api/GetLogs.ts +40 -0
  22. package/src/api/GetOnetokenFeatures.ts +25 -0
  23. package/src/api/GetPassphraseState.ts +28 -0
  24. package/src/api/PromptWebDeviceAccess.ts +77 -0
  25. package/src/api/SearchDevices.ts +50 -0
  26. package/src/api/alephium/AlephiumGetAddress.ts +84 -0
  27. package/src/api/alephium/AlephiumSignMessage.ts +51 -0
  28. package/src/api/alephium/AlephiumSignTransaction.ts +135 -0
  29. package/src/api/algo/AlgoGetAddress.ts +73 -0
  30. package/src/api/algo/AlgoSignTransaction.ts +52 -0
  31. package/src/api/allnetwork/AllNetworkGetAddress.ts +88 -0
  32. package/src/api/allnetwork/AllNetworkGetAddressBase.ts +529 -0
  33. package/src/api/allnetwork/AllNetworkGetAddressByLoop.ts +162 -0
  34. package/src/api/aptos/AptosGetAddress.ts +129 -0
  35. package/src/api/aptos/AptosGetPublicKey.ts +64 -0
  36. package/src/api/aptos/AptosSignInMessage.ts +55 -0
  37. package/src/api/aptos/AptosSignMessage.ts +79 -0
  38. package/src/api/aptos/AptosSignTransaction.ts +72 -0
  39. package/src/api/benfen/BenfenGetAddress.ts +122 -0
  40. package/src/api/benfen/BenfenGetPublicKey.ts +68 -0
  41. package/src/api/benfen/BenfenSignMessage.ts +50 -0
  42. package/src/api/benfen/BenfenSignTransaction.ts +105 -0
  43. package/src/api/benfen/normalize.ts +51 -0
  44. package/src/api/btc/BTCGetAddress.ts +91 -0
  45. package/src/api/btc/BTCGetPublicKey.ts +174 -0
  46. package/src/api/btc/BTCSignMessage.ts +73 -0
  47. package/src/api/btc/BTCSignPsbt.ts +65 -0
  48. package/src/api/btc/BTCSignTransaction.ts +148 -0
  49. package/src/api/btc/BTCVerifyMessage.ts +46 -0
  50. package/src/api/btc/helpers/btcParamsUtils.ts +64 -0
  51. package/src/api/btc/helpers/signtx.ts +251 -0
  52. package/src/api/btc/helpers/signtxLegacy.ts +227 -0
  53. package/src/api/btc/helpers/versionLimit.ts +25 -0
  54. package/src/api/btc/helpers/xpubUtils.ts +132 -0
  55. package/src/api/cardano/CardanoGetAddress.ts +139 -0
  56. package/src/api/cardano/CardanoGetPublicKey.ts +72 -0
  57. package/src/api/cardano/CardanoSignMessage.ts +73 -0
  58. package/src/api/cardano/CardanoSignTransaction.ts +404 -0
  59. package/src/api/cardano/helper/addressParameters.ts +120 -0
  60. package/src/api/cardano/helper/auxiliaryData.ts +133 -0
  61. package/src/api/cardano/helper/cardanoInputs.ts +55 -0
  62. package/src/api/cardano/helper/cardanoOutputs.ts +89 -0
  63. package/src/api/cardano/helper/certificate.ts +246 -0
  64. package/src/api/cardano/helper/token.ts +44 -0
  65. package/src/api/cardano/helper/utils.ts +17 -0
  66. package/src/api/cardano/helper/witnesses.ts +62 -0
  67. package/src/api/conflux/ConfluxGetAddress.ts +78 -0
  68. package/src/api/conflux/ConfluxSignMessage.ts +49 -0
  69. package/src/api/conflux/ConfluxSignMessageCIP23.ts +49 -0
  70. package/src/api/conflux/ConfluxSignTransaction.ts +135 -0
  71. package/src/api/cosmos/CosmosGetAddress.ts +80 -0
  72. package/src/api/cosmos/CosmosGetPublicKey.ts +77 -0
  73. package/src/api/cosmos/CosmosSignTransaction.ts +68 -0
  74. package/src/api/device/DeviceBackup.ts +15 -0
  75. package/src/api/device/DeviceCancel.ts +15 -0
  76. package/src/api/device/DeviceChangePin.ts +25 -0
  77. package/src/api/device/DeviceFlags.ts +26 -0
  78. package/src/api/device/DeviceFullyUploadResource.ts +80 -0
  79. package/src/api/device/DeviceLock.ts +15 -0
  80. package/src/api/device/DeviceRebootToBoardloader.ts +30 -0
  81. package/src/api/device/DeviceRebootToBootloader.ts +28 -0
  82. package/src/api/device/DeviceRecovery.ts +44 -0
  83. package/src/api/device/DeviceReset.ts +46 -0
  84. package/src/api/device/DeviceSettings.ts +96 -0
  85. package/src/api/device/DeviceSupportFeatures.ts +29 -0
  86. package/src/api/device/DeviceUnlock.ts +13 -0
  87. package/src/api/device/DeviceUpdateBootloader.ts +111 -0
  88. package/src/api/device/DeviceUpdateReboot.ts +17 -0
  89. package/src/api/device/DeviceUploadResource.ts +204 -0
  90. package/src/api/device/DeviceVerify.ts +65 -0
  91. package/src/api/device/DeviceWipe.ts +15 -0
  92. package/src/api/dynex/DnxGetAddress.ts +75 -0
  93. package/src/api/dynex/DnxSignTransaction.ts +126 -0
  94. package/src/api/evm/EVMGetAddress.ts +88 -0
  95. package/src/api/evm/EVMGetPublicKey.ts +116 -0
  96. package/src/api/evm/EVMSignMessage.ts +49 -0
  97. package/src/api/evm/EVMSignMessageEIP712.ts +56 -0
  98. package/src/api/evm/EVMSignTransaction.ts +141 -0
  99. package/src/api/evm/EVMSignTypedData.ts +477 -0
  100. package/src/api/evm/EVMVerifyMessage.ts +46 -0
  101. package/src/api/evm/latest/getAddress.ts +13 -0
  102. package/src/api/evm/latest/getPublicKey.ts +17 -0
  103. package/src/api/evm/latest/signMessage.ts +19 -0
  104. package/src/api/evm/latest/signTransaction.ts +303 -0
  105. package/src/api/evm/latest/signTypedData.ts +34 -0
  106. package/src/api/evm/latest/signTypedHash.ts +46 -0
  107. package/src/api/evm/latest/verifyMessage.ts +15 -0
  108. package/src/api/evm/legacyV1/getAddress.ts +16 -0
  109. package/src/api/evm/legacyV1/getPublicKey.ts +20 -0
  110. package/src/api/evm/legacyV1/signMessage.ts +22 -0
  111. package/src/api/evm/legacyV1/signTransaction.ts +37 -0
  112. package/src/api/evm/legacyV1/signTypedData.ts +37 -0
  113. package/src/api/evm/legacyV1/signTypedHash.ts +50 -0
  114. package/src/api/evm/legacyV1/verifyMessage.ts +19 -0
  115. package/src/api/filecoin/FilecoinGetAddress.ts +80 -0
  116. package/src/api/filecoin/FilecoinSignTransaction.ts +57 -0
  117. package/src/api/firmware/FirmwareUpdateBaseMethod.ts +476 -0
  118. package/src/api/firmware/bootloaderHelper.ts +46 -0
  119. package/src/api/firmware/getBinary.ts +99 -0
  120. package/src/api/firmware/releaseHelper.ts +78 -0
  121. package/src/api/firmware/updateBootloader.ts +82 -0
  122. package/src/api/firmware/uploadFirmware.ts +541 -0
  123. package/src/api/helpers/batchGetPublickeys.ts +84 -0
  124. package/src/api/helpers/bigNumberUtils.ts +58 -0
  125. package/src/api/helpers/hexUtils.ts +111 -0
  126. package/src/api/helpers/paramsValidator.ts +165 -0
  127. package/src/api/helpers/pathUtils.ts +145 -0
  128. package/src/api/helpers/stringUtils.ts +11 -0
  129. package/src/api/helpers/typeNameUtils.ts +137 -0
  130. package/src/api/index.ts +161 -0
  131. package/src/api/kaspa/KaspaGetAddress.ts +103 -0
  132. package/src/api/kaspa/KaspaSignTransaction.ts +182 -0
  133. package/src/api/kaspa/helpers/BufferWriter.ts +177 -0
  134. package/src/api/kaspa/helpers/HashWriter.ts +74 -0
  135. package/src/api/kaspa/helpers/SignatureType.ts +7 -0
  136. package/src/api/kaspa/helpers/TransferSerialize.ts +144 -0
  137. package/src/api/lightning/LnurlAuth.ts +52 -0
  138. package/src/api/near/NearGetAddress.ts +75 -0
  139. package/src/api/near/NearSignTransaction.ts +46 -0
  140. package/src/api/nem/NEMGetAddress.ts +72 -0
  141. package/src/api/nem/NEMSignTransaction.ts +251 -0
  142. package/src/api/neo/NeoGetAddress.ts +80 -0
  143. package/src/api/neo/NeoSignTransaction.ts +59 -0
  144. package/src/api/nervos/NervosGetAddress.ts +80 -0
  145. package/src/api/nervos/NervosSignTransaction.ts +116 -0
  146. package/src/api/nexa/NexaGetAddress.ts +88 -0
  147. package/src/api/nexa/NexaSignTransaction.ts +107 -0
  148. package/src/api/nostr/NostrDecryptMessage.ts +57 -0
  149. package/src/api/nostr/NostrEncryptMessage.ts +57 -0
  150. package/src/api/nostr/NostrGetPublicKey.ts +74 -0
  151. package/src/api/nostr/NostrSignEvent.ts +65 -0
  152. package/src/api/nostr/NostrSignSchnorr.ts +52 -0
  153. package/src/api/nostr/helper/index.ts +28 -0
  154. package/src/api/polkadot/PolkadotGetAddress.ts +83 -0
  155. package/src/api/polkadot/PolkadotSignTransaction.ts +53 -0
  156. package/src/api/polkadot/networks.ts +72 -0
  157. package/src/api/scdo/ScdoGetAddress.ts +76 -0
  158. package/src/api/scdo/ScdoSignMessage.ts +45 -0
  159. package/src/api/scdo/ScdoSignTransaction.ts +106 -0
  160. package/src/api/solana/SolGetAddress.ts +68 -0
  161. package/src/api/solana/SolSignMessage.ts +61 -0
  162. package/src/api/solana/SolSignOffchainMessage.ts +61 -0
  163. package/src/api/solana/SolSignTransaction.ts +108 -0
  164. package/src/api/starcoin/StarcoinGetAddress.ts +69 -0
  165. package/src/api/starcoin/StarcoinGetPublicKey.ts +70 -0
  166. package/src/api/starcoin/StarcoinSignMessage.ts +42 -0
  167. package/src/api/starcoin/StarcoinSignTransaction.ts +38 -0
  168. package/src/api/starcoin/StarcoinVerifyMessage.ts +35 -0
  169. package/src/api/stellar/StellarGetAddress.ts +68 -0
  170. package/src/api/stellar/StellarSignTransaction.ts +220 -0
  171. package/src/api/sui/SuiGetAddress.ts +117 -0
  172. package/src/api/sui/SuiGetPublicKey.ts +66 -0
  173. package/src/api/sui/SuiSignMessage.ts +48 -0
  174. package/src/api/sui/SuiSignTransaction.ts +126 -0
  175. package/src/api/sui/normalize.ts +28 -0
  176. package/src/api/test/TestInitializeDeviceDuration.ts +22 -0
  177. package/src/api/ton/TonGetAddress.ts +96 -0
  178. package/src/api/ton/TonSignMessage.ts +217 -0
  179. package/src/api/ton/TonSignProof.ts +62 -0
  180. package/src/api/tron/TronGetAddress.ts +75 -0
  181. package/src/api/tron/TronSignMessage.ts +89 -0
  182. package/src/api/tron/TronSignTransaction.ts +214 -0
  183. package/src/api/u2f/GetNextU2FCounter.ts +15 -0
  184. package/src/api/u2f/SetU2FCounter.ts +19 -0
  185. package/src/api/utils.ts +23 -0
  186. package/src/api/xrp/XrpGetAddress.ts +96 -0
  187. package/src/api/xrp/XrpSignTransaction.ts +71 -0
  188. package/src/constants/errors.ts +15 -0
  189. package/src/constants/index.ts +2 -0
  190. package/src/constants/ui-request.ts +3 -0
  191. package/src/core/RequestQueue.ts +134 -0
  192. package/src/core/index.ts +1320 -0
  193. package/src/data/coins/bitcoin.json +44 -0
  194. package/src/data/config.ts +25 -0
  195. package/src/data/messages/messages.json +13167 -0
  196. package/src/data/messages/messages_legacy_v1.json +10282 -0
  197. package/src/data-manager/CoinManager.ts +31 -0
  198. package/src/data-manager/DataManager.ts +499 -0
  199. package/src/data-manager/MessagesConfig.ts +28 -0
  200. package/src/data-manager/TransportManager.ts +140 -0
  201. package/src/data-manager/connectSettings.ts +121 -0
  202. package/src/data-manager/index.ts +3 -0
  203. package/src/device/Device.ts +884 -0
  204. package/src/device/DeviceCommands.ts +631 -0
  205. package/src/device/DeviceConnector.ts +124 -0
  206. package/src/device/DeviceList.ts +39 -0
  207. package/src/device/DevicePool.ts +266 -0
  208. package/src/events/call.ts +95 -0
  209. package/src/events/core.ts +65 -0
  210. package/src/events/device.ts +92 -0
  211. package/src/events/firmware.ts +43 -0
  212. package/src/events/iframe.ts +55 -0
  213. package/src/events/index.ts +10 -0
  214. package/src/events/log.ts +23 -0
  215. package/src/events/logBlockEvent.ts +6 -0
  216. package/src/events/ui-promise.ts +14 -0
  217. package/src/events/ui-request.ts +216 -0
  218. package/src/events/ui-response.ts +59 -0
  219. package/src/events/utils.ts +19 -0
  220. package/src/index.ts +70 -0
  221. package/src/inject.ts +408 -0
  222. package/src/lowLevelInject.ts +61 -0
  223. package/src/topLevelInject.ts +62 -0
  224. package/src/types/api/alephiumGetAddress.ts +31 -0
  225. package/src/types/api/alephiumSignMessage.ts +14 -0
  226. package/src/types/api/alephiumSignTransaction.ts +18 -0
  227. package/src/types/api/algoGetAddress.ts +23 -0
  228. package/src/types/api/algoSignTransaction.ts +17 -0
  229. package/src/types/api/allNetworkGetAddress.ts +130 -0
  230. package/src/types/api/aptosGetAddress.ts +28 -0
  231. package/src/types/api/aptosGetPublicKey.ts +27 -0
  232. package/src/types/api/aptosSignInMessage.ts +17 -0
  233. package/src/types/api/aptosSignMessage.ts +26 -0
  234. package/src/types/api/aptosSignTransaction.ts +18 -0
  235. package/src/types/api/benfenGetAddress.ts +24 -0
  236. package/src/types/api/benfenGetPublicKey.ts +23 -0
  237. package/src/types/api/benfenSignMessage.ts +13 -0
  238. package/src/types/api/benfenSignTransaction.ts +19 -0
  239. package/src/types/api/btcGetAddress.ts +26 -0
  240. package/src/types/api/btcGetPublicKey.ts +26 -0
  241. package/src/types/api/btcSignMessage.ts +16 -0
  242. package/src/types/api/btcSignPsbt.ts +13 -0
  243. package/src/types/api/btcSignTransaction.ts +98 -0
  244. package/src/types/api/btcVerifyMessage.ts +15 -0
  245. package/src/types/api/cardano.ts +212 -0
  246. package/src/types/api/cardanoGetAddress.ts +49 -0
  247. package/src/types/api/cardanoGetPublicKey.ts +33 -0
  248. package/src/types/api/cardanoSignMessage.ts +31 -0
  249. package/src/types/api/cardanoSignTransaction.ts +8 -0
  250. package/src/types/api/checkAllFirmwareRelease.ts +34 -0
  251. package/src/types/api/checkBLEFirmwareRelease.ts +15 -0
  252. package/src/types/api/checkBootloaderRelease.ts +19 -0
  253. package/src/types/api/checkBridgeRelease.ts +14 -0
  254. package/src/types/api/checkBridgeStatus.ts +3 -0
  255. package/src/types/api/checkFirmwareRelease.ts +23 -0
  256. package/src/types/api/checkFirmwareTypeAvailable.ts +12 -0
  257. package/src/types/api/cipherKeyValue.ts +28 -0
  258. package/src/types/api/confluxGetAddress.ts +24 -0
  259. package/src/types/api/confluxSignMessage.ts +13 -0
  260. package/src/types/api/confluxSignMessageCIP23.ts +14 -0
  261. package/src/types/api/confluxSignTransaction.ts +32 -0
  262. package/src/types/api/cosmosGetAddress.ts +24 -0
  263. package/src/types/api/cosmosGetPublicKey.ts +28 -0
  264. package/src/types/api/cosmosSignTransaction.ts +17 -0
  265. package/src/types/api/deviceBackup.ts +4 -0
  266. package/src/types/api/deviceCancel.ts +4 -0
  267. package/src/types/api/deviceChangePin.ts +11 -0
  268. package/src/types/api/deviceFlags.ts +11 -0
  269. package/src/types/api/deviceFullyUploadResource.ts +15 -0
  270. package/src/types/api/deviceLock.ts +4 -0
  271. package/src/types/api/deviceRebootToBoardloader.ts +6 -0
  272. package/src/types/api/deviceRebootToBootloader.ts +4 -0
  273. package/src/types/api/deviceRecovery.ts +19 -0
  274. package/src/types/api/deviceReset.ts +20 -0
  275. package/src/types/api/deviceSettings.ts +23 -0
  276. package/src/types/api/deviceSupportFeatures.ts +6 -0
  277. package/src/types/api/deviceUnlock.ts +4 -0
  278. package/src/types/api/deviceUpdateBootloader.ts +13 -0
  279. package/src/types/api/deviceUpdateReboot.ts +3 -0
  280. package/src/types/api/deviceUploadResource.ts +21 -0
  281. package/src/types/api/deviceVerify.ts +15 -0
  282. package/src/types/api/deviceWipe.ts +4 -0
  283. package/src/types/api/dnxGetAddress.ts +23 -0
  284. package/src/types/api/dnxSignTransaction.ts +36 -0
  285. package/src/types/api/event.ts +8 -0
  286. package/src/types/api/evmGetAddress.ts +24 -0
  287. package/src/types/api/evmGetPublicKey.ts +36 -0
  288. package/src/types/api/evmSignMessage.ts +14 -0
  289. package/src/types/api/evmSignMessageEIP712.ts +14 -0
  290. package/src/types/api/evmSignTransaction.ts +80 -0
  291. package/src/types/api/evmSignTypedData.ts +42 -0
  292. package/src/types/api/evmVerifyMessage.ts +15 -0
  293. package/src/types/api/export.ts +194 -0
  294. package/src/types/api/filecoinGetAddress.ts +24 -0
  295. package/src/types/api/filecoinSignTransaction.ts +24 -0
  296. package/src/types/api/firmwareUpdate.ts +66 -0
  297. package/src/types/api/getFeatures.ts +4 -0
  298. package/src/types/api/getLogs.ts +3 -0
  299. package/src/types/api/getNextU2FCounter.ts +7 -0
  300. package/src/types/api/getOnetokenFeatures.ts +7 -0
  301. package/src/types/api/getPassphraseState.ts +6 -0
  302. package/src/types/api/index.ts +404 -0
  303. package/src/types/api/init.ts +11 -0
  304. package/src/types/api/kaspaGetAddress.ts +26 -0
  305. package/src/types/api/kaspaSignTransaction.ts +44 -0
  306. package/src/types/api/lnurlAuth.ts +22 -0
  307. package/src/types/api/nearGetAddress.ts +23 -0
  308. package/src/types/api/nearSignTransaction.ts +13 -0
  309. package/src/types/api/nemGetAddress.ts +24 -0
  310. package/src/types/api/nemSignTransaction.ts +118 -0
  311. package/src/types/api/neoGetAddress.ts +24 -0
  312. package/src/types/api/neoSignTransaction.ts +18 -0
  313. package/src/types/api/nervosGetAddress.ts +24 -0
  314. package/src/types/api/nervosSignTransaction.ts +19 -0
  315. package/src/types/api/nexaGetAddress.ts +26 -0
  316. package/src/types/api/nexaSignTransaction.ts +28 -0
  317. package/src/types/api/nostrDecryptMessage.ts +25 -0
  318. package/src/types/api/nostrEncryptMessage.ts +25 -0
  319. package/src/types/api/nostrGetPublicKey.ts +28 -0
  320. package/src/types/api/nostrSignEvent.ts +52 -0
  321. package/src/types/api/nostrSignSchnorr.ts +22 -0
  322. package/src/types/api/polkadotGetAddress.ts +30 -0
  323. package/src/types/api/polkadotSignTransaction.ts +19 -0
  324. package/src/types/api/promptWebDeviceAccess.ts +6 -0
  325. package/src/types/api/scdoGetAddress.ts +23 -0
  326. package/src/types/api/scdoSignMessage.ts +13 -0
  327. package/src/types/api/scdoSignTransaction.ts +24 -0
  328. package/src/types/api/searchDevices.ts +4 -0
  329. package/src/types/api/setU2FCounter.ts +7 -0
  330. package/src/types/api/solGetAddress.ts +23 -0
  331. package/src/types/api/solSignMessage.ts +17 -0
  332. package/src/types/api/solSignOffchainMessage.ts +24 -0
  333. package/src/types/api/solSignTransaction.ts +27 -0
  334. package/src/types/api/starcoinGetAddress.ts +23 -0
  335. package/src/types/api/starcoinGetPublicKey.ts +23 -0
  336. package/src/types/api/starcoinSignMessage.ts +13 -0
  337. package/src/types/api/starcoinSignTransaction.ts +13 -0
  338. package/src/types/api/starcoinVerifyMessage.ts +14 -0
  339. package/src/types/api/stellarGetAddress.ts +23 -0
  340. package/src/types/api/stellarSignTransaction.ts +154 -0
  341. package/src/types/api/suiGetAddress.ts +28 -0
  342. package/src/types/api/suiGetPublicKey.ts +27 -0
  343. package/src/types/api/suiSignMessage.ts +13 -0
  344. package/src/types/api/suiSignTransaction.ts +17 -0
  345. package/src/types/api/testInitializeDeviceDuration.ts +6 -0
  346. package/src/types/api/tonGetAddress.ts +34 -0
  347. package/src/types/api/tonSignMessage.ts +42 -0
  348. package/src/types/api/tonSignProof.ts +25 -0
  349. package/src/types/api/tronGetAddress.ts +23 -0
  350. package/src/types/api/tronSignMessage.ts +14 -0
  351. package/src/types/api/tronSignTransaction.ts +89 -0
  352. package/src/types/api/uiResponse.ts +3 -0
  353. package/src/types/api/xrpGetAddress.ts +28 -0
  354. package/src/types/api/xrpSignTransaction.ts +29 -0
  355. package/src/types/device.ts +194 -0
  356. package/src/types/firmware.ts +41 -0
  357. package/src/types/global.d.ts +3 -0
  358. package/src/types/index.ts +5 -0
  359. package/src/types/params.ts +64 -0
  360. package/src/types/settings.ts +144 -0
  361. package/src/utils/arrayUtils.ts +7 -0
  362. package/src/utils/assets.ts +5 -0
  363. package/src/utils/bridgeUpdate.ts +80 -0
  364. package/src/utils/capabilitieUtils.ts +12 -0
  365. package/src/utils/deviceFeaturesUtils.ts +352 -0
  366. package/src/utils/deviceInfoUtils.ts +167 -0
  367. package/src/utils/deviceSettings.ts +109 -0
  368. package/src/utils/deviceVersionUtils.ts +79 -0
  369. package/src/utils/findDefectiveBatchDevice.ts +39 -0
  370. package/src/utils/getMutex.ts +41 -0
  371. package/src/utils/getSynchronize.ts +25 -0
  372. package/src/utils/homescreen.ts +345 -0
  373. package/src/utils/index.ts +44 -0
  374. package/src/utils/logger.ts +190 -0
  375. package/src/utils/networkUtils.ts +25 -0
  376. package/src/utils/patch.ts +14 -0
  377. package/src/utils/promiseUtils.ts +4 -0
  378. package/src/utils/release.ts +42 -0
  379. package/src/utils/semver.test.js +53 -0
  380. package/src/utils/tracing.ts +238 -0
  381. package/src/utils/versionUtils.ts +120 -0
  382. package/tsconfig.json +11 -0
@@ -0,0 +1,78 @@
1
+ import { DataManager } from '../../data-manager';
2
+ import { DeviceModelToTypes, type Features } from '../../types';
3
+ import {
4
+ checkNeedUpdateBootForClassicAndMini,
5
+ checkNeedUpdateBootForTouch,
6
+ getDeviceType,
7
+ } from '../../utils';
8
+
9
+ import type { EFirmwareType } from '@onetokenfe/hd-shared';
10
+
11
+ export const getFirmwareReleaseInfo = (features: Features, firmwareType: EFirmwareType) => {
12
+ const firmwareStatus = DataManager.getFirmwareStatus(features, firmwareType);
13
+ const changelog = DataManager.getFirmwareChangelog(features, firmwareType);
14
+ const release = DataManager.getFirmwareLatestRelease(features, firmwareType);
15
+ const bootloaderMode = !!features.bootloader_mode;
16
+ return {
17
+ status: firmwareStatus,
18
+ changelog,
19
+ release,
20
+ bootloaderMode,
21
+ };
22
+ };
23
+
24
+ export const getBleFirmwareReleaseInfo = (features: Features) => {
25
+ const firmwareStatus = DataManager.getBLEFirmwareStatus(features);
26
+ const changelog = DataManager.getBleFirmwareChangelog(features);
27
+ const release = DataManager.getBleFirmwareLatestRelease(features);
28
+ const bootloaderMode = !!features.bootloader_mode;
29
+ return {
30
+ status: firmwareStatus,
31
+ changelog,
32
+ release,
33
+ bootloaderMode,
34
+ };
35
+ };
36
+
37
+ export const getBootloaderReleaseInfo = ({
38
+ features,
39
+ willUpdateFirmwareVersion,
40
+ firmwareType,
41
+ }: {
42
+ features: Features;
43
+ willUpdateFirmwareVersion?: string;
44
+ firmwareType: EFirmwareType;
45
+ }) => {
46
+ const release = DataManager.getFirmwareLatestRelease(features, firmwareType);
47
+ const changelog = [release?.bootloaderChangelog].filter(
48
+ item =>
49
+ item != null &&
50
+ typeof item === 'object' &&
51
+ Object.prototype.hasOwnProperty.call(item, 'zh-CN') &&
52
+ Object.prototype.hasOwnProperty.call(item, 'en-US')
53
+ );
54
+
55
+ const bootloaderMode = !!features.bootloader_mode;
56
+
57
+ let shouldUpdate = false;
58
+
59
+ const deviceType = getDeviceType(features);
60
+ // classic mini classic1s
61
+ if (DeviceModelToTypes.model_mini.includes(deviceType)) {
62
+ shouldUpdate = !!checkNeedUpdateBootForClassicAndMini({
63
+ features,
64
+ willUpdateFirmware: willUpdateFirmwareVersion,
65
+ firmwareType,
66
+ });
67
+ } else if (DeviceModelToTypes.model_touch.includes(deviceType)) {
68
+ shouldUpdate = checkNeedUpdateBootForTouch(features, firmwareType);
69
+ }
70
+
71
+ return {
72
+ status: shouldUpdate ? 'outdated' : 'valid',
73
+ changelog,
74
+ release,
75
+ bootloaderMode,
76
+ shouldUpdate,
77
+ };
78
+ };
@@ -0,0 +1,82 @@
1
+ import ByteBuffer from 'bytebuffer';
2
+ import semver from 'semver';
3
+
4
+ import { DeviceModelToTypes } from '../../types';
5
+ import { getDeviceBootloaderVersion, getDeviceFirmwareVersion, getDeviceType } from '../../utils';
6
+ import { DataManager } from '../../data-manager';
7
+ import { shouldUpdateBootloaderForClassicAndMini } from './bootloaderHelper';
8
+
9
+ import type { Features } from '../../types';
10
+ import type { EFirmwareType } from '@onetokenfe/hd-shared';
11
+
12
+ export function checkNeedUpdateBootForTouch(features: Features, firmwareType: EFirmwareType) {
13
+ const deviceType = getDeviceType(features);
14
+ if (!DeviceModelToTypes.model_touch.includes(deviceType)) return false;
15
+ const currentVersion = getDeviceFirmwareVersion(features).join('.');
16
+ const bootloaderVersion = getDeviceBootloaderVersion(features).join('.');
17
+ const targetBootloaderVersion = DataManager.getBootloaderTargetVersion(features, firmwareType);
18
+ if (!targetBootloaderVersion) return false;
19
+
20
+ return (
21
+ // support ResourceUpdate version 3.2.0
22
+ semver.gte(currentVersion, '3.2.0') &&
23
+ // support update bootloader version 4.1.0
24
+ semver.gte(currentVersion, '4.1.0') &&
25
+ // target bootloader version
26
+ semver.lte(bootloaderVersion, targetBootloaderVersion.join('.'))
27
+ );
28
+ }
29
+
30
+ export function checkNeedUpdateBootForClassicAndMini({
31
+ features,
32
+ willUpdateFirmware,
33
+ firmwareType,
34
+ }: {
35
+ features: Features;
36
+ willUpdateFirmware?: string;
37
+ firmwareType: EFirmwareType;
38
+ }) {
39
+ const deviceType = getDeviceType(features);
40
+ if (!DeviceModelToTypes.model_mini.includes(deviceType)) return false;
41
+ if (!willUpdateFirmware) return false;
42
+ const currentVersion = getDeviceFirmwareVersion(features).join('.');
43
+ const bootloaderVersion = getDeviceBootloaderVersion(features).join('.');
44
+ const targetBootloaderVersion = DataManager.getBootloaderTargetVersion(features, firmwareType);
45
+ if (targetBootloaderVersion && semver.gte(bootloaderVersion, targetBootloaderVersion.join('.'))) {
46
+ return false;
47
+ }
48
+
49
+ const bootloaderRelatedFirmwareVersion = DataManager.getBootloaderRelatedFirmwareVersion(
50
+ features,
51
+ firmwareType
52
+ );
53
+ if (!bootloaderRelatedFirmwareVersion) return false;
54
+
55
+ return shouldUpdateBootloaderForClassicAndMini({
56
+ currentVersion,
57
+ bootloaderVersion,
58
+ willUpdateFirmware,
59
+ targetBootloaderVersion,
60
+ bootloaderRelatedFirmwareVersion,
61
+ });
62
+ }
63
+
64
+ const INIT_DATA_CHUNK_SIZE = 16 * 1024;
65
+ export function checkBootloaderLength(data: ArrayBuffer) {
66
+ const chunk = new Uint8Array(data.slice(0, Math.min(INIT_DATA_CHUNK_SIZE, data.byteLength)));
67
+ const buffer = ByteBuffer.wrap(chunk, undefined, undefined, true);
68
+ buffer.LE();
69
+ // byte 'O', 'K', 'T', 'B'
70
+ buffer.readByte();
71
+ buffer.readByte();
72
+ buffer.readByte();
73
+ buffer.readByte();
74
+ // g_header_end - g_header
75
+ const hdrlen = buffer.readUint32();
76
+ // word 0
77
+ buffer.readUint32();
78
+ // codelen
79
+ const codelen = buffer.readUint32();
80
+ const bootloaderLength = hdrlen + codelen;
81
+ return bootloaderLength === data.byteLength;
82
+ }
@@ -0,0 +1,541 @@
1
+ import semver from 'semver';
2
+ import { blake2s } from '@noble/hashes/blake2s';
3
+ import JSZip from 'jszip';
4
+ import { ERRORS, HardwareErrorCode } from '@onetokenfe/hd-shared';
5
+
6
+ import { getDeviceFirmwareVersion } from '../../utils/deviceVersionUtils';
7
+ import {
8
+ LoggerNames,
9
+ getDeviceBootloaderVersion,
10
+ getDeviceType,
11
+ getLogger,
12
+ wait,
13
+ } from '../../utils';
14
+ import { DEVICE, UI_REQUEST, createUiMessage } from '../../events';
15
+ import { DeviceModelToTypes } from '../../types';
16
+ import { bytesToHex } from '../helpers/hexUtils';
17
+ import { DataManager } from '../../data-manager';
18
+ import { DevicePool } from '../../device/DevicePool';
19
+
20
+ import type { KnownDevice } from '../../types';
21
+ import type { TypedCall, TypedResponseMessage } from '../../device/DeviceCommands';
22
+ import type { PROTO } from '../../constants';
23
+ import type { CoreMessage, IFirmwareUpdateProgressType } from '../../events';
24
+ import type { Success } from '@onetokenfe/hd-transport';
25
+ import type { Device } from '../../device/Device';
26
+
27
+ const NEW_BOOT_UPRATE_FIRMWARE_VERSION = '2.4.5';
28
+ const SESSION_ERROR = 'session not found';
29
+ const FIRMWARE_UPDATE_CONFIRM = 'Firmware install confirmed';
30
+
31
+ const Log = getLogger(LoggerNames.Method);
32
+
33
+ const isDeviceDisconnectedError = (error: unknown) => {
34
+ const message = error instanceof Error ? error.message : String(error ?? '');
35
+ return (
36
+ message.includes('device was disconnected') ||
37
+ message.includes('transferIn') ||
38
+ message.includes('USBDevice')
39
+ );
40
+ };
41
+
42
+ const postConfirmationMessage = (device: Device) => {
43
+ // only if firmware is already installed. fresh device does not require button confirmation
44
+ if (device.features?.firmware_present) {
45
+ device.emit(DEVICE.BUTTON, device, { code: 'ButtonRequest_FirmwareUpdate' });
46
+ }
47
+ };
48
+
49
+ const postProgressMessage = (
50
+ device: Device,
51
+ progress: number,
52
+ progressType: IFirmwareUpdateProgressType,
53
+ postMessage: (message: CoreMessage) => void
54
+ ) => {
55
+ postMessage(
56
+ createUiMessage(UI_REQUEST.FIRMWARE_PROGRESS, {
57
+ device: device.toMessageObject() as KnownDevice,
58
+ progress,
59
+ progressType,
60
+ })
61
+ );
62
+ };
63
+
64
+ const postProcessingMessage = (
65
+ type: 'firmware' | 'ble' | 'bootloader' | 'resource',
66
+ postMessage: (message: CoreMessage) => void
67
+ ) => {
68
+ postMessage(
69
+ createUiMessage(UI_REQUEST.FIRMWARE_PROCESSING, {
70
+ type,
71
+ })
72
+ );
73
+ };
74
+
75
+ const postProgressTip = (
76
+ device: Device,
77
+ message: string,
78
+ postMessage: (message: CoreMessage) => void
79
+ ) => {
80
+ postMessage(
81
+ createUiMessage(UI_REQUEST.FIRMWARE_TIP, {
82
+ device: device.toMessageObject() as KnownDevice,
83
+ data: {
84
+ message,
85
+ },
86
+ })
87
+ );
88
+ };
89
+
90
+ export const waitBleInstall = async (updateType: string) => {
91
+ if (updateType === 'ble') {
92
+ // wait for device install
93
+ await wait(10 * 1000);
94
+ }
95
+ };
96
+
97
+ export const uploadFirmware = async (
98
+ updateType: 'firmware' | 'ble',
99
+ typedCall: TypedCall,
100
+ postMessage: (message: CoreMessage) => void,
101
+ device: Device,
102
+ {
103
+ payload,
104
+ rebootOnSuccess,
105
+ }: PROTO.FirmwareUpload & {
106
+ rebootOnSuccess?: boolean;
107
+ },
108
+ isUpdateBootloader?: boolean
109
+ ) => {
110
+ const deviceType = getDeviceType(device.features);
111
+ if (DeviceModelToTypes.model_mini.includes(deviceType)) {
112
+ postConfirmationMessage(device);
113
+ postProgressTip(device, 'ConfirmOnDevice', postMessage);
114
+
115
+ const isFirmware = updateType === 'firmware';
116
+
117
+ if (isFirmware && !isUpdateBootloader) {
118
+ const newFeatures = await typedCall('GetFeatures', 'Features', {});
119
+ const deviceBootloaderVersion = getDeviceBootloaderVersion(newFeatures.message).join('.');
120
+ const supportUpgradeFileHeader = semver.gte(deviceBootloaderVersion, '2.1.0');
121
+ Log.debug('supportUpgradeFileHeader:', supportUpgradeFileHeader);
122
+
123
+ if (supportUpgradeFileHeader) {
124
+ // Extract and validate firmware header (first 1KB)
125
+ const HEADER_SIZE = 1024;
126
+ if (payload.byteLength < HEADER_SIZE) {
127
+ throw ERRORS.TypedError(
128
+ HardwareErrorCode.RuntimeError,
129
+ `firmware payload too small: ${payload.byteLength} bytes, expected at least ${HEADER_SIZE} bytes`
130
+ );
131
+ }
132
+
133
+ Log.debug('Uploading firmware header:', {
134
+ size: HEADER_SIZE,
135
+ totalSize: payload.byteLength,
136
+ });
137
+ postProgressTip(device, 'UploadingFirmwareHeader', postMessage);
138
+
139
+ const header = new Uint8Array(payload.slice(0, HEADER_SIZE));
140
+
141
+ try {
142
+ const headerRes = await typedCall('UpgradeFileHeader', 'Success', {
143
+ data: bytesToHex(header),
144
+ });
145
+
146
+ const isUnknownMessage = headerRes.message?.message?.includes('Failure_UnknownMessage');
147
+
148
+ if (headerRes.type !== 'Success' && !isUnknownMessage) {
149
+ Log.error('Firmware header upload failed:', headerRes);
150
+ throw ERRORS.TypedError(
151
+ HardwareErrorCode.RuntimeError,
152
+ 'failed to upload firmware header'
153
+ );
154
+ }
155
+ } catch (error) {
156
+ Log.error('Firmware header upload failed:', error);
157
+ const message = error instanceof Error ? error.message : String(error ?? '');
158
+ if (!message.includes('Failure_UnknownMessage')) {
159
+ throw error;
160
+ }
161
+ }
162
+ Log.debug('Firmware header uploaded successfully');
163
+ }
164
+ }
165
+
166
+ const eraseCommand = isFirmware ? 'FirmwareErase' : 'FirmwareErase_ex';
167
+ const eraseRes = await typedCall(eraseCommand as unknown as any, 'Success', {});
168
+ if (eraseRes.type !== 'Success') {
169
+ throw ERRORS.TypedError(HardwareErrorCode.RuntimeError, 'erase firmware error');
170
+ }
171
+ postProgressTip(device, 'FirmwareEraseSuccess', postMessage);
172
+
173
+ postProgressMessage(device, 0, 'installingFirmware', postMessage);
174
+ let updateResponse: TypedResponseMessage<'Success'>;
175
+ try {
176
+ updateResponse = await typedCall('FirmwareUpload', 'Success', {
177
+ payload,
178
+ });
179
+ } catch (error) {
180
+ if (isDeviceDisconnectedError(error)) {
181
+ Log.log('Rebooting device');
182
+ updateResponse = {
183
+ type: 'Success',
184
+ message: { message: FIRMWARE_UPDATE_CONFIRM },
185
+ };
186
+ } else {
187
+ throw error;
188
+ }
189
+ }
190
+ postProgressMessage(device, 100, 'installingFirmware', postMessage);
191
+
192
+ await waitBleInstall(updateType);
193
+ if (updateResponse.type !== 'Success') {
194
+ throw ERRORS.TypedError(HardwareErrorCode.RuntimeError, 'install firmware error');
195
+ }
196
+ return updateResponse.message;
197
+ }
198
+
199
+ if (DeviceModelToTypes.model_touch.includes(deviceType)) {
200
+ if (device.features) {
201
+ const bootloaderVersion = getDeviceBootloaderVersion(device.features);
202
+ if (semver.gte(bootloaderVersion.join('.'), NEW_BOOT_UPRATE_FIRMWARE_VERSION)) {
203
+ const response = await newTouchUpdateProcess(
204
+ updateType,
205
+ postMessage,
206
+ device,
207
+ {
208
+ payload,
209
+ },
210
+ rebootOnSuccess
211
+ );
212
+ return response.message;
213
+ }
214
+ }
215
+
216
+ postConfirmationMessage(device);
217
+ postProgressTip(device, 'ConfirmOnDevice', postMessage);
218
+ const length = payload.byteLength;
219
+
220
+ let response = await typedCall('FirmwareErase', ['FirmwareRequest', 'Success'], { length });
221
+ postProgressTip(device, 'FirmwareEraseSuccess', postMessage);
222
+ while (response.type !== 'Success') {
223
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
224
+ const start = response.message.offset!;
225
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
226
+ const end = response.message.offset! + response.message.length!;
227
+ const chunk = payload.slice(start, end);
228
+
229
+ if (start > 0) {
230
+ postProgressMessage(
231
+ device,
232
+ Math.round((start / length) * 100),
233
+ 'transferData',
234
+ postMessage
235
+ );
236
+ }
237
+
238
+ response = await typedCall('FirmwareUpload', ['FirmwareRequest', 'Success'], {
239
+ payload: chunk,
240
+ });
241
+ // @ts-expect-error
242
+ if (response.type === 'CallMethodError') {
243
+ throw ERRORS.TypedError(HardwareErrorCode.RuntimeError, 'upload firmware error');
244
+ }
245
+ }
246
+
247
+ postProgressMessage(device, 100, 'transferData', postMessage);
248
+
249
+ await waitBleInstall(updateType);
250
+ return response.message;
251
+ }
252
+
253
+ throw ERRORS.TypedError(HardwareErrorCode.RuntimeError, 'uploadFirmware: unknown device model');
254
+ };
255
+
256
+ const newTouchUpdateProcess = async (
257
+ updateType: 'firmware' | 'ble',
258
+ postMessage: (message: CoreMessage) => void,
259
+ device: Device,
260
+ { payload }: PROTO.FirmwareUpload,
261
+ rebootOnSuccess = true
262
+ ) => {
263
+ let typedCall = device.getCommands().typedCall.bind(device.getCommands());
264
+ postProgressTip(device, 'StartTransferData', postMessage);
265
+ // Write File
266
+ const filePath = `0:${updateType === 'ble' ? 'ble-' : ''}firmware.bin`;
267
+ const env = DataManager.getSettings('env');
268
+ const perPackageSize = DataManager.isBleConnect(env) ? 16 : 128;
269
+ const chunkSize = 1024 * perPackageSize;
270
+ const totalChunks = Math.ceil(payload.byteLength / chunkSize);
271
+ let offset = 0;
272
+ for (let i = 0; i < totalChunks; i++) {
273
+ const chunkStart = i * chunkSize;
274
+ const chunkEnd = Math.min(chunkStart + chunkSize, payload.byteLength);
275
+ const chunkLength = chunkEnd - chunkStart;
276
+ const chunk = payload.slice(chunkStart, chunkEnd);
277
+ const overwrite = i === 0;
278
+ const progress = Math.round(((i + 1) / totalChunks) * 100);
279
+ const writeRes = await emmcFileWriteWithRetry(
280
+ device,
281
+ filePath,
282
+ chunkLength,
283
+ offset,
284
+ chunk,
285
+ overwrite,
286
+ progress
287
+ );
288
+ // @ts-expect-error
289
+ offset += writeRes.message.processed_byte;
290
+ postProgressMessage(device, progress, 'transferData', postMessage);
291
+ }
292
+
293
+ postConfirmationMessage(device);
294
+ postProgressTip(device, 'ConfirmOnDevice', postMessage);
295
+ postProgressTip(device, 'InstallingFirmware', postMessage);
296
+ typedCall = device.getCommands().typedCall.bind(device.getCommands());
297
+ // Firmware Update
298
+ let response: TypedResponseMessage<'Success'>;
299
+ try {
300
+ response = await typedCall('FirmwareUpdateEmmc', 'Success', {
301
+ path: filePath,
302
+ reboot_on_success: rebootOnSuccess,
303
+ });
304
+ } catch (error) {
305
+ if (isDeviceDisconnectedError(error)) {
306
+ Log.log('Rebooting device');
307
+ response = {
308
+ type: 'Success',
309
+ message: { message: FIRMWARE_UPDATE_CONFIRM },
310
+ } as TypedResponseMessage<'Success'>;
311
+ } else {
312
+ throw error;
313
+ }
314
+ }
315
+
316
+ if (
317
+ response.type === 'Success' &&
318
+ (response as any)?.message?.message === FIRMWARE_UPDATE_CONFIRM
319
+ ) {
320
+ const timeout = 2 * 60 * 1000;
321
+ // eslint-disable-next-line no-constant-condition
322
+ // Check if timeout exceeded
323
+ const startTime = Date.now();
324
+ const isBleReconnect = DataManager.isBleConnect(env);
325
+ while (Date.now() - startTime < timeout) {
326
+ try {
327
+ if (isBleReconnect) {
328
+ try {
329
+ await device.deviceConnector?.acquire(device.originalDescriptor.id, null, true);
330
+ const typedCall = device.getCommands().typedCall.bind(device.getCommands());
331
+ await Promise.race([
332
+ typedCall('Initialize', 'Features', {}),
333
+ new Promise((_, reject) => {
334
+ setTimeout(() => {
335
+ reject(ERRORS.TypedError(HardwareErrorCode.DeviceInitializeFailed));
336
+ }, 3000);
337
+ }),
338
+ ]);
339
+ } catch (e) {
340
+ // ignore error because of device is not connected
341
+ Log.log('catch Bluetooth error when device is restarting: ', e);
342
+ }
343
+ } else {
344
+ const deviceDiff = await device.deviceConnector?.enumerate();
345
+ const devicesDescriptor = deviceDiff?.descriptors ?? [];
346
+ const { deviceList } = await DevicePool.getDevices(
347
+ devicesDescriptor,
348
+ device.originalDescriptor.id
349
+ );
350
+ if (deviceList.length === 1) {
351
+ device.updateFromCache(deviceList[0]);
352
+ await device.acquire();
353
+ device.commands.disposed = false;
354
+ device.getCommands().mainId = device.mainId ?? '';
355
+ }
356
+ }
357
+ const typedCall = device.getCommands().typedCall.bind(device.getCommands());
358
+ await typedCall('GetFeatures', 'Features', {});
359
+ DevicePool.resetState();
360
+ break;
361
+ } catch (error) {
362
+ console.error('Device reconnect failed: ', error);
363
+ Log.error('Device reconnect failed:', error);
364
+ await wait(1000);
365
+ }
366
+ }
367
+ }
368
+ return response;
369
+ };
370
+
371
+ const emmcFileWriteWithRetry = async (
372
+ device: Device,
373
+ filePath: string,
374
+ chunkLength: number,
375
+ offset: number,
376
+ chunk: ArrayBuffer,
377
+ overwrite: boolean,
378
+ progress: number
379
+ ) => {
380
+ const writeFunc = async () => {
381
+ const typedCall = device.getCommands().typedCall.bind(device.getCommands());
382
+ // @ts-expect-error
383
+ const writeRes = await typedCall('EmmcFileWrite', 'EmmcFile', {
384
+ file: {
385
+ path: filePath,
386
+ len: chunkLength,
387
+ offset,
388
+ data: chunk,
389
+ },
390
+ overwrite,
391
+ append: offset !== 0,
392
+ ui_percentage: progress,
393
+ });
394
+ if (writeRes.type !== 'EmmcFile') {
395
+ // @ts-expect-error
396
+ if (writeRes.type === 'CallMethodError') {
397
+ if (((writeRes as any).message.error ?? '').indexOf(SESSION_ERROR) > -1) {
398
+ throw ERRORS.TypedError(HardwareErrorCode.RuntimeError, SESSION_ERROR);
399
+ }
400
+ }
401
+ throw ERRORS.TypedError(HardwareErrorCode.EmmcFileWriteFirmwareError, 'transfer data error');
402
+ }
403
+ return writeRes;
404
+ };
405
+
406
+ let retryCount = 10;
407
+ while (retryCount > 0) {
408
+ try {
409
+ const result = await writeFunc();
410
+ return result;
411
+ } catch (error) {
412
+ Log.error(`emmcWrite error: `, error);
413
+ retryCount--;
414
+ if (retryCount === 0) {
415
+ throw ERRORS.TypedError(
416
+ HardwareErrorCode.EmmcFileWriteFirmwareError,
417
+ 'transfer data error'
418
+ );
419
+ }
420
+ const env = DataManager.getSettings('env');
421
+ if (DataManager.isBleConnect(env)) {
422
+ await wait(3000);
423
+ await device.deviceConnector?.acquire(device.originalDescriptor.id, null, true);
424
+ await device.initialize();
425
+ } else if (
426
+ error?.message?.indexOf(SESSION_ERROR) > -1 ||
427
+ error?.response?.data?.indexOf(SESSION_ERROR) > -1
428
+ ) {
429
+ const deviceDiff = await device.deviceConnector?.enumerate();
430
+ const devicesDescriptor = deviceDiff?.descriptors ?? [];
431
+ const { deviceList } = await DevicePool.getDevices(devicesDescriptor, undefined);
432
+ if (deviceList.length === 1 && deviceList[0]?.features?.bootloader_mode) {
433
+ device.updateFromCache(deviceList[0]);
434
+ await device.acquire();
435
+ device.getCommands().mainId = device.mainId ?? '';
436
+ }
437
+ }
438
+ await wait(3000);
439
+ }
440
+ }
441
+ };
442
+
443
+ const INIT_DATA_CHUNK_SIZE = 16 * 1024;
444
+
445
+ const processResourceRequest = async (
446
+ typedCall: TypedCall,
447
+ res: TypedResponseMessage<'ResourceRequest'> | TypedResponseMessage<'Success'>,
448
+ data: ArrayBuffer
449
+ ): Promise<Success> => {
450
+ if (res.type === 'Success') {
451
+ return res.message;
452
+ }
453
+
454
+ const { offset, data_length } = res.message;
455
+
456
+ if (offset === undefined) {
457
+ throw new Error('offset is undefined');
458
+ }
459
+
460
+ const payload = new Uint8Array(
461
+ data.slice(offset, Math.min(offset + data_length, data.byteLength))
462
+ );
463
+ const digest = blake2s(payload);
464
+
465
+ const resourceAckParams = {
466
+ data_chunk: bytesToHex(payload),
467
+ hash: bytesToHex(digest),
468
+ };
469
+
470
+ const response = await typedCall('ResourceAck', ['ResourceRequest', 'Success'], {
471
+ ...resourceAckParams,
472
+ });
473
+ return processResourceRequest(typedCall, response, data);
474
+ };
475
+
476
+ // Fixed size
477
+ export const updateResource = async (
478
+ typedCall: TypedCall,
479
+ fileName: string,
480
+ data: ArrayBuffer,
481
+ onConfirmAfter?: () => void
482
+ ) => {
483
+ const chunk = new Uint8Array(data.slice(0, Math.min(INIT_DATA_CHUNK_SIZE, data.byteLength)));
484
+ const digest = blake2s(chunk);
485
+
486
+ const res = await typedCall('ResourceUpdate', ['ResourceRequest', 'Success'], {
487
+ file_name: fileName,
488
+ data_length: data.byteLength,
489
+ initial_data_chunk: bytesToHex(chunk),
490
+ hash: bytesToHex(digest),
491
+ });
492
+
493
+ onConfirmAfter?.();
494
+ return processResourceRequest(typedCall, res, data);
495
+ };
496
+
497
+ export const updateResources = async (
498
+ typedCall: TypedCall,
499
+ postMessage: (message: CoreMessage) => void,
500
+ device: Device,
501
+ source: ArrayBuffer
502
+ ) => {
503
+ postProgressTip(device, 'UpdateSysResource', postMessage);
504
+
505
+ const zipData = await JSZip.loadAsync(source);
506
+ const files = Object.entries(zipData.files);
507
+
508
+ let progress = 0;
509
+ const stepProgress = 100 / files.length;
510
+
511
+ for (const [fileName, file] of files) {
512
+ const name = fileName.split('/').pop();
513
+ if (!file.dir && fileName.indexOf('__MACOSX') === -1 && name) {
514
+ const data = await file.async('arraybuffer');
515
+ await updateResource(typedCall, name, data);
516
+ }
517
+
518
+ progress += stepProgress;
519
+ postProgressMessage(device, Math.floor(progress), 'installingFirmware', postMessage);
520
+ }
521
+
522
+ postProgressMessage(device, 100, 'installingFirmware', postMessage);
523
+ postProgressTip(device, 'UpdateSysResourceSuccess', postMessage);
524
+ return true;
525
+ };
526
+
527
+ export const updateBootloader = async (
528
+ typedCall: TypedCall,
529
+ postMessage: (message: CoreMessage) => void,
530
+ device: Device,
531
+ source: ArrayBuffer
532
+ ) => {
533
+ postProgressTip(device, 'UpdateBootloader', postMessage);
534
+ postProgressMessage(device, Math.floor(0), 'installingFirmware', postMessage);
535
+ await updateResource(typedCall, 'bootloader.bin', source, () => {
536
+ postProcessingMessage('resource', postMessage);
537
+ });
538
+ postProgressMessage(device, Math.floor(100), 'installingFirmware', postMessage);
539
+ postProgressTip(device, 'UpdateBootloaderSuccess', postMessage);
540
+ return true;
541
+ };