@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.
- package/.eslintrc +6 -0
- package/README.md +32 -0
- package/__tests__/benfen.test.ts +68 -0
- package/__tests__/checkBootloaderReleast.test.ts +115 -0
- package/__tests__/evmSignTransaction.test.ts +419 -0
- package/jest.config.js +6 -0
- package/package.json +48 -0
- package/src/api/BaseMethod.ts +275 -0
- package/src/api/CheckAllFirmwareRelease.ts +73 -0
- package/src/api/CheckBLEFirmwareRelease.ts +23 -0
- package/src/api/CheckBootloaderRelease.ts +32 -0
- package/src/api/CheckBridgeRelease.ts +28 -0
- package/src/api/CheckBridgeStatus.ts +32 -0
- package/src/api/CheckFirmwareRelease.ts +31 -0
- package/src/api/CheckFirmwareTypeAvailable.tsx +30 -0
- package/src/api/CipherKeyValue.ts +68 -0
- package/src/api/FirmwareUpdate.ts +219 -0
- package/src/api/FirmwareUpdateV2.ts +408 -0
- package/src/api/FirmwareUpdateV3.ts +560 -0
- package/src/api/GetFeatures.ts +23 -0
- package/src/api/GetLogs.ts +40 -0
- package/src/api/GetOnetokenFeatures.ts +25 -0
- package/src/api/GetPassphraseState.ts +28 -0
- package/src/api/PromptWebDeviceAccess.ts +77 -0
- package/src/api/SearchDevices.ts +50 -0
- package/src/api/alephium/AlephiumGetAddress.ts +84 -0
- package/src/api/alephium/AlephiumSignMessage.ts +51 -0
- package/src/api/alephium/AlephiumSignTransaction.ts +135 -0
- package/src/api/algo/AlgoGetAddress.ts +73 -0
- package/src/api/algo/AlgoSignTransaction.ts +52 -0
- package/src/api/allnetwork/AllNetworkGetAddress.ts +88 -0
- package/src/api/allnetwork/AllNetworkGetAddressBase.ts +529 -0
- package/src/api/allnetwork/AllNetworkGetAddressByLoop.ts +162 -0
- package/src/api/aptos/AptosGetAddress.ts +129 -0
- package/src/api/aptos/AptosGetPublicKey.ts +64 -0
- package/src/api/aptos/AptosSignInMessage.ts +55 -0
- package/src/api/aptos/AptosSignMessage.ts +79 -0
- package/src/api/aptos/AptosSignTransaction.ts +72 -0
- package/src/api/benfen/BenfenGetAddress.ts +122 -0
- package/src/api/benfen/BenfenGetPublicKey.ts +68 -0
- package/src/api/benfen/BenfenSignMessage.ts +50 -0
- package/src/api/benfen/BenfenSignTransaction.ts +105 -0
- package/src/api/benfen/normalize.ts +51 -0
- package/src/api/btc/BTCGetAddress.ts +91 -0
- package/src/api/btc/BTCGetPublicKey.ts +174 -0
- package/src/api/btc/BTCSignMessage.ts +73 -0
- package/src/api/btc/BTCSignPsbt.ts +65 -0
- package/src/api/btc/BTCSignTransaction.ts +148 -0
- package/src/api/btc/BTCVerifyMessage.ts +46 -0
- package/src/api/btc/helpers/btcParamsUtils.ts +64 -0
- package/src/api/btc/helpers/signtx.ts +251 -0
- package/src/api/btc/helpers/signtxLegacy.ts +227 -0
- package/src/api/btc/helpers/versionLimit.ts +25 -0
- package/src/api/btc/helpers/xpubUtils.ts +132 -0
- package/src/api/cardano/CardanoGetAddress.ts +139 -0
- package/src/api/cardano/CardanoGetPublicKey.ts +72 -0
- package/src/api/cardano/CardanoSignMessage.ts +73 -0
- package/src/api/cardano/CardanoSignTransaction.ts +404 -0
- package/src/api/cardano/helper/addressParameters.ts +120 -0
- package/src/api/cardano/helper/auxiliaryData.ts +133 -0
- package/src/api/cardano/helper/cardanoInputs.ts +55 -0
- package/src/api/cardano/helper/cardanoOutputs.ts +89 -0
- package/src/api/cardano/helper/certificate.ts +246 -0
- package/src/api/cardano/helper/token.ts +44 -0
- package/src/api/cardano/helper/utils.ts +17 -0
- package/src/api/cardano/helper/witnesses.ts +62 -0
- package/src/api/conflux/ConfluxGetAddress.ts +78 -0
- package/src/api/conflux/ConfluxSignMessage.ts +49 -0
- package/src/api/conflux/ConfluxSignMessageCIP23.ts +49 -0
- package/src/api/conflux/ConfluxSignTransaction.ts +135 -0
- package/src/api/cosmos/CosmosGetAddress.ts +80 -0
- package/src/api/cosmos/CosmosGetPublicKey.ts +77 -0
- package/src/api/cosmos/CosmosSignTransaction.ts +68 -0
- package/src/api/device/DeviceBackup.ts +15 -0
- package/src/api/device/DeviceCancel.ts +15 -0
- package/src/api/device/DeviceChangePin.ts +25 -0
- package/src/api/device/DeviceFlags.ts +26 -0
- package/src/api/device/DeviceFullyUploadResource.ts +80 -0
- package/src/api/device/DeviceLock.ts +15 -0
- package/src/api/device/DeviceRebootToBoardloader.ts +30 -0
- package/src/api/device/DeviceRebootToBootloader.ts +28 -0
- package/src/api/device/DeviceRecovery.ts +44 -0
- package/src/api/device/DeviceReset.ts +46 -0
- package/src/api/device/DeviceSettings.ts +96 -0
- package/src/api/device/DeviceSupportFeatures.ts +29 -0
- package/src/api/device/DeviceUnlock.ts +13 -0
- package/src/api/device/DeviceUpdateBootloader.ts +111 -0
- package/src/api/device/DeviceUpdateReboot.ts +17 -0
- package/src/api/device/DeviceUploadResource.ts +204 -0
- package/src/api/device/DeviceVerify.ts +65 -0
- package/src/api/device/DeviceWipe.ts +15 -0
- package/src/api/dynex/DnxGetAddress.ts +75 -0
- package/src/api/dynex/DnxSignTransaction.ts +126 -0
- package/src/api/evm/EVMGetAddress.ts +88 -0
- package/src/api/evm/EVMGetPublicKey.ts +116 -0
- package/src/api/evm/EVMSignMessage.ts +49 -0
- package/src/api/evm/EVMSignMessageEIP712.ts +56 -0
- package/src/api/evm/EVMSignTransaction.ts +141 -0
- package/src/api/evm/EVMSignTypedData.ts +477 -0
- package/src/api/evm/EVMVerifyMessage.ts +46 -0
- package/src/api/evm/latest/getAddress.ts +13 -0
- package/src/api/evm/latest/getPublicKey.ts +17 -0
- package/src/api/evm/latest/signMessage.ts +19 -0
- package/src/api/evm/latest/signTransaction.ts +303 -0
- package/src/api/evm/latest/signTypedData.ts +34 -0
- package/src/api/evm/latest/signTypedHash.ts +46 -0
- package/src/api/evm/latest/verifyMessage.ts +15 -0
- package/src/api/evm/legacyV1/getAddress.ts +16 -0
- package/src/api/evm/legacyV1/getPublicKey.ts +20 -0
- package/src/api/evm/legacyV1/signMessage.ts +22 -0
- package/src/api/evm/legacyV1/signTransaction.ts +37 -0
- package/src/api/evm/legacyV1/signTypedData.ts +37 -0
- package/src/api/evm/legacyV1/signTypedHash.ts +50 -0
- package/src/api/evm/legacyV1/verifyMessage.ts +19 -0
- package/src/api/filecoin/FilecoinGetAddress.ts +80 -0
- package/src/api/filecoin/FilecoinSignTransaction.ts +57 -0
- package/src/api/firmware/FirmwareUpdateBaseMethod.ts +476 -0
- package/src/api/firmware/bootloaderHelper.ts +46 -0
- package/src/api/firmware/getBinary.ts +99 -0
- package/src/api/firmware/releaseHelper.ts +78 -0
- package/src/api/firmware/updateBootloader.ts +82 -0
- package/src/api/firmware/uploadFirmware.ts +541 -0
- package/src/api/helpers/batchGetPublickeys.ts +84 -0
- package/src/api/helpers/bigNumberUtils.ts +58 -0
- package/src/api/helpers/hexUtils.ts +111 -0
- package/src/api/helpers/paramsValidator.ts +165 -0
- package/src/api/helpers/pathUtils.ts +145 -0
- package/src/api/helpers/stringUtils.ts +11 -0
- package/src/api/helpers/typeNameUtils.ts +137 -0
- package/src/api/index.ts +161 -0
- package/src/api/kaspa/KaspaGetAddress.ts +103 -0
- package/src/api/kaspa/KaspaSignTransaction.ts +182 -0
- package/src/api/kaspa/helpers/BufferWriter.ts +177 -0
- package/src/api/kaspa/helpers/HashWriter.ts +74 -0
- package/src/api/kaspa/helpers/SignatureType.ts +7 -0
- package/src/api/kaspa/helpers/TransferSerialize.ts +144 -0
- package/src/api/lightning/LnurlAuth.ts +52 -0
- package/src/api/near/NearGetAddress.ts +75 -0
- package/src/api/near/NearSignTransaction.ts +46 -0
- package/src/api/nem/NEMGetAddress.ts +72 -0
- package/src/api/nem/NEMSignTransaction.ts +251 -0
- package/src/api/neo/NeoGetAddress.ts +80 -0
- package/src/api/neo/NeoSignTransaction.ts +59 -0
- package/src/api/nervos/NervosGetAddress.ts +80 -0
- package/src/api/nervos/NervosSignTransaction.ts +116 -0
- package/src/api/nexa/NexaGetAddress.ts +88 -0
- package/src/api/nexa/NexaSignTransaction.ts +107 -0
- package/src/api/nostr/NostrDecryptMessage.ts +57 -0
- package/src/api/nostr/NostrEncryptMessage.ts +57 -0
- package/src/api/nostr/NostrGetPublicKey.ts +74 -0
- package/src/api/nostr/NostrSignEvent.ts +65 -0
- package/src/api/nostr/NostrSignSchnorr.ts +52 -0
- package/src/api/nostr/helper/index.ts +28 -0
- package/src/api/polkadot/PolkadotGetAddress.ts +83 -0
- package/src/api/polkadot/PolkadotSignTransaction.ts +53 -0
- package/src/api/polkadot/networks.ts +72 -0
- package/src/api/scdo/ScdoGetAddress.ts +76 -0
- package/src/api/scdo/ScdoSignMessage.ts +45 -0
- package/src/api/scdo/ScdoSignTransaction.ts +106 -0
- package/src/api/solana/SolGetAddress.ts +68 -0
- package/src/api/solana/SolSignMessage.ts +61 -0
- package/src/api/solana/SolSignOffchainMessage.ts +61 -0
- package/src/api/solana/SolSignTransaction.ts +108 -0
- package/src/api/starcoin/StarcoinGetAddress.ts +69 -0
- package/src/api/starcoin/StarcoinGetPublicKey.ts +70 -0
- package/src/api/starcoin/StarcoinSignMessage.ts +42 -0
- package/src/api/starcoin/StarcoinSignTransaction.ts +38 -0
- package/src/api/starcoin/StarcoinVerifyMessage.ts +35 -0
- package/src/api/stellar/StellarGetAddress.ts +68 -0
- package/src/api/stellar/StellarSignTransaction.ts +220 -0
- package/src/api/sui/SuiGetAddress.ts +117 -0
- package/src/api/sui/SuiGetPublicKey.ts +66 -0
- package/src/api/sui/SuiSignMessage.ts +48 -0
- package/src/api/sui/SuiSignTransaction.ts +126 -0
- package/src/api/sui/normalize.ts +28 -0
- package/src/api/test/TestInitializeDeviceDuration.ts +22 -0
- package/src/api/ton/TonGetAddress.ts +96 -0
- package/src/api/ton/TonSignMessage.ts +217 -0
- package/src/api/ton/TonSignProof.ts +62 -0
- package/src/api/tron/TronGetAddress.ts +75 -0
- package/src/api/tron/TronSignMessage.ts +89 -0
- package/src/api/tron/TronSignTransaction.ts +214 -0
- package/src/api/u2f/GetNextU2FCounter.ts +15 -0
- package/src/api/u2f/SetU2FCounter.ts +19 -0
- package/src/api/utils.ts +23 -0
- package/src/api/xrp/XrpGetAddress.ts +96 -0
- package/src/api/xrp/XrpSignTransaction.ts +71 -0
- package/src/constants/errors.ts +15 -0
- package/src/constants/index.ts +2 -0
- package/src/constants/ui-request.ts +3 -0
- package/src/core/RequestQueue.ts +134 -0
- package/src/core/index.ts +1320 -0
- package/src/data/coins/bitcoin.json +44 -0
- package/src/data/config.ts +25 -0
- package/src/data/messages/messages.json +13167 -0
- package/src/data/messages/messages_legacy_v1.json +10282 -0
- package/src/data-manager/CoinManager.ts +31 -0
- package/src/data-manager/DataManager.ts +499 -0
- package/src/data-manager/MessagesConfig.ts +28 -0
- package/src/data-manager/TransportManager.ts +140 -0
- package/src/data-manager/connectSettings.ts +121 -0
- package/src/data-manager/index.ts +3 -0
- package/src/device/Device.ts +884 -0
- package/src/device/DeviceCommands.ts +631 -0
- package/src/device/DeviceConnector.ts +124 -0
- package/src/device/DeviceList.ts +39 -0
- package/src/device/DevicePool.ts +266 -0
- package/src/events/call.ts +95 -0
- package/src/events/core.ts +65 -0
- package/src/events/device.ts +92 -0
- package/src/events/firmware.ts +43 -0
- package/src/events/iframe.ts +55 -0
- package/src/events/index.ts +10 -0
- package/src/events/log.ts +23 -0
- package/src/events/logBlockEvent.ts +6 -0
- package/src/events/ui-promise.ts +14 -0
- package/src/events/ui-request.ts +216 -0
- package/src/events/ui-response.ts +59 -0
- package/src/events/utils.ts +19 -0
- package/src/index.ts +70 -0
- package/src/inject.ts +408 -0
- package/src/lowLevelInject.ts +61 -0
- package/src/topLevelInject.ts +62 -0
- package/src/types/api/alephiumGetAddress.ts +31 -0
- package/src/types/api/alephiumSignMessage.ts +14 -0
- package/src/types/api/alephiumSignTransaction.ts +18 -0
- package/src/types/api/algoGetAddress.ts +23 -0
- package/src/types/api/algoSignTransaction.ts +17 -0
- package/src/types/api/allNetworkGetAddress.ts +130 -0
- package/src/types/api/aptosGetAddress.ts +28 -0
- package/src/types/api/aptosGetPublicKey.ts +27 -0
- package/src/types/api/aptosSignInMessage.ts +17 -0
- package/src/types/api/aptosSignMessage.ts +26 -0
- package/src/types/api/aptosSignTransaction.ts +18 -0
- package/src/types/api/benfenGetAddress.ts +24 -0
- package/src/types/api/benfenGetPublicKey.ts +23 -0
- package/src/types/api/benfenSignMessage.ts +13 -0
- package/src/types/api/benfenSignTransaction.ts +19 -0
- package/src/types/api/btcGetAddress.ts +26 -0
- package/src/types/api/btcGetPublicKey.ts +26 -0
- package/src/types/api/btcSignMessage.ts +16 -0
- package/src/types/api/btcSignPsbt.ts +13 -0
- package/src/types/api/btcSignTransaction.ts +98 -0
- package/src/types/api/btcVerifyMessage.ts +15 -0
- package/src/types/api/cardano.ts +212 -0
- package/src/types/api/cardanoGetAddress.ts +49 -0
- package/src/types/api/cardanoGetPublicKey.ts +33 -0
- package/src/types/api/cardanoSignMessage.ts +31 -0
- package/src/types/api/cardanoSignTransaction.ts +8 -0
- package/src/types/api/checkAllFirmwareRelease.ts +34 -0
- package/src/types/api/checkBLEFirmwareRelease.ts +15 -0
- package/src/types/api/checkBootloaderRelease.ts +19 -0
- package/src/types/api/checkBridgeRelease.ts +14 -0
- package/src/types/api/checkBridgeStatus.ts +3 -0
- package/src/types/api/checkFirmwareRelease.ts +23 -0
- package/src/types/api/checkFirmwareTypeAvailable.ts +12 -0
- package/src/types/api/cipherKeyValue.ts +28 -0
- package/src/types/api/confluxGetAddress.ts +24 -0
- package/src/types/api/confluxSignMessage.ts +13 -0
- package/src/types/api/confluxSignMessageCIP23.ts +14 -0
- package/src/types/api/confluxSignTransaction.ts +32 -0
- package/src/types/api/cosmosGetAddress.ts +24 -0
- package/src/types/api/cosmosGetPublicKey.ts +28 -0
- package/src/types/api/cosmosSignTransaction.ts +17 -0
- package/src/types/api/deviceBackup.ts +4 -0
- package/src/types/api/deviceCancel.ts +4 -0
- package/src/types/api/deviceChangePin.ts +11 -0
- package/src/types/api/deviceFlags.ts +11 -0
- package/src/types/api/deviceFullyUploadResource.ts +15 -0
- package/src/types/api/deviceLock.ts +4 -0
- package/src/types/api/deviceRebootToBoardloader.ts +6 -0
- package/src/types/api/deviceRebootToBootloader.ts +4 -0
- package/src/types/api/deviceRecovery.ts +19 -0
- package/src/types/api/deviceReset.ts +20 -0
- package/src/types/api/deviceSettings.ts +23 -0
- package/src/types/api/deviceSupportFeatures.ts +6 -0
- package/src/types/api/deviceUnlock.ts +4 -0
- package/src/types/api/deviceUpdateBootloader.ts +13 -0
- package/src/types/api/deviceUpdateReboot.ts +3 -0
- package/src/types/api/deviceUploadResource.ts +21 -0
- package/src/types/api/deviceVerify.ts +15 -0
- package/src/types/api/deviceWipe.ts +4 -0
- package/src/types/api/dnxGetAddress.ts +23 -0
- package/src/types/api/dnxSignTransaction.ts +36 -0
- package/src/types/api/event.ts +8 -0
- package/src/types/api/evmGetAddress.ts +24 -0
- package/src/types/api/evmGetPublicKey.ts +36 -0
- package/src/types/api/evmSignMessage.ts +14 -0
- package/src/types/api/evmSignMessageEIP712.ts +14 -0
- package/src/types/api/evmSignTransaction.ts +80 -0
- package/src/types/api/evmSignTypedData.ts +42 -0
- package/src/types/api/evmVerifyMessage.ts +15 -0
- package/src/types/api/export.ts +194 -0
- package/src/types/api/filecoinGetAddress.ts +24 -0
- package/src/types/api/filecoinSignTransaction.ts +24 -0
- package/src/types/api/firmwareUpdate.ts +66 -0
- package/src/types/api/getFeatures.ts +4 -0
- package/src/types/api/getLogs.ts +3 -0
- package/src/types/api/getNextU2FCounter.ts +7 -0
- package/src/types/api/getOnetokenFeatures.ts +7 -0
- package/src/types/api/getPassphraseState.ts +6 -0
- package/src/types/api/index.ts +404 -0
- package/src/types/api/init.ts +11 -0
- package/src/types/api/kaspaGetAddress.ts +26 -0
- package/src/types/api/kaspaSignTransaction.ts +44 -0
- package/src/types/api/lnurlAuth.ts +22 -0
- package/src/types/api/nearGetAddress.ts +23 -0
- package/src/types/api/nearSignTransaction.ts +13 -0
- package/src/types/api/nemGetAddress.ts +24 -0
- package/src/types/api/nemSignTransaction.ts +118 -0
- package/src/types/api/neoGetAddress.ts +24 -0
- package/src/types/api/neoSignTransaction.ts +18 -0
- package/src/types/api/nervosGetAddress.ts +24 -0
- package/src/types/api/nervosSignTransaction.ts +19 -0
- package/src/types/api/nexaGetAddress.ts +26 -0
- package/src/types/api/nexaSignTransaction.ts +28 -0
- package/src/types/api/nostrDecryptMessage.ts +25 -0
- package/src/types/api/nostrEncryptMessage.ts +25 -0
- package/src/types/api/nostrGetPublicKey.ts +28 -0
- package/src/types/api/nostrSignEvent.ts +52 -0
- package/src/types/api/nostrSignSchnorr.ts +22 -0
- package/src/types/api/polkadotGetAddress.ts +30 -0
- package/src/types/api/polkadotSignTransaction.ts +19 -0
- package/src/types/api/promptWebDeviceAccess.ts +6 -0
- package/src/types/api/scdoGetAddress.ts +23 -0
- package/src/types/api/scdoSignMessage.ts +13 -0
- package/src/types/api/scdoSignTransaction.ts +24 -0
- package/src/types/api/searchDevices.ts +4 -0
- package/src/types/api/setU2FCounter.ts +7 -0
- package/src/types/api/solGetAddress.ts +23 -0
- package/src/types/api/solSignMessage.ts +17 -0
- package/src/types/api/solSignOffchainMessage.ts +24 -0
- package/src/types/api/solSignTransaction.ts +27 -0
- package/src/types/api/starcoinGetAddress.ts +23 -0
- package/src/types/api/starcoinGetPublicKey.ts +23 -0
- package/src/types/api/starcoinSignMessage.ts +13 -0
- package/src/types/api/starcoinSignTransaction.ts +13 -0
- package/src/types/api/starcoinVerifyMessage.ts +14 -0
- package/src/types/api/stellarGetAddress.ts +23 -0
- package/src/types/api/stellarSignTransaction.ts +154 -0
- package/src/types/api/suiGetAddress.ts +28 -0
- package/src/types/api/suiGetPublicKey.ts +27 -0
- package/src/types/api/suiSignMessage.ts +13 -0
- package/src/types/api/suiSignTransaction.ts +17 -0
- package/src/types/api/testInitializeDeviceDuration.ts +6 -0
- package/src/types/api/tonGetAddress.ts +34 -0
- package/src/types/api/tonSignMessage.ts +42 -0
- package/src/types/api/tonSignProof.ts +25 -0
- package/src/types/api/tronGetAddress.ts +23 -0
- package/src/types/api/tronSignMessage.ts +14 -0
- package/src/types/api/tronSignTransaction.ts +89 -0
- package/src/types/api/uiResponse.ts +3 -0
- package/src/types/api/xrpGetAddress.ts +28 -0
- package/src/types/api/xrpSignTransaction.ts +29 -0
- package/src/types/device.ts +194 -0
- package/src/types/firmware.ts +41 -0
- package/src/types/global.d.ts +3 -0
- package/src/types/index.ts +5 -0
- package/src/types/params.ts +64 -0
- package/src/types/settings.ts +144 -0
- package/src/utils/arrayUtils.ts +7 -0
- package/src/utils/assets.ts +5 -0
- package/src/utils/bridgeUpdate.ts +80 -0
- package/src/utils/capabilitieUtils.ts +12 -0
- package/src/utils/deviceFeaturesUtils.ts +352 -0
- package/src/utils/deviceInfoUtils.ts +167 -0
- package/src/utils/deviceSettings.ts +109 -0
- package/src/utils/deviceVersionUtils.ts +79 -0
- package/src/utils/findDefectiveBatchDevice.ts +39 -0
- package/src/utils/getMutex.ts +41 -0
- package/src/utils/getSynchronize.ts +25 -0
- package/src/utils/homescreen.ts +345 -0
- package/src/utils/index.ts +44 -0
- package/src/utils/logger.ts +190 -0
- package/src/utils/networkUtils.ts +25 -0
- package/src/utils/patch.ts +14 -0
- package/src/utils/promiseUtils.ts +4 -0
- package/src/utils/release.ts +42 -0
- package/src/utils/semver.test.js +53 -0
- package/src/utils/tracing.ts +238 -0
- package/src/utils/versionUtils.ts +120 -0
- 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
|
+
};
|