@hiero-ledger/sdk 2.80.0 → 2.81.0
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/README.md +107 -64
- package/dist/umd.js +444 -217
- package/dist/umd.js.map +1 -0
- package/dist/umd.min.js +8 -7
- package/dist/umd.min.js.map +1 -0
- package/lib/BadEntityIdError.js.map +1 -1
- package/lib/Cache.js.map +1 -1
- package/lib/Duration.js.map +1 -1
- package/lib/EntityIdHelper.js.map +1 -1
- package/lib/EthereumFlow.js.map +1 -1
- package/lib/EthereumTransaction.d.ts +4 -0
- package/lib/EthereumTransaction.js.map +1 -1
- package/lib/EthereumTransactionData.js.map +1 -1
- package/lib/EthereumTransactionDataEip1559.js.map +1 -1
- package/lib/EthereumTransactionDataEip2930.js.map +1 -1
- package/lib/EthereumTransactionDataEip7702.js.map +1 -1
- package/lib/EthereumTransactionDataLegacy.js.map +1 -1
- package/lib/EvmAddress.js.map +1 -1
- package/lib/ExchangeRate.js.map +1 -1
- package/lib/ExchangeRates.js.map +1 -1
- package/lib/Executable.cjs +8 -5
- package/lib/Executable.js +1 -1
- package/lib/Executable.js.map +1 -1
- package/lib/FeeComponents.js.map +1 -1
- package/lib/FeeData.js.map +1 -1
- package/lib/FeeDataType.js.map +1 -1
- package/lib/FeeSchedule.js.map +1 -1
- package/lib/FeeSchedules.js.map +1 -1
- package/lib/FreezeType.js.map +1 -1
- package/lib/Hbar.js.map +1 -1
- package/lib/HbarUnit.js.map +1 -1
- package/lib/Key.js.map +1 -1
- package/lib/KeyList.js.map +1 -1
- package/lib/LedgerId.js.map +1 -1
- package/lib/LocalProvider.js.map +1 -1
- package/lib/LocalProviderWeb.js.map +1 -1
- package/lib/ManagedNode.js.map +1 -1
- package/lib/ManagedNodeAddress.js.map +1 -1
- package/lib/MaxAttemptsOrTimeoutError.js.map +1 -1
- package/lib/MaxQueryPaymentExceeded.js.map +1 -1
- package/lib/MirrorNode.js.map +1 -1
- package/lib/Mnemonic.js.map +1 -1
- package/lib/Node.js.map +1 -1
- package/lib/ObjectMap.js.map +1 -1
- package/lib/PrecheckStatusError.js.map +1 -1
- package/lib/PrivateKey.js.map +1 -1
- package/lib/PrngTransaction.d.ts +4 -0
- package/lib/PrngTransaction.js.map +1 -1
- package/lib/Provider.js.map +1 -1
- package/lib/PublicKey.js.map +1 -1
- package/lib/ReceiptStatusError.js.map +1 -1
- package/lib/RecordStatusError.js.map +1 -1
- package/lib/RequestType.js.map +1 -1
- package/lib/Signer.js.map +1 -1
- package/lib/SignerSignature.js.map +1 -1
- package/lib/StakingInfo.js.map +1 -1
- package/lib/Status.js.map +1 -1
- package/lib/StatusError.js.map +1 -1
- package/lib/Timestamp.js.map +1 -1
- package/lib/TransactionFeeSchedule.js.map +1 -1
- package/lib/Transfer.js.map +1 -1
- package/lib/Wallet.js.map +1 -1
- package/lib/account/AccountAllowanceAdjustTransaction.cjs +2 -1
- package/lib/account/AccountAllowanceAdjustTransaction.d.ts +4 -2
- package/lib/account/AccountAllowanceAdjustTransaction.js.map +1 -1
- package/lib/account/AccountAllowanceApproveTransaction.cjs +2 -1
- package/lib/account/AccountAllowanceApproveTransaction.d.ts +4 -2
- package/lib/account/AccountAllowanceApproveTransaction.js.map +1 -1
- package/lib/account/AccountAllowanceDeleteTransaction.cjs +2 -1
- package/lib/account/AccountAllowanceDeleteTransaction.d.ts +4 -2
- package/lib/account/AccountAllowanceDeleteTransaction.js.map +1 -1
- package/lib/account/AccountBalance.cjs +6 -15
- package/lib/account/AccountBalance.d.ts +2 -2
- package/lib/account/AccountBalance.js +1 -1
- package/lib/account/AccountBalance.js.map +1 -1
- package/lib/account/AccountBalanceQuery.cjs +5 -10
- package/lib/account/AccountBalanceQuery.d.ts +15 -2
- package/lib/account/AccountBalanceQuery.js +1 -1
- package/lib/account/AccountBalanceQuery.js.map +1 -1
- package/lib/account/AccountCreateTransaction.cjs +2 -1
- package/lib/account/AccountCreateTransaction.d.ts +4 -2
- package/lib/account/AccountCreateTransaction.js.map +1 -1
- package/lib/account/AccountDeleteTransaction.cjs +2 -1
- package/lib/account/AccountDeleteTransaction.d.ts +4 -2
- package/lib/account/AccountDeleteTransaction.js.map +1 -1
- package/lib/account/AccountId.js.map +1 -1
- package/lib/account/AccountInfo.js.map +1 -1
- package/lib/account/AccountInfoFlow.js.map +1 -1
- package/lib/account/AccountInfoQuery.cjs +2 -1
- package/lib/account/AccountInfoQuery.d.ts +8 -2
- package/lib/account/AccountInfoQuery.js.map +1 -1
- package/lib/account/AccountRecordsQuery.cjs +2 -1
- package/lib/account/AccountRecordsQuery.d.ts +8 -2
- package/lib/account/AccountRecordsQuery.js.map +1 -1
- package/lib/account/AccountUpdateTransaction.cjs +2 -1
- package/lib/account/AccountUpdateTransaction.d.ts +4 -2
- package/lib/account/AccountUpdateTransaction.js.map +1 -1
- package/lib/account/HbarAllowance.cjs +3 -1
- package/lib/account/HbarAllowance.d.ts +6 -2
- package/lib/account/HbarAllowance.js.map +1 -1
- package/lib/account/HbarTransferMap.js.map +1 -1
- package/lib/account/LiveHash.js.map +1 -1
- package/lib/account/LiveHashAddTransaction.cjs +2 -1
- package/lib/account/LiveHashAddTransaction.d.ts +4 -2
- package/lib/account/LiveHashAddTransaction.js.map +1 -1
- package/lib/account/LiveHashDeleteTransaction.cjs +2 -1
- package/lib/account/LiveHashDeleteTransaction.d.ts +4 -2
- package/lib/account/LiveHashDeleteTransaction.js.map +1 -1
- package/lib/account/LiveHashQuery.cjs +2 -1
- package/lib/account/LiveHashQuery.d.ts +8 -2
- package/lib/account/LiveHashQuery.js.map +1 -1
- package/lib/account/NullableTokenDecimalMap.js.map +1 -1
- package/lib/account/ProxyStaker.js.map +1 -1
- package/lib/account/TokenAllowance.cjs +3 -1
- package/lib/account/TokenAllowance.d.ts +6 -2
- package/lib/account/TokenAllowance.js.map +1 -1
- package/lib/account/TokenBalanceMap.js.map +1 -1
- package/lib/account/TokenDecimalMap.js.map +1 -1
- package/lib/account/TokenNftAllowance.cjs +3 -1
- package/lib/account/TokenNftAllowance.d.ts +6 -2
- package/lib/account/TokenNftAllowance.js.map +1 -1
- package/lib/account/TokenNftTransferMap.js.map +1 -1
- package/lib/account/TokenRelationship.js.map +1 -1
- package/lib/account/TokenRelationshipMap.js.map +1 -1
- package/lib/account/TokenTransferAccountMap.js.map +1 -1
- package/lib/account/TokenTransferMap.js.map +1 -1
- package/lib/account/TransferTransaction.cjs +6 -5
- package/lib/account/TransferTransaction.d.ts +6 -2
- package/lib/account/TransferTransaction.js +1 -1
- package/lib/account/TransferTransaction.js.map +1 -1
- package/lib/address_book/Endpoint.js.map +1 -1
- package/lib/address_book/IPv4Address.js.map +1 -1
- package/lib/address_book/IPv4AddressPart.js.map +1 -1
- package/lib/address_book/NodeAddress.js.map +1 -1
- package/lib/address_book/NodeAddressBook.js.map +1 -1
- package/lib/base32.js.map +1 -1
- package/lib/browser.js +1 -1
- package/lib/channel/Channel.js.map +1 -1
- package/lib/channel/MirrorChannel.js.map +1 -1
- package/lib/channel/NativeChannel.js.map +1 -1
- package/lib/channel/NodeChannel.js.map +1 -1
- package/lib/channel/NodeMirrorChannel.js.map +1 -1
- package/lib/channel/WebChannel.js.map +1 -1
- package/lib/client/Client.cjs +38 -0
- package/lib/client/Client.d.ts +30 -0
- package/lib/client/Client.js +1 -1
- package/lib/client/Client.js.map +1 -1
- package/lib/client/ManagedNetwork.js.map +1 -1
- package/lib/client/MirrorNetwork.js.map +1 -1
- package/lib/client/NativeClient.js.map +1 -1
- package/lib/client/Network.js.map +1 -1
- package/lib/client/NodeClient.js.map +1 -1
- package/lib/client/WebClient.js.map +1 -1
- package/lib/client/addressbooks/mainnet.cjs +1 -1
- package/lib/client/addressbooks/mainnet.d.ts +1 -1
- package/lib/client/addressbooks/mainnet.js +1 -1
- package/lib/client/addressbooks/mainnet.js.map +1 -1
- package/lib/client/addressbooks/previewnet.cjs +1 -1
- package/lib/client/addressbooks/previewnet.d.ts +1 -1
- package/lib/client/addressbooks/previewnet.js +1 -1
- package/lib/client/addressbooks/previewnet.js.map +1 -1
- package/lib/client/addressbooks/testnet.cjs +1 -1
- package/lib/client/addressbooks/testnet.d.ts +1 -1
- package/lib/client/addressbooks/testnet.js +1 -1
- package/lib/client/addressbooks/testnet.js.map +1 -1
- package/lib/constants/ClientConstants.js.map +1 -1
- package/lib/contract/ContractByteCodeQuery.js.map +1 -1
- package/lib/contract/ContractCallQuery.js.map +1 -1
- package/lib/contract/ContractCreateFlow.js.map +1 -1
- package/lib/contract/ContractCreateTransaction.cjs +2 -1
- package/lib/contract/ContractCreateTransaction.d.ts +4 -2
- package/lib/contract/ContractCreateTransaction.js.map +1 -1
- package/lib/contract/ContractDeleteTransaction.cjs +2 -1
- package/lib/contract/ContractDeleteTransaction.d.ts +4 -2
- package/lib/contract/ContractDeleteTransaction.js.map +1 -1
- package/lib/contract/ContractExecuteTransaction.d.ts +4 -0
- package/lib/contract/ContractExecuteTransaction.js.map +1 -1
- package/lib/contract/ContractFunctionParameters.js.map +1 -1
- package/lib/contract/ContractFunctionResult.js.map +1 -1
- package/lib/contract/ContractFunctionSelector.js.map +1 -1
- package/lib/contract/ContractId.js.map +1 -1
- package/lib/contract/ContractInfo.js.map +1 -1
- package/lib/contract/ContractInfoQuery.js.map +1 -1
- package/lib/contract/ContractLogInfo.js.map +1 -1
- package/lib/contract/ContractNonceInfo.js.map +1 -1
- package/lib/contract/ContractUpdateTransaction.cjs +2 -1
- package/lib/contract/ContractUpdateTransaction.d.ts +4 -2
- package/lib/contract/ContractUpdateTransaction.js.map +1 -1
- package/lib/contract/DelegateContractId.js.map +1 -1
- package/lib/cryptography/keccak.js.map +1 -1
- package/lib/encoding/hex.js.map +1 -1
- package/lib/file/FileAppendTransaction.cjs +5 -4
- package/lib/file/FileAppendTransaction.d.ts +10 -12
- package/lib/file/FileAppendTransaction.js.map +1 -1
- package/lib/file/FileContentsQuery.js.map +1 -1
- package/lib/file/FileCreateTransaction.js.map +1 -1
- package/lib/file/FileDeleteTransaction.d.ts +4 -0
- package/lib/file/FileDeleteTransaction.js.map +1 -1
- package/lib/file/FileId.js.map +1 -1
- package/lib/file/FileInfo.js.map +1 -1
- package/lib/file/FileInfoQuery.js.map +1 -1
- package/lib/file/FileUpdateTransaction.d.ts +4 -0
- package/lib/file/FileUpdateTransaction.js.map +1 -1
- package/lib/grpc/GrpcServiceError.js.map +1 -1
- package/lib/grpc/GrpcStatus.js.map +1 -1
- package/lib/http/HttpError.js.map +1 -1
- package/lib/http/HttpStatus.js.map +1 -1
- package/lib/index.js +1 -1
- package/lib/logger/LogLevel.js.map +1 -1
- package/lib/logger/Logger.js.map +1 -1
- package/lib/native.js +1 -1
- package/lib/network/AddressBookQuery.js.map +1 -1
- package/lib/network/AddressBookQueryWeb.js.map +1 -1
- package/lib/network/NetworkVersionInfo.js.map +1 -1
- package/lib/network/NetworkVersionInfoQuery.js.map +1 -1
- package/lib/network/SemanticVersion.js.map +1 -1
- package/lib/node/NodeCreateTransaction.js.map +1 -1
- package/lib/node/NodeDeleteTransaction.js.map +1 -1
- package/lib/node/NodeUpdateTransaction.js.map +1 -1
- package/lib/node/ServiceEndpoint.js.map +1 -1
- package/lib/query/CostQuery.js.map +1 -1
- package/lib/query/MirrorNodeContractCallQuery.js.map +1 -1
- package/lib/query/MirrorNodeContractEstimateQuery.js.map +1 -1
- package/lib/query/MirrorNodeContractQuery.js.map +1 -1
- package/lib/query/Query.js.map +1 -1
- package/lib/query/QueryBase.js.map +1 -1
- package/lib/schedule/ScheduleCreateTransaction.cjs +2 -1
- package/lib/schedule/ScheduleCreateTransaction.d.ts +4 -2
- package/lib/schedule/ScheduleCreateTransaction.js.map +1 -1
- package/lib/schedule/ScheduleDeleteTransaction.d.ts +4 -0
- package/lib/schedule/ScheduleDeleteTransaction.js.map +1 -1
- package/lib/schedule/ScheduleId.js.map +1 -1
- package/lib/schedule/ScheduleInfo.js.map +1 -1
- package/lib/schedule/ScheduleInfoQuery.js.map +1 -1
- package/lib/schedule/ScheduleSignTransaction.d.ts +4 -0
- package/lib/schedule/ScheduleSignTransaction.js.map +1 -1
- package/lib/system/FreezeTransaction.js.map +1 -1
- package/lib/system/SystemDeleteTransaction.js.map +1 -1
- package/lib/system/SystemUndeleteTransaction.js.map +1 -1
- package/lib/token/AbstractTokenTransferTransaction.js.map +1 -1
- package/lib/token/AirdropPendingTransaction.js.map +1 -1
- package/lib/token/AssessedCustomFee.js.map +1 -1
- package/lib/token/CustomFee.js.map +1 -1
- package/lib/token/CustomFixedFee.js.map +1 -1
- package/lib/token/CustomFractionalFee.js.map +1 -1
- package/lib/token/CustomRoyaltyFee.js.map +1 -1
- package/lib/token/FeeAssessmentMethod.js.map +1 -1
- package/lib/token/NftId.js.map +1 -1
- package/lib/token/PendingAirdropId.js.map +1 -1
- package/lib/token/PendingAirdropRecord.js.map +1 -1
- package/lib/token/TokenAirdropTransaction.js.map +1 -1
- package/lib/token/TokenAssociateTransaction.cjs +2 -1
- package/lib/token/TokenAssociateTransaction.d.ts +4 -2
- package/lib/token/TokenAssociateTransaction.js.map +1 -1
- package/lib/token/TokenAssociation.js.map +1 -1
- package/lib/token/TokenBurnTransaction.d.ts +4 -0
- package/lib/token/TokenBurnTransaction.js.map +1 -1
- package/lib/token/TokenCancelAirdropTransaction.js.map +1 -1
- package/lib/token/TokenClaimAirdropTransaction.js.map +1 -1
- package/lib/token/TokenCreateTransaction.cjs +2 -1
- package/lib/token/TokenCreateTransaction.d.ts +4 -2
- package/lib/token/TokenCreateTransaction.js.map +1 -1
- package/lib/token/TokenDeleteTransaction.d.ts +4 -0
- package/lib/token/TokenDeleteTransaction.js.map +1 -1
- package/lib/token/TokenDissociateTransaction.cjs +2 -1
- package/lib/token/TokenDissociateTransaction.d.ts +4 -2
- package/lib/token/TokenDissociateTransaction.js.map +1 -1
- package/lib/token/TokenFeeScheduleUpdateTransaction.js.map +1 -1
- package/lib/token/TokenFreezeTransaction.cjs +2 -1
- package/lib/token/TokenFreezeTransaction.d.ts +4 -2
- package/lib/token/TokenFreezeTransaction.js.map +1 -1
- package/lib/token/TokenGrantKycTransaction.cjs +2 -1
- package/lib/token/TokenGrantKycTransaction.d.ts +4 -2
- package/lib/token/TokenGrantKycTransaction.js.map +1 -1
- package/lib/token/TokenId.js.map +1 -1
- package/lib/token/TokenInfo.js.map +1 -1
- package/lib/token/TokenInfoQuery.js.map +1 -1
- package/lib/token/TokenKeyValidation.js.map +1 -1
- package/lib/token/TokenMintTransaction.d.ts +4 -0
- package/lib/token/TokenMintTransaction.js.map +1 -1
- package/lib/token/TokenNftInfo.js.map +1 -1
- package/lib/token/TokenNftInfoQuery.js.map +1 -1
- package/lib/token/TokenNftTransfer.js.map +1 -1
- package/lib/token/TokenNftsUpdateTransaction.d.ts +4 -0
- package/lib/token/TokenPauseTransaction.d.ts +4 -0
- package/lib/token/TokenPauseTransaction.js.map +1 -1
- package/lib/token/TokenReference.js.map +1 -1
- package/lib/token/TokenRejectFlow.cjs +3 -1
- package/lib/token/TokenRejectFlow.d.ts +6 -2
- package/lib/token/TokenRejectFlow.js.map +1 -1
- package/lib/token/TokenRejectTransaction.js.map +1 -1
- package/lib/token/TokenRevokeKycTransaction.cjs +2 -1
- package/lib/token/TokenRevokeKycTransaction.d.ts +4 -2
- package/lib/token/TokenRevokeKycTransaction.js.map +1 -1
- package/lib/token/TokenSupplyType.js.map +1 -1
- package/lib/token/TokenTransfer.js.map +1 -1
- package/lib/token/TokenType.js.map +1 -1
- package/lib/token/TokenUnfreezeTransaction.cjs +2 -1
- package/lib/token/TokenUnfreezeTransaction.d.ts +4 -2
- package/lib/token/TokenUnfreezeTransaction.js.map +1 -1
- package/lib/token/TokenUnpauseTransaction.d.ts +4 -0
- package/lib/token/TokenUnpauseTransaction.js.map +1 -1
- package/lib/token/TokenUpdateNftsTransaction.d.ts +4 -0
- package/lib/token/TokenUpdateNftsTransaction.js.map +1 -1
- package/lib/token/TokenUpdateTransaction.cjs +2 -1
- package/lib/token/TokenUpdateTransaction.d.ts +4 -2
- package/lib/token/TokenUpdateTransaction.js.map +1 -1
- package/lib/token/TokenWipeTransaction.cjs +2 -1
- package/lib/token/TokenWipeTransaction.d.ts +4 -2
- package/lib/token/TokenWipeTransaction.js.map +1 -1
- package/lib/topic/SubscriptionHandle.js.map +1 -1
- package/lib/topic/TopicCreateTransaction.cjs +2 -1
- package/lib/topic/TopicCreateTransaction.d.ts +4 -2
- package/lib/topic/TopicCreateTransaction.js.map +1 -1
- package/lib/topic/TopicDeleteTransaction.d.ts +4 -0
- package/lib/topic/TopicDeleteTransaction.js.map +1 -1
- package/lib/topic/TopicId.js.map +1 -1
- package/lib/topic/TopicInfo.js.map +1 -1
- package/lib/topic/TopicInfoQuery.js.map +1 -1
- package/lib/topic/TopicMessage.js.map +1 -1
- package/lib/topic/TopicMessageChunk.js.map +1 -1
- package/lib/topic/TopicMessageQuery.js.map +1 -1
- package/lib/topic/TopicMessageSubmitTransaction.js.map +1 -1
- package/lib/topic/TopicUpdateTransaction.cjs +2 -1
- package/lib/topic/TopicUpdateTransaction.d.ts +4 -2
- package/lib/topic/TopicUpdateTransaction.js.map +1 -1
- package/lib/transaction/BatchTransaction.js.map +1 -1
- package/lib/transaction/CustomFeeLimit.js.map +1 -1
- package/lib/transaction/List.js.map +1 -1
- package/lib/transaction/NodeAccountIdSignatureMap.js.map +1 -1
- package/lib/transaction/NodeAccountIdSignatureMapLegacy.js.map +1 -1
- package/lib/transaction/SignableNodeTransactionBodyBytes.js.map +1 -1
- package/lib/transaction/SignatureMap.js.map +1 -1
- package/lib/transaction/SignatureMapLegacy.js.map +1 -1
- package/lib/transaction/SignaturePairMap.js.map +1 -1
- package/lib/transaction/Transaction.cjs +83 -15
- package/lib/transaction/Transaction.d.ts +33 -4
- package/lib/transaction/Transaction.js +1 -1
- package/lib/transaction/Transaction.js.map +1 -1
- package/lib/transaction/TransactionHashMap.js.map +1 -1
- package/lib/transaction/TransactionId.js.map +1 -1
- package/lib/transaction/TransactionReceipt.js.map +1 -1
- package/lib/transaction/TransactionReceiptQuery.cjs +2 -1
- package/lib/transaction/TransactionReceiptQuery.d.ts +8 -2
- package/lib/transaction/TransactionReceiptQuery.js.map +1 -1
- package/lib/transaction/TransactionRecord.js.map +1 -1
- package/lib/transaction/TransactionRecordQuery.cjs +2 -1
- package/lib/transaction/TransactionRecordQuery.d.ts +8 -2
- package/lib/transaction/TransactionRecordQuery.js.map +1 -1
- package/lib/transaction/TransactionResponse.cjs +85 -10
- package/lib/transaction/TransactionResponse.d.ts +39 -4
- package/lib/transaction/TransactionResponse.js +1 -1
- package/lib/transaction/TransactionResponse.js.map +1 -1
- package/lib/util/ASN1-Decoder.js.map +1 -1
- package/lib/util.js.map +1 -1
- package/lib/version.js +1 -1
- package/package.json +21 -19
- package/src/Executable.js +13 -8
- package/src/account/AccountAllowanceAdjustTransaction.js +2 -1
- package/src/account/AccountAllowanceApproveTransaction.js +2 -1
- package/src/account/AccountAllowanceDeleteTransaction.js +2 -1
- package/src/account/AccountBalance.js +7 -15
- package/src/account/AccountBalanceQuery.js +5 -9
- package/src/account/AccountCreateTransaction.js +2 -1
- package/src/account/AccountDeleteTransaction.js +2 -1
- package/src/account/AccountInfoQuery.js +2 -1
- package/src/account/AccountRecordsQuery.js +2 -1
- package/src/account/AccountUpdateTransaction.js +2 -1
- package/src/account/HbarAllowance.js +3 -1
- package/src/account/LiveHashAddTransaction.js +2 -1
- package/src/account/LiveHashDeleteTransaction.js +2 -1
- package/src/account/LiveHashQuery.js +2 -1
- package/src/account/TokenAllowance.js +3 -1
- package/src/account/TokenNftAllowance.js +3 -1
- package/src/account/TransferTransaction.js +6 -4
- package/src/client/Client.js +38 -0
- package/src/client/addressbooks/mainnet.js +1 -1
- package/src/client/addressbooks/previewnet.js +1 -1
- package/src/client/addressbooks/testnet.js +1 -1
- package/src/contract/ContractCreateTransaction.js +2 -1
- package/src/contract/ContractDeleteTransaction.js +2 -1
- package/src/contract/ContractUpdateTransaction.js +2 -1
- package/src/file/FileAppendTransaction.js +5 -4
- package/src/schedule/ScheduleCreateTransaction.js +2 -1
- package/src/token/TokenAssociateTransaction.js +2 -1
- package/src/token/TokenCreateTransaction.js +2 -1
- package/src/token/TokenDissociateTransaction.js +2 -1
- package/src/token/TokenFreezeTransaction.js +2 -1
- package/src/token/TokenGrantKycTransaction.js +2 -1
- package/src/token/TokenRejectFlow.js +3 -1
- package/src/token/TokenRevokeKycTransaction.js +2 -1
- package/src/token/TokenUnfreezeTransaction.js +2 -1
- package/src/token/TokenUpdateTransaction.js +2 -1
- package/src/token/TokenWipeTransaction.js +2 -1
- package/src/topic/TopicCreateTransaction.js +2 -1
- package/src/topic/TopicUpdateTransaction.js +2 -1
- package/src/transaction/Transaction.js +139 -19
- package/src/transaction/TransactionReceiptQuery.js +2 -1
- package/src/transaction/TransactionRecordQuery.js +2 -1
- package/src/transaction/TransactionResponse.js +101 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ManagedNetwork.js","sources":["../../src/client/ManagedNetwork.js"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\nimport LedgerId from \"../LedgerId.js\";\nimport * as util from \"../util.js\";\n\n/**\n * @typedef {import(\"../channel/Channel.js\").default} Channel\n * @typedef {import(\"../channel/MirrorChannel.js\").default} MirrorChannel\n * @typedef {import(\"../Node.js\").default} Node\n * @typedef {import(\"../MirrorNode.js\").default} MirrorNode\n * @typedef {import(\"../address_book/NodeAddressBook.js\").default} NodeAddressBook\n */\n\n/**\n * @template {Channel | MirrorChannel} ChannelT\n * @typedef {import(\"../ManagedNode.js\").default<ChannelT>} ManagedNode\n */\n\n/**\n * @template {Channel | MirrorChannel} ChannelT\n * @template {ManagedNode<ChannelT>} NetworkNodeT\n * @template {{ toString: () => string }} KeyT\n */\nexport default class ManagedNetwork {\n /**\n * @param {(address: string) => ChannelT} createNetworkChannel\n */\n constructor(createNetworkChannel) {\n /**\n * Map of node account ID (as a string)\n * to the node URL.\n *\n * @internal\n * @type {Map<string, NetworkNodeT[]>}\n */\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n this._network = new Map();\n\n /**\n * List of node account IDs.\n *\n * @protected\n * @type {NetworkNodeT[]}\n */\n this._nodes = [];\n\n /**\n * List of node account IDs.\n *\n * @protected\n * @type {NetworkNodeT[]}\n */\n this._healthyNodes = [];\n\n /** @type {(address: string, cert?: string) => ChannelT} */\n this._createNetworkChannel = createNetworkChannel;\n\n /** @type {LedgerId | null} */\n this._ledgerId = null;\n\n this._minBackoff = 8000;\n this._maxBackoff = 1000 * 60 * 60;\n\n /** @type {number} */\n this._maxNodeAttempts = -1;\n\n this._nodeMinReadmitPeriod = this._minBackoff;\n this._nodeMaxReadmitPeriod = this._maxBackoff;\n\n this._earliestReadmitTime = Date.now() + this._nodeMinReadmitPeriod;\n }\n\n /**\n * @deprecated\n * @param {string} networkName\n * @returns {this}\n */\n setNetworkName(networkName) {\n console.warn(\"Deprecated: Use `setLedgerId` instead\");\n return this.setLedgerId(networkName);\n }\n\n /**\n * @deprecated\n * @returns {string | null}\n */\n get networkName() {\n console.warn(\"Deprecated: Use `ledgerId` instead\");\n return this.ledgerId != null ? this.ledgerId.toString() : null;\n }\n\n /**\n * @param {string|LedgerId} ledgerId\n * @returns {this}\n */\n setLedgerId(ledgerId) {\n this._ledgerId =\n typeof ledgerId === \"string\"\n ? LedgerId.fromString(ledgerId)\n : ledgerId;\n return this;\n }\n\n /**\n * @returns {LedgerId | null}\n */\n get ledgerId() {\n return this._ledgerId != null ? this._ledgerId : null;\n }\n\n /**\n * @abstract\n * @param {[string, KeyT]} entry\n * @returns {NetworkNodeT}\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _createNodeFromNetworkEntry(entry) {\n throw new Error(\"not implemented\");\n }\n\n /**\n * @abstract\n * @param {Map<string, KeyT>} network\n * @returns {number[]}\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _getNodesToRemove(network) {\n throw new Error(\"not implemented\");\n }\n\n _removeDeadNodes() {\n if (this._maxNodeAttempts > 0) {\n for (let i = this._nodes.length - 1; i >= 0; i--) {\n const node = this._nodes[i];\n\n if (node._badGrpcStatusCount < this._maxNodeAttempts) {\n continue;\n }\n\n this._closeNode(i);\n }\n }\n }\n\n _readmitNodes() {\n const now = Date.now();\n\n if (this._earliestReadmitTime <= now) {\n let nextEarliestReadmitTime = Number.MAX_SAFE_INTEGER;\n let searchForNextEarliestReadmitTime = true;\n\n outer: for (let i = 0; i < this._nodes.length; i++) {\n for (let j = 0; j < this._healthyNodes.length; j++) {\n if (\n searchForNextEarliestReadmitTime &&\n this._nodes[i]._readmitTime > now\n ) {\n nextEarliestReadmitTime = Math.min(\n this._nodes[i]._readmitTime,\n nextEarliestReadmitTime,\n );\n }\n\n if (this._nodes[i] == this._healthyNodes[j]) {\n continue outer;\n }\n }\n\n searchForNextEarliestReadmitTime = false;\n\n if (this._nodes[i]._readmitTime <= now) {\n this._healthyNodes.push(this._nodes[i]);\n }\n }\n\n this._earliestReadmitTime = Math.min(\n Math.max(nextEarliestReadmitTime, this._nodeMinReadmitPeriod),\n this._nodeMaxReadmitPeriod,\n );\n }\n }\n\n /**\n * @param {number} count\n * @returns {NetworkNodeT[]}\n */\n _getNumberOfMostHealthyNodes(count) {\n this._removeDeadNodes();\n this._readmitNodes();\n\n const nodes = [];\n // Create a shallow for safe iteration\n let healthyNodes = this._healthyNodes.slice();\n count = Math.min(count, healthyNodes.length);\n\n for (let i = 0; i < count; i++) {\n // Select a random index\n const nodeIndex = Math.floor(Math.random() * healthyNodes.length);\n const selectedNode = healthyNodes[nodeIndex];\n\n // Check if the node exists\n if (!selectedNode) {\n break; // Break out of the loop if undefined node is selected\n }\n\n // Add the selected node in array for execution\n nodes.push(selectedNode);\n // Remove all nodes with the same account id as\n // the selected node account id from the array\n healthyNodes = healthyNodes.filter(\n // eslint-disable-next-line ie11/no-loop-func\n (node) => node.getKey() !== selectedNode.getKey(),\n );\n }\n\n return nodes;\n }\n\n /**\n * @param {number} i\n */\n _closeNode(i) {\n const node = this._nodes[i];\n\n node.close();\n this._removeNodeFromNetwork(node);\n this._nodes.splice(i, 1);\n }\n\n /**\n * @param {NetworkNodeT} node\n */\n _removeNodeFromNetwork(node) {\n const network = /** @type {NetworkNodeT[]} */ (\n this._network.get(node.getKey())\n );\n\n for (let j = 0; j < network.length; j++) {\n if (network[j] === node) {\n network.splice(j, 1);\n break;\n }\n }\n\n if (network.length === 0) {\n this._network.delete(node.getKey());\n }\n }\n\n /**\n * @param {Map<string, KeyT>} network\n * @returns {this}\n */\n _setNetwork(network) {\n /** @type {NetworkNodeT[]} */\n const newNodes = [];\n const newNodeKeys = new Set();\n const newNodeAddresses = new Set();\n\n /** @type {NetworkNodeT[]} */\n const newHealthyNodes = [];\n\n /** @type {Map<string, NetworkNodeT[]>} */\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const newNetwork = new Map();\n\n // Remove nodes that are not in the new network\n for (const i of this._getNodesToRemove(network)) {\n this._closeNode(i);\n }\n\n // Copy all the unclosed nodes\n for (const node of this._nodes) {\n newNodes.push(node);\n newNodeKeys.add(node.getKey());\n newNodeAddresses.add(node.address.toString());\n }\n\n // Add new nodes\n for (const [key, value] of network) {\n if (\n newNodeKeys.has(value.toString()) &&\n newNodeAddresses.has(key)\n ) {\n continue;\n }\n newNodes.push(this._createNodeFromNetworkEntry([key, value]));\n }\n\n // Shuffle the nodes so we don't immediately pick the first nodes\n util.shuffle(newNodes);\n\n // Copy all the nodes into the healhty nodes list initially\n // and push the nodes into the network; this maintains the\n // shuffled state from `newNodes`\n for (const node of newNodes) {\n if (!node.isHealthy()) {\n continue;\n }\n\n newHealthyNodes.push(node);\n\n const newNetworkNodes = newNetwork.has(node.getKey())\n ? /** @type {NetworkNodeT[]} */ (newNetwork.get(node.getKey()))\n : [];\n newNetworkNodes.push(node);\n newNetwork.set(node.getKey(), newNetworkNodes);\n }\n\n this._nodes = newNodes;\n this._healthyNodes = newHealthyNodes;\n this._network = newNetwork;\n\n return this;\n }\n\n /**\n * @returns {number}\n */\n get maxNodeAttempts() {\n return this._maxNodeAttempts;\n }\n\n /**\n * @param {number} maxNodeAttempts\n * @returns {this}\n */\n setMaxNodeAttempts(maxNodeAttempts) {\n this._maxNodeAttempts = maxNodeAttempts;\n return this;\n }\n\n /**\n * @returns {number}\n */\n get minBackoff() {\n return this._minBackoff;\n }\n\n /**\n * @param {number} minBackoff\n * @returns {this}\n */\n setMinBackoff(minBackoff) {\n this._minBackoff = minBackoff;\n for (const node of this._nodes) {\n node.setMinBackoff(minBackoff);\n }\n return this;\n }\n\n /**\n * @returns {number}\n */\n get maxBackoff() {\n return this._maxBackoff;\n }\n\n /**\n * @param {number} maxBackoff\n * @returns {this}\n */\n setMaxBackoff(maxBackoff) {\n this._maxBackoff = maxBackoff;\n for (const node of this._nodes) {\n node.setMaxBackoff(maxBackoff);\n }\n return this;\n }\n\n /**\n * @returns {number}\n */\n get nodeMinReadmitPeriod() {\n return this._nodeMinReadmitPeriod;\n }\n\n /**\n * @param {number} nodeMinReadmitPeriod\n * @returns {this}\n */\n setNodeMinReadmitPeriod(nodeMinReadmitPeriod) {\n this._nodeMinReadmitPeriod = nodeMinReadmitPeriod;\n this._earliestReadmitTime = Date.now() + this._nodeMinReadmitPeriod;\n return this;\n }\n\n /**\n * @returns {number}\n */\n get nodeMaxReadmitPeriod() {\n return this._nodeMaxReadmitPeriod;\n }\n\n /**\n * @param {number} nodeMaxReadmitPeriod\n * @returns {this}\n */\n setNodeMaxReadmitPeriod(nodeMaxReadmitPeriod) {\n this._nodeMaxReadmitPeriod = nodeMaxReadmitPeriod;\n return this;\n }\n\n /**\n * @param {KeyT=} key\n * @returns {NetworkNodeT}\n */\n getNode(key) {\n this._readmitNodes();\n if (key != null && key != undefined) {\n const lockedNodes = this._network.get(key.toString());\n if (lockedNodes) {\n const randomNodeAddress = Math.floor(\n Math.random() * lockedNodes.length,\n );\n return /** @type {NetworkNodeT[]} */ (lockedNodes)[\n randomNodeAddress\n ];\n } else {\n const nodes = Array.from(this._network.keys());\n const randomNodeAccountId =\n nodes[Math.floor(Math.random() * nodes.length)];\n\n const randomNode = this._network.get(randomNodeAccountId);\n // We get the `randomNodeAccountId` from the network mapping,\n // so it cannot be `undefined`\n const randomNodeAddress = Math.floor(\n // @ts-ignore\n Math.random() * randomNode.length,\n );\n // @ts-ignore\n return randomNode[randomNodeAddress];\n }\n } else {\n if (this._healthyNodes.length == 0) {\n throw new Error(\"failed to find a healthy working node\");\n }\n\n return this._healthyNodes[\n Math.floor(Math.random() * this._healthyNodes.length)\n ];\n }\n }\n\n /**\n * @param {NetworkNodeT} node\n */\n increaseBackoff(node) {\n node.increaseBackoff();\n\n for (let i = 0; i < this._healthyNodes.length; i++) {\n if (this._healthyNodes[i] == node) {\n this._healthyNodes.splice(i, 1);\n }\n }\n }\n\n /**\n * @param {NetworkNodeT} node\n */\n decreaseBackoff(node) {\n node.decreaseBackoff();\n }\n\n close() {\n for (const node of this._nodes) {\n node.close();\n }\n\n this._network.clear();\n this._nodes = [];\n }\n}\n"],"names":["ManagedNetwork","constructor","createNetworkChannel","this","_network","Map","_nodes","_healthyNodes","_createNetworkChannel","_ledgerId","_minBackoff","_maxBackoff","_maxNodeAttempts","_nodeMinReadmitPeriod","_nodeMaxReadmitPeriod","_earliestReadmitTime","Date","now","setNetworkName","networkName","console","warn","setLedgerId","ledgerId","toString","LedgerId","fromString","_createNodeFromNetworkEntry","entry","Error","_getNodesToRemove","network","_removeDeadNodes","i","length","_badGrpcStatusCount","_closeNode","_readmitNodes","nextEarliestReadmitTime","Number","MAX_SAFE_INTEGER","searchForNextEarliestReadmitTime","outer","j","_readmitTime","Math","min","push","max","_getNumberOfMostHealthyNodes","count","nodes","healthyNodes","slice","selectedNode","floor","random","filter","node","getKey","close","_removeNodeFromNetwork","splice","get","delete","_setNetwork","newNodes","newNodeKeys","Set","newNodeAddresses","newHealthyNodes","newNetwork","add","address","key","value","has","util.shuffle","isHealthy","newNetworkNodes","set","maxNodeAttempts","setMaxNodeAttempts","minBackoff","setMinBackoff","maxBackoff","setMaxBackoff","nodeMinReadmitPeriod","setNodeMinReadmitPeriod","nodeMaxReadmitPeriod","setNodeMaxReadmitPeriod","getNode","undefined","lockedNodes","Array","from","keys","randomNodeAccountId","randomNode","increaseBackoff","decreaseBackoff","clear"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ManagedNetwork.js","sources":["../../src/client/ManagedNetwork.js"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\nimport LedgerId from \"../LedgerId.js\";\nimport * as util from \"../util.js\";\n\n/**\n * @typedef {import(\"../channel/Channel.js\").default} Channel\n * @typedef {import(\"../channel/MirrorChannel.js\").default} MirrorChannel\n * @typedef {import(\"../Node.js\").default} Node\n * @typedef {import(\"../MirrorNode.js\").default} MirrorNode\n * @typedef {import(\"../address_book/NodeAddressBook.js\").default} NodeAddressBook\n */\n\n/**\n * @template {Channel | MirrorChannel} ChannelT\n * @typedef {import(\"../ManagedNode.js\").default<ChannelT>} ManagedNode\n */\n\n/**\n * @template {Channel | MirrorChannel} ChannelT\n * @template {ManagedNode<ChannelT>} NetworkNodeT\n * @template {{ toString: () => string }} KeyT\n */\nexport default class ManagedNetwork {\n /**\n * @param {(address: string) => ChannelT} createNetworkChannel\n */\n constructor(createNetworkChannel) {\n /**\n * Map of node account ID (as a string)\n * to the node URL.\n *\n * @internal\n * @type {Map<string, NetworkNodeT[]>}\n */\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n this._network = new Map();\n\n /**\n * List of node account IDs.\n *\n * @protected\n * @type {NetworkNodeT[]}\n */\n this._nodes = [];\n\n /**\n * List of node account IDs.\n *\n * @protected\n * @type {NetworkNodeT[]}\n */\n this._healthyNodes = [];\n\n /** @type {(address: string, cert?: string) => ChannelT} */\n this._createNetworkChannel = createNetworkChannel;\n\n /** @type {LedgerId | null} */\n this._ledgerId = null;\n\n this._minBackoff = 8000;\n this._maxBackoff = 1000 * 60 * 60;\n\n /** @type {number} */\n this._maxNodeAttempts = -1;\n\n this._nodeMinReadmitPeriod = this._minBackoff;\n this._nodeMaxReadmitPeriod = this._maxBackoff;\n\n this._earliestReadmitTime = Date.now() + this._nodeMinReadmitPeriod;\n }\n\n /**\n * @deprecated\n * @param {string} networkName\n * @returns {this}\n */\n setNetworkName(networkName) {\n console.warn(\"Deprecated: Use `setLedgerId` instead\");\n return this.setLedgerId(networkName);\n }\n\n /**\n * @deprecated\n * @returns {string | null}\n */\n get networkName() {\n console.warn(\"Deprecated: Use `ledgerId` instead\");\n return this.ledgerId != null ? this.ledgerId.toString() : null;\n }\n\n /**\n * @param {string|LedgerId} ledgerId\n * @returns {this}\n */\n setLedgerId(ledgerId) {\n this._ledgerId =\n typeof ledgerId === \"string\"\n ? LedgerId.fromString(ledgerId)\n : ledgerId;\n return this;\n }\n\n /**\n * @returns {LedgerId | null}\n */\n get ledgerId() {\n return this._ledgerId != null ? this._ledgerId : null;\n }\n\n /**\n * @abstract\n * @param {[string, KeyT]} entry\n * @returns {NetworkNodeT}\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _createNodeFromNetworkEntry(entry) {\n throw new Error(\"not implemented\");\n }\n\n /**\n * @abstract\n * @param {Map<string, KeyT>} network\n * @returns {number[]}\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _getNodesToRemove(network) {\n throw new Error(\"not implemented\");\n }\n\n _removeDeadNodes() {\n if (this._maxNodeAttempts > 0) {\n for (let i = this._nodes.length - 1; i >= 0; i--) {\n const node = this._nodes[i];\n\n if (node._badGrpcStatusCount < this._maxNodeAttempts) {\n continue;\n }\n\n this._closeNode(i);\n }\n }\n }\n\n _readmitNodes() {\n const now = Date.now();\n\n if (this._earliestReadmitTime <= now) {\n let nextEarliestReadmitTime = Number.MAX_SAFE_INTEGER;\n let searchForNextEarliestReadmitTime = true;\n\n outer: for (let i = 0; i < this._nodes.length; i++) {\n for (let j = 0; j < this._healthyNodes.length; j++) {\n if (\n searchForNextEarliestReadmitTime &&\n this._nodes[i]._readmitTime > now\n ) {\n nextEarliestReadmitTime = Math.min(\n this._nodes[i]._readmitTime,\n nextEarliestReadmitTime,\n );\n }\n\n if (this._nodes[i] == this._healthyNodes[j]) {\n continue outer;\n }\n }\n\n searchForNextEarliestReadmitTime = false;\n\n if (this._nodes[i]._readmitTime <= now) {\n this._healthyNodes.push(this._nodes[i]);\n }\n }\n\n this._earliestReadmitTime = Math.min(\n Math.max(nextEarliestReadmitTime, this._nodeMinReadmitPeriod),\n this._nodeMaxReadmitPeriod,\n );\n }\n }\n\n /**\n * @param {number} count\n * @returns {NetworkNodeT[]}\n */\n _getNumberOfMostHealthyNodes(count) {\n this._removeDeadNodes();\n this._readmitNodes();\n\n const nodes = [];\n // Create a shallow for safe iteration\n let healthyNodes = this._healthyNodes.slice();\n count = Math.min(count, healthyNodes.length);\n\n for (let i = 0; i < count; i++) {\n // Select a random index\n const nodeIndex = Math.floor(Math.random() * healthyNodes.length);\n const selectedNode = healthyNodes[nodeIndex];\n\n // Check if the node exists\n if (!selectedNode) {\n break; // Break out of the loop if undefined node is selected\n }\n\n // Add the selected node in array for execution\n nodes.push(selectedNode);\n // Remove all nodes with the same account id as\n // the selected node account id from the array\n healthyNodes = healthyNodes.filter(\n // eslint-disable-next-line ie11/no-loop-func\n (node) => node.getKey() !== selectedNode.getKey(),\n );\n }\n\n return nodes;\n }\n\n /**\n * @param {number} i\n */\n _closeNode(i) {\n const node = this._nodes[i];\n\n node.close();\n this._removeNodeFromNetwork(node);\n this._nodes.splice(i, 1);\n }\n\n /**\n * @param {NetworkNodeT} node\n */\n _removeNodeFromNetwork(node) {\n const network = /** @type {NetworkNodeT[]} */ (\n this._network.get(node.getKey())\n );\n\n for (let j = 0; j < network.length; j++) {\n if (network[j] === node) {\n network.splice(j, 1);\n break;\n }\n }\n\n if (network.length === 0) {\n this._network.delete(node.getKey());\n }\n }\n\n /**\n * @param {Map<string, KeyT>} network\n * @returns {this}\n */\n _setNetwork(network) {\n /** @type {NetworkNodeT[]} */\n const newNodes = [];\n const newNodeKeys = new Set();\n const newNodeAddresses = new Set();\n\n /** @type {NetworkNodeT[]} */\n const newHealthyNodes = [];\n\n /** @type {Map<string, NetworkNodeT[]>} */\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const newNetwork = new Map();\n\n // Remove nodes that are not in the new network\n for (const i of this._getNodesToRemove(network)) {\n this._closeNode(i);\n }\n\n // Copy all the unclosed nodes\n for (const node of this._nodes) {\n newNodes.push(node);\n newNodeKeys.add(node.getKey());\n newNodeAddresses.add(node.address.toString());\n }\n\n // Add new nodes\n for (const [key, value] of network) {\n if (\n newNodeKeys.has(value.toString()) &&\n newNodeAddresses.has(key)\n ) {\n continue;\n }\n newNodes.push(this._createNodeFromNetworkEntry([key, value]));\n }\n\n // Shuffle the nodes so we don't immediately pick the first nodes\n util.shuffle(newNodes);\n\n // Copy all the nodes into the healhty nodes list initially\n // and push the nodes into the network; this maintains the\n // shuffled state from `newNodes`\n for (const node of newNodes) {\n if (!node.isHealthy()) {\n continue;\n }\n\n newHealthyNodes.push(node);\n\n const newNetworkNodes = newNetwork.has(node.getKey())\n ? /** @type {NetworkNodeT[]} */ (newNetwork.get(node.getKey()))\n : [];\n newNetworkNodes.push(node);\n newNetwork.set(node.getKey(), newNetworkNodes);\n }\n\n this._nodes = newNodes;\n this._healthyNodes = newHealthyNodes;\n this._network = newNetwork;\n\n return this;\n }\n\n /**\n * @returns {number}\n */\n get maxNodeAttempts() {\n return this._maxNodeAttempts;\n }\n\n /**\n * @param {number} maxNodeAttempts\n * @returns {this}\n */\n setMaxNodeAttempts(maxNodeAttempts) {\n this._maxNodeAttempts = maxNodeAttempts;\n return this;\n }\n\n /**\n * @returns {number}\n */\n get minBackoff() {\n return this._minBackoff;\n }\n\n /**\n * @param {number} minBackoff\n * @returns {this}\n */\n setMinBackoff(minBackoff) {\n this._minBackoff = minBackoff;\n for (const node of this._nodes) {\n node.setMinBackoff(minBackoff);\n }\n return this;\n }\n\n /**\n * @returns {number}\n */\n get maxBackoff() {\n return this._maxBackoff;\n }\n\n /**\n * @param {number} maxBackoff\n * @returns {this}\n */\n setMaxBackoff(maxBackoff) {\n this._maxBackoff = maxBackoff;\n for (const node of this._nodes) {\n node.setMaxBackoff(maxBackoff);\n }\n return this;\n }\n\n /**\n * @returns {number}\n */\n get nodeMinReadmitPeriod() {\n return this._nodeMinReadmitPeriod;\n }\n\n /**\n * @param {number} nodeMinReadmitPeriod\n * @returns {this}\n */\n setNodeMinReadmitPeriod(nodeMinReadmitPeriod) {\n this._nodeMinReadmitPeriod = nodeMinReadmitPeriod;\n this._earliestReadmitTime = Date.now() + this._nodeMinReadmitPeriod;\n return this;\n }\n\n /**\n * @returns {number}\n */\n get nodeMaxReadmitPeriod() {\n return this._nodeMaxReadmitPeriod;\n }\n\n /**\n * @param {number} nodeMaxReadmitPeriod\n * @returns {this}\n */\n setNodeMaxReadmitPeriod(nodeMaxReadmitPeriod) {\n this._nodeMaxReadmitPeriod = nodeMaxReadmitPeriod;\n return this;\n }\n\n /**\n * @param {KeyT=} key\n * @returns {NetworkNodeT}\n */\n getNode(key) {\n this._readmitNodes();\n if (key != null && key != undefined) {\n const lockedNodes = this._network.get(key.toString());\n if (lockedNodes) {\n const randomNodeAddress = Math.floor(\n Math.random() * lockedNodes.length,\n );\n return /** @type {NetworkNodeT[]} */ (lockedNodes)[\n randomNodeAddress\n ];\n } else {\n const nodes = Array.from(this._network.keys());\n const randomNodeAccountId =\n nodes[Math.floor(Math.random() * nodes.length)];\n\n const randomNode = this._network.get(randomNodeAccountId);\n // We get the `randomNodeAccountId` from the network mapping,\n // so it cannot be `undefined`\n const randomNodeAddress = Math.floor(\n // @ts-ignore\n Math.random() * randomNode.length,\n );\n // @ts-ignore\n return randomNode[randomNodeAddress];\n }\n } else {\n if (this._healthyNodes.length == 0) {\n throw new Error(\"failed to find a healthy working node\");\n }\n\n return this._healthyNodes[\n Math.floor(Math.random() * this._healthyNodes.length)\n ];\n }\n }\n\n /**\n * @param {NetworkNodeT} node\n */\n increaseBackoff(node) {\n node.increaseBackoff();\n\n for (let i = 0; i < this._healthyNodes.length; i++) {\n if (this._healthyNodes[i] == node) {\n this._healthyNodes.splice(i, 1);\n }\n }\n }\n\n /**\n * @param {NetworkNodeT} node\n */\n decreaseBackoff(node) {\n node.decreaseBackoff();\n }\n\n close() {\n for (const node of this._nodes) {\n node.close();\n }\n\n this._network.clear();\n this._nodes = [];\n }\n}\n"],"names":["ManagedNetwork","constructor","createNetworkChannel","this","_network","Map","_nodes","_healthyNodes","_createNetworkChannel","_ledgerId","_minBackoff","_maxBackoff","_maxNodeAttempts","_nodeMinReadmitPeriod","_nodeMaxReadmitPeriod","_earliestReadmitTime","Date","now","setNetworkName","networkName","console","warn","setLedgerId","ledgerId","toString","LedgerId","fromString","_createNodeFromNetworkEntry","entry","Error","_getNodesToRemove","network","_removeDeadNodes","i","length","_badGrpcStatusCount","_closeNode","_readmitNodes","nextEarliestReadmitTime","Number","MAX_SAFE_INTEGER","searchForNextEarliestReadmitTime","outer","j","_readmitTime","Math","min","push","max","_getNumberOfMostHealthyNodes","count","nodes","healthyNodes","slice","selectedNode","floor","random","filter","node","getKey","close","_removeNodeFromNetwork","splice","get","delete","_setNetwork","newNodes","newNodeKeys","Set","newNodeAddresses","newHealthyNodes","newNetwork","add","address","key","value","has","util.shuffle","isHealthy","newNetworkNodes","set","maxNodeAttempts","setMaxNodeAttempts","minBackoff","setMinBackoff","maxBackoff","setMaxBackoff","nodeMinReadmitPeriod","setNodeMinReadmitPeriod","nodeMaxReadmitPeriod","setNodeMaxReadmitPeriod","getNode","undefined","lockedNodes","Array","from","keys","randomNodeAccountId","randomNode","increaseBackoff","decreaseBackoff","clear"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MirrorNetwork.js","sources":["../../src/client/MirrorNetwork.js"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\nimport MirrorNode from \"../MirrorNode.js\";\nimport ManagedNetwork from \"./ManagedNetwork.js\";\n\n/**\n * @typedef {import(\"../channel/MirrorChannel.js\").default} MirrorChannel\n */\n\n/**\n * @augments {ManagedNetwork<MirrorChannel, MirrorNode, string>}\n */\nexport default class MirrorNetwork extends ManagedNetwork {\n /**\n * @param {(address: string) => MirrorChannel} channelInitFunction\n */\n constructor(channelInitFunction) {\n super(channelInitFunction);\n }\n\n /**\n * @param {string[]} network\n */\n setNetwork(network) {\n // eslint-disable-next-line ie11/no-collection-args\n this._setNetwork(new Map(network.map((address) => [address, address])));\n }\n\n /**\n * @returns {string[]}\n */\n get network() {\n /**\n * @type {string[]}\n */\n var n = [];\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const node of this._nodes) {\n n.push(node.address.toString());\n }\n\n return n;\n }\n\n /**\n * @abstract\n * @param {[string, string]} entry\n * @returns {MirrorNode}\n */\n _createNodeFromNetworkEntry(entry) {\n return new MirrorNode({\n newNode: {\n address: entry[1],\n channelInitFunction: this._createNetworkChannel,\n },\n }).setMinBackoff(this._minBackoff);\n }\n\n /**\n * @abstract\n * @param {Map<string, string>} network\n * @returns {number[]}\n */\n _getNodesToRemove(network) {\n const indexes = [];\n\n const values = Object.values(network);\n\n for (let i = this._nodes.length - 1; i >= 0; i--) {\n const node = this._nodes[i];\n\n if (!values.includes(node.address.toString())) {\n indexes.push(i);\n }\n }\n\n return indexes;\n }\n\n /**\n * @returns {MirrorNode}\n */\n getNextMirrorNode() {\n return this._getNumberOfMostHealthyNodes(1)[0];\n }\n\n /**\n * Gets the base URL for the mirror node REST API.\n *\n * @returns {string} The base URL for the mirror node REST API\n * @throws {Error} When no mirror network is configured or available\n */\n get mirrorRestApiBaseUrl() {\n try {\n const mirrorNode = this.getNextMirrorNode();\n return mirrorNode.mirrorRestApiBaseUrl;\n } catch (error) {\n // Re-throw with a more descriptive error message\n throw new Error(\n \"Client has no mirror network configured or no healthy mirror nodes are available\",\n );\n }\n }\n}\n"],"names":["MirrorNetwork","ManagedNetwork","constructor","channelInitFunction","super","setNetwork","network","this","_setNetwork","Map","map","address","n","node","_nodes","push","toString","_createNodeFromNetworkEntry","entry","MirrorNode","newNode","_createNetworkChannel","setMinBackoff","_minBackoff","_getNodesToRemove","indexes","values","Object","i","length","includes","getNextMirrorNode","_getNumberOfMostHealthyNodes","mirrorRestApiBaseUrl","error","Error"],"mappings":"mEAYe,MAAMA,UAAsBC,EAIvC,WAAAC,CAAYC,GACRC,MAAMD,
|
|
1
|
+
{"version":3,"file":"MirrorNetwork.js","sources":["../../src/client/MirrorNetwork.js"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\nimport MirrorNode from \"../MirrorNode.js\";\nimport ManagedNetwork from \"./ManagedNetwork.js\";\n\n/**\n * @typedef {import(\"../channel/MirrorChannel.js\").default} MirrorChannel\n */\n\n/**\n * @augments {ManagedNetwork<MirrorChannel, MirrorNode, string>}\n */\nexport default class MirrorNetwork extends ManagedNetwork {\n /**\n * @param {(address: string) => MirrorChannel} channelInitFunction\n */\n constructor(channelInitFunction) {\n super(channelInitFunction);\n }\n\n /**\n * @param {string[]} network\n */\n setNetwork(network) {\n // eslint-disable-next-line ie11/no-collection-args\n this._setNetwork(new Map(network.map((address) => [address, address])));\n }\n\n /**\n * @returns {string[]}\n */\n get network() {\n /**\n * @type {string[]}\n */\n var n = [];\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const node of this._nodes) {\n n.push(node.address.toString());\n }\n\n return n;\n }\n\n /**\n * @abstract\n * @param {[string, string]} entry\n * @returns {MirrorNode}\n */\n _createNodeFromNetworkEntry(entry) {\n return new MirrorNode({\n newNode: {\n address: entry[1],\n channelInitFunction: this._createNetworkChannel,\n },\n }).setMinBackoff(this._minBackoff);\n }\n\n /**\n * @abstract\n * @param {Map<string, string>} network\n * @returns {number[]}\n */\n _getNodesToRemove(network) {\n const indexes = [];\n\n const values = Object.values(network);\n\n for (let i = this._nodes.length - 1; i >= 0; i--) {\n const node = this._nodes[i];\n\n if (!values.includes(node.address.toString())) {\n indexes.push(i);\n }\n }\n\n return indexes;\n }\n\n /**\n * @returns {MirrorNode}\n */\n getNextMirrorNode() {\n return this._getNumberOfMostHealthyNodes(1)[0];\n }\n\n /**\n * Gets the base URL for the mirror node REST API.\n *\n * @returns {string} The base URL for the mirror node REST API\n * @throws {Error} When no mirror network is configured or available\n */\n get mirrorRestApiBaseUrl() {\n try {\n const mirrorNode = this.getNextMirrorNode();\n return mirrorNode.mirrorRestApiBaseUrl;\n } catch (error) {\n // Re-throw with a more descriptive error message\n throw new Error(\n \"Client has no mirror network configured or no healthy mirror nodes are available\",\n );\n }\n }\n}\n"],"names":["MirrorNetwork","ManagedNetwork","constructor","channelInitFunction","super","setNetwork","network","this","_setNetwork","Map","map","address","n","node","_nodes","push","toString","_createNodeFromNetworkEntry","entry","MirrorNode","newNode","_createNetworkChannel","setMinBackoff","_minBackoff","_getNodesToRemove","indexes","values","Object","i","length","includes","getNextMirrorNode","_getNumberOfMostHealthyNodes","mirrorRestApiBaseUrl","error","Error"],"mappings":"mEAYe,MAAMA,UAAsBC,EAIvC,WAAAC,CAAYC,GACRC,MAAMD,EACV,CAKA,UAAAE,CAAWC,GAEPC,KAAKC,YAAY,IAAIC,IAAIH,EAAQI,IAAKC,GAAY,CAACA,EAASA,KAChE,CAKA,WAAIL,GAIA,IAAIM,EAAI,GAGR,IAAK,MAAMC,KAAQN,KAAKO,OACpBF,EAAEG,KAAKF,EAAKF,QAAQK,YAGxB,OAAOJ,CACX,CAOA,2BAAAK,CAA4BC,GACxB,OAAO,IAAIC,EAAW,CAClBC,QAAS,CACLT,QAASO,EAAM,GACff,oBAAqBI,KAAKc,yBAE/BC,cAAcf,KAAKgB,YAC1B,CAOA,iBAAAC,CAAkBlB,GACd,MAAMmB,EAAU,GAEVC,EAASC,OAAOD,OAAOpB,GAE7B,IAAK,IAAIsB,EAAIrB,KAAKO,OAAOe,OAAS,EAAGD,GAAK,EAAGA,IAAK,CAC9C,MAAMf,EAAON,KAAKO,OAAOc,GAEpBF,EAAOI,SAASjB,EAAKF,QAAQK,aAC9BS,EAAQV,KAAKa,EAErB,CAEA,OAAOH,CACX,CAKA,iBAAAM,GACI,OAAOxB,KAAKyB,6BAA6B,GAAG,EAChD,CAQA,wBAAIC,GACA,IAEI,OADmB1B,KAAKwB,oBACNE,oBACtB,CAAE,MAAOC,GAEL,MAAM,IAAIC,MACN,mFAER,CACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeClient.js","sources":["../../src/client/NativeClient.js"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\nimport Client from \"./Client.js\";\nimport NativeChannel from \"../channel/NativeChannel.js\";\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport AccountId from \"../account/AccountId.js\";\nimport LedgerId from \"../LedgerId.js\";\nimport { MirrorNetwork, WebNetwork } from \"../constants/ClientConstants.js\";\nimport AddressBookQuery from \"../network/AddressBookQueryWeb.js\";\nimport FileId from \"../file/FileId.js\";\n\n/**\n * @typedef {import(\"./Client.js\").ClientConfiguration} ClientConfiguration\n */\n\n/**\n * @augments {Client<NativeChannel, *>}\n */\nexport default class NativeClient extends Client {\n /**\n * @param {ClientConfiguration} [props]\n */\n constructor(props) {\n super(props);\n\n if (props != null) {\n if (typeof props.network === \"string\") {\n switch (props.network) {\n case \"mainnet\":\n this.setNetwork(WebNetwork.MAINNET);\n this.setLedgerId(LedgerId.MAINNET);\n this.setMirrorNetwork(MirrorNetwork.MAINNET);\n break;\n\n case \"testnet\":\n this.setNetwork(WebNetwork.TESTNET);\n this.setLedgerId(LedgerId.TESTNET);\n this.setMirrorNetwork(MirrorNetwork.TESTNET);\n break;\n\n case \"previewnet\":\n this.setNetwork(WebNetwork.PREVIEWNET);\n this.setLedgerId(LedgerId.PREVIEWNET);\n this.setMirrorNetwork(MirrorNetwork.PREVIEWNET);\n break;\n\n default:\n throw new Error(\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `unknown network: ${props.network}`,\n );\n }\n } else if (props.network != null) {\n Client._validateNetworkConsistency(props.network);\n\n const { shard, realm } = Client._extractShardRealm(\n props.network,\n );\n\n // Shard and realm are inferred from the network, so we need to set them here\n // to ensure that the client is properly configured.\n this._shard = shard;\n this._realm = realm;\n\n this.setNetwork(props.network);\n }\n }\n }\n\n /**\n * @param {string | ClientConfiguration} data\n * @returns {NativeClient}\n */\n static fromConfig(data) {\n return new NativeClient(\n typeof data === \"string\"\n ? /** @type {ClientConfiguration | undefined} */ (\n JSON.parse(data)\n )\n : data,\n );\n }\n\n /**\n * Construct a client for a specific network.\n *\n * It is the responsibility of the caller to ensure that all nodes in the map are part of the\n * same Hedera network. Failure to do so will result in undefined behavior.\n *\n * The client will load balance all requests to Hedera using a simple round-robin scheme to\n * chose nodes to send transactions to. For one transaction, at most 1/3 of the nodes will be\n * tried.\n *\n * @param {{[key: string]: (string | AccountId)} | string} network\n * @returns {NativeClient}\n */\n static forNetwork(network) {\n return new NativeClient({\n network,\n });\n }\n\n /**\n * @param {string} network\n * @returns {NativeClient}\n */\n static forName(network) {\n return new NativeClient({ network });\n }\n\n /**\n * Construct a Hedera client pre-configured for Mainnet access.\n *\n * @returns {NativeClient}\n */\n static forMainnet() {\n return new NativeClient({\n network: \"mainnet\",\n });\n }\n\n /**\n * Construct a Hedera client pre-configured for Testnet access.\n *\n * @returns {NativeClient}\n */\n static forTestnet() {\n return new NativeClient({\n network: \"testnet\",\n });\n }\n\n /**\n * Construct a Hedera client pre-configured for Previewnet access.\n *\n * @returns {NativeClient}\n */\n static forPreviewnet() {\n return new NativeClient({\n network: \"previewnet\",\n });\n }\n\n /**\n * Construct a Hedera client pre-configured for Mainnet access with network update.\n *\n * @returns {Promise<NativeClient>}\n */\n static async forMainnetAsync() {\n return new NativeClient({\n network: \"mainnet\",\n }).updateNetwork();\n }\n\n /**\n * Construct a Hedera client pre-configured for Testnet access with network update.\n *\n * @returns {Promise<NativeClient>}\n */\n static async forTestnetAsync() {\n return new NativeClient({\n network: \"testnet\",\n }).updateNetwork();\n }\n\n /**\n * Construct a Hedera client pre-configured for Previewnet access with network update.\n *\n * @returns {Promise<NativeClient>}\n */\n static async forPreviewnetAsync() {\n return new NativeClient({\n network: \"previewnet\",\n }).updateNetwork();\n }\n\n /**\n * Construct a client for a specific network with optional network update.\n * Updates network only if the network is not \"local-node\".\n *\n * @param {string} network\n * @returns {Promise<NativeClient>}\n */\n static async forNameAsync(network) {\n const client = new NativeClient({ network });\n\n if (network !== \"local-node\") {\n await client.updateNetwork();\n }\n\n return client;\n }\n\n /**\n * Construct a client configured to use mirror nodes.\n * This will query the address book to get the network nodes.\n *\n * @param {string[] | string} mirrorNetwork\n * @returns {Promise<NativeClient>}\n */\n static async forMirrorNetwork(mirrorNetwork) {\n const client = new NativeClient({\n mirrorNetwork,\n });\n\n await client.updateNetwork();\n\n return client;\n }\n\n /**\n * @param {{[key: string]: (string | AccountId)} | string} network\n * @returns {void}\n */\n setNetwork(network) {\n if (typeof network === \"string\") {\n switch (network) {\n case \"previewnet\":\n this._network.setNetwork(WebNetwork.PREVIEWNET);\n break;\n case \"testnet\":\n this._network.setNetwork(WebNetwork.TESTNET);\n break;\n case \"mainnet\":\n this._network.setNetwork(WebNetwork.MAINNET);\n }\n } else {\n this._network.setNetwork(network);\n }\n }\n\n /**\n * @param {string[] | string} mirrorNetwork\n * @returns {this}\n */\n setMirrorNetwork(mirrorNetwork) {\n if (typeof mirrorNetwork === \"string\") {\n switch (mirrorNetwork) {\n case \"local-node\":\n this._mirrorNetwork.setNetwork(MirrorNetwork.LOCAL_NODE);\n break;\n case \"previewnet\":\n this._mirrorNetwork.setNetwork(MirrorNetwork.PREVIEWNET);\n break;\n case \"testnet\":\n this._mirrorNetwork.setNetwork(MirrorNetwork.TESTNET);\n break;\n case \"mainnet\":\n this._mirrorNetwork.setNetwork(MirrorNetwork.MAINNET);\n break;\n default:\n this._mirrorNetwork.setNetwork([mirrorNetwork]);\n }\n } else {\n this._mirrorNetwork.setNetwork(mirrorNetwork);\n }\n\n return this;\n }\n\n /**\n * @override\n * @returns {Promise<this>}\n */\n async updateNetwork() {\n if (this._isUpdatingNetwork) {\n return this;\n }\n\n this._isUpdatingNetwork = true;\n\n try {\n const addressBook = await new AddressBookQuery()\n .setFileId(\n FileId.getAddressBookFileIdFor(this.shard, this.realm),\n )\n .execute(this);\n\n /** @type {Record<string, AccountId>} */\n const network = {};\n for (const nodeAddress of addressBook.nodeAddresses) {\n for (const endpoint of nodeAddress.addresses) {\n if (nodeAddress.accountId != null) {\n network[endpoint.toString()] = nodeAddress.accountId;\n }\n }\n }\n\n this.setNetwork(network);\n } catch (/** @type {unknown} */ error) {\n if (this._logger) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n this._logger.trace(\n `failed to update client address book: ${errorMessage}`,\n );\n }\n } finally {\n this._isUpdatingNetwork = false;\n }\n\n return this;\n }\n\n /**\n * @override\n * @returns {(address: string) => NativeChannel}\n */\n _createNetworkChannel() {\n return (address) => new NativeChannel(address, this.grpcDeadline);\n }\n\n /**\n * @override\n * @returns {(address: string) => *}\n */\n _createMirrorNetworkChannel() {\n return () => {\n throw new Error(\"mirror support is not supported in native\");\n };\n }\n}\n"],"names":["NativeClient","Client","constructor","props","super","network","this","setNetwork","WebNetwork","MAINNET","setLedgerId","LedgerId","setMirrorNetwork","MirrorNetwork","TESTNET","PREVIEWNET","Error","_validateNetworkConsistency","shard","realm","_extractShardRealm","_shard","_realm","fromConfig","data","JSON","parse","forNetwork","forName","forMainnet","forTestnet","forPreviewnet","forMainnetAsync","updateNetwork","forTestnetAsync","forPreviewnetAsync","forNameAsync","client","forMirrorNetwork","mirrorNetwork","_network","_mirrorNetwork","LOCAL_NODE","_isUpdatingNetwork","addressBook","AddressBookQuery","setFileId","FileId","getAddressBookFileIdFor","execute","nodeAddress","nodeAddresses","endpoint","addresses","accountId","toString","error","_logger","errorMessage","message","String","trace","_createNetworkChannel","address","NativeChannel","grpcDeadline","_createMirrorNetworkChannel"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"NativeClient.js","sources":["../../src/client/NativeClient.js"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\nimport Client from \"./Client.js\";\nimport NativeChannel from \"../channel/NativeChannel.js\";\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport AccountId from \"../account/AccountId.js\";\nimport LedgerId from \"../LedgerId.js\";\nimport { MirrorNetwork, WebNetwork } from \"../constants/ClientConstants.js\";\nimport AddressBookQuery from \"../network/AddressBookQueryWeb.js\";\nimport FileId from \"../file/FileId.js\";\n\n/**\n * @typedef {import(\"./Client.js\").ClientConfiguration} ClientConfiguration\n */\n\n/**\n * @augments {Client<NativeChannel, *>}\n */\nexport default class NativeClient extends Client {\n /**\n * @param {ClientConfiguration} [props]\n */\n constructor(props) {\n super(props);\n\n if (props != null) {\n if (typeof props.network === \"string\") {\n switch (props.network) {\n case \"mainnet\":\n this.setNetwork(WebNetwork.MAINNET);\n this.setLedgerId(LedgerId.MAINNET);\n this.setMirrorNetwork(MirrorNetwork.MAINNET);\n break;\n\n case \"testnet\":\n this.setNetwork(WebNetwork.TESTNET);\n this.setLedgerId(LedgerId.TESTNET);\n this.setMirrorNetwork(MirrorNetwork.TESTNET);\n break;\n\n case \"previewnet\":\n this.setNetwork(WebNetwork.PREVIEWNET);\n this.setLedgerId(LedgerId.PREVIEWNET);\n this.setMirrorNetwork(MirrorNetwork.PREVIEWNET);\n break;\n\n default:\n throw new Error(\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `unknown network: ${props.network}`,\n );\n }\n } else if (props.network != null) {\n Client._validateNetworkConsistency(props.network);\n\n const { shard, realm } = Client._extractShardRealm(\n props.network,\n );\n\n // Shard and realm are inferred from the network, so we need to set them here\n // to ensure that the client is properly configured.\n this._shard = shard;\n this._realm = realm;\n\n this.setNetwork(props.network);\n }\n }\n }\n\n /**\n * @param {string | ClientConfiguration} data\n * @returns {NativeClient}\n */\n static fromConfig(data) {\n return new NativeClient(\n typeof data === \"string\"\n ? /** @type {ClientConfiguration | undefined} */ (\n JSON.parse(data)\n )\n : data,\n );\n }\n\n /**\n * Construct a client for a specific network.\n *\n * It is the responsibility of the caller to ensure that all nodes in the map are part of the\n * same Hedera network. Failure to do so will result in undefined behavior.\n *\n * The client will load balance all requests to Hedera using a simple round-robin scheme to\n * chose nodes to send transactions to. For one transaction, at most 1/3 of the nodes will be\n * tried.\n *\n * @param {{[key: string]: (string | AccountId)} | string} network\n * @returns {NativeClient}\n */\n static forNetwork(network) {\n return new NativeClient({\n network,\n });\n }\n\n /**\n * @param {string} network\n * @returns {NativeClient}\n */\n static forName(network) {\n return new NativeClient({ network });\n }\n\n /**\n * Construct a Hedera client pre-configured for Mainnet access.\n *\n * @returns {NativeClient}\n */\n static forMainnet() {\n return new NativeClient({\n network: \"mainnet\",\n });\n }\n\n /**\n * Construct a Hedera client pre-configured for Testnet access.\n *\n * @returns {NativeClient}\n */\n static forTestnet() {\n return new NativeClient({\n network: \"testnet\",\n });\n }\n\n /**\n * Construct a Hedera client pre-configured for Previewnet access.\n *\n * @returns {NativeClient}\n */\n static forPreviewnet() {\n return new NativeClient({\n network: \"previewnet\",\n });\n }\n\n /**\n * Construct a Hedera client pre-configured for Mainnet access with network update.\n *\n * @returns {Promise<NativeClient>}\n */\n static async forMainnetAsync() {\n return new NativeClient({\n network: \"mainnet\",\n }).updateNetwork();\n }\n\n /**\n * Construct a Hedera client pre-configured for Testnet access with network update.\n *\n * @returns {Promise<NativeClient>}\n */\n static async forTestnetAsync() {\n return new NativeClient({\n network: \"testnet\",\n }).updateNetwork();\n }\n\n /**\n * Construct a Hedera client pre-configured for Previewnet access with network update.\n *\n * @returns {Promise<NativeClient>}\n */\n static async forPreviewnetAsync() {\n return new NativeClient({\n network: \"previewnet\",\n }).updateNetwork();\n }\n\n /**\n * Construct a client for a specific network with optional network update.\n * Updates network only if the network is not \"local-node\".\n *\n * @param {string} network\n * @returns {Promise<NativeClient>}\n */\n static async forNameAsync(network) {\n const client = new NativeClient({ network });\n\n if (network !== \"local-node\") {\n await client.updateNetwork();\n }\n\n return client;\n }\n\n /**\n * Construct a client configured to use mirror nodes.\n * This will query the address book to get the network nodes.\n *\n * @param {string[] | string} mirrorNetwork\n * @returns {Promise<NativeClient>}\n */\n static async forMirrorNetwork(mirrorNetwork) {\n const client = new NativeClient({\n mirrorNetwork,\n });\n\n await client.updateNetwork();\n\n return client;\n }\n\n /**\n * @param {{[key: string]: (string | AccountId)} | string} network\n * @returns {void}\n */\n setNetwork(network) {\n if (typeof network === \"string\") {\n switch (network) {\n case \"previewnet\":\n this._network.setNetwork(WebNetwork.PREVIEWNET);\n break;\n case \"testnet\":\n this._network.setNetwork(WebNetwork.TESTNET);\n break;\n case \"mainnet\":\n this._network.setNetwork(WebNetwork.MAINNET);\n }\n } else {\n this._network.setNetwork(network);\n }\n }\n\n /**\n * @param {string[] | string} mirrorNetwork\n * @returns {this}\n */\n setMirrorNetwork(mirrorNetwork) {\n if (typeof mirrorNetwork === \"string\") {\n switch (mirrorNetwork) {\n case \"local-node\":\n this._mirrorNetwork.setNetwork(MirrorNetwork.LOCAL_NODE);\n break;\n case \"previewnet\":\n this._mirrorNetwork.setNetwork(MirrorNetwork.PREVIEWNET);\n break;\n case \"testnet\":\n this._mirrorNetwork.setNetwork(MirrorNetwork.TESTNET);\n break;\n case \"mainnet\":\n this._mirrorNetwork.setNetwork(MirrorNetwork.MAINNET);\n break;\n default:\n this._mirrorNetwork.setNetwork([mirrorNetwork]);\n }\n } else {\n this._mirrorNetwork.setNetwork(mirrorNetwork);\n }\n\n return this;\n }\n\n /**\n * @override\n * @returns {Promise<this>}\n */\n async updateNetwork() {\n if (this._isUpdatingNetwork) {\n return this;\n }\n\n this._isUpdatingNetwork = true;\n\n try {\n const addressBook = await new AddressBookQuery()\n .setFileId(\n FileId.getAddressBookFileIdFor(this.shard, this.realm),\n )\n .execute(this);\n\n /** @type {Record<string, AccountId>} */\n const network = {};\n for (const nodeAddress of addressBook.nodeAddresses) {\n for (const endpoint of nodeAddress.addresses) {\n if (nodeAddress.accountId != null) {\n network[endpoint.toString()] = nodeAddress.accountId;\n }\n }\n }\n\n this.setNetwork(network);\n } catch (/** @type {unknown} */ error) {\n if (this._logger) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n this._logger.trace(\n `failed to update client address book: ${errorMessage}`,\n );\n }\n } finally {\n this._isUpdatingNetwork = false;\n }\n\n return this;\n }\n\n /**\n * @override\n * @returns {(address: string) => NativeChannel}\n */\n _createNetworkChannel() {\n return (address) => new NativeChannel(address, this.grpcDeadline);\n }\n\n /**\n * @override\n * @returns {(address: string) => *}\n */\n _createMirrorNetworkChannel() {\n return () => {\n throw new Error(\"mirror support is not supported in native\");\n };\n }\n}\n"],"names":["NativeClient","Client","constructor","props","super","network","this","setNetwork","WebNetwork","MAINNET","setLedgerId","LedgerId","setMirrorNetwork","MirrorNetwork","TESTNET","PREVIEWNET","Error","_validateNetworkConsistency","shard","realm","_extractShardRealm","_shard","_realm","fromConfig","data","JSON","parse","forNetwork","forName","forMainnet","forTestnet","forPreviewnet","forMainnetAsync","updateNetwork","forTestnetAsync","forPreviewnetAsync","forNameAsync","client","forMirrorNetwork","mirrorNetwork","_network","_mirrorNetwork","LOCAL_NODE","_isUpdatingNetwork","addressBook","AddressBookQuery","setFileId","FileId","getAddressBookFileIdFor","execute","nodeAddress","nodeAddresses","endpoint","addresses","accountId","toString","error","_logger","errorMessage","message","String","trace","_createNetworkChannel","address","NativeChannel","grpcDeadline","_createMirrorNetworkChannel"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Network.js","sources":["../../src/client/Network.js"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\nimport AccountId from \"../account/AccountId.js\";\nimport Node from \"../Node.js\";\nimport {\n PREVIEWNET_ADDRESS_BOOK,\n TESTNET_ADDRESS_BOOK,\n MAINNET_ADDRESS_BOOK,\n} from \"../address_book/AddressBooks.js\";\nimport ManagedNetwork from \"./ManagedNetwork.js\";\n\n/**\n * @typedef {import(\"../channel/Channel.js\").default} Channel\n * @typedef {import(\"../address_book/NodeAddressBook.js\").default} NodeAddressBook\n */\n\n/**\n * @augments {ManagedNetwork<Channel, Node, AccountId>}\n */\nexport default class Network extends ManagedNetwork {\n /**\n * @param {(address: string) => Channel} createNetworkChannel\n */\n constructor(createNetworkChannel) {\n super(createNetworkChannel);\n\n this._maxNodesPerTransaction = -1;\n\n /** @type {NodeAddressBook | null} */\n this._addressBook = null;\n\n /** @type {boolean} */\n this._transportSecurity = false;\n }\n\n /**\n * @param {{[key: string]: (string | AccountId)}} network\n */\n setNetwork(network) {\n this._setNetwork(\n // eslint-disable-next-line ie11/no-collection-args\n new Map(\n // eslint-disable-next-line ie11/no-collection-args\n Object.entries(network).map(([key, value]) => {\n return [\n key,\n typeof value === \"string\"\n ? AccountId.fromString(value)\n : value,\n ];\n }),\n ),\n );\n }\n\n /**\n * @param {NodeAddressBook} addressBook\n * @returns {this}\n */\n setNetworkFromAddressBook(addressBook) {\n /** @type {Record<string, AccountId>} */\n const network = {};\n const port = this.isTransportSecurity() ? 50212 : 50211;\n\n for (const nodeAddress of addressBook.nodeAddresses) {\n for (const endpoint of nodeAddress.addresses) {\n // TODO: We hard code ports too much, should fix\n if (endpoint.port === port && nodeAddress.accountId != null) {\n network[endpoint.toString()] = nodeAddress.accountId;\n }\n }\n }\n\n this.setNetwork(network);\n return this;\n }\n\n /**\n * @returns {{[key: string]: (string | AccountId)}}\n */\n get network() {\n /**\n * @type {{[key: string]: (string | AccountId)}}\n */\n var n = {};\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const node of this._nodes) {\n n[node.address.toString()] = node.accountId;\n }\n\n return n;\n }\n\n /**\n * @param {string} networkName\n * @returns {this}\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n setNetworkName(networkName) {\n super.setLedgerId(networkName);\n\n switch (networkName) {\n case \"mainnet\":\n this._addressBook = MAINNET_ADDRESS_BOOK;\n break;\n case \"testnet\":\n this._addressBook = TESTNET_ADDRESS_BOOK;\n break;\n case \"previewnet\":\n this._addressBook = PREVIEWNET_ADDRESS_BOOK;\n break;\n }\n\n if (this._addressBook != null) {\n for (const node of this._nodes) {\n for (const address of this._addressBook.nodeAddresses) {\n if (\n address.accountId != null &&\n address.accountId.toString() ===\n node.accountId.toString()\n ) {\n node.setNodeAddress(address);\n }\n }\n }\n }\n\n return this;\n }\n\n /**\n * @returns {string | null}\n */\n get networkName() {\n return this._ledgerId != null ? this._ledgerId.toString() : null;\n }\n\n /**\n * @abstract\n * @param {[string, (string | AccountId)]} entry\n * @returns {Node}\n */\n _createNodeFromNetworkEntry(entry) {\n const accountId =\n typeof entry[1] === \"string\"\n ? AccountId.fromString(entry[1])\n : entry[1];\n\n return new Node({\n newNode: {\n address: entry[0],\n accountId,\n channelInitFunction: this._createNetworkChannel,\n },\n }).setMinBackoff(this._minBackoff);\n }\n\n /**\n * @abstract\n * @param {Map<string, AccountId>} network\n * @returns {number[]}\n */\n _getNodesToRemove(network) {\n const indexes = [];\n\n for (let i = this._nodes.length - 1; i >= 0; i--) {\n const node = this._nodes[i];\n const accountId = network.get(node.address.toString());\n\n if (\n accountId == null ||\n accountId.toString() !== node.accountId.toString()\n ) {\n indexes.push(i);\n }\n }\n\n return indexes;\n }\n\n /**\n * @abstract\n * @param {[string, (string | AccountId)]} entry\n * @returns {boolean}\n */\n _checkNetworkContainsEntry(entry) {\n for (const node of this._nodes) {\n if (node.address.toString() === entry[0]) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * @returns {number}\n */\n get maxNodesPerTransaction() {\n return this._maxNodesPerTransaction;\n }\n\n /**\n * @param {number} maxNodesPerTransaction\n * @returns {this}\n */\n setMaxNodesPerTransaction(maxNodesPerTransaction) {\n this._maxNodesPerTransaction = maxNodesPerTransaction;\n return this;\n }\n\n /**\n * @returns {number}\n */\n get maxNodeAttempts() {\n return this._maxNodeAttempts;\n }\n\n /**\n * @param {number} maxNodeAttempts\n * @returns {this}\n */\n setMaxNodeAttempts(maxNodeAttempts) {\n this._maxNodeAttempts = maxNodeAttempts;\n return this;\n }\n\n /**\n * @returns {boolean}\n */\n isTransportSecurity() {\n return this._transportSecurity;\n }\n\n /**\n * @param {boolean} transportSecurity\n * @returns {this}\n */\n setTransportSecurity(transportSecurity) {\n if (this._transportSecurity == transportSecurity) {\n return this;\n }\n\n this._network.clear();\n\n for (let i = 0; i < this._nodes.length; i++) {\n let node = this._nodes[i];\n node.close();\n\n node = /** @type {Node} */ (\n transportSecurity\n ? node\n .toSecure()\n .setCert(\n this._ledgerId != null\n ? this._ledgerId.toString()\n : \"\",\n )\n : node.toInsecure()\n );\n this._nodes[i] = node;\n\n const nodes =\n this._network.get(node.getKey()) != null\n ? /** @type {Node[]} */ (this._network.get(node.getKey()))\n : [];\n nodes.push(node);\n this._network.set(node.getKey(), nodes);\n }\n\n // Overwrite healthy node list since new ports might make the node work again\n this._healthyNodes = [...this._nodes];\n\n this._transportSecurity = transportSecurity;\n return this;\n }\n\n /**\n * @internal\n * @returns {number}\n */\n getNumberOfNodesForTransaction() {\n if (this._maxNodesPerTransaction > 0) {\n return this._maxNodesPerTransaction;\n }\n return this._nodes.length;\n }\n\n /**\n * @internal\n * @returns {AccountId[]}\n */\n getNodeAccountIdsForExecute() {\n return this._getNumberOfMostHealthyNodes(\n this.getNumberOfNodesForTransaction(),\n ).map((node) => node.accountId);\n }\n}\n"],"names":["Network","ManagedNetwork","constructor","createNetworkChannel","super","this","_maxNodesPerTransaction","_addressBook","_transportSecurity","setNetwork","network","_setNetwork","Map","Object","entries","map","key","value","AccountId","fromString","setNetworkFromAddressBook","addressBook","port","isTransportSecurity","nodeAddress","nodeAddresses","endpoint","addresses","accountId","toString","n","node","_nodes","address","setNetworkName","networkName","setLedgerId","MAINNET_ADDRESS_BOOK","TESTNET_ADDRESS_BOOK","PREVIEWNET_ADDRESS_BOOK","setNodeAddress","_ledgerId","_createNodeFromNetworkEntry","entry","Node","newNode","channelInitFunction","_createNetworkChannel","setMinBackoff","_minBackoff","_getNodesToRemove","indexes","i","length","get","push","_checkNetworkContainsEntry","maxNodesPerTransaction","setMaxNodesPerTransaction","maxNodeAttempts","_maxNodeAttempts","setMaxNodeAttempts","setTransportSecurity","transportSecurity","_network","clear","close","toSecure","setCert","toInsecure","nodes","getKey","set","_healthyNodes","getNumberOfNodesForTransaction","getNodeAccountIdsForExecute","_getNumberOfMostHealthyNodes"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Network.js","sources":["../../src/client/Network.js"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\nimport AccountId from \"../account/AccountId.js\";\nimport Node from \"../Node.js\";\nimport {\n PREVIEWNET_ADDRESS_BOOK,\n TESTNET_ADDRESS_BOOK,\n MAINNET_ADDRESS_BOOK,\n} from \"../address_book/AddressBooks.js\";\nimport ManagedNetwork from \"./ManagedNetwork.js\";\n\n/**\n * @typedef {import(\"../channel/Channel.js\").default} Channel\n * @typedef {import(\"../address_book/NodeAddressBook.js\").default} NodeAddressBook\n */\n\n/**\n * @augments {ManagedNetwork<Channel, Node, AccountId>}\n */\nexport default class Network extends ManagedNetwork {\n /**\n * @param {(address: string) => Channel} createNetworkChannel\n */\n constructor(createNetworkChannel) {\n super(createNetworkChannel);\n\n this._maxNodesPerTransaction = -1;\n\n /** @type {NodeAddressBook | null} */\n this._addressBook = null;\n\n /** @type {boolean} */\n this._transportSecurity = false;\n }\n\n /**\n * @param {{[key: string]: (string | AccountId)}} network\n */\n setNetwork(network) {\n this._setNetwork(\n // eslint-disable-next-line ie11/no-collection-args\n new Map(\n // eslint-disable-next-line ie11/no-collection-args\n Object.entries(network).map(([key, value]) => {\n return [\n key,\n typeof value === \"string\"\n ? AccountId.fromString(value)\n : value,\n ];\n }),\n ),\n );\n }\n\n /**\n * @param {NodeAddressBook} addressBook\n * @returns {this}\n */\n setNetworkFromAddressBook(addressBook) {\n /** @type {Record<string, AccountId>} */\n const network = {};\n const port = this.isTransportSecurity() ? 50212 : 50211;\n\n for (const nodeAddress of addressBook.nodeAddresses) {\n for (const endpoint of nodeAddress.addresses) {\n // TODO: We hard code ports too much, should fix\n if (endpoint.port === port && nodeAddress.accountId != null) {\n network[endpoint.toString()] = nodeAddress.accountId;\n }\n }\n }\n\n this.setNetwork(network);\n return this;\n }\n\n /**\n * @returns {{[key: string]: (string | AccountId)}}\n */\n get network() {\n /**\n * @type {{[key: string]: (string | AccountId)}}\n */\n var n = {};\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const node of this._nodes) {\n n[node.address.toString()] = node.accountId;\n }\n\n return n;\n }\n\n /**\n * @param {string} networkName\n * @returns {this}\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n setNetworkName(networkName) {\n super.setLedgerId(networkName);\n\n switch (networkName) {\n case \"mainnet\":\n this._addressBook = MAINNET_ADDRESS_BOOK;\n break;\n case \"testnet\":\n this._addressBook = TESTNET_ADDRESS_BOOK;\n break;\n case \"previewnet\":\n this._addressBook = PREVIEWNET_ADDRESS_BOOK;\n break;\n }\n\n if (this._addressBook != null) {\n for (const node of this._nodes) {\n for (const address of this._addressBook.nodeAddresses) {\n if (\n address.accountId != null &&\n address.accountId.toString() ===\n node.accountId.toString()\n ) {\n node.setNodeAddress(address);\n }\n }\n }\n }\n\n return this;\n }\n\n /**\n * @returns {string | null}\n */\n get networkName() {\n return this._ledgerId != null ? this._ledgerId.toString() : null;\n }\n\n /**\n * @abstract\n * @param {[string, (string | AccountId)]} entry\n * @returns {Node}\n */\n _createNodeFromNetworkEntry(entry) {\n const accountId =\n typeof entry[1] === \"string\"\n ? AccountId.fromString(entry[1])\n : entry[1];\n\n return new Node({\n newNode: {\n address: entry[0],\n accountId,\n channelInitFunction: this._createNetworkChannel,\n },\n }).setMinBackoff(this._minBackoff);\n }\n\n /**\n * @abstract\n * @param {Map<string, AccountId>} network\n * @returns {number[]}\n */\n _getNodesToRemove(network) {\n const indexes = [];\n\n for (let i = this._nodes.length - 1; i >= 0; i--) {\n const node = this._nodes[i];\n const accountId = network.get(node.address.toString());\n\n if (\n accountId == null ||\n accountId.toString() !== node.accountId.toString()\n ) {\n indexes.push(i);\n }\n }\n\n return indexes;\n }\n\n /**\n * @abstract\n * @param {[string, (string | AccountId)]} entry\n * @returns {boolean}\n */\n _checkNetworkContainsEntry(entry) {\n for (const node of this._nodes) {\n if (node.address.toString() === entry[0]) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * @returns {number}\n */\n get maxNodesPerTransaction() {\n return this._maxNodesPerTransaction;\n }\n\n /**\n * @param {number} maxNodesPerTransaction\n * @returns {this}\n */\n setMaxNodesPerTransaction(maxNodesPerTransaction) {\n this._maxNodesPerTransaction = maxNodesPerTransaction;\n return this;\n }\n\n /**\n * @returns {number}\n */\n get maxNodeAttempts() {\n return this._maxNodeAttempts;\n }\n\n /**\n * @param {number} maxNodeAttempts\n * @returns {this}\n */\n setMaxNodeAttempts(maxNodeAttempts) {\n this._maxNodeAttempts = maxNodeAttempts;\n return this;\n }\n\n /**\n * @returns {boolean}\n */\n isTransportSecurity() {\n return this._transportSecurity;\n }\n\n /**\n * @param {boolean} transportSecurity\n * @returns {this}\n */\n setTransportSecurity(transportSecurity) {\n if (this._transportSecurity == transportSecurity) {\n return this;\n }\n\n this._network.clear();\n\n for (let i = 0; i < this._nodes.length; i++) {\n let node = this._nodes[i];\n node.close();\n\n node = /** @type {Node} */ (\n transportSecurity\n ? node\n .toSecure()\n .setCert(\n this._ledgerId != null\n ? this._ledgerId.toString()\n : \"\",\n )\n : node.toInsecure()\n );\n this._nodes[i] = node;\n\n const nodes =\n this._network.get(node.getKey()) != null\n ? /** @type {Node[]} */ (this._network.get(node.getKey()))\n : [];\n nodes.push(node);\n this._network.set(node.getKey(), nodes);\n }\n\n // Overwrite healthy node list since new ports might make the node work again\n this._healthyNodes = [...this._nodes];\n\n this._transportSecurity = transportSecurity;\n return this;\n }\n\n /**\n * @internal\n * @returns {number}\n */\n getNumberOfNodesForTransaction() {\n if (this._maxNodesPerTransaction > 0) {\n return this._maxNodesPerTransaction;\n }\n return this._nodes.length;\n }\n\n /**\n * @internal\n * @returns {AccountId[]}\n */\n getNodeAccountIdsForExecute() {\n return this._getNumberOfMostHealthyNodes(\n this.getNumberOfNodesForTransaction(),\n ).map((node) => node.accountId);\n }\n}\n"],"names":["Network","ManagedNetwork","constructor","createNetworkChannel","super","this","_maxNodesPerTransaction","_addressBook","_transportSecurity","setNetwork","network","_setNetwork","Map","Object","entries","map","key","value","AccountId","fromString","setNetworkFromAddressBook","addressBook","port","isTransportSecurity","nodeAddress","nodeAddresses","endpoint","addresses","accountId","toString","n","node","_nodes","address","setNetworkName","networkName","setLedgerId","MAINNET_ADDRESS_BOOK","TESTNET_ADDRESS_BOOK","PREVIEWNET_ADDRESS_BOOK","setNodeAddress","_ledgerId","_createNodeFromNetworkEntry","entry","Node","newNode","channelInitFunction","_createNetworkChannel","setMinBackoff","_minBackoff","_getNodesToRemove","indexes","i","length","get","push","_checkNetworkContainsEntry","maxNodesPerTransaction","setMaxNodesPerTransaction","maxNodeAttempts","_maxNodeAttempts","setMaxNodeAttempts","setTransportSecurity","transportSecurity","_network","clear","close","toSecure","setCert","toInsecure","nodes","getKey","set","_healthyNodes","getNumberOfNodesForTransaction","getNodeAccountIdsForExecute","_getNumberOfMostHealthyNodes"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NodeClient.js","sources":["../../src/client/NodeClient.js"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\nimport fs from \"fs\";\nimport util from \"util\";\nimport Client from \"./Client.js\";\nimport NodeChannel from \"../channel/NodeChannel.js\";\nimport NodeMirrorChannel from \"../channel/NodeMirrorChannel.js\";\nimport LedgerId from \"../LedgerId.js\";\nimport NodeAddressBook from \"../address_book/NodeAddressBook.js\";\nimport * as mainnet from \"./addressbooks/mainnet.js\";\nimport * as testnet from \"./addressbooks/testnet.js\";\nimport * as previewnet from \"./addressbooks/previewnet.js\";\nimport * as hex from \"../encoding/hex.js\";\nimport {\n LocalNodeNetwork,\n MirrorNetwork,\n} from \"../constants/ClientConstants.js\";\n\nconst readFileAsync = util.promisify(fs.readFile);\n\n/**\n * @typedef {import(\"./Client.js\").ClientConfiguration} ClientConfiguration\n * @typedef {import(\"../account/AccountId.js\").default} AccountId\n */\n\n/**\n * @augments {Client<NodeChannel, NodeMirrorChannel>}\n * Client for interacting with the Hedera network using Node.js.\n * Extends the base Client class with Node.js specific implementations.\n */\nexport default class NodeClient extends Client {\n /**\n * @param {ClientConfiguration} [props]\n */\n constructor(props) {\n super(props);\n\n if (props != null) {\n if (typeof props.network === \"string\") {\n this._setNetworkFromName(props.network);\n } else if (props.network != null) {\n Client._validateNetworkConsistency(props.network);\n\n const { shard, realm } = Client._extractShardRealm(\n props.network,\n );\n\n // Shard and realm are inferred from the network, so we need to set them here\n // to ensure that the client is properly configured.\n this._shard = shard;\n this._realm = realm;\n\n this.setNetwork(props.network);\n }\n\n if (typeof props.mirrorNetwork === \"string\") {\n switch (props.mirrorNetwork) {\n case \"mainnet\":\n this.setMirrorNetwork(MirrorNetwork.MAINNET);\n break;\n\n case \"testnet\":\n this.setMirrorNetwork(MirrorNetwork.TESTNET);\n break;\n\n case \"previewnet\":\n this.setMirrorNetwork(MirrorNetwork.PREVIEWNET);\n break;\n\n default:\n this.setMirrorNetwork([props.mirrorNetwork]);\n break;\n }\n } else if (props.mirrorNetwork != null) {\n this.setMirrorNetwork(props.mirrorNetwork);\n }\n }\n }\n\n /**\n * @param {string | ClientConfiguration} data\n * @returns {NodeClient}\n */\n static fromConfig(data) {\n return new NodeClient(\n typeof data === \"string\"\n ? /** @type {ClientConfiguration | undefined} */ (\n JSON.parse(data)\n )\n : data,\n );\n }\n\n /**\n * @param {string} filename\n * @returns {Promise<NodeClient>}\n */\n static async fromConfigFile(filename) {\n return NodeClient.fromConfig(await readFileAsync(filename, \"utf8\"));\n }\n\n /**\n * Construct a client for a specific network.\n *\n * It is the responsibility of the caller to ensure that all nodes in the map are part of the\n * same Hedera network. Failure to do so will result in undefined behavior.\n *\n * The client will load balance all requests to Hedera using a simple round-robin scheme to\n * chose nodes to send transactions to. For one transaction, at most 1/3 of the nodes will be\n * tried.\n *\n * @param {{[key: string]: (string | AccountId)}} network\n * @param {ClientConfiguration} [props]\n * @returns {NodeClient}\n */\n static forNetwork(network, props) {\n return new NodeClient({\n network,\n ...props,\n });\n }\n\n /**\n * @param {string} network\n * @param {object} [props]\n * @param {boolean} [props.scheduleNetworkUpdate]\n * @returns {NodeClient}\n */\n static forName(network, props = {}) {\n return new NodeClient({ network, ...props });\n }\n\n /**\n * Construct a Hedera client pre-configured for Mainnet access.\n *\n * @param {object} [props]\n * @param {boolean} [props.scheduleNetworkUpdate]\n * @returns {NodeClient}\n */\n static forMainnet(props = {}) {\n return new NodeClient({ network: \"mainnet\", ...props });\n }\n\n /**\n * Construct a Hedera client pre-configured for Testnet access.\n *\n * @param {object} [props]\n * @param {boolean} [props.scheduleNetworkUpdate]\n * @returns {NodeClient}\n */\n static forTestnet(props = {}) {\n return new NodeClient({ network: \"testnet\", ...props });\n }\n\n /**\n * @param {string[] | string} mirrorNetwork\n * @param {number} [shard]\n * @param {number} [realm]\n * @returns {Promise<NodeClient>}\n */\n static async forMirrorNetwork(mirrorNetwork, shard, realm) {\n const client = new NodeClient({\n mirrorNetwork,\n shard,\n realm,\n });\n\n await client.updateNetwork();\n\n return client;\n }\n\n /**\n * Construct a Hedera client pre-configured for Previewnet access.\n *\n * @param {object} [props]\n * @param {boolean} [props.scheduleNetworkUpdate]\n * @returns {NodeClient}\n */\n static forPreviewnet(props = {}) {\n return new NodeClient({ network: \"previewnet\", ...props });\n }\n\n /**\n * Construct a Hedera client pre-configured for local-node access.\n *\n * @param {object} [props]\n * @param {boolean} [props.scheduleNetworkUpdate]\n * @returns {NodeClient}\n */\n static forLocalNode(props = { scheduleNetworkUpdate: false }) {\n return new NodeClient({\n network: \"local-node\",\n ...props,\n });\n }\n\n /**\n * Construct a Hedera client pre-configured for Mainnet access with network update.\n *\n * @param {object} [props]\n * @param {boolean} [props.scheduleNetworkUpdate]\n * @returns {Promise<NodeClient>}\n */\n static async forMainnetAsync(props = {}) {\n return new NodeClient({ network: \"mainnet\", ...props }).updateNetwork();\n }\n\n /**\n * Construct a Hedera client pre-configured for Testnet access with network update.\n *\n * @param {object} [props]\n * @param {boolean} [props.scheduleNetworkUpdate]\n * @returns {Promise<NodeClient>}\n */\n static async forTestnetAsync(props = {}) {\n return new NodeClient({ network: \"testnet\", ...props }).updateNetwork();\n }\n\n /**\n * Construct a Hedera client pre-configured for Previewnet access with network update.\n *\n * @param {object} [props]\n * @param {boolean} [props.scheduleNetworkUpdate]\n * @returns {Promise<NodeClient>}\n */\n static async forPreviewnetAsync(props = {}) {\n return new NodeClient({\n network: \"previewnet\",\n ...props,\n }).updateNetwork();\n }\n\n /**\n * Construct a client for a specific network with optional network update.\n * Updates network only if the network is not \"local-node\".\n *\n * @param {string} network\n * @param {object} [props]\n * @param {boolean} [props.scheduleNetworkUpdate]\n * @returns {Promise<NodeClient>}\n */\n static async forNameAsync(network, props = {}) {\n const client = new NodeClient({ network, ...props });\n\n if (network !== \"local-node\") {\n await client.updateNetwork();\n }\n\n return client;\n }\n\n /**\n * @param {{[key: string]: (string | AccountId)} | string} network\n * @returns {void}\n */\n setNetwork(network) {\n if (typeof network === \"string\") {\n this._setNetworkFromName(network);\n } else {\n this._network.setNetwork(network);\n }\n }\n\n /**\n * Available only for NodeClient\n * Legacy method maintained for backward compatibility.\n * This method now calls setGrpcDeadline internally to ensure proper validation.\n * @deprecated Use setGrpcDeadline instead.\n * @param {number} maxExecutionTime\n * @returns {this}\n */\n setMaxExecutionTime(maxExecutionTime) {\n // Use the parent class setGrpcDeadline method to ensure proper validation\n // This ensures that maxExecutionTime follows the same validation rules as grpcDeadline\n this.setGrpcDeadline(maxExecutionTime);\n return this;\n }\n\n /**\n * @private\n * @param {string} name\n * @returns {this}\n */\n _setNetworkFromName(name) {\n switch (name) {\n case \"mainnet\":\n this.setNetworkFromAddressBook(\n NodeAddressBook.fromBytes(hex.decode(mainnet.addressBook)),\n );\n this.setMirrorNetwork(MirrorNetwork.MAINNET);\n this.setLedgerId(LedgerId.MAINNET);\n break;\n\n case \"testnet\":\n this.setNetworkFromAddressBook(\n NodeAddressBook.fromBytes(hex.decode(testnet.addressBook)),\n );\n this.setMirrorNetwork(MirrorNetwork.TESTNET);\n this.setLedgerId(LedgerId.TESTNET);\n break;\n\n case \"previewnet\":\n this.setNetworkFromAddressBook(\n NodeAddressBook.fromBytes(\n hex.decode(previewnet.addressBook),\n ),\n );\n this.setMirrorNetwork(MirrorNetwork.PREVIEWNET);\n this.setLedgerId(LedgerId.PREVIEWNET);\n break;\n\n case \"local-node\":\n this.setNetwork(LocalNodeNetwork);\n this.setMirrorNetwork(MirrorNetwork.LOCAL_NODE);\n this.setLedgerId(LedgerId.LOCAL_NODE);\n break;\n\n default:\n throw new Error(\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `unknown network: ${name}`,\n );\n }\n return this;\n }\n\n /**\n * @param {string[] | string} mirrorNetwork\n * @returns {this}\n */\n setMirrorNetwork(mirrorNetwork) {\n if (typeof mirrorNetwork === \"string\") {\n switch (mirrorNetwork) {\n case \"local-node\":\n this._mirrorNetwork.setNetwork(MirrorNetwork.LOCAL_NODE);\n break;\n case \"previewnet\":\n this._mirrorNetwork.setNetwork(MirrorNetwork.PREVIEWNET);\n break;\n case \"testnet\":\n this._mirrorNetwork.setNetwork(MirrorNetwork.TESTNET);\n break;\n case \"mainnet\":\n this._mirrorNetwork.setNetwork(MirrorNetwork.MAINNET);\n break;\n default:\n this._mirrorNetwork.setNetwork([mirrorNetwork]);\n }\n } else {\n this._mirrorNetwork.setNetwork(mirrorNetwork);\n }\n\n return this;\n }\n\n /**\n * @override\n * @returns {(address: string, cert?: string) => NodeChannel}\n */\n _createNetworkChannel() {\n return (address) => new NodeChannel(address, this.grpcDeadline);\n }\n\n /**\n * @override\n * @returns {(address: string) => NodeMirrorChannel}\n */\n _createMirrorNetworkChannel() {\n return (address) => new NodeMirrorChannel(address);\n }\n}\n"],"names":["readFileAsync","util","promisify","fs","readFile","NodeClient","Client","constructor","props","super","network","this","_setNetworkFromName","_validateNetworkConsistency","shard","realm","_extractShardRealm","_shard","_realm","setNetwork","mirrorNetwork","setMirrorNetwork","MirrorNetwork","MAINNET","TESTNET","PREVIEWNET","fromConfig","data","JSON","parse","fromConfigFile","filename","forNetwork","forName","forMainnet","forTestnet","forMirrorNetwork","client","updateNetwork","forPreviewnet","forLocalNode","scheduleNetworkUpdate","forMainnetAsync","forTestnetAsync","forPreviewnetAsync","forNameAsync","_network","setMaxExecutionTime","maxExecutionTime","setGrpcDeadline","name","setNetworkFromAddressBook","NodeAddressBook","fromBytes","hex.decode","mainnet.addressBook","setLedgerId","LedgerId","testnet.addressBook","previewnet.addressBook","LocalNodeNetwork","LOCAL_NODE","Error","_mirrorNetwork","_createNetworkChannel","address","NodeChannel","grpcDeadline","_createMirrorNetworkChannel","NodeMirrorChannel"],"mappings":"shBAkBA,MAAMA,EAAgBC,EAAKC,UAAUC,EAAGC,UAYzB,MAAMC,UAAmBC,EAIpC,WAAAC,CAAYC,GAGR,GAFAC,MAAMD,GAEO,MAATA,EAAe,CACf,GAA6B,iBAAlBA,EAAME,QACbC,KAAKC,oBAAoBJ,EAAME,cAC5B,GAAqB,MAAjBF,EAAME,QAAiB,CAC9BJ,EAAOO,4BAA4BL,EAAME,SAEzC,MAAMI,MAAEA,EAAKC,MAAEA,GAAUT,EAAOU,mBAC5BR,EAAME,SAKVC,KAAKM,OAASH,EACdH,KAAKO,OAASH,EAEdJ,KAAKQ,WAAWX,EAAME,QACtC,CAEY,GAAmC,iBAAxBF,EAAMY,cACb,OAAQZ,EAAMY,eACV,IAAK,UACDT,KAAKU,iBAAiBC,EAAcC,SACpC,MAEJ,IAAK,UACDZ,KAAKU,iBAAiBC,EAAcE,SACpC,MAEJ,IAAK,aACDb,KAAKU,iBAAiBC,EAAcG,YACpC,MAEJ,QACId,KAAKU,iBAAiB,CAACb,EAAMY,qBAGP,MAAvBZ,EAAMY,eACbT,KAAKU,iBAAiBb,EAAMY,cAE5C,CACA,CAMI,iBAAOM,CAAWC,GACd,OAAO,IAAItB,EACS,iBAATsB,EAEGC,KAAKC,MAAMF,GAEfA,EAElB,CAMI,2BAAaG,CAAeC,GACxB,OAAO1B,EAAWqB,iBAAiB1B,EAAc+B,EAAU,QACnE,CAgBI,iBAAOC,CAAWtB,EAASF,GACvB,OAAO,IAAIH,EAAW,CAClBK,aACGF,GAEf,CAQI,cAAOyB,CAAQvB,EAASF,EAAQ,IAC5B,OAAO,IAAIH,EAAW,CAAEK,aAAYF,GAC5C,CASI,iBAAO0B,CAAW1B,EAAQ,IACtB,OAAO,IAAIH,EAAW,CAAEK,QAAS,aAAcF,GACvD,CASI,iBAAO2B,CAAW3B,EAAQ,IACtB,OAAO,IAAIH,EAAW,CAAEK,QAAS,aAAcF,GACvD,CAQI,6BAAa4B,CAAiBhB,EAAeN,EAAOC,GAChD,MAAMsB,EAAS,IAAIhC,EAAW,CAC1Be,gBACAN,QACAC,UAKJ,aAFMsB,EAAOC,gBAEND,CACf,CASI,oBAAOE,CAAc/B,EAAQ,IACzB,OAAO,IAAIH,EAAW,CAAEK,QAAS,gBAAiBF,GAC1D,CASI,mBAAOgC,CAAahC,EAAQ,CAAEiC,uBAAuB,IACjD,OAAO,IAAIpC,EAAW,CAClBK,QAAS,gBACNF,GAEf,CASI,4BAAakC,CAAgBlC,EAAQ,IACjC,OAAO,IAAIH,EAAW,CAAEK,QAAS,aAAcF,IAAS8B,eAChE,CASI,4BAAaK,CAAgBnC,EAAQ,IACjC,OAAO,IAAIH,EAAW,CAAEK,QAAS,aAAcF,IAAS8B,eAChE,CASI,+BAAaM,CAAmBpC,EAAQ,IACpC,OAAO,IAAIH,EAAW,CAClBK,QAAS,gBACNF,IACJ8B,eACX,CAWI,yBAAaO,CAAanC,EAASF,EAAQ,IACvC,MAAM6B,EAAS,IAAIhC,EAAW,CAAEK,aAAYF,IAM5C,MAJgB,eAAZE,SACM2B,EAAOC,gBAGVD,CACf,CAMI,UAAAlB,CAAWT,GACgB,iBAAZA,EACPC,KAAKC,oBAAoBF,GAEzBC,KAAKmC,SAAS3B,WAAWT,EAErC,CAUI,mBAAAqC,CAAoBC,GAIhB,OADArC,KAAKsC,gBAAgBD,GACdrC,IACf,CAOI,mBAAAC,CAAoBsC,GAChB,OAAQA,GACJ,IAAK,UACDvC,KAAKwC,0BACDC,EAAgBC,UAAUC,EAAWC,KAEzC5C,KAAKU,iBAAiBC,EAAcC,SACpCZ,KAAK6C,YAAYC,EAASlC,SAC1B,MAEJ,IAAK,UACDZ,KAAKwC,0BACDC,EAAgBC,UAAUC,EAAWI,KAEzC/C,KAAKU,iBAAiBC,EAAcE,SACpCb,KAAK6C,YAAYC,EAASjC,SAC1B,MAEJ,IAAK,aACDb,KAAKwC,0BACDC,EAAgBC,UACZC,EAAWK,KAGnBhD,KAAKU,iBAAiBC,EAAcG,YACpCd,KAAK6C,YAAYC,EAAShC,YAC1B,MAEJ,IAAK,aACDd,KAAKQ,WAAWyC,GAChBjD,KAAKU,iBAAiBC,EAAcuC,YACpClD,KAAK6C,YAAYC,EAASI,YAC1B,MAEJ,QACI,MAAM,IAAIC,MAEN,oBAAoBZ,KAGhC,OAAOvC,IACf,CAMI,gBAAAU,CAAiBD,GACb,GAA6B,iBAAlBA,EACP,OAAQA,GACJ,IAAK,aACDT,KAAKoD,eAAe5C,WAAWG,EAAcuC,YAC7C,MACJ,IAAK,aACDlD,KAAKoD,eAAe5C,WAAWG,EAAcG,YAC7C,MACJ,IAAK,UACDd,KAAKoD,eAAe5C,WAAWG,EAAcE,SAC7C,MACJ,IAAK,UACDb,KAAKoD,eAAe5C,WAAWG,EAAcC,SAC7C,MACJ,QACIZ,KAAKoD,eAAe5C,WAAW,CAACC,SAGxCT,KAAKoD,eAAe5C,WAAWC,GAGnC,OAAOT,IACf,CAMI,qBAAAqD,GACI,OAAQC,GAAY,IAAIC,EAAYD,EAAStD,KAAKwD,aAC1D,CAMI,2BAAAC,GACI,OAAQH,GAAY,IAAII,EAAkBJ,EAClD"}
|
|
1
|
+
{"version":3,"file":"NodeClient.js","sources":["../../src/client/NodeClient.js"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\nimport fs from \"fs\";\nimport util from \"util\";\nimport Client from \"./Client.js\";\nimport NodeChannel from \"../channel/NodeChannel.js\";\nimport NodeMirrorChannel from \"../channel/NodeMirrorChannel.js\";\nimport LedgerId from \"../LedgerId.js\";\nimport NodeAddressBook from \"../address_book/NodeAddressBook.js\";\nimport * as mainnet from \"./addressbooks/mainnet.js\";\nimport * as testnet from \"./addressbooks/testnet.js\";\nimport * as previewnet from \"./addressbooks/previewnet.js\";\nimport * as hex from \"../encoding/hex.js\";\nimport {\n LocalNodeNetwork,\n MirrorNetwork,\n} from \"../constants/ClientConstants.js\";\n\nconst readFileAsync = util.promisify(fs.readFile);\n\n/**\n * @typedef {import(\"./Client.js\").ClientConfiguration} ClientConfiguration\n * @typedef {import(\"../account/AccountId.js\").default} AccountId\n */\n\n/**\n * @augments {Client<NodeChannel, NodeMirrorChannel>}\n * Client for interacting with the Hedera network using Node.js.\n * Extends the base Client class with Node.js specific implementations.\n */\nexport default class NodeClient extends Client {\n /**\n * @param {ClientConfiguration} [props]\n */\n constructor(props) {\n super(props);\n\n if (props != null) {\n if (typeof props.network === \"string\") {\n this._setNetworkFromName(props.network);\n } else if (props.network != null) {\n Client._validateNetworkConsistency(props.network);\n\n const { shard, realm } = Client._extractShardRealm(\n props.network,\n );\n\n // Shard and realm are inferred from the network, so we need to set them here\n // to ensure that the client is properly configured.\n this._shard = shard;\n this._realm = realm;\n\n this.setNetwork(props.network);\n }\n\n if (typeof props.mirrorNetwork === \"string\") {\n switch (props.mirrorNetwork) {\n case \"mainnet\":\n this.setMirrorNetwork(MirrorNetwork.MAINNET);\n break;\n\n case \"testnet\":\n this.setMirrorNetwork(MirrorNetwork.TESTNET);\n break;\n\n case \"previewnet\":\n this.setMirrorNetwork(MirrorNetwork.PREVIEWNET);\n break;\n\n default:\n this.setMirrorNetwork([props.mirrorNetwork]);\n break;\n }\n } else if (props.mirrorNetwork != null) {\n this.setMirrorNetwork(props.mirrorNetwork);\n }\n }\n }\n\n /**\n * @param {string | ClientConfiguration} data\n * @returns {NodeClient}\n */\n static fromConfig(data) {\n return new NodeClient(\n typeof data === \"string\"\n ? /** @type {ClientConfiguration | undefined} */ (\n JSON.parse(data)\n )\n : data,\n );\n }\n\n /**\n * @param {string} filename\n * @returns {Promise<NodeClient>}\n */\n static async fromConfigFile(filename) {\n return NodeClient.fromConfig(await readFileAsync(filename, \"utf8\"));\n }\n\n /**\n * Construct a client for a specific network.\n *\n * It is the responsibility of the caller to ensure that all nodes in the map are part of the\n * same Hedera network. Failure to do so will result in undefined behavior.\n *\n * The client will load balance all requests to Hedera using a simple round-robin scheme to\n * chose nodes to send transactions to. For one transaction, at most 1/3 of the nodes will be\n * tried.\n *\n * @param {{[key: string]: (string | AccountId)}} network\n * @param {ClientConfiguration} [props]\n * @returns {NodeClient}\n */\n static forNetwork(network, props) {\n return new NodeClient({\n network,\n ...props,\n });\n }\n\n /**\n * @param {string} network\n * @param {object} [props]\n * @param {boolean} [props.scheduleNetworkUpdate]\n * @returns {NodeClient}\n */\n static forName(network, props = {}) {\n return new NodeClient({ network, ...props });\n }\n\n /**\n * Construct a Hedera client pre-configured for Mainnet access.\n *\n * @param {object} [props]\n * @param {boolean} [props.scheduleNetworkUpdate]\n * @returns {NodeClient}\n */\n static forMainnet(props = {}) {\n return new NodeClient({ network: \"mainnet\", ...props });\n }\n\n /**\n * Construct a Hedera client pre-configured for Testnet access.\n *\n * @param {object} [props]\n * @param {boolean} [props.scheduleNetworkUpdate]\n * @returns {NodeClient}\n */\n static forTestnet(props = {}) {\n return new NodeClient({ network: \"testnet\", ...props });\n }\n\n /**\n * @param {string[] | string} mirrorNetwork\n * @param {number} [shard]\n * @param {number} [realm]\n * @returns {Promise<NodeClient>}\n */\n static async forMirrorNetwork(mirrorNetwork, shard, realm) {\n const client = new NodeClient({\n mirrorNetwork,\n shard,\n realm,\n });\n\n await client.updateNetwork();\n\n return client;\n }\n\n /**\n * Construct a Hedera client pre-configured for Previewnet access.\n *\n * @param {object} [props]\n * @param {boolean} [props.scheduleNetworkUpdate]\n * @returns {NodeClient}\n */\n static forPreviewnet(props = {}) {\n return new NodeClient({ network: \"previewnet\", ...props });\n }\n\n /**\n * Construct a Hedera client pre-configured for local-node access.\n *\n * @param {object} [props]\n * @param {boolean} [props.scheduleNetworkUpdate]\n * @returns {NodeClient}\n */\n static forLocalNode(props = { scheduleNetworkUpdate: false }) {\n return new NodeClient({\n network: \"local-node\",\n ...props,\n });\n }\n\n /**\n * Construct a Hedera client pre-configured for Mainnet access with network update.\n *\n * @param {object} [props]\n * @param {boolean} [props.scheduleNetworkUpdate]\n * @returns {Promise<NodeClient>}\n */\n static async forMainnetAsync(props = {}) {\n return new NodeClient({ network: \"mainnet\", ...props }).updateNetwork();\n }\n\n /**\n * Construct a Hedera client pre-configured for Testnet access with network update.\n *\n * @param {object} [props]\n * @param {boolean} [props.scheduleNetworkUpdate]\n * @returns {Promise<NodeClient>}\n */\n static async forTestnetAsync(props = {}) {\n return new NodeClient({ network: \"testnet\", ...props }).updateNetwork();\n }\n\n /**\n * Construct a Hedera client pre-configured for Previewnet access with network update.\n *\n * @param {object} [props]\n * @param {boolean} [props.scheduleNetworkUpdate]\n * @returns {Promise<NodeClient>}\n */\n static async forPreviewnetAsync(props = {}) {\n return new NodeClient({\n network: \"previewnet\",\n ...props,\n }).updateNetwork();\n }\n\n /**\n * Construct a client for a specific network with optional network update.\n * Updates network only if the network is not \"local-node\".\n *\n * @param {string} network\n * @param {object} [props]\n * @param {boolean} [props.scheduleNetworkUpdate]\n * @returns {Promise<NodeClient>}\n */\n static async forNameAsync(network, props = {}) {\n const client = new NodeClient({ network, ...props });\n\n if (network !== \"local-node\") {\n await client.updateNetwork();\n }\n\n return client;\n }\n\n /**\n * @param {{[key: string]: (string | AccountId)} | string} network\n * @returns {void}\n */\n setNetwork(network) {\n if (typeof network === \"string\") {\n this._setNetworkFromName(network);\n } else {\n this._network.setNetwork(network);\n }\n }\n\n /**\n * Available only for NodeClient\n * Legacy method maintained for backward compatibility.\n * This method now calls setGrpcDeadline internally to ensure proper validation.\n * @deprecated Use setGrpcDeadline instead.\n * @param {number} maxExecutionTime\n * @returns {this}\n */\n setMaxExecutionTime(maxExecutionTime) {\n // Use the parent class setGrpcDeadline method to ensure proper validation\n // This ensures that maxExecutionTime follows the same validation rules as grpcDeadline\n this.setGrpcDeadline(maxExecutionTime);\n return this;\n }\n\n /**\n * @private\n * @param {string} name\n * @returns {this}\n */\n _setNetworkFromName(name) {\n switch (name) {\n case \"mainnet\":\n this.setNetworkFromAddressBook(\n NodeAddressBook.fromBytes(hex.decode(mainnet.addressBook)),\n );\n this.setMirrorNetwork(MirrorNetwork.MAINNET);\n this.setLedgerId(LedgerId.MAINNET);\n break;\n\n case \"testnet\":\n this.setNetworkFromAddressBook(\n NodeAddressBook.fromBytes(hex.decode(testnet.addressBook)),\n );\n this.setMirrorNetwork(MirrorNetwork.TESTNET);\n this.setLedgerId(LedgerId.TESTNET);\n break;\n\n case \"previewnet\":\n this.setNetworkFromAddressBook(\n NodeAddressBook.fromBytes(\n hex.decode(previewnet.addressBook),\n ),\n );\n this.setMirrorNetwork(MirrorNetwork.PREVIEWNET);\n this.setLedgerId(LedgerId.PREVIEWNET);\n break;\n\n case \"local-node\":\n this.setNetwork(LocalNodeNetwork);\n this.setMirrorNetwork(MirrorNetwork.LOCAL_NODE);\n this.setLedgerId(LedgerId.LOCAL_NODE);\n break;\n\n default:\n throw new Error(\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `unknown network: ${name}`,\n );\n }\n return this;\n }\n\n /**\n * @param {string[] | string} mirrorNetwork\n * @returns {this}\n */\n setMirrorNetwork(mirrorNetwork) {\n if (typeof mirrorNetwork === \"string\") {\n switch (mirrorNetwork) {\n case \"local-node\":\n this._mirrorNetwork.setNetwork(MirrorNetwork.LOCAL_NODE);\n break;\n case \"previewnet\":\n this._mirrorNetwork.setNetwork(MirrorNetwork.PREVIEWNET);\n break;\n case \"testnet\":\n this._mirrorNetwork.setNetwork(MirrorNetwork.TESTNET);\n break;\n case \"mainnet\":\n this._mirrorNetwork.setNetwork(MirrorNetwork.MAINNET);\n break;\n default:\n this._mirrorNetwork.setNetwork([mirrorNetwork]);\n }\n } else {\n this._mirrorNetwork.setNetwork(mirrorNetwork);\n }\n\n return this;\n }\n\n /**\n * @override\n * @returns {(address: string, cert?: string) => NodeChannel}\n */\n _createNetworkChannel() {\n return (address) => new NodeChannel(address, this.grpcDeadline);\n }\n\n /**\n * @override\n * @returns {(address: string) => NodeMirrorChannel}\n */\n _createMirrorNetworkChannel() {\n return (address) => new NodeMirrorChannel(address);\n }\n}\n"],"names":["readFileAsync","util","promisify","fs","readFile","NodeClient","Client","constructor","props","super","network","this","_setNetworkFromName","_validateNetworkConsistency","shard","realm","_extractShardRealm","_shard","_realm","setNetwork","mirrorNetwork","setMirrorNetwork","MirrorNetwork","MAINNET","TESTNET","PREVIEWNET","fromConfig","data","JSON","parse","fromConfigFile","filename","forNetwork","forName","forMainnet","forTestnet","forMirrorNetwork","client","updateNetwork","forPreviewnet","forLocalNode","scheduleNetworkUpdate","forMainnetAsync","forTestnetAsync","forPreviewnetAsync","forNameAsync","_network","setMaxExecutionTime","maxExecutionTime","setGrpcDeadline","name","setNetworkFromAddressBook","NodeAddressBook","fromBytes","hex.decode","mainnet.addressBook","setLedgerId","LedgerId","testnet.addressBook","previewnet.addressBook","LocalNodeNetwork","LOCAL_NODE","Error","_mirrorNetwork","_createNetworkChannel","address","NodeChannel","grpcDeadline","_createMirrorNetworkChannel","NodeMirrorChannel"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebClient.js","sources":["../../src/client/WebClient.js"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\nimport Client from \"./Client.js\";\nimport WebChannel from \"../channel/WebChannel.js\";\nimport LedgerId from \"../LedgerId.js\";\nimport { WebNetwork, WebMirrorNetwork } from \"../constants/ClientConstants.js\";\n\nimport AddressBookQuery from \"../network/AddressBookQueryWeb.js\";\nimport FileId from \"../file/FileId.js\";\n\n/**\n * @typedef {import(\"./Client.js\").ClientConfiguration} ClientConfiguration\n * @typedef {import(\"../account/AccountId.js\").default} AccountId\n */\n\n/**\n * Represents a client for interacting with the Hedera network over the web.\n * The `WebClient` class extends the base `Client` class and provides methods\n * for configuring and managing connections to the Hedera network, including\n * setting the network type (mainnet, testnet, previewnet) and handling\n * transactions and queries.\n * @augments {Client<WebChannel, *>}\n */\nexport default class WebClient extends Client {\n /**\n * @param {ClientConfiguration} [props]\n */\n constructor(props) {\n super(props);\n\n if (props != null) {\n if (typeof props.network === \"string\") {\n this._setNetworkFromName(props.network);\n } else if (props.network != null) {\n Client._validateNetworkConsistency(props.network);\n\n const { shard, realm } = Client._extractShardRealm(\n props.network,\n );\n\n // Shard and realm are inferred from the network, so we need to set them here\n // to ensure that the client is properly configured.\n this._shard = shard;\n this._realm = realm;\n\n this.setNetwork(props.network);\n }\n\n if (typeof props.mirrorNetwork === \"string\") {\n switch (props.mirrorNetwork) {\n case \"mainnet\":\n this.setMirrorNetwork(WebMirrorNetwork.MAINNET);\n break;\n\n case \"testnet\":\n this.setMirrorNetwork(WebMirrorNetwork.TESTNET);\n break;\n\n case \"previewnet\":\n this.setMirrorNetwork(WebMirrorNetwork.PREVIEWNET);\n break;\n\n default:\n this.setMirrorNetwork([props.mirrorNetwork]);\n break;\n }\n } else if (props.mirrorNetwork != null) {\n this.setMirrorNetwork(props.mirrorNetwork);\n }\n }\n }\n\n /**\n * @param {string | ClientConfiguration} data\n * @returns {WebClient}\n */\n static fromConfig(data) {\n return new WebClient(\n typeof data === \"string\"\n ? /** @type {ClientConfiguration | undefined} */ (\n JSON.parse(data)\n )\n : data,\n );\n }\n\n /**\n * Construct a client for a specific network.\n *\n * It is the responsibility of the caller to ensure that all nodes in the map are part of the\n * same Hedera network. Failure to do so will result in undefined behavior.\n *\n * The client will load balance all requests to Hedera using a simple round-robin scheme to\n * chose nodes to send transactions to. For one transaction, at most 1/3 of the nodes will be\n * tried.\n *\n * @param {{[key: string]: (string | AccountId)} | string} network\n * @returns {WebClient}\n */\n static forNetwork(network) {\n return new WebClient({ network });\n }\n\n /**\n * @param {string} network\n * @returns {WebClient}\n */\n static forName(network) {\n return new WebClient({ network });\n }\n\n /**\n * Construct a Hedera client pre-configured for Mainnet access.\n *\n * @returns {WebClient}\n */\n static forMainnet() {\n return new WebClient({\n network: \"mainnet\",\n });\n }\n\n /**\n * Construct a Hedera client pre-configured for Testnet access.\n *\n * @returns {WebClient}\n */\n static forTestnet() {\n return new WebClient({\n network: \"testnet\",\n });\n }\n\n /**\n * Construct a Hedera client pre-configured for Previewnet access.\n *\n * @returns {WebClient}\n */\n static forPreviewnet() {\n return new WebClient({\n network: \"previewnet\",\n });\n }\n\n /**\n * Construct a Hedera client pre-configured for local-node access.\n *\n * @param {object} [props]\n * @param {boolean} [props.scheduleNetworkUpdate]\n * @returns {WebClient}\n */\n static forLocalNode(props = { scheduleNetworkUpdate: false }) {\n return new WebClient({\n network: \"local-node\",\n ...props,\n });\n }\n\n /**\n * Construct a Hedera client pre-configured for Mainnet access with network update.\n *\n * @returns {Promise<WebClient>}\n */\n static async forMainnetAsync() {\n return new WebClient({\n network: \"mainnet\",\n }).updateNetwork();\n }\n\n /**\n * Construct a Hedera client pre-configured for Testnet access with network update.\n *\n * @returns {Promise<WebClient>}\n */\n static async forTestnetAsync() {\n return new WebClient({\n network: \"testnet\",\n }).updateNetwork();\n }\n\n /**\n * Construct a Hedera client pre-configured for Previewnet access with network update.\n *\n * @returns {Promise<WebClient>}\n */\n static async forPreviewnetAsync() {\n return new WebClient({\n network: \"previewnet\",\n }).updateNetwork();\n }\n\n /**\n * Construct a client for a specific network with optional network update.\n * Updates network only if the network is not \"local-node\".\n *\n * @param {string} network\n * @returns {Promise<WebClient>}\n */\n static async forNameAsync(network) {\n const client = new WebClient({ network });\n\n if (network !== \"local-node\") {\n await client.updateNetwork();\n }\n\n return client;\n }\n\n /**\n * Construct a client configured to use mirror nodes.\n * This will query the address book to get the network nodes.\n *\n * @param {string[] | string} mirrorNetwork\n * @returns {Promise<WebClient>}\n */\n static async forMirrorNetwork(mirrorNetwork) {\n const client = new WebClient({ mirrorNetwork: mirrorNetwork });\n\n await client.updateNetwork();\n\n return client;\n }\n\n /**\n * @param {{[key: string]: (string | AccountId)} | string} network\n * @returns {void}\n */\n setNetwork(network) {\n if (typeof network === \"string\") {\n switch (network) {\n case \"previewnet\":\n this._network.setNetwork(WebNetwork.PREVIEWNET);\n break;\n case \"testnet\":\n this._network.setNetwork(WebNetwork.TESTNET);\n break;\n case \"mainnet\":\n this._network.setNetwork(WebNetwork.MAINNET);\n break;\n case \"local-node\":\n this._network.setNetwork(WebNetwork.LOCAL_NODE);\n break;\n }\n } else {\n // Check for deprecation warnings for network endpoints with schemes\n for (const [key] of Object.entries(network)) {\n if (key.startsWith(\"https://\") || key.startsWith(\"http://\")) {\n console.warn(\n '[Deprecation Notice] Hiero SDK: Network endpoint \"' +\n key +\n '\" includes a URL scheme (e.g. \"https://\"). ' +\n \"This format was accepted in earlier versions but is now deprecated. \" +\n 'Please remove the scheme and use \"host:port\" instead (e.g. \"node00.swirldslabs.com:443\"). ' +\n \"Support for scheme-prefixed endpoints will be removed in a future major release.\",\n );\n }\n }\n this._network.setNetwork(network);\n }\n }\n\n /**\n * @param {string[] | string} mirrorNetwork\n * @returns {this}\n */\n setMirrorNetwork(mirrorNetwork) {\n if (typeof mirrorNetwork === \"string\") {\n switch (mirrorNetwork) {\n case \"local-node\":\n this._mirrorNetwork.setNetwork(WebMirrorNetwork.LOCAL_NODE);\n break;\n case \"previewnet\":\n this._mirrorNetwork.setNetwork(WebMirrorNetwork.PREVIEWNET);\n break;\n case \"testnet\":\n this._mirrorNetwork.setNetwork(WebMirrorNetwork.TESTNET);\n break;\n case \"mainnet\":\n this._mirrorNetwork.setNetwork(WebMirrorNetwork.MAINNET);\n break;\n default:\n this._mirrorNetwork.setNetwork([mirrorNetwork]);\n }\n } else {\n this._mirrorNetwork.setNetwork(mirrorNetwork);\n }\n\n return this;\n }\n\n /**\n * @private\n * @param {string} name\n * @returns {this}\n */\n _setNetworkFromName(name) {\n switch (name) {\n case \"mainnet\":\n this.setNetwork(WebNetwork.MAINNET);\n this.setMirrorNetwork(WebMirrorNetwork.MAINNET);\n this.setLedgerId(LedgerId.MAINNET);\n break;\n\n case \"testnet\":\n this.setNetwork(WebNetwork.TESTNET);\n this.setMirrorNetwork(WebMirrorNetwork.TESTNET);\n this.setLedgerId(LedgerId.TESTNET);\n break;\n\n case \"previewnet\":\n this.setNetwork(WebNetwork.PREVIEWNET);\n this.setMirrorNetwork(WebMirrorNetwork.PREVIEWNET);\n this.setLedgerId(LedgerId.PREVIEWNET);\n break;\n\n case \"local-node\":\n this.setNetwork(WebNetwork.LOCAL_NODE);\n this.setMirrorNetwork(WebMirrorNetwork.LOCAL_NODE);\n this.setLedgerId(LedgerId.LOCAL_NODE);\n break;\n\n default:\n throw new Error(\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `unknown network: ${name}`,\n );\n }\n return this;\n }\n\n /**\n * @override\n * @returns {Promise<this>}\n */\n async updateNetwork() {\n if (this._isUpdatingNetwork) {\n return this;\n }\n\n this._isUpdatingNetwork = true;\n\n try {\n const addressBook = await new AddressBookQuery()\n .setFileId(\n FileId.getAddressBookFileIdFor(this.shard, this.realm),\n )\n .execute(this);\n\n /** @type {Record<string, AccountId>} */\n const network = {};\n for (const nodeAddress of addressBook.nodeAddresses) {\n for (const endpoint of nodeAddress.addresses) {\n if (nodeAddress.accountId != null) {\n network[endpoint.toString()] = nodeAddress.accountId;\n }\n }\n }\n\n this.setNetwork(network);\n } catch (/** @type {unknown} */ error) {\n if (this._logger) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n this._logger.trace(\n `failed to update client address book: ${errorMessage}`,\n );\n }\n } finally {\n this._isUpdatingNetwork = false;\n }\n\n return this;\n }\n\n /**\n * @override\n * @returns {(address: string) => WebChannel}\n */\n _createNetworkChannel() {\n return (address) => new WebChannel(address, this.grpcDeadline);\n }\n\n /**\n * @override\n * @returns {(address: string) => *}\n */\n _createMirrorNetworkChannel() {\n return () => {\n throw new Error(\"mirror support is not supported in browsers\");\n };\n }\n}\n"],"names":["WebClient","Client","constructor","props","super","network","this","_setNetworkFromName","_validateNetworkConsistency","shard","realm","_extractShardRealm","_shard","_realm","setNetwork","mirrorNetwork","setMirrorNetwork","WebMirrorNetwork","MAINNET","TESTNET","PREVIEWNET","fromConfig","data","JSON","parse","forNetwork","forName","forMainnet","forTestnet","forPreviewnet","forLocalNode","scheduleNetworkUpdate","forMainnetAsync","updateNetwork","forTestnetAsync","forPreviewnetAsync","forNameAsync","client","forMirrorNetwork","_network","WebNetwork","LOCAL_NODE","key","Object","entries","startsWith","console","warn","_mirrorNetwork","name","setLedgerId","LedgerId","Error","_isUpdatingNetwork","addressBook","AddressBookQuery","setFileId","FileId","getAddressBookFileIdFor","execute","nodeAddress","nodeAddresses","endpoint","addresses","accountId","toString","error","_logger","errorMessage","message","String","trace","_createNetworkChannel","address","WebChannel","grpcDeadline","_createMirrorNetworkChannel"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WebClient.js","sources":["../../src/client/WebClient.js"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\nimport Client from \"./Client.js\";\nimport WebChannel from \"../channel/WebChannel.js\";\nimport LedgerId from \"../LedgerId.js\";\nimport { WebNetwork, WebMirrorNetwork } from \"../constants/ClientConstants.js\";\n\nimport AddressBookQuery from \"../network/AddressBookQueryWeb.js\";\nimport FileId from \"../file/FileId.js\";\n\n/**\n * @typedef {import(\"./Client.js\").ClientConfiguration} ClientConfiguration\n * @typedef {import(\"../account/AccountId.js\").default} AccountId\n */\n\n/**\n * Represents a client for interacting with the Hedera network over the web.\n * The `WebClient` class extends the base `Client` class and provides methods\n * for configuring and managing connections to the Hedera network, including\n * setting the network type (mainnet, testnet, previewnet) and handling\n * transactions and queries.\n * @augments {Client<WebChannel, *>}\n */\nexport default class WebClient extends Client {\n /**\n * @param {ClientConfiguration} [props]\n */\n constructor(props) {\n super(props);\n\n if (props != null) {\n if (typeof props.network === \"string\") {\n this._setNetworkFromName(props.network);\n } else if (props.network != null) {\n Client._validateNetworkConsistency(props.network);\n\n const { shard, realm } = Client._extractShardRealm(\n props.network,\n );\n\n // Shard and realm are inferred from the network, so we need to set them here\n // to ensure that the client is properly configured.\n this._shard = shard;\n this._realm = realm;\n\n this.setNetwork(props.network);\n }\n\n if (typeof props.mirrorNetwork === \"string\") {\n switch (props.mirrorNetwork) {\n case \"mainnet\":\n this.setMirrorNetwork(WebMirrorNetwork.MAINNET);\n break;\n\n case \"testnet\":\n this.setMirrorNetwork(WebMirrorNetwork.TESTNET);\n break;\n\n case \"previewnet\":\n this.setMirrorNetwork(WebMirrorNetwork.PREVIEWNET);\n break;\n\n default:\n this.setMirrorNetwork([props.mirrorNetwork]);\n break;\n }\n } else if (props.mirrorNetwork != null) {\n this.setMirrorNetwork(props.mirrorNetwork);\n }\n }\n }\n\n /**\n * @param {string | ClientConfiguration} data\n * @returns {WebClient}\n */\n static fromConfig(data) {\n return new WebClient(\n typeof data === \"string\"\n ? /** @type {ClientConfiguration | undefined} */ (\n JSON.parse(data)\n )\n : data,\n );\n }\n\n /**\n * Construct a client for a specific network.\n *\n * It is the responsibility of the caller to ensure that all nodes in the map are part of the\n * same Hedera network. Failure to do so will result in undefined behavior.\n *\n * The client will load balance all requests to Hedera using a simple round-robin scheme to\n * chose nodes to send transactions to. For one transaction, at most 1/3 of the nodes will be\n * tried.\n *\n * @param {{[key: string]: (string | AccountId)} | string} network\n * @returns {WebClient}\n */\n static forNetwork(network) {\n return new WebClient({ network });\n }\n\n /**\n * @param {string} network\n * @returns {WebClient}\n */\n static forName(network) {\n return new WebClient({ network });\n }\n\n /**\n * Construct a Hedera client pre-configured for Mainnet access.\n *\n * @returns {WebClient}\n */\n static forMainnet() {\n return new WebClient({\n network: \"mainnet\",\n });\n }\n\n /**\n * Construct a Hedera client pre-configured for Testnet access.\n *\n * @returns {WebClient}\n */\n static forTestnet() {\n return new WebClient({\n network: \"testnet\",\n });\n }\n\n /**\n * Construct a Hedera client pre-configured for Previewnet access.\n *\n * @returns {WebClient}\n */\n static forPreviewnet() {\n return new WebClient({\n network: \"previewnet\",\n });\n }\n\n /**\n * Construct a Hedera client pre-configured for local-node access.\n *\n * @param {object} [props]\n * @param {boolean} [props.scheduleNetworkUpdate]\n * @returns {WebClient}\n */\n static forLocalNode(props = { scheduleNetworkUpdate: false }) {\n return new WebClient({\n network: \"local-node\",\n ...props,\n });\n }\n\n /**\n * Construct a Hedera client pre-configured for Mainnet access with network update.\n *\n * @returns {Promise<WebClient>}\n */\n static async forMainnetAsync() {\n return new WebClient({\n network: \"mainnet\",\n }).updateNetwork();\n }\n\n /**\n * Construct a Hedera client pre-configured for Testnet access with network update.\n *\n * @returns {Promise<WebClient>}\n */\n static async forTestnetAsync() {\n return new WebClient({\n network: \"testnet\",\n }).updateNetwork();\n }\n\n /**\n * Construct a Hedera client pre-configured for Previewnet access with network update.\n *\n * @returns {Promise<WebClient>}\n */\n static async forPreviewnetAsync() {\n return new WebClient({\n network: \"previewnet\",\n }).updateNetwork();\n }\n\n /**\n * Construct a client for a specific network with optional network update.\n * Updates network only if the network is not \"local-node\".\n *\n * @param {string} network\n * @returns {Promise<WebClient>}\n */\n static async forNameAsync(network) {\n const client = new WebClient({ network });\n\n if (network !== \"local-node\") {\n await client.updateNetwork();\n }\n\n return client;\n }\n\n /**\n * Construct a client configured to use mirror nodes.\n * This will query the address book to get the network nodes.\n *\n * @param {string[] | string} mirrorNetwork\n * @returns {Promise<WebClient>}\n */\n static async forMirrorNetwork(mirrorNetwork) {\n const client = new WebClient({ mirrorNetwork: mirrorNetwork });\n\n await client.updateNetwork();\n\n return client;\n }\n\n /**\n * @param {{[key: string]: (string | AccountId)} | string} network\n * @returns {void}\n */\n setNetwork(network) {\n if (typeof network === \"string\") {\n switch (network) {\n case \"previewnet\":\n this._network.setNetwork(WebNetwork.PREVIEWNET);\n break;\n case \"testnet\":\n this._network.setNetwork(WebNetwork.TESTNET);\n break;\n case \"mainnet\":\n this._network.setNetwork(WebNetwork.MAINNET);\n break;\n case \"local-node\":\n this._network.setNetwork(WebNetwork.LOCAL_NODE);\n break;\n }\n } else {\n // Check for deprecation warnings for network endpoints with schemes\n for (const [key] of Object.entries(network)) {\n if (key.startsWith(\"https://\") || key.startsWith(\"http://\")) {\n console.warn(\n '[Deprecation Notice] Hiero SDK: Network endpoint \"' +\n key +\n '\" includes a URL scheme (e.g. \"https://\"). ' +\n \"This format was accepted in earlier versions but is now deprecated. \" +\n 'Please remove the scheme and use \"host:port\" instead (e.g. \"node00.swirldslabs.com:443\"). ' +\n \"Support for scheme-prefixed endpoints will be removed in a future major release.\",\n );\n }\n }\n this._network.setNetwork(network);\n }\n }\n\n /**\n * @param {string[] | string} mirrorNetwork\n * @returns {this}\n */\n setMirrorNetwork(mirrorNetwork) {\n if (typeof mirrorNetwork === \"string\") {\n switch (mirrorNetwork) {\n case \"local-node\":\n this._mirrorNetwork.setNetwork(WebMirrorNetwork.LOCAL_NODE);\n break;\n case \"previewnet\":\n this._mirrorNetwork.setNetwork(WebMirrorNetwork.PREVIEWNET);\n break;\n case \"testnet\":\n this._mirrorNetwork.setNetwork(WebMirrorNetwork.TESTNET);\n break;\n case \"mainnet\":\n this._mirrorNetwork.setNetwork(WebMirrorNetwork.MAINNET);\n break;\n default:\n this._mirrorNetwork.setNetwork([mirrorNetwork]);\n }\n } else {\n this._mirrorNetwork.setNetwork(mirrorNetwork);\n }\n\n return this;\n }\n\n /**\n * @private\n * @param {string} name\n * @returns {this}\n */\n _setNetworkFromName(name) {\n switch (name) {\n case \"mainnet\":\n this.setNetwork(WebNetwork.MAINNET);\n this.setMirrorNetwork(WebMirrorNetwork.MAINNET);\n this.setLedgerId(LedgerId.MAINNET);\n break;\n\n case \"testnet\":\n this.setNetwork(WebNetwork.TESTNET);\n this.setMirrorNetwork(WebMirrorNetwork.TESTNET);\n this.setLedgerId(LedgerId.TESTNET);\n break;\n\n case \"previewnet\":\n this.setNetwork(WebNetwork.PREVIEWNET);\n this.setMirrorNetwork(WebMirrorNetwork.PREVIEWNET);\n this.setLedgerId(LedgerId.PREVIEWNET);\n break;\n\n case \"local-node\":\n this.setNetwork(WebNetwork.LOCAL_NODE);\n this.setMirrorNetwork(WebMirrorNetwork.LOCAL_NODE);\n this.setLedgerId(LedgerId.LOCAL_NODE);\n break;\n\n default:\n throw new Error(\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `unknown network: ${name}`,\n );\n }\n return this;\n }\n\n /**\n * @override\n * @returns {Promise<this>}\n */\n async updateNetwork() {\n if (this._isUpdatingNetwork) {\n return this;\n }\n\n this._isUpdatingNetwork = true;\n\n try {\n const addressBook = await new AddressBookQuery()\n .setFileId(\n FileId.getAddressBookFileIdFor(this.shard, this.realm),\n )\n .execute(this);\n\n /** @type {Record<string, AccountId>} */\n const network = {};\n for (const nodeAddress of addressBook.nodeAddresses) {\n for (const endpoint of nodeAddress.addresses) {\n if (nodeAddress.accountId != null) {\n network[endpoint.toString()] = nodeAddress.accountId;\n }\n }\n }\n\n this.setNetwork(network);\n } catch (/** @type {unknown} */ error) {\n if (this._logger) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n this._logger.trace(\n `failed to update client address book: ${errorMessage}`,\n );\n }\n } finally {\n this._isUpdatingNetwork = false;\n }\n\n return this;\n }\n\n /**\n * @override\n * @returns {(address: string) => WebChannel}\n */\n _createNetworkChannel() {\n return (address) => new WebChannel(address, this.grpcDeadline);\n }\n\n /**\n * @override\n * @returns {(address: string) => *}\n */\n _createMirrorNetworkChannel() {\n return () => {\n throw new Error(\"mirror support is not supported in browsers\");\n };\n }\n}\n"],"names":["WebClient","Client","constructor","props","super","network","this","_setNetworkFromName","_validateNetworkConsistency","shard","realm","_extractShardRealm","_shard","_realm","setNetwork","mirrorNetwork","setMirrorNetwork","WebMirrorNetwork","MAINNET","TESTNET","PREVIEWNET","fromConfig","data","JSON","parse","forNetwork","forName","forMainnet","forTestnet","forPreviewnet","forLocalNode","scheduleNetworkUpdate","forMainnetAsync","updateNetwork","forTestnetAsync","forPreviewnetAsync","forNameAsync","client","forMirrorNetwork","_network","WebNetwork","LOCAL_NODE","key","Object","entries","startsWith","console","warn","_mirrorNetwork","name","setLedgerId","LedgerId","Error","_isUpdatingNetwork","addressBook","AddressBookQuery","setFileId","FileId","getAddressBookFileIdFor","execute","nodeAddress","nodeAddresses","endpoint","addresses","accountId","toString","error","_logger","errorMessage","message","String","trace","_createNetworkChannel","address","WebChannel","grpcDeadline","_createMirrorNetworkChannel"],"mappings":"sQAuBe,MAAMA,UAAkBC,EAInC,WAAAC,CAAYC,GAGR,GAFAC,MAAMD,GAEO,MAATA,EAAe,CACf,GAA6B,iBAAlBA,EAAME,QACbC,KAAKC,oBAAoBJ,EAAME,cAC5B,GAAqB,MAAjBF,EAAME,QAAiB,CAC9BJ,EAAOO,4BAA4BL,EAAME,SAEzC,MAAMI,MAAEA,EAAKC,MAAEA,GAAUT,EAAOU,mBAC5BR,EAAME,SAKVC,KAAKM,OAASH,EACdH,KAAKO,OAASH,EAEdJ,KAAKQ,WAAWX,EAAME,QAC1B,CAEA,GAAmC,iBAAxBF,EAAMY,cACb,OAAQZ,EAAMY,eACV,IAAK,UACDT,KAAKU,iBAAiBC,EAAiBC,SACvC,MAEJ,IAAK,UACDZ,KAAKU,iBAAiBC,EAAiBE,SACvC,MAEJ,IAAK,aACDb,KAAKU,iBAAiBC,EAAiBG,YACvC,MAEJ,QACId,KAAKU,iBAAiB,CAACb,EAAMY,qBAGP,MAAvBZ,EAAMY,eACbT,KAAKU,iBAAiBb,EAAMY,cAEpC,CACJ,CAMA,iBAAOM,CAAWC,GACd,OAAO,IAAItB,EACS,iBAATsB,EAEGC,KAAKC,MAAMF,GAEfA,EAEd,CAeA,iBAAOG,CAAWpB,GACd,OAAO,IAAIL,EAAU,CAAEK,WAC3B,CAMA,cAAOqB,CAAQrB,GACX,OAAO,IAAIL,EAAU,CAAEK,WAC3B,CAOA,iBAAOsB,GACH,OAAO,IAAI3B,EAAU,CACjBK,QAAS,WAEjB,CAOA,iBAAOuB,GACH,OAAO,IAAI5B,EAAU,CACjBK,QAAS,WAEjB,CAOA,oBAAOwB,GACH,OAAO,IAAI7B,EAAU,CACjBK,QAAS,cAEjB,CASA,mBAAOyB,CAAa3B,EAAQ,CAAE4B,uBAAuB,IACjD,OAAO,IAAI/B,EAAU,CACjBK,QAAS,gBACNF,GAEX,CAOA,4BAAa6B,GACT,OAAO,IAAIhC,EAAU,CACjBK,QAAS,YACV4B,eACP,CAOA,4BAAaC,GACT,OAAO,IAAIlC,EAAU,CACjBK,QAAS,YACV4B,eACP,CAOA,+BAAaE,GACT,OAAO,IAAInC,EAAU,CACjBK,QAAS,eACV4B,eACP,CASA,yBAAaG,CAAa/B,GACtB,MAAMgC,EAAS,IAAIrC,EAAU,CAAEK,YAM/B,MAJgB,eAAZA,SACMgC,EAAOJ,gBAGVI,CACX,CASA,6BAAaC,CAAiBvB,GAC1B,MAAMsB,EAAS,IAAIrC,EAAU,CAAEe,cAAeA,IAI9C,aAFMsB,EAAOJ,gBAENI,CACX,CAMA,UAAAvB,CAAWT,GACP,GAAuB,iBAAZA,EACP,OAAQA,GACJ,IAAK,aACDC,KAAKiC,SAASzB,WAAW0B,EAAWpB,YACpC,MACJ,IAAK,UACDd,KAAKiC,SAASzB,WAAW0B,EAAWrB,SACpC,MACJ,IAAK,UACDb,KAAKiC,SAASzB,WAAW0B,EAAWtB,SACpC,MACJ,IAAK,aACDZ,KAAKiC,SAASzB,WAAW0B,EAAWC,gBAGzC,CAEH,IAAK,MAAOC,KAAQC,OAAOC,QAAQvC,IAC3BqC,EAAIG,WAAW,aAAeH,EAAIG,WAAW,aAC7CC,QAAQC,KACJ,qDACIL,EADJ,6RASZpC,KAAKiC,SAASzB,WAAWT,EAC7B,CACJ,CAMA,gBAAAW,CAAiBD,GACb,GAA6B,iBAAlBA,EACP,OAAQA,GACJ,IAAK,aACDT,KAAK0C,eAAelC,WAAWG,EAAiBwB,YAChD,MACJ,IAAK,aACDnC,KAAK0C,eAAelC,WAAWG,EAAiBG,YAChD,MACJ,IAAK,UACDd,KAAK0C,eAAelC,WAAWG,EAAiBE,SAChD,MACJ,IAAK,UACDb,KAAK0C,eAAelC,WAAWG,EAAiBC,SAChD,MACJ,QACIZ,KAAK0C,eAAelC,WAAW,CAACC,SAGxCT,KAAK0C,eAAelC,WAAWC,GAGnC,OAAOT,IACX,CAOA,mBAAAC,CAAoB0C,GAChB,OAAQA,GACJ,IAAK,UACD3C,KAAKQ,WAAW0B,EAAWtB,SAC3BZ,KAAKU,iBAAiBC,EAAiBC,SACvCZ,KAAK4C,YAAYC,EAASjC,SAC1B,MAEJ,IAAK,UACDZ,KAAKQ,WAAW0B,EAAWrB,SAC3Bb,KAAKU,iBAAiBC,EAAiBE,SACvCb,KAAK4C,YAAYC,EAAShC,SAC1B,MAEJ,IAAK,aACDb,KAAKQ,WAAW0B,EAAWpB,YAC3Bd,KAAKU,iBAAiBC,EAAiBG,YACvCd,KAAK4C,YAAYC,EAAS/B,YAC1B,MAEJ,IAAK,aACDd,KAAKQ,WAAW0B,EAAWC,YAC3BnC,KAAKU,iBAAiBC,EAAiBwB,YACvCnC,KAAK4C,YAAYC,EAASV,YAC1B,MAEJ,QACI,MAAM,IAAIW,MAEN,oBAAoBH,KAGhC,OAAO3C,IACX,CAMA,mBAAM2B,GACF,GAAI3B,KAAK+C,mBACL,OAAO/C,KAGXA,KAAK+C,oBAAqB,EAE1B,IACI,MAAMC,QAAoB,IAAIC,GACzBC,UACGC,EAAOC,wBAAwBpD,KAAKG,MAAOH,KAAKI,QAEnDiD,QAAQrD,MAGPD,EAAU,CAAA,EAChB,IAAK,MAAMuD,KAAeN,EAAYO,cAClC,IAAK,MAAMC,KAAYF,EAAYG,UACF,MAAzBH,EAAYI,YACZ3D,EAAQyD,EAASG,YAAcL,EAAYI,WAKvD1D,KAAKQ,WAAWT,EACpB,CAAE,MAA8B6D,GAC5B,GAAI5D,KAAK6D,QAAS,CACd,MAAMC,EACFF,aAAiBd,MAAQc,EAAMG,QAAUC,OAAOJ,GACpD5D,KAAK6D,QAAQI,MACT,yCAAyCH,IAEjD,CACJ,CAAC,QACG9D,KAAK+C,oBAAqB,CAC9B,CAEA,OAAO/C,IACX,CAMA,qBAAAkE,GACI,OAAQC,GAAY,IAAIC,EAAWD,EAASnE,KAAKqE,aACrD,CAMA,2BAAAC,GACI,MAAO,KACH,MAAM,IAAIxB,MAAM,+CAExB"}
|