@atomiqlabs/sdk 7.0.12 → 8.0.7
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 +45 -29
- package/dist/SmartChainAssets.d.ts +11 -3
- package/dist/SmartChainAssets.js +7 -3
- package/dist/bitcoin/BitcoinRpcWithAddressIndex.d.ts +68 -0
- package/dist/bitcoin/BitcoinRpcWithAddressIndex.js +2 -0
- package/dist/bitcoin/LightningNetworkApi.d.ts +12 -0
- package/dist/bitcoin/LightningNetworkApi.js +2 -0
- package/dist/bitcoin/coinselect2/accumulative.d.ts +6 -0
- package/dist/bitcoin/coinselect2/accumulative.js +52 -0
- package/dist/bitcoin/coinselect2/blackjack.d.ts +6 -0
- package/dist/bitcoin/coinselect2/blackjack.js +38 -0
- package/dist/bitcoin/coinselect2/index.d.ts +19 -0
- package/dist/bitcoin/coinselect2/index.js +69 -0
- package/dist/bitcoin/coinselect2/utils.d.ts +71 -0
- package/dist/bitcoin/coinselect2/utils.js +123 -0
- package/dist/bitcoin/mempool/MempoolApi.d.ts +350 -0
- package/dist/bitcoin/mempool/MempoolApi.js +311 -0
- package/dist/bitcoin/mempool/MempoolBitcoinBlock.d.ts +44 -0
- package/dist/bitcoin/mempool/MempoolBitcoinBlock.js +48 -0
- package/dist/bitcoin/mempool/MempoolBitcoinRpc.d.ts +119 -0
- package/dist/bitcoin/mempool/MempoolBitcoinRpc.js +361 -0
- package/dist/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.d.ts +22 -0
- package/dist/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.js +105 -0
- package/dist/bitcoin/wallet/BitcoinWallet.d.ts +93 -0
- package/dist/bitcoin/wallet/BitcoinWallet.js +273 -0
- package/dist/bitcoin/wallet/IBitcoinWallet.d.ts +28 -0
- package/dist/bitcoin/wallet/IBitcoinWallet.js +20 -0
- package/dist/bitcoin/wallet/MinimalBitcoinWalletInterface.d.ts +21 -0
- package/dist/bitcoin/wallet/MinimalBitcoinWalletInterface.js +2 -0
- package/dist/bitcoin/wallet/MinimalLightningNetworkWalletInterface.d.ts +7 -0
- package/dist/bitcoin/wallet/MinimalLightningNetworkWalletInterface.js +2 -0
- package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.d.ts +40 -0
- package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.js +86 -0
- package/dist/enums/FeeType.d.ts +8 -0
- package/dist/enums/FeeType.js +12 -0
- package/dist/enums/SwapAmountType.d.ts +8 -0
- package/dist/enums/SwapAmountType.js +12 -0
- package/dist/enums/SwapDirection.d.ts +8 -0
- package/dist/enums/SwapDirection.js +12 -0
- package/dist/enums/SwapType.d.ts +14 -0
- package/dist/enums/SwapType.js +18 -0
- package/dist/errors/IntermediaryError.d.ts +9 -0
- package/dist/errors/IntermediaryError.js +26 -0
- package/dist/errors/PaymentAuthError.d.ts +11 -0
- package/dist/errors/PaymentAuthError.js +23 -0
- package/dist/errors/RequestError.d.ts +18 -0
- package/dist/errors/RequestError.js +46 -0
- package/dist/errors/UserError.d.ts +7 -0
- package/dist/errors/UserError.js +15 -0
- package/dist/events/UnifiedSwapEventListener.d.ts +23 -0
- package/dist/events/UnifiedSwapEventListener.js +130 -0
- package/dist/http/HttpUtils.d.ts +27 -0
- package/dist/http/HttpUtils.js +91 -0
- package/dist/http/paramcoders/IParamReader.d.ts +8 -0
- package/dist/http/paramcoders/IParamReader.js +2 -0
- package/dist/http/paramcoders/ParamDecoder.d.ts +44 -0
- package/dist/http/paramcoders/ParamDecoder.js +132 -0
- package/dist/http/paramcoders/ParamEncoder.d.ts +20 -0
- package/dist/http/paramcoders/ParamEncoder.js +31 -0
- package/dist/http/paramcoders/SchemaVerifier.d.ts +26 -0
- package/dist/http/paramcoders/SchemaVerifier.js +145 -0
- package/dist/http/paramcoders/client/ResponseParamDecoder.d.ts +11 -0
- package/dist/http/paramcoders/client/ResponseParamDecoder.js +57 -0
- package/dist/http/paramcoders/client/StreamParamEncoder.d.ts +13 -0
- package/dist/http/paramcoders/client/StreamParamEncoder.js +26 -0
- package/dist/http/paramcoders/client/StreamingFetchPromise.d.ts +16 -0
- package/dist/http/paramcoders/client/StreamingFetchPromise.js +174 -0
- package/dist/index.d.ts +82 -4
- package/dist/index.js +128 -4
- package/dist/intermediaries/Intermediary.d.ts +111 -0
- package/dist/intermediaries/Intermediary.js +115 -0
- package/dist/intermediaries/IntermediaryDiscovery.d.ts +166 -0
- package/dist/intermediaries/IntermediaryDiscovery.js +390 -0
- package/dist/intermediaries/apis/IntermediaryAPI.d.ts +436 -0
- package/dist/intermediaries/apis/IntermediaryAPI.js +600 -0
- package/dist/intermediaries/apis/TrustedIntermediaryAPI.d.ts +154 -0
- package/dist/intermediaries/apis/TrustedIntermediaryAPI.js +136 -0
- package/dist/lnurl/LNURL.d.ts +102 -0
- package/dist/lnurl/LNURL.js +321 -0
- package/dist/prices/RedundantSwapPrice.d.ts +89 -0
- package/dist/prices/RedundantSwapPrice.js +202 -0
- package/dist/prices/SingleSwapPrice.d.ts +31 -0
- package/dist/prices/SingleSwapPrice.js +41 -0
- package/dist/prices/SwapPriceWithChain.d.ts +70 -0
- package/dist/prices/SwapPriceWithChain.js +91 -0
- package/dist/prices/abstract/ICachedSwapPrice.d.ts +28 -0
- package/dist/prices/abstract/ICachedSwapPrice.js +62 -0
- package/dist/prices/abstract/IPriceProvider.d.ts +81 -0
- package/dist/prices/abstract/IPriceProvider.js +74 -0
- package/dist/prices/abstract/ISwapPrice.d.ts +117 -0
- package/dist/prices/abstract/ISwapPrice.js +219 -0
- package/dist/prices/providers/BinancePriceProvider.d.ts +16 -0
- package/dist/prices/providers/BinancePriceProvider.js +23 -0
- package/dist/prices/providers/CoinGeckoPriceProvider.d.ts +17 -0
- package/dist/prices/providers/CoinGeckoPriceProvider.js +23 -0
- package/dist/prices/providers/CoinPaprikaPriceProvider.d.ts +19 -0
- package/dist/prices/providers/CoinPaprikaPriceProvider.js +23 -0
- package/dist/prices/providers/CustomPriceProvider.d.ts +13 -0
- package/dist/prices/providers/CustomPriceProvider.js +24 -0
- package/dist/prices/providers/KrakenPriceProvider.d.ts +29 -0
- package/dist/prices/providers/KrakenPriceProvider.js +36 -0
- package/dist/prices/providers/OKXPriceProvider.d.ts +28 -0
- package/dist/prices/providers/OKXPriceProvider.js +23 -0
- package/dist/prices/providers/abstract/ExchangePriceProvider.d.ts +14 -0
- package/dist/prices/providers/abstract/ExchangePriceProvider.js +18 -0
- package/dist/prices/providers/abstract/HttpPriceProvider.d.ts +7 -0
- package/dist/prices/providers/abstract/HttpPriceProvider.js +12 -0
- package/dist/storage/IUnifiedStorage.d.ts +73 -0
- package/dist/storage/IUnifiedStorage.js +2 -0
- package/dist/storage/UnifiedSwapStorage.d.ts +82 -0
- package/dist/storage/UnifiedSwapStorage.js +83 -0
- package/dist/storage-browser/IndexedDBUnifiedStorage.d.ts +39 -0
- package/dist/storage-browser/IndexedDBUnifiedStorage.js +275 -0
- package/dist/{storage → storage-browser}/LocalStorageManager.d.ts +1 -0
- package/dist/{storage → storage-browser}/LocalStorageManager.js +2 -1
- package/dist/swapper/Swapper.d.ts +533 -0
- package/dist/swapper/Swapper.js +1566 -0
- package/dist/swapper/SwapperFactory.d.ts +87 -0
- package/dist/{SwapperFactory.js → swapper/SwapperFactory.js} +37 -19
- package/dist/swapper/SwapperUtils.d.ts +153 -0
- package/dist/swapper/SwapperUtils.js +420 -0
- package/dist/swapper/SwapperWithChain.d.ts +214 -0
- package/dist/swapper/SwapperWithChain.js +315 -0
- package/dist/swapper/SwapperWithSigner.d.ts +178 -0
- package/dist/swapper/SwapperWithSigner.js +172 -0
- package/dist/swaps/IAddressSwap.d.ts +13 -0
- package/dist/swaps/IAddressSwap.js +13 -0
- package/dist/swaps/IBTCWalletSwap.d.ts +55 -0
- package/dist/swaps/IBTCWalletSwap.js +17 -0
- package/dist/swaps/IClaimableSwap.d.ts +17 -0
- package/dist/swaps/IClaimableSwap.js +14 -0
- package/dist/swaps/IClaimableSwapWrapper.d.ts +5 -0
- package/dist/swaps/IClaimableSwapWrapper.js +2 -0
- package/dist/swaps/IRefundableSwap.d.ts +17 -0
- package/dist/swaps/IRefundableSwap.js +13 -0
- package/dist/swaps/ISwap.d.ts +207 -0
- package/dist/swaps/ISwap.js +264 -0
- package/dist/swaps/ISwapWithGasDrop.d.ts +15 -0
- package/dist/swaps/ISwapWithGasDrop.js +11 -0
- package/dist/swaps/ISwapWrapper.d.ts +153 -0
- package/dist/swaps/ISwapWrapper.js +227 -0
- package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.d.ts +53 -0
- package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.js +116 -0
- package/dist/swaps/escrow_swaps/IEscrowSwap.d.ts +70 -0
- package/dist/swaps/escrow_swaps/IEscrowSwap.js +132 -0
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.d.ts +85 -0
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.js +122 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.d.ts +86 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.js +115 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.d.ts +93 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.js +121 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.d.ts +45 -0
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.js +65 -0
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.d.ts +263 -0
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.js +933 -0
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.d.ts +110 -0
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.js +307 -0
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.d.ts +236 -0
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.js +898 -0
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.d.ts +125 -0
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.js +393 -0
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.d.ts +245 -0
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.js +841 -0
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.d.ts +120 -0
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.js +294 -0
- package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.d.ts +228 -0
- package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.js +721 -0
- package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.d.ts +37 -0
- package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.js +93 -0
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.d.ts +86 -0
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.js +213 -0
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.d.ts +170 -0
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.js +520 -0
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.d.ts +50 -0
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.js +109 -0
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.d.ts +93 -0
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.js +217 -0
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.d.ts +315 -0
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.js +1098 -0
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.d.ts +125 -0
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.js +631 -0
- package/dist/swaps/trusted/ln/LnForGasSwap.d.ts +107 -0
- package/dist/swaps/trusted/ln/LnForGasSwap.js +343 -0
- package/dist/swaps/trusted/ln/LnForGasWrapper.d.ts +21 -0
- package/dist/swaps/trusted/ln/LnForGasWrapper.js +62 -0
- package/dist/swaps/trusted/onchain/OnchainForGasSwap.d.ts +164 -0
- package/dist/swaps/trusted/onchain/OnchainForGasSwap.js +520 -0
- package/dist/swaps/trusted/onchain/OnchainForGasWrapper.d.ts +48 -0
- package/dist/swaps/trusted/onchain/OnchainForGasWrapper.js +74 -0
- package/dist/types/AmountData.d.ts +9 -0
- package/dist/types/AmountData.js +2 -0
- package/dist/types/CustomPriceFunction.d.ts +5 -0
- package/dist/types/CustomPriceFunction.js +2 -0
- package/dist/types/PriceInfoType.d.ts +28 -0
- package/dist/types/PriceInfoType.js +57 -0
- package/dist/types/SwapExecutionAction.d.ts +7 -0
- package/dist/types/SwapExecutionAction.js +2 -0
- package/dist/types/SwapWithSigner.d.ts +14 -0
- package/dist/types/SwapWithSigner.js +40 -0
- package/dist/types/Token.d.ts +53 -0
- package/dist/types/Token.js +58 -0
- package/dist/types/TokenAmount.d.ts +57 -0
- package/dist/types/TokenAmount.js +47 -0
- package/dist/types/fees/Fee.d.ts +49 -0
- package/dist/types/fees/Fee.js +2 -0
- package/dist/types/fees/FeeBreakdown.d.ts +10 -0
- package/dist/types/fees/FeeBreakdown.js +2 -0
- package/dist/types/fees/PercentagePPM.d.ts +15 -0
- package/dist/types/fees/PercentagePPM.js +17 -0
- package/dist/types/lnurl/LNURLPay.d.ts +54 -0
- package/dist/types/lnurl/LNURLPay.js +28 -0
- package/dist/types/lnurl/LNURLWithdraw.d.ts +42 -0
- package/dist/types/lnurl/LNURLWithdraw.js +24 -0
- package/dist/utils/AutomaticClockDriftCorrection.d.ts +1 -0
- package/dist/utils/AutomaticClockDriftCorrection.js +70 -0
- package/dist/utils/BitcoinUtils.d.ts +13 -0
- package/dist/utils/BitcoinUtils.js +98 -0
- package/dist/utils/BitcoinWalletUtils.d.ts +7 -0
- package/dist/utils/BitcoinWalletUtils.js +14 -0
- package/dist/utils/Logger.d.ts +7 -0
- package/dist/utils/Logger.js +12 -0
- package/dist/utils/RetryUtils.d.ts +21 -0
- package/dist/utils/RetryUtils.js +66 -0
- package/dist/utils/SwapUtils.d.ts +31 -0
- package/dist/utils/SwapUtils.js +18 -0
- package/dist/{Utils.d.ts → utils/TimeoutUtils.d.ts} +9 -3
- package/dist/utils/TimeoutUtils.js +55 -0
- package/dist/utils/TokenUtils.d.ts +11 -0
- package/dist/utils/TokenUtils.js +29 -0
- package/dist/utils/TypeUtils.d.ts +7 -0
- package/dist/utils/TypeUtils.js +2 -0
- package/dist/utils/Utils.d.ts +57 -0
- package/dist/utils/Utils.js +178 -0
- package/package.json +14 -6
- package/src/SmartChainAssets.ts +11 -3
- package/src/bitcoin/BitcoinRpcWithAddressIndex.ts +87 -0
- package/src/bitcoin/LightningNetworkApi.ts +16 -0
- package/src/bitcoin/coinselect2/accumulative.ts +68 -0
- package/src/bitcoin/coinselect2/blackjack.ts +49 -0
- package/src/bitcoin/coinselect2/index.ts +92 -0
- package/src/bitcoin/coinselect2/utils.ts +189 -0
- package/src/bitcoin/mempool/MempoolApi.ts +554 -0
- package/src/bitcoin/mempool/MempoolBitcoinBlock.ts +88 -0
- package/src/bitcoin/mempool/MempoolBitcoinRpc.ts +437 -0
- package/src/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.ts +134 -0
- package/src/bitcoin/wallet/BitcoinWallet.ts +375 -0
- package/src/bitcoin/wallet/IBitcoinWallet.ts +44 -0
- package/src/bitcoin/wallet/MinimalBitcoinWalletInterface.ts +19 -0
- package/src/bitcoin/wallet/MinimalLightningNetworkWalletInterface.ts +7 -0
- package/src/bitcoin/wallet/SingleAddressBitcoinWallet.ts +108 -0
- package/src/enums/FeeType.ts +9 -0
- package/src/enums/SwapAmountType.ts +9 -0
- package/src/enums/SwapDirection.ts +9 -0
- package/src/enums/SwapType.ts +15 -0
- package/src/errors/IntermediaryError.ts +24 -0
- package/src/errors/PaymentAuthError.ts +26 -0
- package/src/errors/RequestError.ts +51 -0
- package/src/errors/UserError.ts +14 -0
- package/src/events/UnifiedSwapEventListener.ts +171 -0
- package/src/http/HttpUtils.ts +92 -0
- package/src/http/paramcoders/IParamReader.ts +10 -0
- package/src/http/paramcoders/ParamDecoder.ts +142 -0
- package/src/http/paramcoders/ParamEncoder.ts +37 -0
- package/src/http/paramcoders/SchemaVerifier.ts +153 -0
- package/src/http/paramcoders/client/ResponseParamDecoder.ts +58 -0
- package/src/http/paramcoders/client/StreamParamEncoder.ts +29 -0
- package/src/http/paramcoders/client/StreamingFetchPromise.ts +193 -0
- package/src/index.ts +102 -4
- package/src/intermediaries/Intermediary.ts +204 -0
- package/src/intermediaries/IntermediaryDiscovery.ts +485 -0
- package/src/intermediaries/apis/IntermediaryAPI.ts +940 -0
- package/src/intermediaries/apis/TrustedIntermediaryAPI.ts +257 -0
- package/src/lnurl/LNURL.ts +403 -0
- package/src/prices/RedundantSwapPrice.ts +245 -0
- package/src/prices/SingleSwapPrice.ts +47 -0
- package/src/prices/SwapPriceWithChain.ts +157 -0
- package/src/prices/abstract/ICachedSwapPrice.ts +86 -0
- package/src/prices/abstract/IPriceProvider.ts +128 -0
- package/src/prices/abstract/ISwapPrice.ts +328 -0
- package/src/prices/providers/BinancePriceProvider.ts +41 -0
- package/src/prices/providers/CoinGeckoPriceProvider.ts +40 -0
- package/src/prices/providers/CoinPaprikaPriceProvider.ts +44 -0
- package/src/prices/providers/CustomPriceProvider.ts +29 -0
- package/src/prices/providers/KrakenPriceProvider.ts +74 -0
- package/src/prices/providers/OKXPriceProvider.ts +53 -0
- package/src/prices/providers/abstract/ExchangePriceProvider.ts +29 -0
- package/src/prices/providers/abstract/HttpPriceProvider.ts +15 -0
- package/src/storage/IUnifiedStorage.ts +83 -0
- package/src/storage/UnifiedSwapStorage.ts +104 -0
- package/src/storage-browser/IndexedDBUnifiedStorage.ts +328 -0
- package/src/{storage → storage-browser}/LocalStorageManager.ts +2 -1
- package/src/swapper/Swapper.ts +2107 -0
- package/src/{SwapperFactory.ts → swapper/SwapperFactory.ts} +113 -72
- package/src/swapper/SwapperUtils.ts +510 -0
- package/src/swapper/SwapperWithChain.ts +464 -0
- package/src/swapper/SwapperWithSigner.ts +300 -0
- package/src/swaps/IAddressSwap.ts +20 -0
- package/src/swaps/IBTCWalletSwap.ts +77 -0
- package/src/swaps/IClaimableSwap.ts +30 -0
- package/src/swaps/IClaimableSwapWrapper.ts +9 -0
- package/src/swaps/IRefundableSwap.ts +29 -0
- package/src/swaps/ISwap.ts +490 -0
- package/src/swaps/ISwapWithGasDrop.ts +19 -0
- package/src/swaps/ISwapWrapper.ts +344 -0
- package/src/swaps/escrow_swaps/IEscrowSelfInitSwap.ts +168 -0
- package/src/swaps/escrow_swaps/IEscrowSwap.ts +197 -0
- package/src/swaps/escrow_swaps/IEscrowSwapWrapper.ts +210 -0
- package/src/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.ts +150 -0
- package/src/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.ts +219 -0
- package/src/swaps/escrow_swaps/frombtc/IFromBTCWrapper.ts +84 -0
- package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.ts +1082 -0
- package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.ts +429 -0
- package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.ts +1078 -0
- package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.ts +549 -0
- package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.ts +974 -0
- package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.ts +443 -0
- package/src/swaps/escrow_swaps/tobtc/IToBTCSwap.ts +860 -0
- package/src/swaps/escrow_swaps/tobtc/IToBTCWrapper.ts +104 -0
- package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.ts +256 -0
- package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.ts +716 -0
- package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.ts +151 -0
- package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.ts +299 -0
- package/src/swaps/spv_swaps/SpvFromBTCSwap.ts +1394 -0
- package/src/swaps/spv_swaps/SpvFromBTCWrapper.ts +796 -0
- package/src/swaps/trusted/ln/LnForGasSwap.ts +402 -0
- package/src/swaps/trusted/ln/LnForGasWrapper.ts +70 -0
- package/src/swaps/trusted/onchain/OnchainForGasSwap.ts +633 -0
- package/src/swaps/trusted/onchain/OnchainForGasWrapper.ts +110 -0
- package/src/types/AmountData.ts +9 -0
- package/src/types/CustomPriceFunction.ts +5 -0
- package/src/types/PriceInfoType.ts +67 -0
- package/src/types/SwapExecutionAction.ts +8 -0
- package/src/types/SwapWithSigner.ts +57 -0
- package/src/types/Token.ts +90 -0
- package/src/types/TokenAmount.ts +110 -0
- package/src/types/fees/Fee.ts +55 -0
- package/src/types/fees/FeeBreakdown.ts +11 -0
- package/src/types/fees/PercentagePPM.ts +24 -0
- package/src/types/lnurl/LNURLPay.ts +72 -0
- package/src/types/lnurl/LNURLWithdraw.ts +55 -0
- package/src/utils/AutomaticClockDriftCorrection.ts +71 -0
- package/src/utils/BitcoinUtils.ts +86 -0
- package/src/utils/BitcoinWalletUtils.ts +16 -0
- package/src/utils/Logger.ts +15 -0
- package/src/utils/RetryUtils.ts +71 -0
- package/src/utils/SwapUtils.ts +38 -0
- package/src/utils/TimeoutUtils.ts +50 -0
- package/src/utils/TokenUtils.ts +25 -0
- package/src/utils/TypeUtils.ts +9 -0
- package/src/utils/Utils.ts +182 -0
- package/dist/SwapperFactory.d.ts +0 -52
- package/dist/Utils.js +0 -37
- package/dist/fs-storage/FileSystemStorageManager.d.ts +0 -15
- package/dist/fs-storage/FileSystemStorageManager.js +0 -60
- package/dist/fs-storage/index.d.ts +0 -1
- package/dist/fs-storage/index.js +0 -17
- package/src/SmartChainAssets.js +0 -75
- package/src/SwapperFactory.js +0 -120
- package/src/Utils.js +0 -37
- package/src/Utils.ts +0 -31
- package/src/fs-storage/FileSystemStorageManager.ts +0 -71
- package/src/fs-storage/index.ts +0 -1
- package/src/index.js +0 -21
- package/src/storage/LocalStorageManager.js +0 -72
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
|
|
2
|
+
/**
|
|
3
|
+
* Query parameters for storage operations
|
|
4
|
+
* @category Storage
|
|
5
|
+
*/
|
|
6
|
+
export type QueryParams = {
|
|
7
|
+
key: string,
|
|
8
|
+
value: any | any[]
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Base type for stored objects
|
|
13
|
+
* @category Storage
|
|
14
|
+
*/
|
|
15
|
+
export type UnifiedStoredObject = {id: string} & any;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Defines simple indexes (for queries that use a single key)
|
|
19
|
+
* @category Storage
|
|
20
|
+
*/
|
|
21
|
+
export type UnifiedStorageIndexes = readonly {
|
|
22
|
+
key: string,
|
|
23
|
+
type: "number" | "string" | "boolean",
|
|
24
|
+
unique: boolean,
|
|
25
|
+
nullable: boolean
|
|
26
|
+
}[];
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Defines composite indexes (for queries that use multiple keys)
|
|
30
|
+
* @category Storage
|
|
31
|
+
*/
|
|
32
|
+
export type UnifiedStorageCompositeIndexes = readonly {
|
|
33
|
+
keys: readonly string[],
|
|
34
|
+
unique: boolean
|
|
35
|
+
}[];
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Interface for unified storage implementations
|
|
39
|
+
* @category Storage
|
|
40
|
+
*/
|
|
41
|
+
export interface IUnifiedStorage<I extends UnifiedStorageIndexes, C extends UnifiedStorageCompositeIndexes> {
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Initializes the storage with given indexes and composite indexes
|
|
45
|
+
* @param indexes
|
|
46
|
+
* @param compositeIndexes
|
|
47
|
+
*/
|
|
48
|
+
init(indexes: I, compositeIndexes: C): Promise<void>;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Params are specified in the following way:
|
|
52
|
+
* - [[condition1, condition2]] - returns all rows where condition1 AND condition2 is met
|
|
53
|
+
* - [[condition1], [condition2]] - returns all rows where condition1 OR condition2 is met
|
|
54
|
+
* - [[condition1, condition2], [condition3]] - returns all rows where (condition1 AND condition2) OR condition3 is met
|
|
55
|
+
* @param params
|
|
56
|
+
*/
|
|
57
|
+
query(params: Array<Array<QueryParams>>): Promise<Array<UnifiedStoredObject>>;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Saves an object to storage, updating indexes as needed
|
|
61
|
+
* @param value - Object to save (must have an id property)
|
|
62
|
+
*/
|
|
63
|
+
save(value: UnifiedStoredObject): Promise<void>;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Saves multiple objects to storage in a batch operation
|
|
67
|
+
* @param value - Array of objects to save
|
|
68
|
+
*/
|
|
69
|
+
saveAll(value: UnifiedStoredObject[]): Promise<void>;
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Removes an object from storage
|
|
73
|
+
* @param value - Object to remove (must have an id property)
|
|
74
|
+
*/
|
|
75
|
+
remove(value: UnifiedStoredObject): Promise<void>;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Removes multiple objects from storage in a batch operation
|
|
79
|
+
* @param value - Array of objects to remove
|
|
80
|
+
*/
|
|
81
|
+
removeAll(value: UnifiedStoredObject[]): Promise<void>;
|
|
82
|
+
|
|
83
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import {ChainType} from "@atomiqlabs/base";
|
|
2
|
+
import {IUnifiedStorage, QueryParams} from "./IUnifiedStorage";
|
|
3
|
+
import {ISwap} from "../swaps/ISwap";
|
|
4
|
+
|
|
5
|
+
import {getLogger} from "../utils/Logger";
|
|
6
|
+
|
|
7
|
+
const logger = getLogger("UnifiedSwapStorage: ");
|
|
8
|
+
|
|
9
|
+
const indexes = [
|
|
10
|
+
{key: "id", type: "string", unique: true, nullable: false},
|
|
11
|
+
{key: "escrowHash", type: "string", unique: true, nullable: true},
|
|
12
|
+
{key: "type", type: "number", unique: false, nullable: false},
|
|
13
|
+
{key: "initiator", type: "string", unique: false, nullable: false},
|
|
14
|
+
{key: "state", type: "number", unique: false, nullable: false},
|
|
15
|
+
{key: "paymentHash", type: "string", unique: false, nullable: true},
|
|
16
|
+
] as const;
|
|
17
|
+
/**
|
|
18
|
+
* Index types for swap storage
|
|
19
|
+
* @category Storage
|
|
20
|
+
*/
|
|
21
|
+
export type UnifiedSwapStorageIndexes = typeof indexes;
|
|
22
|
+
|
|
23
|
+
const compositeIndexes = [
|
|
24
|
+
{keys: ["initiator", "id"], unique: false},
|
|
25
|
+
{keys: ["type", "state"], unique: false},
|
|
26
|
+
{keys: ["type", "paymentHash"], unique: false},
|
|
27
|
+
{keys: ["type", "initiator", "state"], unique: false}
|
|
28
|
+
] as const;
|
|
29
|
+
/**
|
|
30
|
+
* Composite index types for swap storage
|
|
31
|
+
* @category Storage
|
|
32
|
+
*/
|
|
33
|
+
export type UnifiedSwapStorageCompositeIndexes = typeof compositeIndexes;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Unified swap persistence layer with caching
|
|
37
|
+
* @category Storage
|
|
38
|
+
*/
|
|
39
|
+
export class UnifiedSwapStorage<T extends ChainType> {
|
|
40
|
+
|
|
41
|
+
readonly storage: IUnifiedStorage<UnifiedSwapStorageIndexes, UnifiedSwapStorageCompositeIndexes>;
|
|
42
|
+
readonly weakRefCache: Map<string, WeakRef<ISwap<T>>> = new Map();
|
|
43
|
+
readonly noWeakRefMap?: boolean;
|
|
44
|
+
|
|
45
|
+
constructor(storage: IUnifiedStorage<UnifiedSwapStorageIndexes, UnifiedSwapStorageCompositeIndexes>, noWeakRefMap?: boolean) {
|
|
46
|
+
this.storage = storage;
|
|
47
|
+
this.noWeakRefMap = noWeakRefMap;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
init(): Promise<void> {
|
|
51
|
+
return this.storage.init(indexes, compositeIndexes);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Params are specified in the following way:
|
|
56
|
+
* - [[condition1, condition2]] - returns all rows where condition1 AND condition2 is met
|
|
57
|
+
* - [[condition1], [condition2]] - returns all rows where condition1 OR condition2 is met
|
|
58
|
+
* - [[condition1, condition2], [condition3]] - returns all rows where (condition1 AND condition2) OR condition3 is met
|
|
59
|
+
* @param params
|
|
60
|
+
* @param reviver
|
|
61
|
+
*/
|
|
62
|
+
async query<S extends ISwap<T>>(params: Array<Array<QueryParams>>, reviver: (obj: any) => S | null | undefined): Promise<Array<S>> {
|
|
63
|
+
const rawSwaps = await this.storage.query(params);
|
|
64
|
+
|
|
65
|
+
const result: Array<S> = [];
|
|
66
|
+
rawSwaps.forEach(rawObj => {
|
|
67
|
+
if(!this.noWeakRefMap) {
|
|
68
|
+
const savedRef = this.weakRefCache.get(rawObj.id)?.deref();
|
|
69
|
+
if(savedRef!=null) {
|
|
70
|
+
result.push(savedRef as S);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
logger.debug("query(): Reviving new swap instance: "+rawObj.id);
|
|
74
|
+
}
|
|
75
|
+
const value = reviver(rawObj);
|
|
76
|
+
if(value==null) return;
|
|
77
|
+
if(!this.noWeakRefMap) this.weakRefCache.set(rawObj.id, new WeakRef<ISwap<T>>(value));
|
|
78
|
+
result.push(value);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
save<S extends ISwap<T>>(value: S): Promise<void> {
|
|
85
|
+
if(!this.noWeakRefMap) this.weakRefCache.set(value.getId(), new WeakRef<ISwap<T>>(value));
|
|
86
|
+
return this.storage.save(value.serialize());
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
saveAll<S extends ISwap<T>>(values: S[]): Promise<void> {
|
|
90
|
+
if(!this.noWeakRefMap) values.forEach(value => this.weakRefCache.set(value.getId(), new WeakRef<ISwap<T>>(value)));
|
|
91
|
+
return this.storage.saveAll(values.map(obj => obj.serialize()));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
remove<S extends ISwap<T>>(value: S): Promise<void> {
|
|
95
|
+
if(!this.noWeakRefMap) this.weakRefCache.delete(value.getId());
|
|
96
|
+
return this.storage.remove(value.serialize());
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
removeAll<S extends ISwap<T>>(values: S[]): Promise<void> {
|
|
100
|
+
if(!this.noWeakRefMap) values.forEach(value => this.weakRefCache.delete(value.getId()));
|
|
101
|
+
return this.storage.removeAll(values.map(obj => obj.serialize()));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
}
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
import {
|
|
2
|
+
IUnifiedStorage,
|
|
3
|
+
QueryParams,
|
|
4
|
+
UnifiedStorageCompositeIndexes,
|
|
5
|
+
UnifiedStoredObject
|
|
6
|
+
} from "../storage/IUnifiedStorage";
|
|
7
|
+
import {ISwap} from "../swaps/ISwap";
|
|
8
|
+
import {SwapType} from "../enums/SwapType";
|
|
9
|
+
import {UnifiedSwapStorageIndexes} from "../storage/UnifiedSwapStorage";
|
|
10
|
+
import {getLogger, LoggerType} from "../utils/Logger";
|
|
11
|
+
|
|
12
|
+
export type QuerySetCondition = {
|
|
13
|
+
key: string,
|
|
14
|
+
values: Set<any>
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function toCompositeIndex(values: Array<any[]>): Array<any[]> {
|
|
18
|
+
if(values.length===0) return [];
|
|
19
|
+
if(values.length===1) {
|
|
20
|
+
return values[0];
|
|
21
|
+
} else {
|
|
22
|
+
const compositeArray = [];
|
|
23
|
+
const firstValues = values.shift()!;
|
|
24
|
+
const restValues = toCompositeIndex(values);
|
|
25
|
+
for(let value of firstValues) {
|
|
26
|
+
for(let restValue of restValues) {
|
|
27
|
+
compositeArray.push([value].concat(restValue));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return compositeArray;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function matches(conditions: Array<QuerySetCondition>, obj: any): boolean {
|
|
35
|
+
for(let condition of conditions) {
|
|
36
|
+
let value = obj[condition.key];
|
|
37
|
+
if(!condition.values.has(value)) return false;
|
|
38
|
+
}
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function toSetConditions(input: Array<QueryParams>): Array<QuerySetCondition> {
|
|
43
|
+
return input.map(val => {
|
|
44
|
+
return {
|
|
45
|
+
key: val.key,
|
|
46
|
+
values: Array.isArray(val.value) ? new Set(val.value) : new Set([val.value])
|
|
47
|
+
};
|
|
48
|
+
})
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const indexes: Record<string, {key: string | string[], unique: boolean}> = {
|
|
52
|
+
"escrowHash": { key: "escrowHash", unique: true},
|
|
53
|
+
"type": {key: "type", unique: false},
|
|
54
|
+
"initiator": {key: "initiator", unique: false},
|
|
55
|
+
"initiator, id": {key: ["initiator", "id"], unique: false},
|
|
56
|
+
"type, state": {key: ["type", "state"], unique: false},
|
|
57
|
+
"type, paymentHash": {key: ["type", "paymentHash"], unique: false},
|
|
58
|
+
"type, initiator, state": {key: ["type", "initiator", "state"], unique: false}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Browser IndexedDB storage implementation
|
|
63
|
+
* @category Storage
|
|
64
|
+
*/
|
|
65
|
+
export class IndexedDBUnifiedStorage implements IUnifiedStorage<UnifiedSwapStorageIndexes, UnifiedStorageCompositeIndexes> {
|
|
66
|
+
|
|
67
|
+
protected readonly logger: LoggerType;
|
|
68
|
+
|
|
69
|
+
storageKey: string;
|
|
70
|
+
db?: IDBDatabase;
|
|
71
|
+
|
|
72
|
+
constructor(storageKey: string) {
|
|
73
|
+
this.storageKey = storageKey;
|
|
74
|
+
this.logger = getLogger("IndexedDBUnifiedStorage("+this.storageKey+"): ");
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
//Reviver also needs to update the swap to the latest version
|
|
78
|
+
private async tryMigrateLocalStorage(storageKey: string, swapType: SwapType, reviver: (obj: any) => ISwap): Promise<boolean> {
|
|
79
|
+
const txt = window.localStorage.getItem(storageKey);
|
|
80
|
+
if(txt==null) return false;
|
|
81
|
+
|
|
82
|
+
let data: {[key: string]: any};
|
|
83
|
+
try {
|
|
84
|
+
data = JSON.parse(txt);
|
|
85
|
+
} catch (e) {
|
|
86
|
+
this.logger.warn("tryMigrate("+storageKey+"): Tried to migrate the database, but cannot parse old local storage!");
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
let swaps: ISwap[] = Object.keys(data).map(id => {
|
|
91
|
+
let swapData = data[id];
|
|
92
|
+
swapData.type = swapType;
|
|
93
|
+
return reviver(swapData);
|
|
94
|
+
});
|
|
95
|
+
await this.saveAll(swaps.map(swap => swap.serialize()));
|
|
96
|
+
|
|
97
|
+
window.localStorage.removeItem(storageKey);
|
|
98
|
+
|
|
99
|
+
this.logger.info("tryMigrate("+storageKey+"): Database successfully migrated from localStorage to unifiedIndexedDB!");
|
|
100
|
+
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
//Reviver also needs to update the swap to the latest version
|
|
105
|
+
private async tryMigrateOldIndexedDB(storageKey: string, swapType: SwapType, reviver: (obj: any) => ISwap): Promise<boolean> {
|
|
106
|
+
const databases = await window.indexedDB.databases();
|
|
107
|
+
if(databases.find(val => val.name===storageKey)==null) {
|
|
108
|
+
this.logger.info("tryMigrateOldIndexedDB("+storageKey+"): Old database not found!");
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
this.logger.debug("tryMigrateOldIndexedDB("+storageKey+"): Old database found!");
|
|
113
|
+
|
|
114
|
+
let db: IDBDatabase;
|
|
115
|
+
try {
|
|
116
|
+
db = await new Promise<IDBDatabase>((resolve, reject) => {
|
|
117
|
+
const request = window.indexedDB.open(storageKey, 1);
|
|
118
|
+
request.onerror = (e) => reject(e);
|
|
119
|
+
request.onsuccess = (e: any) => resolve(e.target.result);
|
|
120
|
+
});
|
|
121
|
+
} catch (e) {
|
|
122
|
+
this.logger.warn("tryMigrateOldIndexedDB("+storageKey+"): Error opening old IndexedDB!", e);
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
this.logger.debug("tryMigrateOldIndexedDB("+storageKey+"): Connection opened!");
|
|
127
|
+
|
|
128
|
+
try {
|
|
129
|
+
const data = await new Promise<{ id: string, data: any }[]>((resolve, reject) => {
|
|
130
|
+
const tx = db.transaction("swaps", "readonly", {durability: "strict"});
|
|
131
|
+
const store = tx.objectStore("swaps");
|
|
132
|
+
const req = store.getAll();
|
|
133
|
+
req.onsuccess = (event: any) => resolve(event.target.result);
|
|
134
|
+
req.onerror = (event) => reject(event);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
this.logger.debug("tryMigrateOldIndexedDB("+storageKey+"): Data retrieved!");
|
|
138
|
+
|
|
139
|
+
let swaps: ISwap[] = data.map(({id, data}) => {
|
|
140
|
+
data.type = swapType;
|
|
141
|
+
return reviver(data);
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
this.logger.debug("tryMigrateOldIndexedDB("+storageKey+"): Data revived!");
|
|
145
|
+
|
|
146
|
+
await this.saveAll(swaps.map(swap => swap.serialize()));
|
|
147
|
+
|
|
148
|
+
this.logger.debug("tryMigrateOldIndexedDB("+storageKey+"): Data saved!");
|
|
149
|
+
|
|
150
|
+
//Remove the old database
|
|
151
|
+
db.close();
|
|
152
|
+
|
|
153
|
+
this.logger.debug("tryMigrateOldIndexedDB("+storageKey+"): DB connection closed!");
|
|
154
|
+
|
|
155
|
+
await new Promise<void>((resolve, reject) => {
|
|
156
|
+
const res = window.indexedDB.deleteDatabase(storageKey);
|
|
157
|
+
res.onsuccess = () => resolve();
|
|
158
|
+
res.onerror = (e) => reject(e);
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
this.logger.info("tryMigrateOldIndexedDB("+storageKey+"): Database successfully migrated from oldIndexedDB to unifiedIndexedDB!");
|
|
162
|
+
return true;
|
|
163
|
+
} catch (e) {
|
|
164
|
+
this.logger.warn("tryMigrateOldIndexedDB("+storageKey+"): Tried to migrate the database, but cannot parse oldIndexedDB!", e);
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
//NOTE: Reviver also needs to update the swap to the latest version
|
|
170
|
+
public async tryMigrate(storageKeys: [string, SwapType][], reviver: (obj: any) => ISwap): Promise<boolean> {
|
|
171
|
+
let someMigrated = false;
|
|
172
|
+
for(let storageKey of storageKeys) {
|
|
173
|
+
this.logger.info("tryMigrate(): Trying to migrate...", storageKey);
|
|
174
|
+
if(await this.tryMigrateLocalStorage(storageKey[0], storageKey[1], reviver)) someMigrated = true;
|
|
175
|
+
if(await this.tryMigrateOldIndexedDB(storageKey[0], storageKey[1], reviver)) someMigrated = true;
|
|
176
|
+
}
|
|
177
|
+
return someMigrated;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
private executeTransaction<T>(cbk: (tx: IDBObjectStore) => IDBRequest<T>, readonly: boolean): Promise<T> {
|
|
181
|
+
return new Promise<T>((resolve, reject) => {
|
|
182
|
+
if(this.db==null) {
|
|
183
|
+
reject(new Error("Not initiated, call init() first!"));
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const tx = this.db.transaction("swaps", readonly ? "readonly" : "readwrite", {durability: "strict"});
|
|
187
|
+
const req = cbk(tx.objectStore("swaps"));
|
|
188
|
+
req.onsuccess = (event: any) => resolve(event.target.result);
|
|
189
|
+
req.onerror = (event) => reject(event);
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
private executeTransactionArr<T>(cbk: (tx: IDBObjectStore) => IDBRequest<T>[], readonly: boolean): Promise<T[]> {
|
|
194
|
+
if(this.db==null) throw new Error("Not initiated, call init() first!");
|
|
195
|
+
const tx = this.db.transaction("swaps", readonly ? "readonly" : "readwrite", {durability: "strict"});
|
|
196
|
+
const reqs = cbk(tx.objectStore("swaps"));
|
|
197
|
+
return Promise.all(reqs.map(req => new Promise<T>((resolve, reject) => {
|
|
198
|
+
req.onsuccess = (event: any) => resolve(event.target.result);
|
|
199
|
+
req.onerror = (event) => reject(event);
|
|
200
|
+
})));
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
private async executeTransactionWithCursor<T>(
|
|
204
|
+
cbk: (tx: IDBObjectStore) => IDBRequest<IDBCursorWithValue | null>[],
|
|
205
|
+
valueCbk: (value: T) => boolean
|
|
206
|
+
): Promise<T[]> {
|
|
207
|
+
if(this.db==null) throw new Error("Not initiated, call init() first!");
|
|
208
|
+
const tx = this.db.transaction("swaps", "readonly", {durability: "strict"});
|
|
209
|
+
const cursorRequests = cbk(tx.objectStore("swaps"));
|
|
210
|
+
|
|
211
|
+
const promises = cursorRequests.map(
|
|
212
|
+
cursorRequest => new Promise<T[]>(
|
|
213
|
+
(resolve, reject) => {
|
|
214
|
+
const resultObjects: T[] = [];
|
|
215
|
+
cursorRequest.onsuccess = (event: any) => {
|
|
216
|
+
const cursor = event.target.result;
|
|
217
|
+
if(cursor!=null) {
|
|
218
|
+
const value = cursor.value;
|
|
219
|
+
if(valueCbk(value)) resultObjects.push(value);
|
|
220
|
+
cursor.continue();
|
|
221
|
+
} else {
|
|
222
|
+
resolve(resultObjects);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
cursorRequest.onerror = (event) => reject(event);
|
|
226
|
+
}
|
|
227
|
+
)
|
|
228
|
+
);
|
|
229
|
+
|
|
230
|
+
const result = await Promise.all(promises);
|
|
231
|
+
return result.flat();
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
async init(): Promise<void> {
|
|
235
|
+
if(this.db==null) {
|
|
236
|
+
this.db = await new Promise<IDBDatabase>((resolve, reject) => {
|
|
237
|
+
const request = window.indexedDB.open(this.storageKey, 1);
|
|
238
|
+
request.onupgradeneeded = (event: any) => {
|
|
239
|
+
const db: IDBDatabase = event.target.result;
|
|
240
|
+
const objectStore = db.createObjectStore("swaps", { keyPath: "id" });
|
|
241
|
+
|
|
242
|
+
Object.keys(indexes).forEach(name => {
|
|
243
|
+
const index = indexes[name];
|
|
244
|
+
objectStore.createIndex(name, index.key, {unique: index.unique});
|
|
245
|
+
})
|
|
246
|
+
};
|
|
247
|
+
request.onerror = (e) => reject(e);
|
|
248
|
+
request.onsuccess = (e: any) => resolve(e.target.result);
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Params are specified in the following way:
|
|
255
|
+
* - [[condition1, condition2]] - returns all rows where condition1 AND condition2 is met
|
|
256
|
+
* - [[condition1], [condition2]] - returns all rows where condition1 OR condition2 is met
|
|
257
|
+
* - [[condition1, condition2], [condition3]] - returns all rows where (condition1 AND condition2) OR condition3 is met
|
|
258
|
+
* @param params
|
|
259
|
+
*/
|
|
260
|
+
async query(params: Array<Array<QueryParams>>): Promise<Array<UnifiedStoredObject>> {
|
|
261
|
+
if(params.length===0) return await this.querySingle([]);
|
|
262
|
+
const results = await Promise.all(params.map(singleParam => this.querySingle(singleParam)));
|
|
263
|
+
const resultSet = new Set(results.flat()); //Deduplicate
|
|
264
|
+
return Array.from(resultSet);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
async querySingle(params: Array<QueryParams>): Promise<Array<UnifiedStoredObject>> {
|
|
268
|
+
if(params.length===0) {
|
|
269
|
+
return await this.executeTransaction((objectStore) => objectStore.getAll(), true);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
const queryKeys = params.map(param => param.key);
|
|
273
|
+
const requiredIndex = queryKeys.join(", ");
|
|
274
|
+
|
|
275
|
+
if(requiredIndex==="id") {
|
|
276
|
+
//ID is the index
|
|
277
|
+
const values: any[] = Array.isArray(params[0].value) ? params[0].value : [params[0].value];
|
|
278
|
+
const res = await this.executeTransactionArr((objectStore) => {
|
|
279
|
+
return values.map(val => objectStore.getAll(val));
|
|
280
|
+
}, true);
|
|
281
|
+
return res.flat();
|
|
282
|
+
} else if(indexes[requiredIndex]!=null) {
|
|
283
|
+
//Index exists
|
|
284
|
+
const values: Array<any[]> = params.map(param => Array.isArray(param.value) ? param.value : [param.value]);
|
|
285
|
+
const compositeIndexQueries = toCompositeIndex(values);
|
|
286
|
+
|
|
287
|
+
const resp = await this.executeTransactionArr(objectStore => {
|
|
288
|
+
const index = objectStore.index(requiredIndex);
|
|
289
|
+
return compositeIndexQueries.map(indexQuery => index.getAll(indexQuery));
|
|
290
|
+
}, true);
|
|
291
|
+
|
|
292
|
+
return resp.flat();
|
|
293
|
+
} else {
|
|
294
|
+
//Need to go over all values
|
|
295
|
+
this.logger.warn("query(): Index cannot be used for query, required index: "+requiredIndex+" query params: ", params);
|
|
296
|
+
|
|
297
|
+
const setConditions = toSetConditions(params);
|
|
298
|
+
return await this.executeTransactionWithCursor(
|
|
299
|
+
objectStore => [objectStore.openCursor()],
|
|
300
|
+
(val: any) => matches(setConditions, val)
|
|
301
|
+
);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
async remove(object: UnifiedStoredObject): Promise<void> {
|
|
306
|
+
await this.executeTransaction<undefined>(store => store.delete(object.id), false)
|
|
307
|
+
.catch(() => null);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
async removeAll(arr: UnifiedStoredObject[]): Promise<void> {
|
|
311
|
+
if(arr.length===0) return;
|
|
312
|
+
await this.executeTransactionArr<undefined>(store => arr.map(object => {
|
|
313
|
+
return store.delete(object.id);
|
|
314
|
+
}), false);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
async save(object: UnifiedStoredObject): Promise<void> {
|
|
318
|
+
await this.executeTransaction<IDBValidKey>(store => store.put(object), false);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
async saveAll(arr: UnifiedStoredObject[]): Promise<void> {
|
|
322
|
+
if(arr.length===0) return;
|
|
323
|
+
await this.executeTransactionArr<IDBValidKey>(store => arr.map(object => {
|
|
324
|
+
return store.put(object);
|
|
325
|
+
}), false);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
}
|
|
@@ -2,6 +2,7 @@ import {IStorageManager, StorageObject} from "@atomiqlabs/base";
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* StorageManager using browser's local storage API
|
|
5
|
+
* @category Storage
|
|
5
6
|
*/
|
|
6
7
|
export class LocalStorageManager<T extends StorageObject> implements IStorageManager<T> {
|
|
7
8
|
|
|
@@ -9,7 +10,7 @@ export class LocalStorageManager<T extends StorageObject> implements IStorageMan
|
|
|
9
10
|
|
|
10
11
|
rawData: {
|
|
11
12
|
[hash: string]: any
|
|
12
|
-
} =
|
|
13
|
+
} = {};
|
|
13
14
|
data: {
|
|
14
15
|
[hash: string]: T
|
|
15
16
|
} = {};
|