@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":"NativeChannel.js","sources":["../../src/channel/NativeChannel.js"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\nimport Channel, { encodeRequest, decodeUnaryResponse } from \"./Channel.js\";\nimport * as base64 from \"../encoding/base64.native.js\";\nimport HttpError from \"../http/HttpError.js\";\nimport HttpStatus from \"../http/HttpStatus.js\";\nimport { SDK_NAME, SDK_VERSION } from \"../version.js\";\nimport GrpcServiceError from \"../grpc/GrpcServiceError.js\";\nimport GrpcStatus from \"../grpc/GrpcStatus.js\";\n\nexport default class NativeChannel extends Channel {\n /**\n * @param {string} address\n * @param {number=} grpcDeadline\n */\n constructor(address, grpcDeadline) {\n super(grpcDeadline);\n\n /**\n * @type {string}\n * @private\n */\n this._address = address;\n\n /**\n * Flag indicating if the connection is ready (health check has passed)\n * Set to true after the first successful health check\n *\n * @type {boolean}\n * @private\n */\n this._isReady = false;\n }\n\n /**\n * @override\n * @returns {void}\n */\n close() {\n // do nothing\n }\n\n /**\n * Check if the gRPC-Web proxy is reachable and healthy\n * Performs a POST request and verifies the response has gRPC-Web headers,\n * which indicates the proxy is running and processing gRPC requests.\n * Results are cached per address for the entire lifecycle.\n *\n * @param {Date} deadline - Deadline for the health check\n * @returns {Promise<void>}\n * @private\n */\n async _waitForReady(deadline) {\n // Check if we've already validated this address\n if (this._isReady) {\n return; // Health check already passed for this address\n }\n\n const shouldUseHttps = !(\n this._address.includes(\"localhost\") ||\n this._address.includes(\"127.0.0.1\")\n );\n\n const address = shouldUseHttps\n ? `https://${this._address}`\n : `http://${this._address}`;\n\n // Calculate remaining time until deadline\n const timeoutMs = deadline.getTime() - Date.now();\n if (timeoutMs <= 0) {\n throw new GrpcServiceError(GrpcStatus.Timeout);\n }\n\n const abortController = new AbortController();\n const timeoutId = setTimeout(() => abortController.abort(), timeoutMs);\n\n try {\n // Make a POST request to verify the gRPC-Web proxy is running\n // We use a minimal gRPC-Web compatible request\n //eslint-disable-next-line n/no-unsupported-features/node-builtins\n const response = await fetch(address, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/grpc-web-text\",\n \"x-user-agent\": `${SDK_NAME}/${SDK_VERSION}`,\n \"x-grpc-web\": \"1\",\n },\n body: base64.encode(new Uint8Array(0)), // Empty body for health check\n signal: abortController.signal,\n });\n\n clearTimeout(timeoutId);\n\n // Check if response is successful (200) and has gRPC headers\n if (response.status === 200) {\n const grpcStatus = response.headers.get(\"grpc-status\");\n const grpcMessage = response.headers.get(\"grpc-message\");\n\n // If gRPC headers exist, the proxy is running and processing requests\n if (grpcStatus != null || grpcMessage != null) {\n // Mark this connection as ready\n this._isReady = true;\n return; // Healthy - gRPC-Web proxy is responding\n }\n }\n\n // If we get here, either status isn't 200 or no gRPC headers present\n // This means the proxy might not be configured correctly or not running\n throw new GrpcServiceError(GrpcStatus.Unavailable);\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new GrpcServiceError(GrpcStatus.Timeout);\n }\n\n if (error instanceof GrpcServiceError) {\n throw error;\n }\n\n // Network error - server is not reachable\n throw new GrpcServiceError(GrpcStatus.Unavailable);\n }\n }\n\n /**\n * @override\n * @protected\n * @param {string} serviceName\n * @returns {import(\"protobufjs\").RPCImpl}\n */\n _createUnaryClient(serviceName) {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n return async (method, requestData, callback) => {\n // Calculate deadline for connection check\n const deadline = new Date();\n const milliseconds = this._grpcDeadline;\n\n deadline.setMilliseconds(deadline.getMilliseconds() + milliseconds);\n\n try {\n // Wait for connection to be ready (similar to gRPC waitForReady)\n await this._waitForReady(deadline);\n\n const data = base64.encode(\n new Uint8Array(encodeRequest(requestData)),\n );\n\n const shouldUseHttps = !(\n this._address.includes(\"localhost\") ||\n this._address.includes(\"127.0.0.1\")\n );\n\n const address = shouldUseHttps\n ? `https://${this._address}`\n : `http://${this._address}`;\n // this will be executed in react native environment sho\n // fetch should be available\n //eslint-disable-next-line n/no-unsupported-features/node-builtins\n const response = await fetch(\n `${address}/proto.${serviceName}/${method.name}`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/grpc-web-text\",\n \"x-user-agent\": `${SDK_NAME}/${SDK_VERSION}`,\n \"x-accept-content-transfer-encoding\": \"base64\",\n \"x-grpc-web\": \"1\",\n },\n body: data,\n },\n );\n\n if (!response.ok) {\n const error = new HttpError(\n HttpStatus._fromValue(response.status),\n );\n callback(error, null);\n }\n\n const blob = await response.blob();\n\n /** @type {string} */\n const responseData = await new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsDataURL(blob);\n reader.onloadend = () => {\n resolve(/** @type {string} */ (reader.result));\n };\n reader.onerror = reject;\n });\n\n let responseBuffer;\n if (\n responseData.startsWith(\n \"data:application/octet-stream;base64,\",\n )\n ) {\n responseBuffer = base64.decode(\n responseData.split(\n \"data:application/octet-stream;base64,\",\n )[1],\n );\n } else if (\n responseData.startsWith(\n \"data:application/grpc-web+proto;base64,\",\n )\n ) {\n responseBuffer = base64.decode(\n responseData.split(\n \"data:application/grpc-web+proto;base64,\",\n )[1],\n );\n } else {\n throw new Error(\n `Expected response data to be base64 encode with a 'data:application/octet-stream;base64,' or 'data:application/grpc-web+proto;base64,' prefix, but found: ${responseData}`,\n );\n }\n\n const unaryResponse = decodeUnaryResponse(\n // @ts-ignore\n responseBuffer.buffer,\n responseBuffer.byteOffset,\n responseBuffer.byteLength,\n );\n\n callback(null, unaryResponse);\n } catch (error) {\n if (error instanceof GrpcServiceError) {\n callback(error, null);\n return;\n }\n\n callback(/** @type {Error} */ (error), null);\n }\n };\n }\n}\n"],"names":["NativeChannel","Channel","constructor","address","grpcDeadline","super","this","_address","_isReady","close","_waitForReady","deadline","includes","timeoutMs","getTime","Date","now","GrpcServiceError","GrpcStatus","Timeout","abortController","AbortController","timeoutId","setTimeout","abort","response","fetch","method","headers","SDK_NAME","SDK_VERSION","body","base64.encode","Uint8Array","signal","clearTimeout","status","grpcStatus","get","grpcMessage","Unavailable","error","Error","name","_createUnaryClient","serviceName","async","requestData","callback","milliseconds","_grpcDeadline","setMilliseconds","getMilliseconds","data","encodeRequest","ok","HttpError","HttpStatus","_fromValue","blob","responseData","Promise","resolve","reject","reader","FileReader","readAsDataURL","onloadend","onerror","responseBuffer","startsWith","base64.decode","split","decodeUnaryResponse","buffer","byteOffset","byteLength"],"mappings":"8VASe,MAAMA,UAAsBC,EAKvC,WAAAC,CAAYC,EAASC,GACjBC,MAAMD,GAMNE,KAAKC,SAAWJ,EAShBG,KAAKE,UAAW,CACxB,CAMI,KAAAC,GAEJ,CAYI,mBAAMC,CAAcC,GAEhB,GAAIL,KAAKE,SACL,OAGJ,MAKML,IAJFG,KAAKC,SAASK,SAAS,cACvBN,KAAKC,SAASK,SAAS,cAIrB,WAAWN,KAAKC,WAChB,UAAUD,KAAKC,WAGfM,EAAYF,EAASG,UAAYC,KAAKC,MAC5C,GAAIH,GAAa,EACb,MAAM,IAAII,EAAiBC,EAAWC,SAG1C,MAAMC,EAAkB,IAAIC,gBACtBC,EAAYC,WAAW,IAAMH,EAAgBI,QAASX,GAE5D,IAII,MAAMY,QAAiBC,MAAMvB,EAAS,CAClCwB,OAAQ,OACRC,QAAS,CACL,eAAgB,4BAChB,eAAgB,GAAGC,KAAYC,IAC/B,aAAc,KAElBC,KAAMC,EAAc,IAAIC,WAAW,IACnCC,OAAQd,EAAgBc,SAM5B,GAHAC,aAAab,GAGW,MAApBG,EAASW,OAAgB,CACzB,MAAMC,EAAaZ,EAASG,QAAQU,IAAI,eAClCC,EAAcd,EAASG,QAAQU,IAAI,gBAGzC,GAAkB,MAAdD,GAAqC,MAAfE,EAGtB,YADAjC,KAAKE,UAAW,EAGpC,CAIY,MAAM,IAAIS,EAAiBC,EAAWsB,YACzC,CAAC,MAAOC,GAGL,GAFAN,aAAab,GAETmB,aAAiBC,OAAwB,eAAfD,EAAME,KAChC,MAAM,IAAI1B,EAAiBC,EAAWC,SAG1C,GAAIsB,aAAiBxB,EACjB,MAAMwB,EAIV,MAAM,IAAIxB,EAAiBC,EAAWsB,YAClD,CACA,CAQI,kBAAAI,CAAmBC,GAEf,OAAOC,MAAOnB,EAAQoB,EAAaC,KAE/B,MAAMrC,EAAW,IAAII,KACfkC,EAAe3C,KAAK4C,cAE1BvC,EAASwC,gBAAgBxC,EAASyC,kBAAoBH,GAEtD,UAEU3C,KAAKI,cAAcC,GAEzB,MAAM0C,EAAOrB,EACT,IAAIC,WAAWqB,EAAcP,KAQ3B5C,IAJFG,KAAKC,SAASK,SAAS,cACvBN,KAAKC,SAASK,SAAS,cAIrB,WAAWN,KAAKC,WAChB,UAAUD,KAAKC,WAIfkB,QAAiBC,MACnB,GAAGvB,WAAiB0C,KAAelB,EAAOgB,OAC1C,CACIhB,OAAQ,OACRC,QAAS,CACL,eAAgB,4BAChB,eAAgB,GAAGC,KAAYC,IAC/B,qCAAsC,SACtC,aAAc,KAElBC,KAAMsB,IAId,IAAK5B,EAAS8B,GAAI,CAIdP,EAHc,IAAIQ,EACdC,EAAWC,WAAWjC,EAASW,SAEnB,KACpC,CAEgB,MAAMuB,QAAalC,EAASkC,OAGtBC,QAAqB,IAAIC,QAAQ,CAACC,EAASC,KAC7C,MAAMC,EAAS,IAAIC,WACnBD,EAAOE,cAAcP,GACrBK,EAAOG,UAAY,KACfL,EAA+BE,EAAa,SAEhDA,EAAOI,QAAUL,IAGrB,IAAIM,EACJ,GACIT,EAAaU,WACT,yCAGJD,EAAiBE,EACbX,EAAaY,MACT,yCACF,QAEH,KACHZ,EAAaU,WACT,2CASJ,MAAM,IAAI5B,MACN,6JAA6JkB,KAPjKS,EAAiBE,EACbX,EAAaY,MACT,2CACF,GAM1B,CASgBxB,EAAS,KAPayB,EAElBJ,EAAeK,OACfL,EAAeM,WACfN,EAAeO,YAItB,CAAC,MAAOnC,GACL,GAAIA,aAAiBxB,EAEjB,YADA+B,EAASP,EAAO,MAIpBO,EAAQ,EAA+B,KACvD,EAEA"}
|
|
1
|
+
{"version":3,"file":"NativeChannel.js","sources":["../../src/channel/NativeChannel.js"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\nimport Channel, { encodeRequest, decodeUnaryResponse } from \"./Channel.js\";\nimport * as base64 from \"../encoding/base64.native.js\";\nimport HttpError from \"../http/HttpError.js\";\nimport HttpStatus from \"../http/HttpStatus.js\";\nimport { SDK_NAME, SDK_VERSION } from \"../version.js\";\nimport GrpcServiceError from \"../grpc/GrpcServiceError.js\";\nimport GrpcStatus from \"../grpc/GrpcStatus.js\";\n\nexport default class NativeChannel extends Channel {\n /**\n * @param {string} address\n * @param {number=} grpcDeadline\n */\n constructor(address, grpcDeadline) {\n super(grpcDeadline);\n\n /**\n * @type {string}\n * @private\n */\n this._address = address;\n\n /**\n * Flag indicating if the connection is ready (health check has passed)\n * Set to true after the first successful health check\n *\n * @type {boolean}\n * @private\n */\n this._isReady = false;\n }\n\n /**\n * @override\n * @returns {void}\n */\n close() {\n // do nothing\n }\n\n /**\n * Check if the gRPC-Web proxy is reachable and healthy\n * Performs a POST request and verifies the response has gRPC-Web headers,\n * which indicates the proxy is running and processing gRPC requests.\n * Results are cached per address for the entire lifecycle.\n *\n * @param {Date} deadline - Deadline for the health check\n * @returns {Promise<void>}\n * @private\n */\n async _waitForReady(deadline) {\n // Check if we've already validated this address\n if (this._isReady) {\n return; // Health check already passed for this address\n }\n\n const shouldUseHttps = !(\n this._address.includes(\"localhost\") ||\n this._address.includes(\"127.0.0.1\")\n );\n\n const address = shouldUseHttps\n ? `https://${this._address}`\n : `http://${this._address}`;\n\n // Calculate remaining time until deadline\n const timeoutMs = deadline.getTime() - Date.now();\n if (timeoutMs <= 0) {\n throw new GrpcServiceError(GrpcStatus.Timeout);\n }\n\n const abortController = new AbortController();\n const timeoutId = setTimeout(() => abortController.abort(), timeoutMs);\n\n try {\n // Make a POST request to verify the gRPC-Web proxy is running\n // We use a minimal gRPC-Web compatible request\n //eslint-disable-next-line n/no-unsupported-features/node-builtins\n const response = await fetch(address, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/grpc-web-text\",\n \"x-user-agent\": `${SDK_NAME}/${SDK_VERSION}`,\n \"x-grpc-web\": \"1\",\n },\n body: base64.encode(new Uint8Array(0)), // Empty body for health check\n signal: abortController.signal,\n });\n\n clearTimeout(timeoutId);\n\n // Check if response is successful (200) and has gRPC headers\n if (response.status === 200) {\n const grpcStatus = response.headers.get(\"grpc-status\");\n const grpcMessage = response.headers.get(\"grpc-message\");\n\n // If gRPC headers exist, the proxy is running and processing requests\n if (grpcStatus != null || grpcMessage != null) {\n // Mark this connection as ready\n this._isReady = true;\n return; // Healthy - gRPC-Web proxy is responding\n }\n }\n\n // If we get here, either status isn't 200 or no gRPC headers present\n // This means the proxy might not be configured correctly or not running\n throw new GrpcServiceError(GrpcStatus.Unavailable);\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new GrpcServiceError(GrpcStatus.Timeout);\n }\n\n if (error instanceof GrpcServiceError) {\n throw error;\n }\n\n // Network error - server is not reachable\n throw new GrpcServiceError(GrpcStatus.Unavailable);\n }\n }\n\n /**\n * @override\n * @protected\n * @param {string} serviceName\n * @returns {import(\"protobufjs\").RPCImpl}\n */\n _createUnaryClient(serviceName) {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n return async (method, requestData, callback) => {\n // Calculate deadline for connection check\n const deadline = new Date();\n const milliseconds = this._grpcDeadline;\n\n deadline.setMilliseconds(deadline.getMilliseconds() + milliseconds);\n\n try {\n // Wait for connection to be ready (similar to gRPC waitForReady)\n await this._waitForReady(deadline);\n\n const data = base64.encode(\n new Uint8Array(encodeRequest(requestData)),\n );\n\n const shouldUseHttps = !(\n this._address.includes(\"localhost\") ||\n this._address.includes(\"127.0.0.1\")\n );\n\n const address = shouldUseHttps\n ? `https://${this._address}`\n : `http://${this._address}`;\n // this will be executed in react native environment sho\n // fetch should be available\n //eslint-disable-next-line n/no-unsupported-features/node-builtins\n const response = await fetch(\n `${address}/proto.${serviceName}/${method.name}`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/grpc-web-text\",\n \"x-user-agent\": `${SDK_NAME}/${SDK_VERSION}`,\n \"x-accept-content-transfer-encoding\": \"base64\",\n \"x-grpc-web\": \"1\",\n },\n body: data,\n },\n );\n\n if (!response.ok) {\n const error = new HttpError(\n HttpStatus._fromValue(response.status),\n );\n callback(error, null);\n }\n\n const blob = await response.blob();\n\n /** @type {string} */\n const responseData = await new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsDataURL(blob);\n reader.onloadend = () => {\n resolve(/** @type {string} */ (reader.result));\n };\n reader.onerror = reject;\n });\n\n let responseBuffer;\n if (\n responseData.startsWith(\n \"data:application/octet-stream;base64,\",\n )\n ) {\n responseBuffer = base64.decode(\n responseData.split(\n \"data:application/octet-stream;base64,\",\n )[1],\n );\n } else if (\n responseData.startsWith(\n \"data:application/grpc-web+proto;base64,\",\n )\n ) {\n responseBuffer = base64.decode(\n responseData.split(\n \"data:application/grpc-web+proto;base64,\",\n )[1],\n );\n } else {\n throw new Error(\n `Expected response data to be base64 encode with a 'data:application/octet-stream;base64,' or 'data:application/grpc-web+proto;base64,' prefix, but found: ${responseData}`,\n );\n }\n\n const unaryResponse = decodeUnaryResponse(\n // @ts-ignore\n responseBuffer.buffer,\n responseBuffer.byteOffset,\n responseBuffer.byteLength,\n );\n\n callback(null, unaryResponse);\n } catch (error) {\n if (error instanceof GrpcServiceError) {\n callback(error, null);\n return;\n }\n\n callback(/** @type {Error} */ (error), null);\n }\n };\n }\n}\n"],"names":["NativeChannel","Channel","constructor","address","grpcDeadline","super","this","_address","_isReady","close","_waitForReady","deadline","includes","timeoutMs","getTime","Date","now","GrpcServiceError","GrpcStatus","Timeout","abortController","AbortController","timeoutId","setTimeout","abort","response","fetch","method","headers","SDK_NAME","SDK_VERSION","body","base64.encode","Uint8Array","signal","clearTimeout","status","grpcStatus","get","grpcMessage","Unavailable","error","Error","name","_createUnaryClient","serviceName","async","requestData","callback","milliseconds","_grpcDeadline","setMilliseconds","getMilliseconds","data","encodeRequest","ok","HttpError","HttpStatus","_fromValue","blob","responseData","Promise","resolve","reject","reader","FileReader","readAsDataURL","onloadend","onerror","responseBuffer","startsWith","base64.decode","split","decodeUnaryResponse","buffer","byteOffset","byteLength"],"mappings":"8VASe,MAAMA,UAAsBC,EAKvC,WAAAC,CAAYC,EAASC,GACjBC,MAAMD,GAMNE,KAAKC,SAAWJ,EAShBG,KAAKE,UAAW,CACpB,CAMA,KAAAC,GAEA,CAYA,mBAAMC,CAAcC,GAEhB,GAAIL,KAAKE,SACL,OAGJ,MAKML,IAJFG,KAAKC,SAASK,SAAS,cACvBN,KAAKC,SAASK,SAAS,cAIrB,WAAWN,KAAKC,WAChB,UAAUD,KAAKC,WAGfM,EAAYF,EAASG,UAAYC,KAAKC,MAC5C,GAAIH,GAAa,EACb,MAAM,IAAII,EAAiBC,EAAWC,SAG1C,MAAMC,EAAkB,IAAIC,gBACtBC,EAAYC,WAAW,IAAMH,EAAgBI,QAASX,GAE5D,IAII,MAAMY,QAAiBC,MAAMvB,EAAS,CAClCwB,OAAQ,OACRC,QAAS,CACL,eAAgB,4BAChB,eAAgB,GAAGC,KAAYC,IAC/B,aAAc,KAElBC,KAAMC,EAAc,IAAIC,WAAW,IACnCC,OAAQd,EAAgBc,SAM5B,GAHAC,aAAab,GAGW,MAApBG,EAASW,OAAgB,CACzB,MAAMC,EAAaZ,EAASG,QAAQU,IAAI,eAClCC,EAAcd,EAASG,QAAQU,IAAI,gBAGzC,GAAkB,MAAdD,GAAqC,MAAfE,EAGtB,YADAjC,KAAKE,UAAW,EAGxB,CAIA,MAAM,IAAIS,EAAiBC,EAAWsB,YAC1C,CAAE,MAAOC,GAGL,GAFAN,aAAab,GAETmB,aAAiBC,OAAwB,eAAfD,EAAME,KAChC,MAAM,IAAI1B,EAAiBC,EAAWC,SAG1C,GAAIsB,aAAiBxB,EACjB,MAAMwB,EAIV,MAAM,IAAIxB,EAAiBC,EAAWsB,YAC1C,CACJ,CAQA,kBAAAI,CAAmBC,GAEf,OAAOC,MAAOnB,EAAQoB,EAAaC,KAE/B,MAAMrC,EAAW,IAAII,KACfkC,EAAe3C,KAAK4C,cAE1BvC,EAASwC,gBAAgBxC,EAASyC,kBAAoBH,GAEtD,UAEU3C,KAAKI,cAAcC,GAEzB,MAAM0C,EAAOrB,EACT,IAAIC,WAAWqB,EAAcP,KAQ3B5C,IAJFG,KAAKC,SAASK,SAAS,cACvBN,KAAKC,SAASK,SAAS,cAIrB,WAAWN,KAAKC,WAChB,UAAUD,KAAKC,WAIfkB,QAAiBC,MACnB,GAAGvB,WAAiB0C,KAAelB,EAAOgB,OAC1C,CACIhB,OAAQ,OACRC,QAAS,CACL,eAAgB,4BAChB,eAAgB,GAAGC,KAAYC,IAC/B,qCAAsC,SACtC,aAAc,KAElBC,KAAMsB,IAId,IAAK5B,EAAS8B,GAAI,CAIdP,EAHc,IAAIQ,EACdC,EAAWC,WAAWjC,EAASW,SAEnB,KACpB,CAEA,MAAMuB,QAAalC,EAASkC,OAGtBC,QAAqB,IAAIC,QAAQ,CAACC,EAASC,KAC7C,MAAMC,EAAS,IAAIC,WACnBD,EAAOE,cAAcP,GACrBK,EAAOG,UAAY,KACfL,EAA+BE,EAAa,SAEhDA,EAAOI,QAAUL,IAGrB,IAAIM,EACJ,GACIT,EAAaU,WACT,yCAGJD,EAAiBE,EACbX,EAAaY,MACT,yCACF,QAEH,KACHZ,EAAaU,WACT,2CASJ,MAAM,IAAI5B,MACN,6JAA6JkB,KAPjKS,EAAiBE,EACbX,EAAaY,MACT,2CACF,GAMV,CASAxB,EAAS,KAPayB,EAElBJ,EAAeK,OACfL,EAAeM,WACfN,EAAeO,YAIvB,CAAE,MAAOnC,GACL,GAAIA,aAAiBxB,EAEjB,YADA+B,EAASP,EAAO,MAIpBO,EAAQ,EAA+B,KAC3C,EAER"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NodeChannel.js","sources":["../../src/channel/NodeChannel.js"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\nimport tls from \"tls\";\nimport { Client, credentials, Metadata } from \"@grpc/grpc-js\";\nimport Channel from \"./Channel.js\";\nimport GrpcServicesError from \"../grpc/GrpcServiceError.js\";\nimport GrpcStatus from \"../grpc/GrpcStatus.js\";\nimport { ALL_NETWORK_IPS } from \"../constants/ClientConstants.js\";\nimport { SDK_NAME, SDK_VERSION } from \"../version.js\";\n\n/** @type {{ [key: string]: Client }} */\nconst clientCache = {};\n\nexport default class NodeChannel extends Channel {\n /**\n * @internal\n * @param {string} address\n * @param {number=} grpcDeadline\n */\n constructor(address, grpcDeadline) {\n super(grpcDeadline);\n\n /** @type {Client | null} */\n this._client = null;\n\n this.address = address;\n\n const { ip, port } = this.parseAddress(address);\n this.nodeIp = ip;\n this.nodePort = port;\n }\n\n /**\n * Convert certificate bytes to PEM format\n * @param {Buffer} certBytes\n * @returns {string}\n */\n bytesToPem(certBytes) {\n const base64Cert = certBytes.toString(\"base64\");\n const lines = base64Cert.match(/.{1,64}/g)?.join(\"\\n\") || \"\";\n return `-----BEGIN CERTIFICATE-----\\n${lines}\\n-----END CERTIFICATE-----`;\n }\n\n /**\n * Validates and parses an address in the \"IP:Port\" format.\n * @param {string} address\n * @returns {{ ip: string, port: string }}\n */\n parseAddress(address) {\n const [ip, port] = address.split(\":\");\n if (!ip || !port) {\n throw new Error(\n \"Invalid address format. Expected format: 'IP:Port'\",\n );\n }\n return { ip, port };\n }\n\n /**\n * Retrieve the server's certificate dynamically.\n * @returns {Promise<string>}\n */\n async _retrieveCertificate() {\n return new Promise((resolve, reject) => {\n const socket = tls.connect(\n {\n host: this.nodeIp,\n port: Number(this.nodePort),\n rejectUnauthorized: false,\n },\n () => {\n try {\n const cert = socket.getPeerCertificate();\n\n if (cert && cert.raw) {\n resolve(this.bytesToPem(cert.raw));\n } else {\n reject(new Error(\"No certificate retrieved.\"));\n }\n } catch (err) {\n reject(err);\n } finally {\n socket.end();\n }\n },\n );\n\n socket.on(\"error\", reject);\n });\n }\n\n /**\n * Initialize the gRPC client\n * @returns {Promise<void>}\n */\n async _initializeClient() {\n if (clientCache[this.address]) {\n this._client = clientCache[this.address];\n return;\n }\n\n let security;\n const options = {\n \"grpc.ssl_target_name_override\": \"127.0.0.1\",\n \"grpc.default_authority\": \"127.0.0.1\",\n \"grpc.http_connect_creds\": \"0\",\n \"grpc.keepalive_time_ms\": 100000,\n \"grpc.keepalive_timeout_ms\": 10000,\n \"grpc.keepalive_permit_without_calls\": 1,\n \"grpc.enable_retries\": 1,\n };\n\n // If the port is 50212, use TLS\n if (this.nodePort === \"50212\") {\n const certificate = Buffer.from(await this._retrieveCertificate());\n\n security = credentials.createSsl(certificate);\n } else {\n security = credentials.createInsecure();\n }\n\n this._client = new Client(this.address, security, options);\n\n clientCache[this.address] = this._client;\n }\n\n /**\n * @override\n * @returns {void}\n */\n close() {\n if (this._client) {\n this._client.close();\n delete clientCache[this.address];\n }\n }\n\n /**\n * @override\n * @protected\n * @param {string} serviceName\n * @returns {import(\"protobufjs\").RPCImpl}\n */\n _createUnaryClient(serviceName) {\n return (method, requestData, callback) => {\n this._initializeClient()\n .then(() => {\n const deadline = new Date();\n const milliseconds = this.grpcDeadline;\n deadline.setMilliseconds(\n deadline.getMilliseconds() + milliseconds,\n );\n\n this._client?.waitForReady(deadline, (err) => {\n if (err) {\n callback(\n new GrpcServicesError(\n GrpcStatus.Timeout,\n // Added colons to the IP address to resolve a SonarCloud IP issue.\n ALL_NETWORK_IPS[`${this.nodeIp}:`],\n ),\n );\n } else {\n // Create metadata with user agent\n const metadata = new Metadata();\n\n metadata.set(\n \"x-user-agent\",\n `${SDK_NAME}/${SDK_VERSION}`,\n );\n\n this._client?.makeUnaryRequest(\n `/proto.${serviceName}/${method.name}`,\n (value) => value,\n (value) => value,\n Buffer.from(requestData),\n metadata,\n (e, r) => {\n callback(e, r);\n },\n );\n }\n });\n })\n .catch((err) => {\n if (err instanceof Error) {\n callback(err);\n } else {\n callback(new Error(\"An unexpected error occurred\"));\n }\n });\n };\n }\n}\n"],"names":["clientCache","NodeChannel","Channel","constructor","address","grpcDeadline","super","this","_client","ip","port","parseAddress","nodeIp","nodePort","bytesToPem","certBytes","base64Cert","toString","match","join","split","Error","_retrieveCertificate","Promise","resolve","reject","socket","tls","connect","host","Number","rejectUnauthorized","cert","getPeerCertificate","raw","err","end","on","_initializeClient","security","certificate","Buffer","from","credentials","createSsl","createInsecure","Client","close","_createUnaryClient","serviceName","method","requestData","callback","then","deadline","Date","milliseconds","setMilliseconds","getMilliseconds","waitForReady","GrpcServicesError","GrpcStatus","Timeout","ALL_NETWORK_IPS","metadata","Metadata","set","SDK_NAME","SDK_VERSION","makeUnaryRequest","name","value","e","r","catch"],"mappings":"iUAUA,MAAMA,EAAc,
|
|
1
|
+
{"version":3,"file":"NodeChannel.js","sources":["../../src/channel/NodeChannel.js"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\nimport tls from \"tls\";\nimport { Client, credentials, Metadata } from \"@grpc/grpc-js\";\nimport Channel from \"./Channel.js\";\nimport GrpcServicesError from \"../grpc/GrpcServiceError.js\";\nimport GrpcStatus from \"../grpc/GrpcStatus.js\";\nimport { ALL_NETWORK_IPS } from \"../constants/ClientConstants.js\";\nimport { SDK_NAME, SDK_VERSION } from \"../version.js\";\n\n/** @type {{ [key: string]: Client }} */\nconst clientCache = {};\n\nexport default class NodeChannel extends Channel {\n /**\n * @internal\n * @param {string} address\n * @param {number=} grpcDeadline\n */\n constructor(address, grpcDeadline) {\n super(grpcDeadline);\n\n /** @type {Client | null} */\n this._client = null;\n\n this.address = address;\n\n const { ip, port } = this.parseAddress(address);\n this.nodeIp = ip;\n this.nodePort = port;\n }\n\n /**\n * Convert certificate bytes to PEM format\n * @param {Buffer} certBytes\n * @returns {string}\n */\n bytesToPem(certBytes) {\n const base64Cert = certBytes.toString(\"base64\");\n const lines = base64Cert.match(/.{1,64}/g)?.join(\"\\n\") || \"\";\n return `-----BEGIN CERTIFICATE-----\\n${lines}\\n-----END CERTIFICATE-----`;\n }\n\n /**\n * Validates and parses an address in the \"IP:Port\" format.\n * @param {string} address\n * @returns {{ ip: string, port: string }}\n */\n parseAddress(address) {\n const [ip, port] = address.split(\":\");\n if (!ip || !port) {\n throw new Error(\n \"Invalid address format. Expected format: 'IP:Port'\",\n );\n }\n return { ip, port };\n }\n\n /**\n * Retrieve the server's certificate dynamically.\n * @returns {Promise<string>}\n */\n async _retrieveCertificate() {\n return new Promise((resolve, reject) => {\n const socket = tls.connect(\n {\n host: this.nodeIp,\n port: Number(this.nodePort),\n rejectUnauthorized: false,\n },\n () => {\n try {\n const cert = socket.getPeerCertificate();\n\n if (cert && cert.raw) {\n resolve(this.bytesToPem(cert.raw));\n } else {\n reject(new Error(\"No certificate retrieved.\"));\n }\n } catch (err) {\n reject(err);\n } finally {\n socket.end();\n }\n },\n );\n\n socket.on(\"error\", reject);\n });\n }\n\n /**\n * Initialize the gRPC client\n * @returns {Promise<void>}\n */\n async _initializeClient() {\n if (clientCache[this.address]) {\n this._client = clientCache[this.address];\n return;\n }\n\n let security;\n const options = {\n \"grpc.ssl_target_name_override\": \"127.0.0.1\",\n \"grpc.default_authority\": \"127.0.0.1\",\n \"grpc.http_connect_creds\": \"0\",\n \"grpc.keepalive_time_ms\": 100000,\n \"grpc.keepalive_timeout_ms\": 10000,\n \"grpc.keepalive_permit_without_calls\": 1,\n \"grpc.enable_retries\": 1,\n };\n\n // If the port is 50212, use TLS\n if (this.nodePort === \"50212\") {\n const certificate = Buffer.from(await this._retrieveCertificate());\n\n security = credentials.createSsl(certificate);\n } else {\n security = credentials.createInsecure();\n }\n\n this._client = new Client(this.address, security, options);\n\n clientCache[this.address] = this._client;\n }\n\n /**\n * @override\n * @returns {void}\n */\n close() {\n if (this._client) {\n this._client.close();\n delete clientCache[this.address];\n }\n }\n\n /**\n * @override\n * @protected\n * @param {string} serviceName\n * @returns {import(\"protobufjs\").RPCImpl}\n */\n _createUnaryClient(serviceName) {\n return (method, requestData, callback) => {\n this._initializeClient()\n .then(() => {\n const deadline = new Date();\n const milliseconds = this.grpcDeadline;\n deadline.setMilliseconds(\n deadline.getMilliseconds() + milliseconds,\n );\n\n this._client?.waitForReady(deadline, (err) => {\n if (err) {\n callback(\n new GrpcServicesError(\n GrpcStatus.Timeout,\n // Added colons to the IP address to resolve a SonarCloud IP issue.\n ALL_NETWORK_IPS[`${this.nodeIp}:`],\n ),\n );\n } else {\n // Create metadata with user agent\n const metadata = new Metadata();\n\n metadata.set(\n \"x-user-agent\",\n `${SDK_NAME}/${SDK_VERSION}`,\n );\n\n this._client?.makeUnaryRequest(\n `/proto.${serviceName}/${method.name}`,\n (value) => value,\n (value) => value,\n Buffer.from(requestData),\n metadata,\n (e, r) => {\n callback(e, r);\n },\n );\n }\n });\n })\n .catch((err) => {\n if (err instanceof Error) {\n callback(err);\n } else {\n callback(new Error(\"An unexpected error occurred\"));\n }\n });\n };\n }\n}\n"],"names":["clientCache","NodeChannel","Channel","constructor","address","grpcDeadline","super","this","_client","ip","port","parseAddress","nodeIp","nodePort","bytesToPem","certBytes","base64Cert","toString","match","join","split","Error","_retrieveCertificate","Promise","resolve","reject","socket","tls","connect","host","Number","rejectUnauthorized","cert","getPeerCertificate","raw","err","end","on","_initializeClient","security","certificate","Buffer","from","credentials","createSsl","createInsecure","Client","close","_createUnaryClient","serviceName","method","requestData","callback","then","deadline","Date","milliseconds","setMilliseconds","getMilliseconds","waitForReady","GrpcServicesError","GrpcStatus","Timeout","ALL_NETWORK_IPS","metadata","Metadata","set","SDK_NAME","SDK_VERSION","makeUnaryRequest","name","value","e","r","catch"],"mappings":"iUAUA,MAAMA,EAAc,CAAA,EAEL,MAAMC,UAAoBC,EAMrC,WAAAC,CAAYC,EAASC,GACjBC,MAAMD,GAGNE,KAAKC,QAAU,KAEfD,KAAKH,QAAUA,EAEf,MAAMK,GAAEA,EAAEC,KAAEA,GAASH,KAAKI,aAAaP,GACvCG,KAAKK,OAASH,EACdF,KAAKM,SAAWH,CACpB,CAOA,UAAAI,CAAWC,GACP,MAAMC,EAAaD,EAAUE,SAAS,UAEtC,MAAO,gCADOD,EAAWE,MAAM,aAAaC,KAAK,OAAS,+BAE9D,CAOA,YAAAR,CAAaP,GACT,MAAOK,EAAIC,GAAQN,EAAQgB,MAAM,KACjC,IAAKX,IAAOC,EACR,MAAM,IAAIW,MACN,sDAGR,MAAO,CAAEZ,KAAIC,OACjB,CAMA,0BAAMY,GACF,OAAO,IAAIC,QAAQ,CAACC,EAASC,KACzB,MAAMC,EAASC,EAAIC,QACf,CACIC,KAAMtB,KAAKK,OACXF,KAAMoB,OAAOvB,KAAKM,UAClBkB,oBAAoB,GAExB,KACI,IACI,MAAMC,EAAON,EAAOO,qBAEhBD,GAAQA,EAAKE,IACbV,EAAQjB,KAAKO,WAAWkB,EAAKE,MAE7BT,EAAO,IAAIJ,MAAM,6BAEzB,CAAE,MAAOc,GACLV,EAAOU,EACX,CAAC,QACGT,EAAOU,KACX,IAIRV,EAAOW,GAAG,QAASZ,IAE3B,CAMA,uBAAMa,GACF,GAAItC,EAAYO,KAAKH,SAEjB,YADAG,KAAKC,QAAUR,EAAYO,KAAKH,UAIpC,IAAImC,EAYJ,GAAsB,UAAlBhC,KAAKM,SAAsB,CAC3B,MAAM2B,EAAcC,OAAOC,WAAWnC,KAAKe,wBAE3CiB,EAAWI,EAAYC,UAAUJ,EACrC,MACID,EAAWI,EAAYE,iBAG3BtC,KAAKC,QAAU,IAAIsC,EAAOvC,KAAKH,QAASmC,EAnBxB,CACZ,gCAAiC,YACjC,yBAA0B,YAC1B,0BAA2B,IAC3B,yBAA0B,IAC1B,4BAA6B,IAC7B,sCAAuC,EACvC,sBAAuB,IAc3BvC,EAAYO,KAAKH,SAAWG,KAAKC,OACrC,CAMA,KAAAuC,GACQxC,KAAKC,UACLD,KAAKC,QAAQuC,eACN/C,EAAYO,KAAKH,SAEhC,CAQA,kBAAA4C,CAAmBC,GACf,MAAO,CAACC,EAAQC,EAAaC,KACzB7C,KAAK+B,oBACAe,KAAK,KACF,MAAMC,EAAW,IAAIC,KACfC,EAAejD,KAAKF,aAC1BiD,EAASG,gBACLH,EAASI,kBAAoBF,GAGjCjD,KAAKC,SAASmD,aAAaL,EAAWnB,IAClC,GAAIA,EACAiB,EACI,IAAIQ,EACAC,EAAWC,QAEXC,EAAgB,GAAGxD,KAAKK,iBAG7B,CAEH,MAAMoD,EAAW,IAAIC,EAErBD,EAASE,IACL,eACA,GAAGC,KAAYC,KAGnB7D,KAAKC,SAAS6D,iBACV,UAAUpB,KAAeC,EAAOoB,OAC/BC,GAAUA,EACVA,GAAUA,EACX9B,OAAOC,KAAKS,GACZa,EACA,CAACQ,EAAGC,KACArB,EAASoB,EAAGC,IAGxB,MAGPC,MAAOvC,IACAA,aAAed,MACf+B,EAASjB,GAETiB,EAAS,IAAI/B,MAAM,mCAIvC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NodeMirrorChannel.js","sources":["../../src/channel/NodeMirrorChannel.js"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\nimport * as grpc from \"@grpc/grpc-js\";\nimport MirrorChannel from \"./MirrorChannel.js\";\n\n/**\n * @typedef {import(\"../channel/Channel.js\").default} Channel\n * @typedef {import(\"./MirrorChannel.js\").MirrorError} MirrorError\n */\n\n/**\n * @internal\n */\nexport default class NodeMirrorChannel extends MirrorChannel {\n /**\n * @internal\n * @param {string} address\n */\n constructor(address) {\n super();\n\n /**\n * @type {grpc.Client}\n * @private\n */\n this._client = new grpc.Client(\n address,\n address.endsWith(\":50212\") || address.endsWith(\":443\")\n ? grpc.credentials.createSsl()\n : grpc.credentials.createInsecure(),\n {\n \"grpc.keepalive_time_ms\": 90000,\n \"grpc.keepalive_timeout_ms\": 5000,\n },\n );\n }\n\n /**\n * @override\n * @returns {void}\n */\n close() {\n this._client.close();\n }\n\n /**\n * @override\n * @internal\n * @param {string} serviceName\n * @param {string} methodName\n * @param {Uint8Array} requestData\n * @param {(data: Uint8Array) => void} callback\n * @param {(error: MirrorError | Error) => void} error\n * @param {() => void} end\n * @returns {() => void}\n */\n makeServerStreamRequest(\n serviceName,\n methodName,\n requestData,\n callback,\n error,\n end,\n ) {\n const stream = this._client\n .makeServerStreamRequest(\n `/com.hedera.mirror.api.proto.${serviceName}/${methodName}`,\n (value) => value,\n (value) => value,\n Buffer.from(requestData),\n )\n .on(\"data\", (/** @type {Uint8Array} */ data) => {\n callback(data);\n })\n .on(\"status\", (/** @type {grpc.StatusObject} */ status) => {\n if (status.code == 0) {\n end();\n }\n })\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n .on(\"error\", (/** @type {grpc.StatusObject} */ err) => {\n error(err);\n });\n\n return () => {\n stream.cancel();\n };\n }\n}\n"],"names":["NodeMirrorChannel","MirrorChannel","constructor","address","super","this","_client","grpc","Client","endsWith","credentials","createSsl","createInsecure","close","makeServerStreamRequest","serviceName","methodName","requestData","callback","error","end","stream","value","Buffer","from","on","data","status","code","err","cancel"],"mappings":"kEAae,MAAMA,UAA0BC,EAK3C,WAAAC,CAAYC,GACRC,QAMAC,KAAKC,QAAU,IAAIC,EAAKC,OACpBL,EACAA,EAAQM,SAAS,WAAaN,EAAQM,SAAS,QACzCF,EAAKG,YAAYC,YACjBJ,EAAKG,YAAYE,iBACvB,CACI,yBAA0B,IAC1B,4BAA6B,
|
|
1
|
+
{"version":3,"file":"NodeMirrorChannel.js","sources":["../../src/channel/NodeMirrorChannel.js"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\nimport * as grpc from \"@grpc/grpc-js\";\nimport MirrorChannel from \"./MirrorChannel.js\";\n\n/**\n * @typedef {import(\"../channel/Channel.js\").default} Channel\n * @typedef {import(\"./MirrorChannel.js\").MirrorError} MirrorError\n */\n\n/**\n * @internal\n */\nexport default class NodeMirrorChannel extends MirrorChannel {\n /**\n * @internal\n * @param {string} address\n */\n constructor(address) {\n super();\n\n /**\n * @type {grpc.Client}\n * @private\n */\n this._client = new grpc.Client(\n address,\n address.endsWith(\":50212\") || address.endsWith(\":443\")\n ? grpc.credentials.createSsl()\n : grpc.credentials.createInsecure(),\n {\n \"grpc.keepalive_time_ms\": 90000,\n \"grpc.keepalive_timeout_ms\": 5000,\n },\n );\n }\n\n /**\n * @override\n * @returns {void}\n */\n close() {\n this._client.close();\n }\n\n /**\n * @override\n * @internal\n * @param {string} serviceName\n * @param {string} methodName\n * @param {Uint8Array} requestData\n * @param {(data: Uint8Array) => void} callback\n * @param {(error: MirrorError | Error) => void} error\n * @param {() => void} end\n * @returns {() => void}\n */\n makeServerStreamRequest(\n serviceName,\n methodName,\n requestData,\n callback,\n error,\n end,\n ) {\n const stream = this._client\n .makeServerStreamRequest(\n `/com.hedera.mirror.api.proto.${serviceName}/${methodName}`,\n (value) => value,\n (value) => value,\n Buffer.from(requestData),\n )\n .on(\"data\", (/** @type {Uint8Array} */ data) => {\n callback(data);\n })\n .on(\"status\", (/** @type {grpc.StatusObject} */ status) => {\n if (status.code == 0) {\n end();\n }\n })\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n .on(\"error\", (/** @type {grpc.StatusObject} */ err) => {\n error(err);\n });\n\n return () => {\n stream.cancel();\n };\n }\n}\n"],"names":["NodeMirrorChannel","MirrorChannel","constructor","address","super","this","_client","grpc","Client","endsWith","credentials","createSsl","createInsecure","close","makeServerStreamRequest","serviceName","methodName","requestData","callback","error","end","stream","value","Buffer","from","on","data","status","code","err","cancel"],"mappings":"kEAae,MAAMA,UAA0BC,EAK3C,WAAAC,CAAYC,GACRC,QAMAC,KAAKC,QAAU,IAAIC,EAAKC,OACpBL,EACAA,EAAQM,SAAS,WAAaN,EAAQM,SAAS,QACzCF,EAAKG,YAAYC,YACjBJ,EAAKG,YAAYE,iBACvB,CACI,yBAA0B,IAC1B,4BAA6B,KAGzC,CAMA,KAAAC,GACIR,KAAKC,QAAQO,OACjB,CAaA,uBAAAC,CACIC,EACAC,EACAC,EACAC,EACAC,EACAC,GAEA,MAAMC,EAAShB,KAAKC,QACfQ,wBACG,gCAAgCC,KAAeC,IAC9CM,GAAUA,EACVA,GAAUA,EACXC,OAAOC,KAAKP,IAEfQ,GAAG,OAAmCC,IACnCR,EAASQ,KAEZD,GAAG,SAA4CE,IACzB,GAAfA,EAAOC,MACPR,MAIPK,GAAG,QAA2CI,IAC3CV,EAAMU,KAGd,MAAO,KACHR,EAAOS,SAEf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebChannel.js","sources":["../../src/channel/WebChannel.js"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\nimport { ALL_WEB_NETWORK_NODES } from \"../constants/ClientConstants.js\";\nimport GrpcServiceError from \"../grpc/GrpcServiceError.js\";\nimport GrpcStatus from \"../grpc/GrpcStatus.js\";\nimport HttpError from \"../http/HttpError.js\";\nimport HttpStatus from \"../http/HttpStatus.js\";\nimport { SDK_NAME, SDK_VERSION } from \"../version.js\";\nimport Channel, { encodeRequest, decodeUnaryResponse } from \"./Channel.js\";\n\nexport default class WebChannel extends Channel {\n /**\n * @param {string} address\n * @param {number=} grpcDeadline\n */\n constructor(address, grpcDeadline) {\n super(grpcDeadline);\n\n /**\n * @type {string}\n * @private\n */\n this._address = address;\n\n // Set the gRPC deadline using the base class method\n\n /**\n * Flag indicating if the connection is ready (health check has passed)\n * Set to true after the first successful health check\n *\n * @type {boolean}\n * @private\n */\n this._isReady = false;\n\n /**\n * Promise that resolves when the health check is complete\n * Used to prevent multiple concurrent health checks\n *\n * @type {Promise<void>|null}\n * @private\n */\n this._healthCheckPromise = null;\n }\n\n /**\n * Determines whether to use HTTPS based on the address\n * @param {string} address - The address to check\n * @returns {boolean} - True if HTTPS should be used, false for HTTP\n * @private\n */\n _shouldUseHttps(address) {\n return !(\n address.includes(\"localhost\") ||\n address.includes(\"127.0.0.1\") ||\n address.includes(\".cluster.local\")\n );\n }\n\n /**\n * Builds the full URL with appropriate scheme (http/https)\n * @param {string} address - The base address\n * @returns {string} - The full URL with scheme\n * @private\n */\n _buildUrl(address) {\n // Check if address already contains a scheme\n const hasScheme =\n address.startsWith(\"http://\") || address.startsWith(\"https://\");\n\n if (hasScheme) {\n // Use the address as-is if it already has a scheme\n return address;\n } else {\n // Only prepend scheme if none exists\n const shouldUseHttps = this._shouldUseHttps(address);\n return shouldUseHttps ? `https://${address}` : `http://${address}`;\n }\n }\n\n /**\n * Check if the gRPC-Web proxy is reachable and healthy\n * Performs a POST request and verifies the response has gRPC-Web headers,\n * which indicates the proxy is running and processing gRPC requests.\n * Results are cached per address for the entire lifecycle.\n * Uses promise-based synchronization to prevent multiple concurrent health checks.\n *\n * @param {Date} deadline - Deadline for the health check\n * @returns {Promise<void>}\n * @private\n */\n async _waitForReady(deadline) {\n // Check if we've already validated this address\n if (this._isReady) {\n return; // Health check already passed for this address\n }\n\n // If a health check is already in progress, wait for it to complete\n if (this._healthCheckPromise) {\n return this._healthCheckPromise;\n }\n\n // Start a new health check and store the promise\n this._healthCheckPromise = this._performHealthCheck(deadline);\n\n try {\n await this._healthCheckPromise;\n } finally {\n // Clear the promise when done (success or failure)\n this._healthCheckPromise = null;\n }\n }\n\n /**\n * Performs the actual health check request\n * @param {Date} deadline - Deadline for the health check\n * @returns {Promise<void>}\n * @private\n */\n async _performHealthCheck(deadline) {\n const address = this._buildUrl(this._address);\n\n // Calculate remaining time until deadline\n const timeoutMs = deadline.getTime() - Date.now();\n if (timeoutMs <= 0) {\n throw new GrpcServiceError(\n GrpcStatus.Timeout,\n ALL_WEB_NETWORK_NODES?.[this._address]?.toString(),\n );\n }\n\n const abortController = new AbortController();\n const timeoutId = setTimeout(() => abortController.abort(), timeoutMs);\n\n try {\n // Make a POST request to verify the gRPC-Web proxy is running\n // We use a minimal gRPC-Web compatible request\n //eslint-disable-next-line n/no-unsupported-features/node-builtins\n const response = await fetch(address, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/grpc-web+proto\",\n \"x-user-agent\": `${SDK_NAME}/${SDK_VERSION}`,\n \"x-grpc-web\": \"1\",\n },\n body: new Uint8Array(0), // Empty body for health check\n signal: abortController.signal,\n });\n\n clearTimeout(timeoutId);\n\n // Check if response is successful (200) or indicates a redirect (3xx)\n // 3xx status codes indicate the resource has moved, which is valid for proxies\n if (\n response.ok ||\n (response.status >= 300 && response.status < 400)\n ) {\n const grpcStatus = response.headers.get(\"grpc-status\");\n const grpcMessage = response.headers.get(\"grpc-message\");\n\n // If gRPC headers exist, the proxy is running and processing requests\n if (grpcStatus != null || grpcMessage != null) {\n // Mark this connection as ready\n this._isReady = true;\n return; // Healthy - gRPC-Web proxy is responding\n }\n }\n\n // If we get here, either status isn't 200/3xx or no gRPC headers present\n // This means the proxy might not be configured correctly or not running\n throw new GrpcServiceError(\n GrpcStatus.Unavailable,\n ALL_WEB_NETWORK_NODES?.[this._address]?.toString(),\n );\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new GrpcServiceError(\n GrpcStatus.Timeout,\n ALL_WEB_NETWORK_NODES?.[this._address]?.toString(),\n );\n }\n\n if (error instanceof GrpcServiceError) {\n throw error;\n }\n\n // Network error - server is not reachable\n throw new GrpcServiceError(\n GrpcStatus.Unavailable,\n ALL_WEB_NETWORK_NODES?.[this._address]?.toString(),\n );\n }\n }\n\n /**\n * @override\n * @returns {void}\n */\n close() {\n // do nothing\n }\n\n /**\n * @override\n * @protected\n * @param {string} serviceName\n * @returns {import(\"protobufjs\").RPCImpl}\n */\n _createUnaryClient(serviceName) {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n return async (method, requestData, callback) => {\n // Calculate deadline for connection check\n const deadline = new Date();\n const milliseconds = this._grpcDeadline;\n\n deadline.setMilliseconds(deadline.getMilliseconds() + milliseconds);\n\n try {\n // Wait for connection to be ready (similar to gRPC waitForReady)\n await this._waitForReady(deadline);\n\n // Build the full URL with appropriate scheme\n const address = this._buildUrl(this._address);\n // this will be executed in a browser environment so eslint is\n // disabled for the fetch call\n //eslint-disable-next-line n/no-unsupported-features/node-builtins\n const response = await fetch(\n `${address}/proto.${serviceName}/${method.name}`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/grpc-web+proto\",\n \"x-user-agent\": `${SDK_NAME}/${SDK_VERSION}`,\n \"x-grpc-web\": \"1\",\n },\n body: encodeRequest(requestData),\n },\n );\n\n if (!response.ok) {\n const error = new HttpError(\n HttpStatus._fromValue(response.status),\n );\n callback(error, null);\n return;\n }\n\n // Check headers for gRPC errors\n const grpcStatus = response.headers.get(\"grpc-status\");\n const grpcMessage = response.headers.get(\"grpc-message\");\n\n if (grpcStatus != null && grpcMessage != null) {\n const error = new GrpcServiceError(\n GrpcStatus._fromValue(parseInt(grpcStatus)),\n ALL_WEB_NETWORK_NODES?.[this._address]?.toString(),\n );\n error.message = grpcMessage;\n callback(error, null);\n return;\n }\n\n const responseBuffer = await response.arrayBuffer();\n const unaryResponse = decodeUnaryResponse(responseBuffer);\n\n callback(null, unaryResponse);\n } catch (error) {\n if (error instanceof GrpcServiceError) {\n callback(error, null);\n return;\n }\n\n const err = new GrpcServiceError(\n // retry on grpc web errors\n GrpcStatus._fromValue(18),\n ALL_WEB_NETWORK_NODES?.[this._address]?.toString(),\n );\n callback(err, null);\n }\n };\n }\n}\n"],"names":["WebChannel","Channel","constructor","address","grpcDeadline","super","this","_address","_isReady","_healthCheckPromise","_shouldUseHttps","includes","_buildUrl","startsWith","_waitForReady","deadline","_performHealthCheck","timeoutMs","getTime","Date","now","GrpcServiceError","GrpcStatus","Timeout","ALL_WEB_NETWORK_NODES","toString","abortController","AbortController","timeoutId","setTimeout","abort","response","fetch","method","headers","SDK_NAME","SDK_VERSION","body","Uint8Array","signal","clearTimeout","ok","status","grpcStatus","get","grpcMessage","Unavailable","error","Error","name","close","_createUnaryClient","serviceName","async","requestData","callback","milliseconds","_grpcDeadline","setMilliseconds","getMilliseconds","encodeRequest","HttpError","HttpStatus","_fromValue","parseInt","message","responseBuffer","arrayBuffer","decodeUnaryResponse"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WebChannel.js","sources":["../../src/channel/WebChannel.js"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\nimport { ALL_WEB_NETWORK_NODES } from \"../constants/ClientConstants.js\";\nimport GrpcServiceError from \"../grpc/GrpcServiceError.js\";\nimport GrpcStatus from \"../grpc/GrpcStatus.js\";\nimport HttpError from \"../http/HttpError.js\";\nimport HttpStatus from \"../http/HttpStatus.js\";\nimport { SDK_NAME, SDK_VERSION } from \"../version.js\";\nimport Channel, { encodeRequest, decodeUnaryResponse } from \"./Channel.js\";\n\nexport default class WebChannel extends Channel {\n /**\n * @param {string} address\n * @param {number=} grpcDeadline\n */\n constructor(address, grpcDeadline) {\n super(grpcDeadline);\n\n /**\n * @type {string}\n * @private\n */\n this._address = address;\n\n // Set the gRPC deadline using the base class method\n\n /**\n * Flag indicating if the connection is ready (health check has passed)\n * Set to true after the first successful health check\n *\n * @type {boolean}\n * @private\n */\n this._isReady = false;\n\n /**\n * Promise that resolves when the health check is complete\n * Used to prevent multiple concurrent health checks\n *\n * @type {Promise<void>|null}\n * @private\n */\n this._healthCheckPromise = null;\n }\n\n /**\n * Determines whether to use HTTPS based on the address\n * @param {string} address - The address to check\n * @returns {boolean} - True if HTTPS should be used, false for HTTP\n * @private\n */\n _shouldUseHttps(address) {\n return !(\n address.includes(\"localhost\") ||\n address.includes(\"127.0.0.1\") ||\n address.includes(\".cluster.local\")\n );\n }\n\n /**\n * Builds the full URL with appropriate scheme (http/https)\n * @param {string} address - The base address\n * @returns {string} - The full URL with scheme\n * @private\n */\n _buildUrl(address) {\n // Check if address already contains a scheme\n const hasScheme =\n address.startsWith(\"http://\") || address.startsWith(\"https://\");\n\n if (hasScheme) {\n // Use the address as-is if it already has a scheme\n return address;\n } else {\n // Only prepend scheme if none exists\n const shouldUseHttps = this._shouldUseHttps(address);\n return shouldUseHttps ? `https://${address}` : `http://${address}`;\n }\n }\n\n /**\n * Check if the gRPC-Web proxy is reachable and healthy\n * Performs a POST request and verifies the response has gRPC-Web headers,\n * which indicates the proxy is running and processing gRPC requests.\n * Results are cached per address for the entire lifecycle.\n * Uses promise-based synchronization to prevent multiple concurrent health checks.\n *\n * @param {Date} deadline - Deadline for the health check\n * @returns {Promise<void>}\n * @private\n */\n async _waitForReady(deadline) {\n // Check if we've already validated this address\n if (this._isReady) {\n return; // Health check already passed for this address\n }\n\n // If a health check is already in progress, wait for it to complete\n if (this._healthCheckPromise) {\n return this._healthCheckPromise;\n }\n\n // Start a new health check and store the promise\n this._healthCheckPromise = this._performHealthCheck(deadline);\n\n try {\n await this._healthCheckPromise;\n } finally {\n // Clear the promise when done (success or failure)\n this._healthCheckPromise = null;\n }\n }\n\n /**\n * Performs the actual health check request\n * @param {Date} deadline - Deadline for the health check\n * @returns {Promise<void>}\n * @private\n */\n async _performHealthCheck(deadline) {\n const address = this._buildUrl(this._address);\n\n // Calculate remaining time until deadline\n const timeoutMs = deadline.getTime() - Date.now();\n if (timeoutMs <= 0) {\n throw new GrpcServiceError(\n GrpcStatus.Timeout,\n ALL_WEB_NETWORK_NODES?.[this._address]?.toString(),\n );\n }\n\n const abortController = new AbortController();\n const timeoutId = setTimeout(() => abortController.abort(), timeoutMs);\n\n try {\n // Make a POST request to verify the gRPC-Web proxy is running\n // We use a minimal gRPC-Web compatible request\n //eslint-disable-next-line n/no-unsupported-features/node-builtins\n const response = await fetch(address, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/grpc-web+proto\",\n \"x-user-agent\": `${SDK_NAME}/${SDK_VERSION}`,\n \"x-grpc-web\": \"1\",\n },\n body: new Uint8Array(0), // Empty body for health check\n signal: abortController.signal,\n });\n\n clearTimeout(timeoutId);\n\n // Check if response is successful (200) or indicates a redirect (3xx)\n // 3xx status codes indicate the resource has moved, which is valid for proxies\n if (\n response.ok ||\n (response.status >= 300 && response.status < 400)\n ) {\n const grpcStatus = response.headers.get(\"grpc-status\");\n const grpcMessage = response.headers.get(\"grpc-message\");\n\n // If gRPC headers exist, the proxy is running and processing requests\n if (grpcStatus != null || grpcMessage != null) {\n // Mark this connection as ready\n this._isReady = true;\n return; // Healthy - gRPC-Web proxy is responding\n }\n }\n\n // If we get here, either status isn't 200/3xx or no gRPC headers present\n // This means the proxy might not be configured correctly or not running\n throw new GrpcServiceError(\n GrpcStatus.Unavailable,\n ALL_WEB_NETWORK_NODES?.[this._address]?.toString(),\n );\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new GrpcServiceError(\n GrpcStatus.Timeout,\n ALL_WEB_NETWORK_NODES?.[this._address]?.toString(),\n );\n }\n\n if (error instanceof GrpcServiceError) {\n throw error;\n }\n\n // Network error - server is not reachable\n throw new GrpcServiceError(\n GrpcStatus.Unavailable,\n ALL_WEB_NETWORK_NODES?.[this._address]?.toString(),\n );\n }\n }\n\n /**\n * @override\n * @returns {void}\n */\n close() {\n // do nothing\n }\n\n /**\n * @override\n * @protected\n * @param {string} serviceName\n * @returns {import(\"protobufjs\").RPCImpl}\n */\n _createUnaryClient(serviceName) {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n return async (method, requestData, callback) => {\n // Calculate deadline for connection check\n const deadline = new Date();\n const milliseconds = this._grpcDeadline;\n\n deadline.setMilliseconds(deadline.getMilliseconds() + milliseconds);\n\n try {\n // Wait for connection to be ready (similar to gRPC waitForReady)\n await this._waitForReady(deadline);\n\n // Build the full URL with appropriate scheme\n const address = this._buildUrl(this._address);\n // this will be executed in a browser environment so eslint is\n // disabled for the fetch call\n //eslint-disable-next-line n/no-unsupported-features/node-builtins\n const response = await fetch(\n `${address}/proto.${serviceName}/${method.name}`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/grpc-web+proto\",\n \"x-user-agent\": `${SDK_NAME}/${SDK_VERSION}`,\n \"x-grpc-web\": \"1\",\n },\n body: encodeRequest(requestData),\n },\n );\n\n if (!response.ok) {\n const error = new HttpError(\n HttpStatus._fromValue(response.status),\n );\n callback(error, null);\n return;\n }\n\n // Check headers for gRPC errors\n const grpcStatus = response.headers.get(\"grpc-status\");\n const grpcMessage = response.headers.get(\"grpc-message\");\n\n if (grpcStatus != null && grpcMessage != null) {\n const error = new GrpcServiceError(\n GrpcStatus._fromValue(parseInt(grpcStatus)),\n ALL_WEB_NETWORK_NODES?.[this._address]?.toString(),\n );\n error.message = grpcMessage;\n callback(error, null);\n return;\n }\n\n const responseBuffer = await response.arrayBuffer();\n const unaryResponse = decodeUnaryResponse(responseBuffer);\n\n callback(null, unaryResponse);\n } catch (error) {\n if (error instanceof GrpcServiceError) {\n callback(error, null);\n return;\n }\n\n const err = new GrpcServiceError(\n // retry on grpc web errors\n GrpcStatus._fromValue(18),\n ALL_WEB_NETWORK_NODES?.[this._address]?.toString(),\n );\n callback(err, null);\n }\n };\n }\n}\n"],"names":["WebChannel","Channel","constructor","address","grpcDeadline","super","this","_address","_isReady","_healthCheckPromise","_shouldUseHttps","includes","_buildUrl","startsWith","_waitForReady","deadline","_performHealthCheck","timeoutMs","getTime","Date","now","GrpcServiceError","GrpcStatus","Timeout","ALL_WEB_NETWORK_NODES","toString","abortController","AbortController","timeoutId","setTimeout","abort","response","fetch","method","headers","SDK_NAME","SDK_VERSION","body","Uint8Array","signal","clearTimeout","ok","status","grpcStatus","get","grpcMessage","Unavailable","error","Error","name","close","_createUnaryClient","serviceName","async","requestData","callback","milliseconds","_grpcDeadline","setMilliseconds","getMilliseconds","encodeRequest","HttpError","HttpStatus","_fromValue","parseInt","message","responseBuffer","arrayBuffer","decodeUnaryResponse"],"mappings":"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"}
|
package/lib/client/Client.cjs
CHANGED
|
@@ -131,6 +131,18 @@ class Client {
|
|
|
131
131
|
/** @private */
|
|
132
132
|
this._defaultRegenerateTransactionId = true;
|
|
133
133
|
|
|
134
|
+
/**
|
|
135
|
+
* When enabled, allows receipt queries to fail over to other nodes
|
|
136
|
+
* if the submitting node is unresponsive. Default is false to preserve
|
|
137
|
+
* existing semantics where receipt queries are pinned to the submitting node.
|
|
138
|
+
*
|
|
139
|
+
* Tradeoff: Improved availability vs the rare case where only the submitting
|
|
140
|
+
* node may have final failure information.
|
|
141
|
+
*
|
|
142
|
+
* @private
|
|
143
|
+
*/
|
|
144
|
+
this._allowReceiptNodeFailover = false;
|
|
145
|
+
|
|
134
146
|
/** @private */
|
|
135
147
|
this._requestTimeout = _ClientConstants.DEFAULT_REQUEST_TIMEOUT;
|
|
136
148
|
|
|
@@ -446,6 +458,32 @@ class Client {
|
|
|
446
458
|
return this;
|
|
447
459
|
}
|
|
448
460
|
|
|
461
|
+
/**
|
|
462
|
+
* @returns {boolean}
|
|
463
|
+
*/
|
|
464
|
+
get allowReceiptNodeFailover() {
|
|
465
|
+
return this._allowReceiptNodeFailover;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
/**
|
|
469
|
+
* Enable or disable receipt query failover to other nodes when the submitting node
|
|
470
|
+
* is unresponsive. When enabled, receipt queries will start with the submitting node
|
|
471
|
+
* but can fail over to other nodes in the network if needed.
|
|
472
|
+
*
|
|
473
|
+
* Default is `false` to preserve existing behavior where receipt queries are pinned
|
|
474
|
+
* to the submitting node only.
|
|
475
|
+
*
|
|
476
|
+
* **Tradeoff**: Enabling this improves availability for high-throughput/relay use cases,
|
|
477
|
+
* but in rare cases only the submitting node may have the final failure information.
|
|
478
|
+
*
|
|
479
|
+
* @param {boolean} allowReceiptNodeFailover
|
|
480
|
+
* @returns {this}
|
|
481
|
+
*/
|
|
482
|
+
setAllowReceiptNodeFailover(allowReceiptNodeFailover) {
|
|
483
|
+
this._allowReceiptNodeFailover = allowReceiptNodeFailover;
|
|
484
|
+
return this;
|
|
485
|
+
}
|
|
486
|
+
|
|
449
487
|
/**
|
|
450
488
|
* @returns {Hbar}
|
|
451
489
|
*/
|
package/lib/client/Client.d.ts
CHANGED
|
@@ -108,6 +108,17 @@ export default class Client<ChannelT extends Channel, MirrorChannelT extends Mir
|
|
|
108
108
|
private _maxBackoff;
|
|
109
109
|
/** @private */
|
|
110
110
|
private _defaultRegenerateTransactionId;
|
|
111
|
+
/**
|
|
112
|
+
* When enabled, allows receipt queries to fail over to other nodes
|
|
113
|
+
* if the submitting node is unresponsive. Default is false to preserve
|
|
114
|
+
* existing semantics where receipt queries are pinned to the submitting node.
|
|
115
|
+
*
|
|
116
|
+
* Tradeoff: Improved availability vs the rare case where only the submitting
|
|
117
|
+
* node may have final failure information.
|
|
118
|
+
*
|
|
119
|
+
* @private
|
|
120
|
+
*/
|
|
121
|
+
private _allowReceiptNodeFailover;
|
|
111
122
|
/** @private */
|
|
112
123
|
private _requestTimeout;
|
|
113
124
|
/** @private */
|
|
@@ -286,6 +297,25 @@ export default class Client<ChannelT extends Channel, MirrorChannelT extends Mir
|
|
|
286
297
|
* @returns {this}
|
|
287
298
|
*/
|
|
288
299
|
setDefaultRegenerateTransactionId(defaultRegenerateTransactionId: boolean): this;
|
|
300
|
+
/**
|
|
301
|
+
* @returns {boolean}
|
|
302
|
+
*/
|
|
303
|
+
get allowReceiptNodeFailover(): boolean;
|
|
304
|
+
/**
|
|
305
|
+
* Enable or disable receipt query failover to other nodes when the submitting node
|
|
306
|
+
* is unresponsive. When enabled, receipt queries will start with the submitting node
|
|
307
|
+
* but can fail over to other nodes in the network if needed.
|
|
308
|
+
*
|
|
309
|
+
* Default is `false` to preserve existing behavior where receipt queries are pinned
|
|
310
|
+
* to the submitting node only.
|
|
311
|
+
*
|
|
312
|
+
* **Tradeoff**: Enabling this improves availability for high-throughput/relay use cases,
|
|
313
|
+
* but in rare cases only the submitting node may have the final failure information.
|
|
314
|
+
*
|
|
315
|
+
* @param {boolean} allowReceiptNodeFailover
|
|
316
|
+
* @returns {this}
|
|
317
|
+
*/
|
|
318
|
+
setAllowReceiptNodeFailover(allowReceiptNodeFailover: boolean): this;
|
|
289
319
|
/**
|
|
290
320
|
* @returns {Hbar}
|
|
291
321
|
*/
|
package/lib/client/Client.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"../account/AccountId.js";import t from"../account/AccountBalanceQuery.js";import r from"../Hbar.js";import
|
|
1
|
+
import e from"../account/AccountId.js";import t from"../account/AccountBalanceQuery.js";import r from"../Hbar.js";import i from"./Network.js";import s from"./MirrorNetwork.js";import o from"../PublicKey.js";import n from"../PrivateKey.js";import a from"../LedgerId.js";import u from"../file/FileId.js";import"pino";import"../logger/LogLevel.js";import{convertToNumber as l}from"../util.js";import h from"../network/AddressBookQuery.js";import{DEFAULT_REQUEST_TIMEOUT as d,DEFAULT_GRPC_DEADLINE as m}from"../constants/ClientConstants.js";class c{constructor(e){this._mirrorNetwork=new s(this._createMirrorNetworkChannel()),this._network=new i(this._createNetworkChannel()),this._operator=null,this._defaultMaxTransactionFee=null,this._defaultMaxQueryPayment=new r(1),null!=e&&null!=e.operator&&this.setOperator(e.operator.accountId,e.operator.privateKey),this._maxAttempts=null,this._signOnDemand=!1,this._autoValidateChecksums=!1,this._minBackoff=250,this._maxBackoff=8e3,this._defaultRegenerateTransactionId=!0,this._allowReceiptNodeFailover=!1,this._requestTimeout=d,this._grpcDeadline=m,this._isUpdatingNetwork=!1,this._networkUpdatePeriod=864e5,this._isShutdown=!1,this._shard=0,this._realm=0,null!=e&&!1!==e.scheduleNetworkUpdate&&this._scheduleNetworkUpdate(),null!=e&&null!=e.shard&&(this._shard=e.shard),null!=e&&null!=e.realm&&(this._realm=e.realm),null!=e&&null!=e.grpcDeadline&&this.setGrpcDeadline(e.grpcDeadline),null!=e&&null!=e.requestTimeout&&this.setRequestTimeout(e.requestTimeout),this._requestTimeout<=this._grpcDeadline&&console.warn(`DEPRECATION WARNING: requestTimeout (${this._requestTimeout}ms) should be larger than grpcDeadline (${this._grpcDeadline}ms). This configuration may cause operations to fail unexpectedly. This will throw an error in the next major version. Please adjust your timeout values.`),this._timer,this._logger=null}setNetworkName(e){return console.warn("Deprecated: Use `setLedgerId` instead"),this.setLedgerId(e)}get networkName(){return console.warn("Deprecated: Use `ledgerId` instead"),null!=this.ledgerId?this.ledgerId.toString():null}setLedgerId(e){return this._network.setLedgerId("string"==typeof e?a.fromString(e):e),this}get ledgerId(){return null!=this._network._ledgerId?this._network.ledgerId:null}setNetwork(e){throw new Error("not implemented")}setNetworkFromAddressBook(e){return this._network.setNetworkFromAddressBook(e),this}get network(){return this._network.network}get shard(){return this._shard}get realm(){return this._realm}setMirrorNetwork(e){throw new Error("not implemented")}get mirrorNetwork(){return this._mirrorNetwork.network}get mirrorRestApiBaseUrl(){return this._mirrorNetwork.mirrorRestApiBaseUrl}get signOnDemand(){return this._signOnDemand}setSignOnDemand(e){this._signOnDemand=e}isTransportSecurity(){return this._network.isTransportSecurity()}setTransportSecurity(e){return this._network.setTransportSecurity(e),this}setOperator(e,t){const r="string"==typeof t?n.fromStringDer(t):t;return this.setOperatorWith(e,r.publicKey,e=>Promise.resolve(r.sign(e)))}getOperator(){return this._operator}setOperatorWith(t,r,i){const s=t instanceof e?t:e.fromString(t);return null!=this._network._ledgerId&&s.validateChecksum(this),this._operator={transactionSigner:i,accountId:s,publicKey:r instanceof o?r:o.fromString(r)},this}setAutoValidateChecksums(e){return this._autoValidateChecksums=e,this}isAutoValidateChecksumsEnabled(){return this._autoValidateChecksums}get operatorAccountId(){return null!=this._operator?this._operator.accountId:null}get operatorPublicKey(){return null!=this._operator?this._operator.publicKey:null}get defaultMaxTransactionFee(){return this._defaultMaxTransactionFee}get maxTransactionFee(){return this.defaultMaxTransactionFee}setDefaultMaxTransactionFee(e){if(e.toTinybars().toInt()<0)throw new Error("defaultMaxTransactionFee must be non-negative");return this._defaultMaxTransactionFee=e,this}setMaxTransactionFee(e){return this.setDefaultMaxTransactionFee(e)}get defaultRegenerateTransactionId(){return this._defaultRegenerateTransactionId}setDefaultRegenerateTransactionId(e){return this._defaultRegenerateTransactionId=e,this}get allowReceiptNodeFailover(){return this._allowReceiptNodeFailover}setAllowReceiptNodeFailover(e){return this._allowReceiptNodeFailover=e,this}get defaultMaxQueryPayment(){return this._defaultMaxQueryPayment}get maxQueryPayment(){return this.defaultMaxQueryPayment}setDefaultMaxQueryPayment(e){if(l(e.toTinybars())<0)throw new Error("defaultMaxQueryPayment must be non-negative");return this._defaultMaxQueryPayment=e,this}setMaxQueryPayment(e){return this.setDefaultMaxQueryPayment(e)}get maxAttempts(){return null!=this._maxAttempts?this._maxAttempts:10}setMaxAttempts(e){return this._maxAttempts=e,this}get maxNodeAttempts(){return this._network.maxNodeAttempts}setMaxNodeAttempts(e){return this._network.setMaxNodeAttempts(e),this}get nodeWaitTime(){return this._network.minBackoff}setNodeWaitTime(e){return this._network.setMinBackoff(e),this}get maxNodesPerTransaction(){return this._network.maxNodesPerTransaction}setMaxNodesPerTransaction(e){return this._network.setMaxNodesPerTransaction(e),this}setMinBackoff(e){if(null==e)throw new Error("minBackoff cannot be null.");if(e>this._maxBackoff)throw new Error("minBackoff cannot be larger than maxBackoff.");return this._minBackoff=e,this}get minBackoff(){return this._minBackoff}setMaxBackoff(e){if(null==e)throw new Error("maxBackoff cannot be null.");if(e<this._minBackoff)throw new Error("maxBackoff cannot be smaller than minBackoff.");return this._maxBackoff=e,this}get maxBackoff(){return this._maxBackoff}setNodeMinBackoff(e){return this._network.setMinBackoff(e),this}get nodeMinBackoff(){return this._network.minBackoff}setNodeMaxBackoff(e){return this._network.setMaxBackoff(e),this}get nodeMaxBackoff(){return this._network.maxBackoff}setNodeMinReadmitPeriod(e){return this._network.setNodeMinReadmitPeriod(e),this}get nodeMinReadmitPeriod(){return this._network.nodeMinReadmitPeriod}setNodeMaxReadmitPeriod(e){return this._network.setNodeMaxReadmitPeriod(e),this}get nodeMaxReadmitPeriod(){return this._network.nodeMaxReadmitPeriod}setRequestTimeout(e){if(e<=0)throw new Error("requestTimeout must be a positive number");return e<=this._grpcDeadline&&console.warn(`DEPRECATION WARNING: requestTimeout (${e}ms) should be larger than grpcDeadline (${this._grpcDeadline}ms). This configuration may cause operations to fail unexpectedly. This will throw an error in the next major version. Please adjust your timeout values.`),this._requestTimeout=e,this}get requestTimeout(){return this._requestTimeout}setGrpcDeadline(e){if(e<=0)throw new Error("grpcDeadline must be a positive number");return e>=this._requestTimeout&&console.warn(`DEPRECATION WARNING: grpcDeadline (${e}ms) should be smaller than requestTimeout (${this._requestTimeout}ms). This configuration may cause operations to fail unexpectedly. This will throw an error in the next major version. Please adjust your timeout values.`),this._grpcDeadline=e,this}get grpcDeadline(){return this._grpcDeadline}get networkUpdatePeriod(){return this._networkUpdatePeriod}setNetworkUpdatePeriod(e){return clearTimeout(this._timer),this._networkUpdatePeriod=e,this._scheduleNetworkUpdate(),this}setLogger(e){return this._logger=e,this}get logger(){return this._logger}async ping(r){await new t({accountId:r}).setNodeAccountIds([r instanceof e?r:e.fromString(r)]).execute(this)}async pingAll(){for(const e of Object.values(this._network.network))await this.ping(e)}async updateNetwork(){if(this._isUpdatingNetwork)return this;this._isUpdatingNetwork=!0;try{const e=await(new h).setFileId(u.getAddressBookFileIdFor(this._shard,this._realm)).execute(this);this.setNetworkFromAddressBook(e)}catch(e){this._logger&&this._logger.trace(`failed to update client address book: ${e.toString()}`)}finally{this._isUpdatingNetwork=!1}return this}close(){this._network.close(),this._mirrorNetwork.close(),this._isShutdown=!0,clearTimeout(this._timer)}_createNetworkChannel(){return()=>{throw new Error("not implemented")}}_createMirrorNetworkChannel(){return()=>{throw new Error("not implemented")}}_scheduleNetworkUpdate(){this._timer=setTimeout(async()=>{await this.updateNetwork(),this._isShutdown||this._scheduleNetworkUpdate()},this._networkUpdatePeriod)}get isClientShutDown(){return this._isShutdown}static _validateNetworkConsistency(e){if(0===Object.keys(e).length)return;const[,t]=Object.entries(e)[0],r=t.toString(),[i,s]=r.split(".").map(Number),o=Object.values(e).every(e=>{const t=e.toString(),[r,o]=t.split(".").map(Number);return r===i&&o===s});if(!o)throw new Error("Network is not valid, all nodes must be in the same shard and realm")}static _extractShardRealm(e){const t=Object.entries(e);if(0===t.length)return{shard:0,realm:0};const[,r]=t[0],i=r.toString(),[s,o]=i.split(".").map(Number);return{shard:s,realm:o}}}export{c as default};
|
|
2
2
|
//# sourceMappingURL=Client.js.map
|
package/lib/client/Client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Client.js","sources":["../../src/client/Client.js"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\nimport AccountId from \"../account/AccountId.js\";\nimport AccountBalanceQuery from \"../account/AccountBalanceQuery.js\";\nimport Hbar from \"../Hbar.js\";\nimport Network from \"./Network.js\";\nimport MirrorNetwork from \"./MirrorNetwork.js\";\nimport PublicKey from \"../PublicKey.js\";\nimport PrivateKey from \"../PrivateKey.js\";\nimport LedgerId from \"../LedgerId.js\";\nimport FileId from \"../file/FileId.js\";\nimport Logger from \"../logger/Logger.js\"; // eslint-disable-line\nimport { convertToNumber } from \"../util.js\";\nimport AddressBookQuery from \"../network/AddressBookQuery.js\";\nimport {\n DEFAULT_GRPC_DEADLINE,\n DEFAULT_REQUEST_TIMEOUT,\n} from \"../constants/ClientConstants.js\";\n\n/**\n * @typedef {import(\"../channel/Channel.js\").default} Channel\n * @typedef {import(\"../channel/MirrorChannel.js\").default} MirrorChannel\n * @typedef {import(\"../address_book/NodeAddressBook.js\").default} NodeAddressBook\n */\n\n/**\n * @typedef {object} Operator\n * @property {string | PrivateKey} privateKey\n * @property {string | AccountId} accountId\n */\n\n/**\n * @typedef {object} ClientOperator\n * @property {PublicKey} publicKey\n * @property {AccountId} accountId\n * @property {(message: Uint8Array) => Promise<Uint8Array>} transactionSigner\n */\n\n/**\n * @typedef {object} ClientConfiguration\n * @property {{[key: string]: (string | AccountId)} | string} [network]\n * @property {string[] | string} [mirrorNetwork]\n * @property {Operator} [operator]\n * @property {boolean} [scheduleNetworkUpdate]\n * @property {number} [shard]\n * @property {number} [realm]\n * @property {number} [grpcDeadline]\n * @property {number} [requestTimeout]\n */\n\n/**\n * @typedef {\"mainnet\" | \"testnet\" | \"previewnet\"} NetworkName\n */\n\n/**\n * The `Client` class is the main entry point for interacting with the Hedera Hashgraph network.\n * It provides methods for managing network connections, setting operators, handling transactions\n * and queries, and configuring various client settings.\n *\n * @abstract\n * @template {Channel} ChannelT\n * @template {MirrorChannel} MirrorChannelT\n */\nexport default class Client {\n /**\n * @protected\n * @hideconstructor\n * @param {ClientConfiguration} [props]\n */\n constructor(props) {\n /**\n * List of mirror network URLs.\n *\n * @internal\n * @type {MirrorNetwork}\n */\n this._mirrorNetwork = new MirrorNetwork(\n this._createMirrorNetworkChannel(),\n );\n\n /**\n * Map of node account ID (as a string)\n * to the node URL.\n *\n * @internal\n * @type {Network}\n */\n this._network = new Network(this._createNetworkChannel());\n\n /**\n * @internal\n * @type {?ClientOperator}\n */\n this._operator = null;\n\n /**\n * @private\n * @type {?Hbar}\n */\n this._defaultMaxTransactionFee = null;\n\n /**\n * @private\n * @type {Hbar}\n */\n this._defaultMaxQueryPayment = new Hbar(1);\n\n if (props != null) {\n if (props.operator != null) {\n this.setOperator(\n props.operator.accountId,\n props.operator.privateKey,\n );\n }\n }\n\n /** @type {number | null} */\n this._maxAttempts = null;\n\n /** @private */\n this._signOnDemand = false;\n\n /** @private */\n this._autoValidateChecksums = false;\n\n /** @private */\n this._minBackoff = 250;\n\n /** @private */\n this._maxBackoff = 8000;\n\n /** @private */\n this._defaultRegenerateTransactionId = true;\n\n /** @private */\n this._requestTimeout = DEFAULT_REQUEST_TIMEOUT;\n\n /** @private */\n this._grpcDeadline = DEFAULT_GRPC_DEADLINE;\n\n /**\n * @type {boolean}\n */\n this._isUpdatingNetwork = false;\n\n /** @private */\n this._networkUpdatePeriod = 24 * 60 * 60 * 1000;\n\n /** @private */\n this._isShutdown = false;\n\n this._shard = 0;\n\n this._realm = 0;\n\n if (props != null && props.scheduleNetworkUpdate !== false) {\n this._scheduleNetworkUpdate();\n }\n\n if (props != null && props.shard != null) {\n this._shard = props.shard;\n }\n\n if (props != null && props.realm != null) {\n this._realm = props.realm;\n }\n\n if (props != null && props.grpcDeadline != null) {\n this.setGrpcDeadline(props.grpcDeadline);\n }\n\n if (props != null && props.requestTimeout != null) {\n this.setRequestTimeout(props.requestTimeout);\n }\n\n // Validate that requestTimeout is larger than grpcDeadline after both are set\n if (this._requestTimeout <= this._grpcDeadline) {\n console.warn(\n `DEPRECATION WARNING: requestTimeout (${this._requestTimeout}ms) should be larger than grpcDeadline (${this._grpcDeadline}ms). ` +\n `This configuration may cause operations to fail unexpectedly. ` +\n `This will throw an error in the next major version. Please adjust your timeout values.`,\n );\n }\n\n /** @internal */\n /** @type {NodeJS.Timeout} */\n this._timer;\n\n /**\n * Logger\n *\n * @external\n * @type {Logger | null}\n */\n this._logger = null;\n }\n\n /**\n * @deprecated\n * @param {NetworkName} networkName\n * @returns {this}\n */\n setNetworkName(networkName) {\n // uses custom NetworkName type\n // remove if phasing out set|get 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._network.setLedgerId(\n typeof ledgerId === \"string\"\n ? LedgerId.fromString(ledgerId)\n : ledgerId,\n );\n\n return this;\n }\n\n /**\n * @returns {LedgerId | null}\n */\n get ledgerId() {\n return this._network._ledgerId != null ? this._network.ledgerId : null;\n }\n\n /**\n * @param {{[key: string]: (string | AccountId)} | string} network\n * @returns {void}\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n setNetwork(network) {\n // TODO: This logic _can_ be de-duplicated and likely should\n throw new Error(\"not implemented\");\n }\n\n /**\n * @param {NodeAddressBook} addressBook\n * @returns {this}\n */\n setNetworkFromAddressBook(addressBook) {\n this._network.setNetworkFromAddressBook(addressBook);\n return this;\n }\n\n /**\n * @returns {{[key: string]: (string | AccountId)}}\n */\n get network() {\n return this._network.network;\n }\n\n /**\n * @returns {number}\n */\n get shard() {\n return this._shard;\n }\n\n /**\n * @returns {number}\n */\n get realm() {\n return this._realm;\n }\n\n /**\n * @param {string[] | string} mirrorNetwork\n * @returns {void}\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n setMirrorNetwork(mirrorNetwork) {\n throw new Error(\"not implemented\");\n }\n\n /**\n * @returns {string[]}\n */\n get mirrorNetwork() {\n return this._mirrorNetwork.network;\n }\n\n /**\n * @returns {string}\n * @throws {Error} When no mirror network is configured or available\n */\n get mirrorRestApiBaseUrl() {\n return this._mirrorNetwork.mirrorRestApiBaseUrl;\n }\n\n /**\n * @returns {boolean}\n */\n get signOnDemand() {\n return this._signOnDemand;\n }\n\n /**\n * @param {boolean} signOnDemand\n */\n setSignOnDemand(signOnDemand) {\n this._signOnDemand = signOnDemand;\n }\n\n /**\n * @returns {boolean}\n */\n isTransportSecurity() {\n return this._network.isTransportSecurity();\n }\n\n /**\n * @param {boolean} transportSecurity\n * @returns {this}\n */\n setTransportSecurity(transportSecurity) {\n this._network.setTransportSecurity(transportSecurity);\n return this;\n }\n\n /**\n * Set the account that will, by default, pay for transactions and queries built with this client.\n * NOTE: When using string for private key, the string needs to contain DER headers\n *\n * @param {AccountId | string} accountId\n * @param {PrivateKey | string} privateKey\n * @returns {this}\n */\n setOperator(accountId, privateKey) {\n const key =\n typeof privateKey === \"string\"\n ? PrivateKey.fromStringDer(privateKey)\n : privateKey;\n\n return this.setOperatorWith(accountId, key.publicKey, (message) =>\n Promise.resolve(key.sign(message)),\n );\n }\n\n /**\n * @returns {?ClientOperator}\n */\n getOperator() {\n return this._operator;\n }\n\n /**\n * Sets the account that will, by default, pay for transactions and queries built with\n * this client.\n *\n * @param {AccountId | string} accountId\n * @param {PublicKey | string} publicKey\n * @param {(message: Uint8Array) => Promise<Uint8Array>} transactionSigner\n * @returns {this}\n */\n setOperatorWith(accountId, publicKey, transactionSigner) {\n const accountId_ =\n accountId instanceof AccountId\n ? accountId\n : AccountId.fromString(accountId);\n\n if (this._network._ledgerId != null) {\n accountId_.validateChecksum(this);\n }\n\n this._operator = {\n transactionSigner,\n\n accountId: accountId_,\n\n publicKey:\n publicKey instanceof PublicKey\n ? publicKey\n : PublicKey.fromString(publicKey),\n };\n\n return this;\n }\n\n /**\n * @param {boolean} value\n * @returns {this}\n */\n setAutoValidateChecksums(value) {\n this._autoValidateChecksums = value;\n return this;\n }\n\n /**\n * @returns {boolean}\n */\n isAutoValidateChecksumsEnabled() {\n return this._autoValidateChecksums;\n }\n\n /**\n * @returns {?AccountId}\n */\n get operatorAccountId() {\n return this._operator != null ? this._operator.accountId : null;\n }\n\n /**\n * @returns {?PublicKey}\n */\n get operatorPublicKey() {\n return this._operator != null ? this._operator.publicKey : null;\n }\n\n /**\n * @returns {?Hbar}\n */\n get defaultMaxTransactionFee() {\n return this._defaultMaxTransactionFee;\n }\n\n /**\n * @deprecated - Use `defaultMaxTransactionFee` instead\n * @returns {?Hbar}\n */\n get maxTransactionFee() {\n return this.defaultMaxTransactionFee;\n }\n\n /**\n * Set the defaultimum fee to be paid for transactions\n * executed by this client.\n *\n * @param {Hbar} defaultMaxTransactionFee\n * @returns {this}\n */\n setDefaultMaxTransactionFee(defaultMaxTransactionFee) {\n if (defaultMaxTransactionFee.toTinybars().toInt() < 0) {\n throw new Error(\"defaultMaxTransactionFee must be non-negative\");\n }\n this._defaultMaxTransactionFee = defaultMaxTransactionFee;\n return this;\n }\n\n /**\n * @deprecated - Use `setDefaultMaxTransactionFee()` instead\n * Set the maximum fee to be paid for transactions\n * executed by this client.\n * @param {Hbar} maxTransactionFee\n * @returns {this}\n */\n setMaxTransactionFee(maxTransactionFee) {\n return this.setDefaultMaxTransactionFee(maxTransactionFee);\n }\n\n /**\n * @returns {boolean}\n */\n get defaultRegenerateTransactionId() {\n return this._defaultRegenerateTransactionId;\n }\n\n /**\n * Set if a new transaction ID should be generated when a `TRANSACTION_EXPIRED` status\n * is returned.\n *\n * @param {boolean} defaultRegenerateTransactionId\n * @returns {this}\n */\n setDefaultRegenerateTransactionId(defaultRegenerateTransactionId) {\n this._defaultRegenerateTransactionId = defaultRegenerateTransactionId;\n return this;\n }\n\n /**\n * @returns {Hbar}\n */\n get defaultMaxQueryPayment() {\n return this._defaultMaxQueryPayment;\n }\n\n /**\n * @deprecated in a favor of defaultMaxQueryPayment\n * @returns {Hbar}\n */\n get maxQueryPayment() {\n return this.defaultMaxQueryPayment;\n }\n\n /**\n * Set the maximum payment allowable for queries.\n *\n * @param {Hbar} defaultMaxQueryPayment\n * @returns {Client<ChannelT, MirrorChannelT>}\n */\n setDefaultMaxQueryPayment(defaultMaxQueryPayment) {\n const isMaxQueryPaymentNegative =\n convertToNumber(defaultMaxQueryPayment.toTinybars()) < 0;\n if (isMaxQueryPaymentNegative) {\n throw new Error(\"defaultMaxQueryPayment must be non-negative\");\n }\n this._defaultMaxQueryPayment = defaultMaxQueryPayment;\n return this;\n }\n /**\n * @deprecated in a favor of setDefaultMaxQueryPayment()\n * Set the maximum payment allowable for queries.\n * @param {Hbar} maxQueryPayment\n * @returns {Client<ChannelT, MirrorChannelT>}\n */\n setMaxQueryPayment(maxQueryPayment) {\n return this.setDefaultMaxQueryPayment(maxQueryPayment);\n }\n\n /**\n * @returns {number}\n */\n get maxAttempts() {\n return this._maxAttempts != null ? this._maxAttempts : 10;\n }\n\n /**\n * @param {number} maxAttempts\n * @returns {this}\n */\n setMaxAttempts(maxAttempts) {\n this._maxAttempts = maxAttempts;\n return this;\n }\n\n /**\n * @returns {number}\n */\n get maxNodeAttempts() {\n return this._network.maxNodeAttempts;\n }\n\n /**\n * @param {number} maxNodeAttempts\n * @returns {this}\n */\n setMaxNodeAttempts(maxNodeAttempts) {\n this._network.setMaxNodeAttempts(maxNodeAttempts);\n return this;\n }\n\n /**\n * @returns {number}\n */\n get nodeWaitTime() {\n return this._network.minBackoff;\n }\n\n /**\n * @param {number} nodeWaitTime\n * @returns {this}\n */\n setNodeWaitTime(nodeWaitTime) {\n this._network.setMinBackoff(nodeWaitTime);\n return this;\n }\n\n /**\n * Gets the maximum number of nodes that a transaction or query will attempt to execute against.\n *\n * @returns {number} The current maximum nodes per transaction setting.\n * Returns -1 if no limit is set (uses network defaults).\n */\n get maxNodesPerTransaction() {\n return this._network.maxNodesPerTransaction;\n }\n\n /**\n * Sets the maximum number of nodes that a transaction or query will execute against.\n *\n * - **Before freezing**: Limits automatic node selection when no explicit nodes are set\n * - **After freezing**: Trims frozen transactions to the first N nodes while preserving signatures\n * - **Special values**: 0 disables limiting, values > available nodes cause no trimming\n *\n * @param {number} maxNodesPerTransaction - Maximum nodes per transaction. Set to 0 to disable.\n * @returns {this} The client instance for method chaining\n */\n setMaxNodesPerTransaction(maxNodesPerTransaction) {\n this._network.setMaxNodesPerTransaction(maxNodesPerTransaction);\n return this;\n }\n\n /**\n * @param {?number} minBackoff\n * @returns {this}\n */\n setMinBackoff(minBackoff) {\n if (minBackoff == null) {\n throw new Error(\"minBackoff cannot be null.\");\n }\n if (minBackoff > this._maxBackoff) {\n throw new Error(\"minBackoff cannot be larger than maxBackoff.\");\n }\n this._minBackoff = minBackoff;\n return this;\n }\n\n /**\n * @returns {number}\n */\n get minBackoff() {\n return this._minBackoff;\n }\n\n /**\n * @param {?number} maxBackoff\n * @returns {this}\n */\n setMaxBackoff(maxBackoff) {\n if (maxBackoff == null) {\n throw new Error(\"maxBackoff cannot be null.\");\n } else if (maxBackoff < this._minBackoff) {\n throw new Error(\"maxBackoff cannot be smaller than minBackoff.\");\n }\n this._maxBackoff = maxBackoff;\n return this;\n }\n\n /**\n * @returns {number}\n */\n get maxBackoff() {\n return this._maxBackoff;\n }\n\n /**\n * @param {number} nodeMinBackoff\n * @returns {this}\n */\n setNodeMinBackoff(nodeMinBackoff) {\n this._network.setMinBackoff(nodeMinBackoff);\n return this;\n }\n\n /**\n * @returns {number}\n */\n get nodeMinBackoff() {\n return this._network.minBackoff;\n }\n\n /**\n * @param {number} nodeMaxBackoff\n * @returns {this}\n */\n setNodeMaxBackoff(nodeMaxBackoff) {\n this._network.setMaxBackoff(nodeMaxBackoff);\n return this;\n }\n\n /**\n * @returns {number}\n */\n get nodeMaxBackoff() {\n return this._network.maxBackoff;\n }\n\n /**\n * @param {number} nodeMinReadmitPeriod\n * @returns {this}\n */\n setNodeMinReadmitPeriod(nodeMinReadmitPeriod) {\n this._network.setNodeMinReadmitPeriod(nodeMinReadmitPeriod);\n return this;\n }\n\n /**\n * @returns {number}\n */\n get nodeMinReadmitPeriod() {\n return this._network.nodeMinReadmitPeriod;\n }\n\n /**\n * @param {number} nodeMaxReadmitPeriod\n * @returns {this}\n */\n setNodeMaxReadmitPeriod(nodeMaxReadmitPeriod) {\n this._network.setNodeMaxReadmitPeriod(nodeMaxReadmitPeriod);\n return this;\n }\n\n /**\n * @returns {number}\n */\n get nodeMaxReadmitPeriod() {\n return this._network.nodeMaxReadmitPeriod;\n }\n\n /**\n * Set the total request timeout for complete operations.\n *\n * @param {number} requestTimeout - Maximum time in milliseconds for complete Transaction/Query operations\n * @returns {this}\n */\n setRequestTimeout(requestTimeout) {\n if (requestTimeout <= 0) {\n throw new Error(\"requestTimeout must be a positive number\");\n }\n if (requestTimeout <= this._grpcDeadline) {\n console.warn(\n `DEPRECATION WARNING: requestTimeout (${requestTimeout}ms) should be larger than grpcDeadline (${this._grpcDeadline}ms). ` +\n `This configuration may cause operations to fail unexpectedly. ` +\n `This will throw an error in the next major version. Please adjust your timeout values.`,\n );\n }\n this._requestTimeout = requestTimeout;\n return this;\n }\n\n /**\n * Get the total request timeout for complete operations.\n *\n * @returns {number} Maximum time in milliseconds for complete Transaction/Query operations\n */\n get requestTimeout() {\n return this._requestTimeout;\n }\n\n /**\n * Set the global gRPC deadline for all requests.\n *\n * @param {number} grpcDeadline - Maximum time in milliseconds for a single gRPC request\n * @returns {this}\n */\n setGrpcDeadline(grpcDeadline) {\n if (grpcDeadline <= 0) {\n throw new Error(\"grpcDeadline must be a positive number\");\n }\n if (grpcDeadline >= this._requestTimeout) {\n console.warn(\n `DEPRECATION WARNING: grpcDeadline (${grpcDeadline}ms) should be smaller than requestTimeout (${this._requestTimeout}ms). ` +\n `This configuration may cause operations to fail unexpectedly. ` +\n `This will throw an error in the next major version. Please adjust your timeout values.`,\n );\n }\n this._grpcDeadline = grpcDeadline;\n return this;\n }\n\n /**\n * Get the global gRPC deadline for all requests.\n *\n * @returns {number} Maximum time in milliseconds for a single gRPC request\n */\n get grpcDeadline() {\n return this._grpcDeadline;\n }\n\n /**\n * @returns {number}\n */\n get networkUpdatePeriod() {\n return this._networkUpdatePeriod;\n }\n\n /**\n * @param {number} networkUpdatePeriod\n * @returns {this}\n */\n setNetworkUpdatePeriod(networkUpdatePeriod) {\n clearTimeout(this._timer);\n this._networkUpdatePeriod = networkUpdatePeriod;\n this._scheduleNetworkUpdate();\n return this;\n }\n /**\n * Set logger\n *\n * @param {Logger} logger\n * @returns {this}\n */\n setLogger(logger) {\n this._logger = logger;\n return this;\n }\n\n /**\n * Get logger if set\n *\n * @returns {?Logger}\n */\n get logger() {\n return this._logger;\n }\n\n /**\n * @param {AccountId | string} accountId\n */\n async ping(accountId) {\n await new AccountBalanceQuery({ accountId })\n .setNodeAccountIds([\n accountId instanceof AccountId\n ? accountId\n : AccountId.fromString(accountId),\n ])\n .execute(this);\n }\n\n async pingAll() {\n for (const nodeAccountId of Object.values(this._network.network)) {\n await this.ping(nodeAccountId);\n }\n }\n\n /**\n * Update the network address book.\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 this.setNetworkFromAddressBook(addressBook);\n } catch (error) {\n if (this._logger) {\n this._logger.trace(\n `failed to update client address book: ${\n /** @type {Error} */ (error).toString()\n }`,\n );\n }\n } finally {\n this._isUpdatingNetwork = false;\n }\n\n return this;\n }\n\n /**\n * @returns {void}\n */\n close() {\n this._network.close();\n this._mirrorNetwork.close();\n this._isShutdown = true;\n clearTimeout(this._timer);\n }\n\n /**\n * @abstract\n * @returns {(address: string) => ChannelT}\n */\n _createNetworkChannel() {\n return () => {\n throw new Error(\"not implemented\");\n };\n }\n\n /**\n * @abstract\n * @returns {(address: string) => MirrorChannelT}\n */\n _createMirrorNetworkChannel() {\n return () => {\n throw new Error(\"not implemented\");\n };\n }\n\n /**\n * @private\n */\n _scheduleNetworkUpdate() {\n // This is the automatic network update promise that _eventually_ completes\n // eslint-disable-next-line @typescript-eslint/no-floating-promises,@typescript-eslint/no-misused-promises\n this._timer = setTimeout(async () => {\n await this.updateNetwork();\n\n if (!this._isShutdown) {\n // Recall this method to continuously update the network\n // every `networkUpdatePeriod` amount of itme\n this._scheduleNetworkUpdate();\n }\n }, this._networkUpdatePeriod);\n }\n\n /**\n * @returns {boolean}\n */\n get isClientShutDown() {\n return this._isShutdown;\n }\n\n /**\n * Validates that all nodes in a network are in the same shard and realm.\n *\n * @param {{[key: string]: (string | AccountId)}} network\n */\n static _validateNetworkConsistency(network) {\n if (Object.keys(network).length === 0) {\n return;\n }\n\n const [, nodeAccountId] = Object.entries(network)[0];\n\n const accountIdStr = nodeAccountId.toString();\n\n const [firstNodeShard, firstNodeRealm] = accountIdStr\n .split(\".\")\n .map(Number);\n\n const isNetworkValid = Object.values(network).every((accountId) => {\n const accountIdStr = accountId.toString();\n\n const [currentShard, currentRealm] = accountIdStr\n .split(\".\")\n .map(Number);\n return (\n currentShard === firstNodeShard &&\n currentRealm === firstNodeRealm\n );\n });\n\n if (!isNetworkValid) {\n throw new Error(\n \"Network is not valid, all nodes must be in the same shard and realm\",\n );\n }\n }\n\n /**\n * Extracts shard and realm values from a network configuration.\n * Note: This method assumes the network is consistent (all nodes in same shard/realm).\n * Use validateNetworkConsistency() first to ensure this.\n *\n * @param {{[key: string]: (string | AccountId)}} network\n * @returns {{shard: number, realm: number}}\n */\n static _extractShardRealm(network) {\n const entries = Object.entries(network);\n if (entries.length === 0) {\n return { shard: 0, realm: 0 };\n }\n\n const [, firstNodeAccountId] = entries[0];\n\n const accountIdStr = firstNodeAccountId.toString();\n const [shard, realm] = accountIdStr.split(\".\").map(Number);\n\n return { shard, realm };\n }\n}\n"],"names":["Client","constructor","props","this","_mirrorNetwork","MirrorNetwork","_createMirrorNetworkChannel","_network","Network","_createNetworkChannel","_operator","_defaultMaxTransactionFee","_defaultMaxQueryPayment","Hbar","operator","setOperator","accountId","privateKey","_maxAttempts","_signOnDemand","_autoValidateChecksums","_minBackoff","_maxBackoff","_defaultRegenerateTransactionId","_requestTimeout","DEFAULT_REQUEST_TIMEOUT","_grpcDeadline","DEFAULT_GRPC_DEADLINE","_isUpdatingNetwork","_networkUpdatePeriod","_isShutdown","_shard","_realm","scheduleNetworkUpdate","_scheduleNetworkUpdate","shard","realm","grpcDeadline","setGrpcDeadline","requestTimeout","setRequestTimeout","console","warn","_timer","_logger","setNetworkName","networkName","setLedgerId","ledgerId","toString","LedgerId","fromString","_ledgerId","setNetwork","network","Error","setNetworkFromAddressBook","addressBook","setMirrorNetwork","mirrorNetwork","mirrorRestApiBaseUrl","signOnDemand","setSignOnDemand","isTransportSecurity","setTransportSecurity","transportSecurity","key","PrivateKey","fromStringDer","setOperatorWith","publicKey","message","Promise","resolve","sign","getOperator","transactionSigner","accountId_","AccountId","validateChecksum","PublicKey","setAutoValidateChecksums","value","isAutoValidateChecksumsEnabled","operatorAccountId","operatorPublicKey","defaultMaxTransactionFee","maxTransactionFee","setDefaultMaxTransactionFee","toTinybars","toInt","setMaxTransactionFee","defaultRegenerateTransactionId","setDefaultRegenerateTransactionId","defaultMaxQueryPayment","maxQueryPayment","setDefaultMaxQueryPayment","convertToNumber","setMaxQueryPayment","maxAttempts","setMaxAttempts","maxNodeAttempts","setMaxNodeAttempts","nodeWaitTime","minBackoff","setNodeWaitTime","setMinBackoff","maxNodesPerTransaction","setMaxNodesPerTransaction","setMaxBackoff","maxBackoff","setNodeMinBackoff","nodeMinBackoff","setNodeMaxBackoff","nodeMaxBackoff","setNodeMinReadmitPeriod","nodeMinReadmitPeriod","setNodeMaxReadmitPeriod","nodeMaxReadmitPeriod","networkUpdatePeriod","setNetworkUpdatePeriod","clearTimeout","setLogger","logger","ping","AccountBalanceQuery","setNodeAccountIds","execute","pingAll","nodeAccountId","Object","values","updateNetwork","AddressBookQuery","setFileId","FileId","getAddressBookFileIdFor","error","trace","close","setTimeout","async","isClientShutDown","_validateNetworkConsistency","keys","length","entries","accountIdStr","firstNodeShard","firstNodeRealm","split","map","Number","isNetworkValid","every","currentShard","currentRealm","_extractShardRealm","firstNodeAccountId"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Client.js","sources":["../../src/client/Client.js"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\nimport AccountId from \"../account/AccountId.js\";\nimport AccountBalanceQuery from \"../account/AccountBalanceQuery.js\";\nimport Hbar from \"../Hbar.js\";\nimport Network from \"./Network.js\";\nimport MirrorNetwork from \"./MirrorNetwork.js\";\nimport PublicKey from \"../PublicKey.js\";\nimport PrivateKey from \"../PrivateKey.js\";\nimport LedgerId from \"../LedgerId.js\";\nimport FileId from \"../file/FileId.js\";\nimport Logger from \"../logger/Logger.js\"; // eslint-disable-line\nimport { convertToNumber } from \"../util.js\";\nimport AddressBookQuery from \"../network/AddressBookQuery.js\";\nimport {\n DEFAULT_GRPC_DEADLINE,\n DEFAULT_REQUEST_TIMEOUT,\n} from \"../constants/ClientConstants.js\";\n\n/**\n * @typedef {import(\"../channel/Channel.js\").default} Channel\n * @typedef {import(\"../channel/MirrorChannel.js\").default} MirrorChannel\n * @typedef {import(\"../address_book/NodeAddressBook.js\").default} NodeAddressBook\n */\n\n/**\n * @typedef {object} Operator\n * @property {string | PrivateKey} privateKey\n * @property {string | AccountId} accountId\n */\n\n/**\n * @typedef {object} ClientOperator\n * @property {PublicKey} publicKey\n * @property {AccountId} accountId\n * @property {(message: Uint8Array) => Promise<Uint8Array>} transactionSigner\n */\n\n/**\n * @typedef {object} ClientConfiguration\n * @property {{[key: string]: (string | AccountId)} | string} [network]\n * @property {string[] | string} [mirrorNetwork]\n * @property {Operator} [operator]\n * @property {boolean} [scheduleNetworkUpdate]\n * @property {number} [shard]\n * @property {number} [realm]\n * @property {number} [grpcDeadline]\n * @property {number} [requestTimeout]\n */\n\n/**\n * @typedef {\"mainnet\" | \"testnet\" | \"previewnet\"} NetworkName\n */\n\n/**\n * The `Client` class is the main entry point for interacting with the Hedera Hashgraph network.\n * It provides methods for managing network connections, setting operators, handling transactions\n * and queries, and configuring various client settings.\n *\n * @abstract\n * @template {Channel} ChannelT\n * @template {MirrorChannel} MirrorChannelT\n */\nexport default class Client {\n /**\n * @protected\n * @hideconstructor\n * @param {ClientConfiguration} [props]\n */\n constructor(props) {\n /**\n * List of mirror network URLs.\n *\n * @internal\n * @type {MirrorNetwork}\n */\n this._mirrorNetwork = new MirrorNetwork(\n this._createMirrorNetworkChannel(),\n );\n\n /**\n * Map of node account ID (as a string)\n * to the node URL.\n *\n * @internal\n * @type {Network}\n */\n this._network = new Network(this._createNetworkChannel());\n\n /**\n * @internal\n * @type {?ClientOperator}\n */\n this._operator = null;\n\n /**\n * @private\n * @type {?Hbar}\n */\n this._defaultMaxTransactionFee = null;\n\n /**\n * @private\n * @type {Hbar}\n */\n this._defaultMaxQueryPayment = new Hbar(1);\n\n if (props != null) {\n if (props.operator != null) {\n this.setOperator(\n props.operator.accountId,\n props.operator.privateKey,\n );\n }\n }\n\n /** @type {number | null} */\n this._maxAttempts = null;\n\n /** @private */\n this._signOnDemand = false;\n\n /** @private */\n this._autoValidateChecksums = false;\n\n /** @private */\n this._minBackoff = 250;\n\n /** @private */\n this._maxBackoff = 8000;\n\n /** @private */\n this._defaultRegenerateTransactionId = true;\n\n /**\n * When enabled, allows receipt queries to fail over to other nodes\n * if the submitting node is unresponsive. Default is false to preserve\n * existing semantics where receipt queries are pinned to the submitting node.\n *\n * Tradeoff: Improved availability vs the rare case where only the submitting\n * node may have final failure information.\n *\n * @private\n */\n this._allowReceiptNodeFailover = false;\n\n /** @private */\n this._requestTimeout = DEFAULT_REQUEST_TIMEOUT;\n\n /** @private */\n this._grpcDeadline = DEFAULT_GRPC_DEADLINE;\n\n /**\n * @type {boolean}\n */\n this._isUpdatingNetwork = false;\n\n /** @private */\n this._networkUpdatePeriod = 24 * 60 * 60 * 1000;\n\n /** @private */\n this._isShutdown = false;\n\n this._shard = 0;\n\n this._realm = 0;\n\n if (props != null && props.scheduleNetworkUpdate !== false) {\n this._scheduleNetworkUpdate();\n }\n\n if (props != null && props.shard != null) {\n this._shard = props.shard;\n }\n\n if (props != null && props.realm != null) {\n this._realm = props.realm;\n }\n\n if (props != null && props.grpcDeadline != null) {\n this.setGrpcDeadline(props.grpcDeadline);\n }\n\n if (props != null && props.requestTimeout != null) {\n this.setRequestTimeout(props.requestTimeout);\n }\n\n // Validate that requestTimeout is larger than grpcDeadline after both are set\n if (this._requestTimeout <= this._grpcDeadline) {\n console.warn(\n `DEPRECATION WARNING: requestTimeout (${this._requestTimeout}ms) should be larger than grpcDeadline (${this._grpcDeadline}ms). ` +\n `This configuration may cause operations to fail unexpectedly. ` +\n `This will throw an error in the next major version. Please adjust your timeout values.`,\n );\n }\n\n /** @internal */\n /** @type {NodeJS.Timeout} */\n this._timer;\n\n /**\n * Logger\n *\n * @external\n * @type {Logger | null}\n */\n this._logger = null;\n }\n\n /**\n * @deprecated\n * @param {NetworkName} networkName\n * @returns {this}\n */\n setNetworkName(networkName) {\n // uses custom NetworkName type\n // remove if phasing out set|get 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._network.setLedgerId(\n typeof ledgerId === \"string\"\n ? LedgerId.fromString(ledgerId)\n : ledgerId,\n );\n\n return this;\n }\n\n /**\n * @returns {LedgerId | null}\n */\n get ledgerId() {\n return this._network._ledgerId != null ? this._network.ledgerId : null;\n }\n\n /**\n * @param {{[key: string]: (string | AccountId)} | string} network\n * @returns {void}\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n setNetwork(network) {\n // TODO: This logic _can_ be de-duplicated and likely should\n throw new Error(\"not implemented\");\n }\n\n /**\n * @param {NodeAddressBook} addressBook\n * @returns {this}\n */\n setNetworkFromAddressBook(addressBook) {\n this._network.setNetworkFromAddressBook(addressBook);\n return this;\n }\n\n /**\n * @returns {{[key: string]: (string | AccountId)}}\n */\n get network() {\n return this._network.network;\n }\n\n /**\n * @returns {number}\n */\n get shard() {\n return this._shard;\n }\n\n /**\n * @returns {number}\n */\n get realm() {\n return this._realm;\n }\n\n /**\n * @param {string[] | string} mirrorNetwork\n * @returns {void}\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n setMirrorNetwork(mirrorNetwork) {\n throw new Error(\"not implemented\");\n }\n\n /**\n * @returns {string[]}\n */\n get mirrorNetwork() {\n return this._mirrorNetwork.network;\n }\n\n /**\n * @returns {string}\n * @throws {Error} When no mirror network is configured or available\n */\n get mirrorRestApiBaseUrl() {\n return this._mirrorNetwork.mirrorRestApiBaseUrl;\n }\n\n /**\n * @returns {boolean}\n */\n get signOnDemand() {\n return this._signOnDemand;\n }\n\n /**\n * @param {boolean} signOnDemand\n */\n setSignOnDemand(signOnDemand) {\n this._signOnDemand = signOnDemand;\n }\n\n /**\n * @returns {boolean}\n */\n isTransportSecurity() {\n return this._network.isTransportSecurity();\n }\n\n /**\n * @param {boolean} transportSecurity\n * @returns {this}\n */\n setTransportSecurity(transportSecurity) {\n this._network.setTransportSecurity(transportSecurity);\n return this;\n }\n\n /**\n * Set the account that will, by default, pay for transactions and queries built with this client.\n * NOTE: When using string for private key, the string needs to contain DER headers\n *\n * @param {AccountId | string} accountId\n * @param {PrivateKey | string} privateKey\n * @returns {this}\n */\n setOperator(accountId, privateKey) {\n const key =\n typeof privateKey === \"string\"\n ? PrivateKey.fromStringDer(privateKey)\n : privateKey;\n\n return this.setOperatorWith(accountId, key.publicKey, (message) =>\n Promise.resolve(key.sign(message)),\n );\n }\n\n /**\n * @returns {?ClientOperator}\n */\n getOperator() {\n return this._operator;\n }\n\n /**\n * Sets the account that will, by default, pay for transactions and queries built with\n * this client.\n *\n * @param {AccountId | string} accountId\n * @param {PublicKey | string} publicKey\n * @param {(message: Uint8Array) => Promise<Uint8Array>} transactionSigner\n * @returns {this}\n */\n setOperatorWith(accountId, publicKey, transactionSigner) {\n const accountId_ =\n accountId instanceof AccountId\n ? accountId\n : AccountId.fromString(accountId);\n\n if (this._network._ledgerId != null) {\n accountId_.validateChecksum(this);\n }\n\n this._operator = {\n transactionSigner,\n\n accountId: accountId_,\n\n publicKey:\n publicKey instanceof PublicKey\n ? publicKey\n : PublicKey.fromString(publicKey),\n };\n\n return this;\n }\n\n /**\n * @param {boolean} value\n * @returns {this}\n */\n setAutoValidateChecksums(value) {\n this._autoValidateChecksums = value;\n return this;\n }\n\n /**\n * @returns {boolean}\n */\n isAutoValidateChecksumsEnabled() {\n return this._autoValidateChecksums;\n }\n\n /**\n * @returns {?AccountId}\n */\n get operatorAccountId() {\n return this._operator != null ? this._operator.accountId : null;\n }\n\n /**\n * @returns {?PublicKey}\n */\n get operatorPublicKey() {\n return this._operator != null ? this._operator.publicKey : null;\n }\n\n /**\n * @returns {?Hbar}\n */\n get defaultMaxTransactionFee() {\n return this._defaultMaxTransactionFee;\n }\n\n /**\n * @deprecated - Use `defaultMaxTransactionFee` instead\n * @returns {?Hbar}\n */\n get maxTransactionFee() {\n return this.defaultMaxTransactionFee;\n }\n\n /**\n * Set the defaultimum fee to be paid for transactions\n * executed by this client.\n *\n * @param {Hbar} defaultMaxTransactionFee\n * @returns {this}\n */\n setDefaultMaxTransactionFee(defaultMaxTransactionFee) {\n if (defaultMaxTransactionFee.toTinybars().toInt() < 0) {\n throw new Error(\"defaultMaxTransactionFee must be non-negative\");\n }\n this._defaultMaxTransactionFee = defaultMaxTransactionFee;\n return this;\n }\n\n /**\n * @deprecated - Use `setDefaultMaxTransactionFee()` instead\n * Set the maximum fee to be paid for transactions\n * executed by this client.\n * @param {Hbar} maxTransactionFee\n * @returns {this}\n */\n setMaxTransactionFee(maxTransactionFee) {\n return this.setDefaultMaxTransactionFee(maxTransactionFee);\n }\n\n /**\n * @returns {boolean}\n */\n get defaultRegenerateTransactionId() {\n return this._defaultRegenerateTransactionId;\n }\n\n /**\n * Set if a new transaction ID should be generated when a `TRANSACTION_EXPIRED` status\n * is returned.\n *\n * @param {boolean} defaultRegenerateTransactionId\n * @returns {this}\n */\n setDefaultRegenerateTransactionId(defaultRegenerateTransactionId) {\n this._defaultRegenerateTransactionId = defaultRegenerateTransactionId;\n return this;\n }\n\n /**\n * @returns {boolean}\n */\n get allowReceiptNodeFailover() {\n return this._allowReceiptNodeFailover;\n }\n\n /**\n * Enable or disable receipt query failover to other nodes when the submitting node\n * is unresponsive. When enabled, receipt queries will start with the submitting node\n * but can fail over to other nodes in the network if needed.\n *\n * Default is `false` to preserve existing behavior where receipt queries are pinned\n * to the submitting node only.\n *\n * **Tradeoff**: Enabling this improves availability for high-throughput/relay use cases,\n * but in rare cases only the submitting node may have the final failure information.\n *\n * @param {boolean} allowReceiptNodeFailover\n * @returns {this}\n */\n setAllowReceiptNodeFailover(allowReceiptNodeFailover) {\n this._allowReceiptNodeFailover = allowReceiptNodeFailover;\n return this;\n }\n\n /**\n * @returns {Hbar}\n */\n get defaultMaxQueryPayment() {\n return this._defaultMaxQueryPayment;\n }\n\n /**\n * @deprecated in a favor of defaultMaxQueryPayment\n * @returns {Hbar}\n */\n get maxQueryPayment() {\n return this.defaultMaxQueryPayment;\n }\n\n /**\n * Set the maximum payment allowable for queries.\n *\n * @param {Hbar} defaultMaxQueryPayment\n * @returns {Client<ChannelT, MirrorChannelT>}\n */\n setDefaultMaxQueryPayment(defaultMaxQueryPayment) {\n const isMaxQueryPaymentNegative =\n convertToNumber(defaultMaxQueryPayment.toTinybars()) < 0;\n if (isMaxQueryPaymentNegative) {\n throw new Error(\"defaultMaxQueryPayment must be non-negative\");\n }\n this._defaultMaxQueryPayment = defaultMaxQueryPayment;\n return this;\n }\n /**\n * @deprecated in a favor of setDefaultMaxQueryPayment()\n * Set the maximum payment allowable for queries.\n * @param {Hbar} maxQueryPayment\n * @returns {Client<ChannelT, MirrorChannelT>}\n */\n setMaxQueryPayment(maxQueryPayment) {\n return this.setDefaultMaxQueryPayment(maxQueryPayment);\n }\n\n /**\n * @returns {number}\n */\n get maxAttempts() {\n return this._maxAttempts != null ? this._maxAttempts : 10;\n }\n\n /**\n * @param {number} maxAttempts\n * @returns {this}\n */\n setMaxAttempts(maxAttempts) {\n this._maxAttempts = maxAttempts;\n return this;\n }\n\n /**\n * @returns {number}\n */\n get maxNodeAttempts() {\n return this._network.maxNodeAttempts;\n }\n\n /**\n * @param {number} maxNodeAttempts\n * @returns {this}\n */\n setMaxNodeAttempts(maxNodeAttempts) {\n this._network.setMaxNodeAttempts(maxNodeAttempts);\n return this;\n }\n\n /**\n * @returns {number}\n */\n get nodeWaitTime() {\n return this._network.minBackoff;\n }\n\n /**\n * @param {number} nodeWaitTime\n * @returns {this}\n */\n setNodeWaitTime(nodeWaitTime) {\n this._network.setMinBackoff(nodeWaitTime);\n return this;\n }\n\n /**\n * Gets the maximum number of nodes that a transaction or query will attempt to execute against.\n *\n * @returns {number} The current maximum nodes per transaction setting.\n * Returns -1 if no limit is set (uses network defaults).\n */\n get maxNodesPerTransaction() {\n return this._network.maxNodesPerTransaction;\n }\n\n /**\n * Sets the maximum number of nodes that a transaction or query will execute against.\n *\n * - **Before freezing**: Limits automatic node selection when no explicit nodes are set\n * - **After freezing**: Trims frozen transactions to the first N nodes while preserving signatures\n * - **Special values**: 0 disables limiting, values > available nodes cause no trimming\n *\n * @param {number} maxNodesPerTransaction - Maximum nodes per transaction. Set to 0 to disable.\n * @returns {this} The client instance for method chaining\n */\n setMaxNodesPerTransaction(maxNodesPerTransaction) {\n this._network.setMaxNodesPerTransaction(maxNodesPerTransaction);\n return this;\n }\n\n /**\n * @param {?number} minBackoff\n * @returns {this}\n */\n setMinBackoff(minBackoff) {\n if (minBackoff == null) {\n throw new Error(\"minBackoff cannot be null.\");\n }\n if (minBackoff > this._maxBackoff) {\n throw new Error(\"minBackoff cannot be larger than maxBackoff.\");\n }\n this._minBackoff = minBackoff;\n return this;\n }\n\n /**\n * @returns {number}\n */\n get minBackoff() {\n return this._minBackoff;\n }\n\n /**\n * @param {?number} maxBackoff\n * @returns {this}\n */\n setMaxBackoff(maxBackoff) {\n if (maxBackoff == null) {\n throw new Error(\"maxBackoff cannot be null.\");\n } else if (maxBackoff < this._minBackoff) {\n throw new Error(\"maxBackoff cannot be smaller than minBackoff.\");\n }\n this._maxBackoff = maxBackoff;\n return this;\n }\n\n /**\n * @returns {number}\n */\n get maxBackoff() {\n return this._maxBackoff;\n }\n\n /**\n * @param {number} nodeMinBackoff\n * @returns {this}\n */\n setNodeMinBackoff(nodeMinBackoff) {\n this._network.setMinBackoff(nodeMinBackoff);\n return this;\n }\n\n /**\n * @returns {number}\n */\n get nodeMinBackoff() {\n return this._network.minBackoff;\n }\n\n /**\n * @param {number} nodeMaxBackoff\n * @returns {this}\n */\n setNodeMaxBackoff(nodeMaxBackoff) {\n this._network.setMaxBackoff(nodeMaxBackoff);\n return this;\n }\n\n /**\n * @returns {number}\n */\n get nodeMaxBackoff() {\n return this._network.maxBackoff;\n }\n\n /**\n * @param {number} nodeMinReadmitPeriod\n * @returns {this}\n */\n setNodeMinReadmitPeriod(nodeMinReadmitPeriod) {\n this._network.setNodeMinReadmitPeriod(nodeMinReadmitPeriod);\n return this;\n }\n\n /**\n * @returns {number}\n */\n get nodeMinReadmitPeriod() {\n return this._network.nodeMinReadmitPeriod;\n }\n\n /**\n * @param {number} nodeMaxReadmitPeriod\n * @returns {this}\n */\n setNodeMaxReadmitPeriod(nodeMaxReadmitPeriod) {\n this._network.setNodeMaxReadmitPeriod(nodeMaxReadmitPeriod);\n return this;\n }\n\n /**\n * @returns {number}\n */\n get nodeMaxReadmitPeriod() {\n return this._network.nodeMaxReadmitPeriod;\n }\n\n /**\n * Set the total request timeout for complete operations.\n *\n * @param {number} requestTimeout - Maximum time in milliseconds for complete Transaction/Query operations\n * @returns {this}\n */\n setRequestTimeout(requestTimeout) {\n if (requestTimeout <= 0) {\n throw new Error(\"requestTimeout must be a positive number\");\n }\n if (requestTimeout <= this._grpcDeadline) {\n console.warn(\n `DEPRECATION WARNING: requestTimeout (${requestTimeout}ms) should be larger than grpcDeadline (${this._grpcDeadline}ms). ` +\n `This configuration may cause operations to fail unexpectedly. ` +\n `This will throw an error in the next major version. Please adjust your timeout values.`,\n );\n }\n this._requestTimeout = requestTimeout;\n return this;\n }\n\n /**\n * Get the total request timeout for complete operations.\n *\n * @returns {number} Maximum time in milliseconds for complete Transaction/Query operations\n */\n get requestTimeout() {\n return this._requestTimeout;\n }\n\n /**\n * Set the global gRPC deadline for all requests.\n *\n * @param {number} grpcDeadline - Maximum time in milliseconds for a single gRPC request\n * @returns {this}\n */\n setGrpcDeadline(grpcDeadline) {\n if (grpcDeadline <= 0) {\n throw new Error(\"grpcDeadline must be a positive number\");\n }\n if (grpcDeadline >= this._requestTimeout) {\n console.warn(\n `DEPRECATION WARNING: grpcDeadline (${grpcDeadline}ms) should be smaller than requestTimeout (${this._requestTimeout}ms). ` +\n `This configuration may cause operations to fail unexpectedly. ` +\n `This will throw an error in the next major version. Please adjust your timeout values.`,\n );\n }\n this._grpcDeadline = grpcDeadline;\n return this;\n }\n\n /**\n * Get the global gRPC deadline for all requests.\n *\n * @returns {number} Maximum time in milliseconds for a single gRPC request\n */\n get grpcDeadline() {\n return this._grpcDeadline;\n }\n\n /**\n * @returns {number}\n */\n get networkUpdatePeriod() {\n return this._networkUpdatePeriod;\n }\n\n /**\n * @param {number} networkUpdatePeriod\n * @returns {this}\n */\n setNetworkUpdatePeriod(networkUpdatePeriod) {\n clearTimeout(this._timer);\n this._networkUpdatePeriod = networkUpdatePeriod;\n this._scheduleNetworkUpdate();\n return this;\n }\n /**\n * Set logger\n *\n * @param {Logger} logger\n * @returns {this}\n */\n setLogger(logger) {\n this._logger = logger;\n return this;\n }\n\n /**\n * Get logger if set\n *\n * @returns {?Logger}\n */\n get logger() {\n return this._logger;\n }\n\n /**\n * @param {AccountId | string} accountId\n */\n async ping(accountId) {\n await new AccountBalanceQuery({ accountId })\n .setNodeAccountIds([\n accountId instanceof AccountId\n ? accountId\n : AccountId.fromString(accountId),\n ])\n .execute(this);\n }\n\n async pingAll() {\n for (const nodeAccountId of Object.values(this._network.network)) {\n await this.ping(nodeAccountId);\n }\n }\n\n /**\n * Update the network address book.\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 this.setNetworkFromAddressBook(addressBook);\n } catch (error) {\n if (this._logger) {\n this._logger.trace(\n `failed to update client address book: ${\n /** @type {Error} */ (error).toString()\n }`,\n );\n }\n } finally {\n this._isUpdatingNetwork = false;\n }\n\n return this;\n }\n\n /**\n * @returns {void}\n */\n close() {\n this._network.close();\n this._mirrorNetwork.close();\n this._isShutdown = true;\n clearTimeout(this._timer);\n }\n\n /**\n * @abstract\n * @returns {(address: string) => ChannelT}\n */\n _createNetworkChannel() {\n return () => {\n throw new Error(\"not implemented\");\n };\n }\n\n /**\n * @abstract\n * @returns {(address: string) => MirrorChannelT}\n */\n _createMirrorNetworkChannel() {\n return () => {\n throw new Error(\"not implemented\");\n };\n }\n\n /**\n * @private\n */\n _scheduleNetworkUpdate() {\n // This is the automatic network update promise that _eventually_ completes\n // eslint-disable-next-line @typescript-eslint/no-floating-promises,@typescript-eslint/no-misused-promises\n this._timer = setTimeout(async () => {\n await this.updateNetwork();\n\n if (!this._isShutdown) {\n // Recall this method to continuously update the network\n // every `networkUpdatePeriod` amount of itme\n this._scheduleNetworkUpdate();\n }\n }, this._networkUpdatePeriod);\n }\n\n /**\n * @returns {boolean}\n */\n get isClientShutDown() {\n return this._isShutdown;\n }\n\n /**\n * Validates that all nodes in a network are in the same shard and realm.\n *\n * @param {{[key: string]: (string | AccountId)}} network\n */\n static _validateNetworkConsistency(network) {\n if (Object.keys(network).length === 0) {\n return;\n }\n\n const [, nodeAccountId] = Object.entries(network)[0];\n\n const accountIdStr = nodeAccountId.toString();\n\n const [firstNodeShard, firstNodeRealm] = accountIdStr\n .split(\".\")\n .map(Number);\n\n const isNetworkValid = Object.values(network).every((accountId) => {\n const accountIdStr = accountId.toString();\n\n const [currentShard, currentRealm] = accountIdStr\n .split(\".\")\n .map(Number);\n return (\n currentShard === firstNodeShard &&\n currentRealm === firstNodeRealm\n );\n });\n\n if (!isNetworkValid) {\n throw new Error(\n \"Network is not valid, all nodes must be in the same shard and realm\",\n );\n }\n }\n\n /**\n * Extracts shard and realm values from a network configuration.\n * Note: This method assumes the network is consistent (all nodes in same shard/realm).\n * Use validateNetworkConsistency() first to ensure this.\n *\n * @param {{[key: string]: (string | AccountId)}} network\n * @returns {{shard: number, realm: number}}\n */\n static _extractShardRealm(network) {\n const entries = Object.entries(network);\n if (entries.length === 0) {\n return { shard: 0, realm: 0 };\n }\n\n const [, firstNodeAccountId] = entries[0];\n\n const accountIdStr = firstNodeAccountId.toString();\n const [shard, realm] = accountIdStr.split(\".\").map(Number);\n\n return { shard, realm };\n }\n}\n"],"names":["Client","constructor","props","this","_mirrorNetwork","MirrorNetwork","_createMirrorNetworkChannel","_network","Network","_createNetworkChannel","_operator","_defaultMaxTransactionFee","_defaultMaxQueryPayment","Hbar","operator","setOperator","accountId","privateKey","_maxAttempts","_signOnDemand","_autoValidateChecksums","_minBackoff","_maxBackoff","_defaultRegenerateTransactionId","_allowReceiptNodeFailover","_requestTimeout","DEFAULT_REQUEST_TIMEOUT","_grpcDeadline","DEFAULT_GRPC_DEADLINE","_isUpdatingNetwork","_networkUpdatePeriod","_isShutdown","_shard","_realm","scheduleNetworkUpdate","_scheduleNetworkUpdate","shard","realm","grpcDeadline","setGrpcDeadline","requestTimeout","setRequestTimeout","console","warn","_timer","_logger","setNetworkName","networkName","setLedgerId","ledgerId","toString","LedgerId","fromString","_ledgerId","setNetwork","network","Error","setNetworkFromAddressBook","addressBook","setMirrorNetwork","mirrorNetwork","mirrorRestApiBaseUrl","signOnDemand","setSignOnDemand","isTransportSecurity","setTransportSecurity","transportSecurity","key","PrivateKey","fromStringDer","setOperatorWith","publicKey","message","Promise","resolve","sign","getOperator","transactionSigner","accountId_","AccountId","validateChecksum","PublicKey","setAutoValidateChecksums","value","isAutoValidateChecksumsEnabled","operatorAccountId","operatorPublicKey","defaultMaxTransactionFee","maxTransactionFee","setDefaultMaxTransactionFee","toTinybars","toInt","setMaxTransactionFee","defaultRegenerateTransactionId","setDefaultRegenerateTransactionId","allowReceiptNodeFailover","setAllowReceiptNodeFailover","defaultMaxQueryPayment","maxQueryPayment","setDefaultMaxQueryPayment","convertToNumber","setMaxQueryPayment","maxAttempts","setMaxAttempts","maxNodeAttempts","setMaxNodeAttempts","nodeWaitTime","minBackoff","setNodeWaitTime","setMinBackoff","maxNodesPerTransaction","setMaxNodesPerTransaction","setMaxBackoff","maxBackoff","setNodeMinBackoff","nodeMinBackoff","setNodeMaxBackoff","nodeMaxBackoff","setNodeMinReadmitPeriod","nodeMinReadmitPeriod","setNodeMaxReadmitPeriod","nodeMaxReadmitPeriod","networkUpdatePeriod","setNetworkUpdatePeriod","clearTimeout","setLogger","logger","ping","AccountBalanceQuery","setNodeAccountIds","execute","pingAll","nodeAccountId","Object","values","updateNetwork","AddressBookQuery","setFileId","FileId","getAddressBookFileIdFor","error","trace","close","setTimeout","async","isClientShutDown","_validateNetworkConsistency","keys","length","entries","accountIdStr","firstNodeShard","firstNodeRealm","split","map","Number","isNetworkValid","every","currentShard","currentRealm","_extractShardRealm","firstNodeAccountId"],"mappings":"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"}
|