@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,190 @@
|
|
|
1
|
+
import { LOG, createLogMessage } from '../events/log';
|
|
2
|
+
|
|
3
|
+
import type { CoreMessage } from '../events';
|
|
4
|
+
|
|
5
|
+
type LogMessage = {
|
|
6
|
+
level: string;
|
|
7
|
+
prefix: string;
|
|
8
|
+
message: any[];
|
|
9
|
+
timestamp: number;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const MAX_ENTRIES = 500;
|
|
13
|
+
|
|
14
|
+
let postMessage: (message: CoreMessage) => void;
|
|
15
|
+
|
|
16
|
+
class Log {
|
|
17
|
+
prefix: string;
|
|
18
|
+
|
|
19
|
+
enabled: boolean;
|
|
20
|
+
|
|
21
|
+
messages: LogMessage[];
|
|
22
|
+
|
|
23
|
+
constructor(prefix: string, enabled: boolean) {
|
|
24
|
+
this.prefix = prefix;
|
|
25
|
+
this.enabled = enabled;
|
|
26
|
+
this.messages = [];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
addMessage(level: string, prefix: string, ...args: any[]) {
|
|
30
|
+
this.messages.push({
|
|
31
|
+
level,
|
|
32
|
+
prefix,
|
|
33
|
+
message: args,
|
|
34
|
+
timestamp: new Date().getTime(),
|
|
35
|
+
});
|
|
36
|
+
if (this.messages.length > MAX_ENTRIES) {
|
|
37
|
+
this.messages.shift();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
log(...args: any[]) {
|
|
42
|
+
this.addMessage('log', this.prefix, ...args);
|
|
43
|
+
sendLogMessage(this.prefix, ...args);
|
|
44
|
+
if (!this.enabled) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
console.log(this.prefix, ...args);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
error(...args: any[]) {
|
|
51
|
+
this.addMessage('error', this.prefix, ...args);
|
|
52
|
+
sendLogMessage(this.prefix, ...args);
|
|
53
|
+
if (!this.enabled) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
console.error(this.prefix, ...args);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
warn(...args: any[]) {
|
|
60
|
+
this.addMessage('warn', this.prefix, ...args);
|
|
61
|
+
sendLogMessage(this.prefix, ...args);
|
|
62
|
+
if (!this.enabled) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
console.warn(this.prefix, ...args);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
debug(...args: any[]) {
|
|
69
|
+
this.addMessage('debug', this.prefix, ...args);
|
|
70
|
+
sendLogMessage(this.prefix, ...args);
|
|
71
|
+
if (!this.enabled) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
console.log(this.prefix, ...args);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const _logs: { [k: string]: Log } = {};
|
|
79
|
+
|
|
80
|
+
export const initLog = (prefix: string, enabled?: boolean) => {
|
|
81
|
+
const instance = new Log(prefix, !!enabled);
|
|
82
|
+
_logs[prefix] = instance;
|
|
83
|
+
return instance;
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export const enableLog = (enabled?: boolean) => {
|
|
87
|
+
Object.keys(_logs).forEach(key => {
|
|
88
|
+
_logs[key].enabled = !!enabled;
|
|
89
|
+
});
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
export const enableLogByPrefix = (prefix: string, enabled: boolean) => {
|
|
93
|
+
if (_logs[prefix]) {
|
|
94
|
+
_logs[prefix].enabled = enabled;
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
export const getLog = () => {
|
|
99
|
+
let logs: LogMessage[] = [];
|
|
100
|
+
Object.keys(_logs).forEach(key => {
|
|
101
|
+
logs = logs.concat(_logs[key].messages);
|
|
102
|
+
});
|
|
103
|
+
logs.sort((a, b) => a.timestamp - b.timestamp);
|
|
104
|
+
return logs;
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
export const setLoggerPostMessage = (postMessageFn: (message: CoreMessage) => void) => {
|
|
108
|
+
postMessage = postMessageFn;
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
const serializeLog = (...args: any[]) =>
|
|
112
|
+
args.map(arg => {
|
|
113
|
+
if (typeof arg === 'string') {
|
|
114
|
+
return arg;
|
|
115
|
+
}
|
|
116
|
+
if (typeof arg === 'number') {
|
|
117
|
+
return arg;
|
|
118
|
+
}
|
|
119
|
+
if (typeof arg === 'boolean') {
|
|
120
|
+
return arg;
|
|
121
|
+
}
|
|
122
|
+
if (typeof arg === 'undefined') {
|
|
123
|
+
return arg;
|
|
124
|
+
}
|
|
125
|
+
if (typeof arg === 'object') {
|
|
126
|
+
return JSON.stringify(arg, getCircularReplacer());
|
|
127
|
+
}
|
|
128
|
+
return arg;
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
const getCircularReplacer = () => {
|
|
132
|
+
const seen = new WeakSet();
|
|
133
|
+
return (_: string, value: any) => {
|
|
134
|
+
if (typeof value === 'object' && value !== null) {
|
|
135
|
+
if (seen.has(value)) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
seen.add(value);
|
|
139
|
+
}
|
|
140
|
+
return value;
|
|
141
|
+
};
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
const sendLogMessage = (prefix: string, ...args: any[]) => {
|
|
145
|
+
postMessage?.(createLogMessage(LOG.OUTPUT, serializeLog(prefix, ...args)));
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
export enum LoggerNames {
|
|
149
|
+
Core = '@onetoken/hd-core',
|
|
150
|
+
Transport = 'Transport',
|
|
151
|
+
Device = 'Device',
|
|
152
|
+
DeviceCommands = 'DeviceCommands',
|
|
153
|
+
DeviceConnector = 'DeviceConnector',
|
|
154
|
+
DeviceList = 'DeviceList',
|
|
155
|
+
DevicePool = 'DevicePool',
|
|
156
|
+
HdCommonConnectSdk = '@onetoken/common-connect-sdk',
|
|
157
|
+
HdBleSdk = '@onetoken/hd-ble-sdk',
|
|
158
|
+
HdTransportHttp = '@onetoken/hd-transport-http',
|
|
159
|
+
HdTransportLowLevel = '@onetoken/hd-transport-lowlevel',
|
|
160
|
+
HdBleTransport = '@onetoken/hd-ble-transport',
|
|
161
|
+
HdWebBleTransport = '@onetoken/hd-web-ble-transport',
|
|
162
|
+
HdTransportWebUsb = '@onetoken/hd-transport-webusb',
|
|
163
|
+
Connect = '@onetoken/connect',
|
|
164
|
+
Iframe = 'IFrame',
|
|
165
|
+
SendMessage = '[SendMessage]',
|
|
166
|
+
Method = '[Method]',
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export const LoggerMap = {
|
|
170
|
+
[LoggerNames.Core]: initLog(LoggerNames.Core),
|
|
171
|
+
[LoggerNames.Transport]: initLog(LoggerNames.Transport),
|
|
172
|
+
[LoggerNames.Device]: initLog(LoggerNames.Device),
|
|
173
|
+
[LoggerNames.DeviceCommands]: initLog(LoggerNames.DeviceCommands),
|
|
174
|
+
[LoggerNames.DeviceConnector]: initLog(LoggerNames.DeviceConnector),
|
|
175
|
+
[LoggerNames.DeviceList]: initLog(LoggerNames.DeviceList),
|
|
176
|
+
[LoggerNames.DevicePool]: initLog(LoggerNames.DevicePool),
|
|
177
|
+
[LoggerNames.HdBleSdk]: initLog(LoggerNames.HdBleSdk),
|
|
178
|
+
[LoggerNames.HdTransportHttp]: initLog(LoggerNames.HdTransportHttp),
|
|
179
|
+
[LoggerNames.HdBleTransport]: initLog(LoggerNames.HdBleTransport),
|
|
180
|
+
[LoggerNames.HdWebBleTransport]: initLog(LoggerNames.HdWebBleTransport),
|
|
181
|
+
[LoggerNames.HdTransportLowLevel]: initLog(LoggerNames.HdTransportLowLevel),
|
|
182
|
+
[LoggerNames.HdTransportWebUsb]: initLog(LoggerNames.HdTransportWebUsb),
|
|
183
|
+
[LoggerNames.Connect]: initLog(LoggerNames.Connect),
|
|
184
|
+
[LoggerNames.Iframe]: initLog(LoggerNames.Iframe),
|
|
185
|
+
[LoggerNames.SendMessage]: initLog(LoggerNames.SendMessage),
|
|
186
|
+
[LoggerNames.Method]: initLog(LoggerNames.Method),
|
|
187
|
+
[LoggerNames.HdCommonConnectSdk]: initLog(LoggerNames.Method),
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
export const getLogger = (key: LoggerNames) => LoggerMap[key];
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
|
|
3
|
+
export const httpRequest = async (url: string, type = 'text') => {
|
|
4
|
+
const headers: any = {};
|
|
5
|
+
if (url.indexOf('ngrok-free.app') > -1) {
|
|
6
|
+
headers['ngrok-skip-browser-warning'] = true;
|
|
7
|
+
}
|
|
8
|
+
const response = await axios.request({
|
|
9
|
+
url,
|
|
10
|
+
withCredentials: false,
|
|
11
|
+
responseType: type === 'binary' ? 'arraybuffer' : 'json',
|
|
12
|
+
headers,
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
if (+response.status === 200) {
|
|
16
|
+
if (type === 'json') {
|
|
17
|
+
return response.data;
|
|
18
|
+
}
|
|
19
|
+
if (type === 'binary') {
|
|
20
|
+
return response.data;
|
|
21
|
+
}
|
|
22
|
+
return response.data;
|
|
23
|
+
}
|
|
24
|
+
throw new Error(`httpRequest error: ${url} ${response.statusText}`);
|
|
25
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { DefaultMessageResponse } from '../device/DeviceCommands';
|
|
2
|
+
|
|
3
|
+
export function patchFeatures(response: DefaultMessageResponse) {
|
|
4
|
+
if (response.type !== 'Features') {
|
|
5
|
+
return response;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
// Bootloader 小于 1.8.7 时 major_version 可能小于 0,需要转换为 1
|
|
9
|
+
if (response.message.major_version < 1) {
|
|
10
|
+
response.message.major_version = 1;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
return response;
|
|
14
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import semver from 'semver';
|
|
2
|
+
|
|
3
|
+
import type {
|
|
4
|
+
IBLEFirmwareReleaseInfo,
|
|
5
|
+
IDeviceFirmwareStatus,
|
|
6
|
+
IFirmwareReleaseInfo,
|
|
7
|
+
IVersionArray,
|
|
8
|
+
} from '../types';
|
|
9
|
+
|
|
10
|
+
export const getReleaseStatus = (
|
|
11
|
+
releases: (IFirmwareReleaseInfo | IBLEFirmwareReleaseInfo)[],
|
|
12
|
+
currentVersion: string
|
|
13
|
+
): IDeviceFirmwareStatus => {
|
|
14
|
+
const newVersions = releases.filter(r => semver.gt(r.version.join('.'), currentVersion));
|
|
15
|
+
if (newVersions.length === 0) {
|
|
16
|
+
return 'valid';
|
|
17
|
+
}
|
|
18
|
+
if (newVersions.some(r => r.required)) {
|
|
19
|
+
return 'required';
|
|
20
|
+
}
|
|
21
|
+
return 'outdated';
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export const getReleaseChangelog = (
|
|
25
|
+
releases: (IFirmwareReleaseInfo | IBLEFirmwareReleaseInfo)[],
|
|
26
|
+
currentVersion: string
|
|
27
|
+
): IFirmwareReleaseInfo['changelog'][] => {
|
|
28
|
+
const newVersions = releases.filter(r => semver.gt(r.version.join('.'), currentVersion));
|
|
29
|
+
return newVersions.map(r => r.changelog);
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export const findLatestRelease = <T extends { version: IVersionArray }>(
|
|
33
|
+
releases: T[]
|
|
34
|
+
): T | undefined => {
|
|
35
|
+
let leastRelease = releases[0];
|
|
36
|
+
releases.forEach(release => {
|
|
37
|
+
if (semver.gt(release.version.join('.'), leastRelease.version.join('.'))) {
|
|
38
|
+
leastRelease = release;
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
return leastRelease;
|
|
42
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import semver from 'semver';
|
|
2
|
+
|
|
3
|
+
const semverTest = [
|
|
4
|
+
{
|
|
5
|
+
description: 'success - normal version',
|
|
6
|
+
version: '2.10.0',
|
|
7
|
+
expected: '2.10.0',
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
description: 'success - 0.0.0 version',
|
|
11
|
+
version: '0.0.0',
|
|
12
|
+
expected: '0.0.0',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
description: 'error - 0 version',
|
|
16
|
+
version: '0',
|
|
17
|
+
expected: null,
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
description: 'error - unnecessary version',
|
|
21
|
+
version: '2.10.0 QA',
|
|
22
|
+
expected: null,
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
description: 'error - normal version',
|
|
26
|
+
version: '2.10',
|
|
27
|
+
expected: null,
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
description: 'error - null version',
|
|
31
|
+
version: null,
|
|
32
|
+
expected: null,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
description: 'error - empty version',
|
|
36
|
+
version: '',
|
|
37
|
+
expected: null,
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
description: 'error - undefined version',
|
|
41
|
+
version: undefined,
|
|
42
|
+
expected: null,
|
|
43
|
+
},
|
|
44
|
+
];
|
|
45
|
+
|
|
46
|
+
describe('Check Semver', () => {
|
|
47
|
+
semverTest.forEach(data => {
|
|
48
|
+
test(data.description, () => {
|
|
49
|
+
const { version, expected } = data;
|
|
50
|
+
expect(semver.valid(version)).toBe(expected);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
});
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK Tracing Utilities
|
|
3
|
+
* Tracks object instances and request call chains across multiple SDK instances
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { LoggerNames, getLogger } from './logger';
|
|
7
|
+
|
|
8
|
+
// Global counters (cross-SDK instances)
|
|
9
|
+
|
|
10
|
+
const Log = getLogger(LoggerNames.Core);
|
|
11
|
+
|
|
12
|
+
let globalInstanceCounter = 0;
|
|
13
|
+
let sdkInstanceCounter = 0;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Generate SDK instance ID
|
|
17
|
+
* @returns Format: "SDK-<number>-<timestamp>"
|
|
18
|
+
* @example "SDK-1-123456"
|
|
19
|
+
*/
|
|
20
|
+
export function generateSdkInstanceId(): string {
|
|
21
|
+
sdkInstanceCounter++;
|
|
22
|
+
const timestamp = Date.now().toString().slice(-6);
|
|
23
|
+
return `SDK-${sdkInstanceCounter}-${timestamp}`;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Generate globally unique instance ID
|
|
28
|
+
* @param type Instance type (Device, DeviceCommands, BaseMethod, etc.)
|
|
29
|
+
* @param sdkInstanceId SDK instance ID (optional)
|
|
30
|
+
* @returns Format: <SDK>.<type>-<number>-<timestamp>
|
|
31
|
+
* @example "SDK-1.Device-1-123456" or "Device-1-123456"
|
|
32
|
+
*/
|
|
33
|
+
export function generateInstanceId(type: string, sdkInstanceId?: string): string {
|
|
34
|
+
globalInstanceCounter++;
|
|
35
|
+
const timestamp = Date.now().toString().slice(-6);
|
|
36
|
+
const baseId = `${type}-${globalInstanceCounter}-${timestamp}`;
|
|
37
|
+
return sdkInstanceId ? `${sdkInstanceId}.${baseId}` : baseId;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Request context management
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Request context information
|
|
44
|
+
*/
|
|
45
|
+
export interface RequestContext {
|
|
46
|
+
/** Request unique ID (reuses BaseMethod.responseID) */
|
|
47
|
+
responseID: number;
|
|
48
|
+
/** SDK instance ID */
|
|
49
|
+
sdkInstanceId?: string;
|
|
50
|
+
/** API method name */
|
|
51
|
+
methodName: string;
|
|
52
|
+
/** Device connection ID */
|
|
53
|
+
connectId?: string;
|
|
54
|
+
/** Device instance ID */
|
|
55
|
+
deviceInstanceId?: string;
|
|
56
|
+
/** DeviceCommands instance ID */
|
|
57
|
+
commandsInstanceId?: string;
|
|
58
|
+
/** Parent request ID (for nested calls like allNetworkGetAddress) */
|
|
59
|
+
parentResponseID?: number;
|
|
60
|
+
/** Request start time */
|
|
61
|
+
startTime: number;
|
|
62
|
+
/** Request end time */
|
|
63
|
+
endTime?: number;
|
|
64
|
+
/** Request status */
|
|
65
|
+
status?: 'pending' | 'running' | 'success' | 'error' | 'cancelled';
|
|
66
|
+
/** Error message */
|
|
67
|
+
error?: string;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* SDK instance tracing context
|
|
72
|
+
*/
|
|
73
|
+
export interface SdkTracingContext {
|
|
74
|
+
/** SDK instance ID */
|
|
75
|
+
sdkInstanceId: string;
|
|
76
|
+
/** Creation timestamp */
|
|
77
|
+
createdAt: number;
|
|
78
|
+
/** Active requests */
|
|
79
|
+
activeRequests: Map<number, RequestContext>;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Global SDK instance tracking map
|
|
83
|
+
const sdkInstances = new Map<string, SdkTracingContext>();
|
|
84
|
+
|
|
85
|
+
// Global request map (cross-SDK instances for quick lookup)
|
|
86
|
+
const globalActiveRequests = new Map<number, RequestContext>();
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Create SDK instance tracing context
|
|
90
|
+
*/
|
|
91
|
+
export function createSdkTracingContext(): SdkTracingContext {
|
|
92
|
+
const sdkInstanceId = generateSdkInstanceId();
|
|
93
|
+
const context: SdkTracingContext = {
|
|
94
|
+
sdkInstanceId,
|
|
95
|
+
createdAt: Date.now(),
|
|
96
|
+
activeRequests: new Map(),
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
sdkInstances.set(sdkInstanceId, context);
|
|
100
|
+
|
|
101
|
+
return context;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Create and register request context
|
|
106
|
+
* @param responseID Request ID (reuses BaseMethod.responseID)
|
|
107
|
+
* @param methodName API method name
|
|
108
|
+
* @param options Additional options
|
|
109
|
+
*/
|
|
110
|
+
export function createRequestContext(
|
|
111
|
+
responseID: number,
|
|
112
|
+
methodName: string,
|
|
113
|
+
options?: {
|
|
114
|
+
sdkInstanceId?: string;
|
|
115
|
+
connectId?: string;
|
|
116
|
+
deviceInstanceId?: string;
|
|
117
|
+
commandsInstanceId?: string;
|
|
118
|
+
parentResponseID?: number;
|
|
119
|
+
}
|
|
120
|
+
): RequestContext {
|
|
121
|
+
const context: RequestContext = {
|
|
122
|
+
responseID,
|
|
123
|
+
sdkInstanceId: options?.sdkInstanceId,
|
|
124
|
+
methodName,
|
|
125
|
+
connectId: options?.connectId,
|
|
126
|
+
deviceInstanceId: options?.deviceInstanceId,
|
|
127
|
+
commandsInstanceId: options?.commandsInstanceId,
|
|
128
|
+
parentResponseID: options?.parentResponseID,
|
|
129
|
+
startTime: Date.now(),
|
|
130
|
+
status: 'pending',
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
// Register to global map
|
|
134
|
+
globalActiveRequests.set(context.responseID, context);
|
|
135
|
+
|
|
136
|
+
// Register to SDK instance map
|
|
137
|
+
if (options?.sdkInstanceId) {
|
|
138
|
+
const sdkContext = sdkInstances.get(options.sdkInstanceId);
|
|
139
|
+
if (sdkContext) {
|
|
140
|
+
sdkContext.activeRequests.set(context.responseID, context);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return context;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Update request context
|
|
149
|
+
*/
|
|
150
|
+
export function updateRequestContext(responseID: number, updates: Partial<RequestContext>): void {
|
|
151
|
+
const context = globalActiveRequests.get(responseID);
|
|
152
|
+
if (context) {
|
|
153
|
+
Object.assign(context, updates);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Complete request context
|
|
159
|
+
*/
|
|
160
|
+
export function completeRequestContext(responseID: number, error?: Error): void {
|
|
161
|
+
const context = globalActiveRequests.get(responseID);
|
|
162
|
+
if (context) {
|
|
163
|
+
context.endTime = Date.now();
|
|
164
|
+
context.status = error ? 'error' : 'success';
|
|
165
|
+
if (error) {
|
|
166
|
+
context.error = error.message;
|
|
167
|
+
Log.error(
|
|
168
|
+
`[RequestContext] [completeRequestContext] Error: ${formatRequestContext(context)}`
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Remove from active list
|
|
173
|
+
globalActiveRequests.delete(responseID);
|
|
174
|
+
|
|
175
|
+
// Remove from SDK instance
|
|
176
|
+
if (context.sdkInstanceId) {
|
|
177
|
+
const sdkContext = sdkInstances.get(context.sdkInstanceId);
|
|
178
|
+
if (sdkContext) {
|
|
179
|
+
sdkContext.activeRequests.delete(responseID);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// Query API
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Get active requests for specific Device instance
|
|
189
|
+
*/
|
|
190
|
+
export function getActiveRequestsByDeviceInstance(deviceInstanceId: string): RequestContext[] {
|
|
191
|
+
return Array.from(globalActiveRequests.values()).filter(
|
|
192
|
+
ctx => ctx.deviceInstanceId === deviceInstanceId
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Format output
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Format request context for logging
|
|
200
|
+
*/
|
|
201
|
+
export function formatRequestContext(context: RequestContext): string {
|
|
202
|
+
const duration = context.endTime
|
|
203
|
+
? context.endTime - context.startTime
|
|
204
|
+
: Date.now() - context.startTime;
|
|
205
|
+
|
|
206
|
+
const parts = [
|
|
207
|
+
`[req:${context.responseID}]`,
|
|
208
|
+
context.sdkInstanceId ? `sdk=${context.sdkInstanceId}` : null,
|
|
209
|
+
`method=${context.methodName}`,
|
|
210
|
+
context.connectId ? `connectId=${context.connectId}` : null,
|
|
211
|
+
context.deviceInstanceId ? `deviceInst=${context.deviceInstanceId}` : null,
|
|
212
|
+
context.commandsInstanceId ? `commandsInst=${context.commandsInstanceId}` : null,
|
|
213
|
+
context.parentResponseID ? `parent=${context.parentResponseID}` : null,
|
|
214
|
+
`duration=${duration}ms`,
|
|
215
|
+
`status=${context.status}`,
|
|
216
|
+
`error=${context.error}`,
|
|
217
|
+
].filter(Boolean);
|
|
218
|
+
|
|
219
|
+
return parts.join(' ');
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Cleanup and reset
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Cleanup specific SDK instance
|
|
226
|
+
*/
|
|
227
|
+
export function cleanupSdkInstance(sdkInstanceId: string): void {
|
|
228
|
+
const sdkContext = sdkInstances.get(sdkInstanceId);
|
|
229
|
+
if (sdkContext) {
|
|
230
|
+
// Remove SDK requests from global active requests
|
|
231
|
+
for (const responseID of sdkContext.activeRequests.keys()) {
|
|
232
|
+
globalActiveRequests.delete(responseID);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// Remove SDK instance
|
|
236
|
+
sdkInstances.delete(sdkInstanceId);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
const VER_NUMS = 3;
|
|
2
|
+
|
|
3
|
+
// eslint-disable-next-line prefer-regex-literals
|
|
4
|
+
const versionRegex = new RegExp(/^[0-9]{1,3}(\.[0-9]{1,3}){0,2}$/);
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Validates version string
|
|
8
|
+
* @param {string} version Version string
|
|
9
|
+
* @returns {boolean} True if version string is valid, false if not
|
|
10
|
+
*/
|
|
11
|
+
export const isValidVersionString = (version: string) => versionRegex.test(version);
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Validates a version array
|
|
15
|
+
* @param {number[]} version Version array
|
|
16
|
+
* @returns {boolean} True if version array is valid, false if not
|
|
17
|
+
*/
|
|
18
|
+
export const isValidVersionArray = (version: number[]) => {
|
|
19
|
+
// Check if we're getting an actual array
|
|
20
|
+
if (!Array.isArray(version)) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Array has to have something in it and be no longer than the VER_NUMS const
|
|
25
|
+
if (version.length === 0 || version.length > VER_NUMS) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// There's no major version 0 (invalid number)
|
|
30
|
+
if (version[0] === 0) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Check for invalid numbers in the array
|
|
35
|
+
for (let i = 0; i < version.length; i++) {
|
|
36
|
+
if (typeof version[i] !== 'number' || version[i] < 0) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return true;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Fills the missing version numbers with zeros (ie: [1, 2] will become [1, 2, 0])
|
|
46
|
+
* @param {number[]} version Version array
|
|
47
|
+
* @returns {number[]} Version array with all positions filled
|
|
48
|
+
*/
|
|
49
|
+
export const normalizeVersionArray = (version: number[]) => {
|
|
50
|
+
if (version.length === VER_NUMS) {
|
|
51
|
+
return version;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Filling zero's for partial versions
|
|
55
|
+
const partialVersion = [...version];
|
|
56
|
+
for (let i = version.length; i < VER_NUMS; i++) {
|
|
57
|
+
partialVersion.push(0);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return partialVersion;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Returns a valid version array from a version string
|
|
65
|
+
* @param {string} version Version string
|
|
66
|
+
* @returns {number[]} Version array
|
|
67
|
+
*/
|
|
68
|
+
export const versionSplit = (version: string): number[] => {
|
|
69
|
+
if (!isValidVersionString(version)) {
|
|
70
|
+
return [0, 0, 0];
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return version.split('.').map(v => Number(v));
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Compares two versions and returns if the version is newer (1), older (-1) or equal (0).
|
|
78
|
+
* @param {string | number[]} a Version to compare from
|
|
79
|
+
* @param {string | number[]} b Version to compare with
|
|
80
|
+
* @returns {number} Returns 1 if newer, -1 if older and 0 if equal
|
|
81
|
+
*/
|
|
82
|
+
export const versionCompare = (a: string | number[], b: string | number[]) => {
|
|
83
|
+
// Quick compare for same version
|
|
84
|
+
if (typeof a === 'string' && typeof b === 'string' && a === b) {
|
|
85
|
+
return 0;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Convert string to version arrays
|
|
89
|
+
const pa = typeof a === 'string' ? versionSplit(a) : a;
|
|
90
|
+
const pb = typeof b === 'string' ? versionSplit(b) : b;
|
|
91
|
+
|
|
92
|
+
// Check version validity
|
|
93
|
+
const vpa = isValidVersionArray(pa);
|
|
94
|
+
const vpb = isValidVersionArray(pb);
|
|
95
|
+
|
|
96
|
+
if (!vpa && !vpb) {
|
|
97
|
+
// Both arrays are invalid
|
|
98
|
+
return 0;
|
|
99
|
+
}
|
|
100
|
+
if (!vpa && vpb) {
|
|
101
|
+
// First array is Invalid
|
|
102
|
+
return -1;
|
|
103
|
+
}
|
|
104
|
+
if (vpa && !vpb) {
|
|
105
|
+
// Second array is invalid
|
|
106
|
+
return 1;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Normalize arrays (to contain the right version array length)
|
|
110
|
+
const npa = normalizeVersionArray(pa);
|
|
111
|
+
const npb = normalizeVersionArray(pb);
|
|
112
|
+
|
|
113
|
+
// Compare versions numbers
|
|
114
|
+
for (let i = 0; i < VER_NUMS; i++) {
|
|
115
|
+
if (npa[i] > npb[i]) return 1;
|
|
116
|
+
if (npb[i] > npa[i]) return -1;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return 0;
|
|
120
|
+
};
|