@atomiqlabs/sdk 8.7.7 → 8.8.4
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/LICENSE +201 -201
- package/README.md +1760 -1760
- package/dist/SmartChainAssets.d.ts +181 -181
- package/dist/SmartChainAssets.js +181 -181
- package/dist/bitcoin/coinselect2/accumulative.d.ts +7 -6
- package/dist/bitcoin/coinselect2/accumulative.js +52 -52
- package/dist/bitcoin/coinselect2/blackjack.d.ts +7 -6
- package/dist/bitcoin/coinselect2/blackjack.js +38 -38
- package/dist/bitcoin/coinselect2/index.d.ts +20 -19
- package/dist/bitcoin/coinselect2/index.js +69 -69
- package/dist/bitcoin/coinselect2/utils.d.ts +82 -77
- package/dist/bitcoin/coinselect2/utils.js +158 -123
- package/dist/bitcoin/wallet/BitcoinWallet.d.ts +113 -130
- package/dist/bitcoin/wallet/BitcoinWallet.js +335 -322
- package/dist/bitcoin/wallet/IBitcoinWallet.d.ts +116 -78
- package/dist/bitcoin/wallet/IBitcoinWallet.js +21 -21
- package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.d.ts +106 -101
- package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.js +196 -190
- package/dist/enums/FeeType.d.ts +15 -15
- package/dist/enums/FeeType.js +19 -19
- package/dist/enums/SwapAmountType.d.ts +15 -15
- package/dist/enums/SwapAmountType.js +19 -19
- package/dist/enums/SwapDirection.d.ts +15 -15
- package/dist/enums/SwapDirection.js +19 -19
- package/dist/enums/SwapSide.d.ts +15 -15
- package/dist/enums/SwapSide.js +19 -19
- package/dist/enums/SwapType.d.ts +75 -75
- package/dist/enums/SwapType.js +79 -79
- package/dist/errors/IntermediaryError.d.ts +13 -13
- package/dist/errors/IntermediaryError.js +27 -27
- package/dist/errors/RequestError.d.ts +32 -32
- package/dist/errors/RequestError.js +54 -54
- package/dist/errors/UserError.d.ts +8 -8
- package/dist/errors/UserError.js +16 -16
- package/dist/events/UnifiedSwapEventListener.d.ts +23 -23
- package/dist/events/UnifiedSwapEventListener.js +132 -132
- package/dist/http/HttpUtils.d.ts +27 -27
- package/dist/http/HttpUtils.js +91 -91
- package/dist/http/paramcoders/IParamReader.d.ts +8 -8
- package/dist/http/paramcoders/IParamReader.js +2 -2
- package/dist/http/paramcoders/ParamDecoder.d.ts +44 -44
- package/dist/http/paramcoders/ParamDecoder.js +137 -137
- package/dist/http/paramcoders/ParamEncoder.d.ts +20 -20
- package/dist/http/paramcoders/ParamEncoder.js +36 -36
- package/dist/http/paramcoders/SchemaVerifier.d.ts +26 -26
- package/dist/http/paramcoders/SchemaVerifier.js +145 -145
- package/dist/http/paramcoders/client/ResponseParamDecoder.d.ts +11 -11
- package/dist/http/paramcoders/client/ResponseParamDecoder.js +57 -57
- package/dist/http/paramcoders/client/StreamParamEncoder.d.ts +13 -13
- package/dist/http/paramcoders/client/StreamParamEncoder.js +26 -26
- package/dist/http/paramcoders/client/StreamingFetchPromise.d.ts +16 -16
- package/dist/http/paramcoders/client/StreamingFetchPromise.js +174 -174
- package/dist/index.d.ts +85 -85
- package/dist/index.js +158 -158
- package/dist/intermediaries/Intermediary.d.ts +178 -178
- package/dist/intermediaries/Intermediary.js +166 -166
- package/dist/intermediaries/IntermediaryDiscovery.d.ts +211 -211
- package/dist/intermediaries/IntermediaryDiscovery.js +424 -424
- package/dist/intermediaries/apis/IntermediaryAPI.d.ts +450 -440
- package/dist/intermediaries/apis/IntermediaryAPI.js +618 -603
- package/dist/intermediaries/apis/TrustedIntermediaryAPI.d.ts +155 -155
- package/dist/intermediaries/apis/TrustedIntermediaryAPI.js +137 -137
- package/dist/lnurl/LNURL.d.ts +102 -102
- package/dist/lnurl/LNURL.js +321 -321
- package/dist/prices/RedundantSwapPrice.d.ts +110 -110
- package/dist/prices/RedundantSwapPrice.js +222 -222
- package/dist/prices/SingleSwapPrice.d.ts +34 -34
- package/dist/prices/SingleSwapPrice.js +44 -44
- package/dist/prices/SwapPriceWithChain.d.ts +107 -107
- package/dist/prices/SwapPriceWithChain.js +128 -128
- package/dist/prices/abstract/ICachedSwapPrice.d.ts +28 -28
- package/dist/prices/abstract/ICachedSwapPrice.js +62 -62
- package/dist/prices/abstract/IPriceProvider.d.ts +81 -81
- package/dist/prices/abstract/IPriceProvider.js +74 -74
- package/dist/prices/abstract/ISwapPrice.d.ts +168 -168
- package/dist/prices/abstract/ISwapPrice.js +279 -279
- package/dist/prices/providers/BinancePriceProvider.d.ts +23 -23
- package/dist/prices/providers/BinancePriceProvider.js +30 -30
- package/dist/prices/providers/CoinGeckoPriceProvider.d.ts +23 -23
- package/dist/prices/providers/CoinGeckoPriceProvider.js +29 -29
- package/dist/prices/providers/CoinPaprikaPriceProvider.d.ts +25 -25
- package/dist/prices/providers/CoinPaprikaPriceProvider.js +29 -29
- package/dist/prices/providers/CustomPriceProvider.d.ts +24 -24
- package/dist/prices/providers/CustomPriceProvider.js +35 -35
- package/dist/prices/providers/KrakenPriceProvider.d.ts +38 -38
- package/dist/prices/providers/KrakenPriceProvider.js +45 -45
- package/dist/prices/providers/OKXPriceProvider.d.ts +34 -34
- package/dist/prices/providers/OKXPriceProvider.js +29 -29
- package/dist/prices/providers/abstract/ExchangePriceProvider.d.ts +17 -17
- package/dist/prices/providers/abstract/ExchangePriceProvider.js +21 -21
- package/dist/prices/providers/abstract/HttpPriceProvider.d.ts +7 -7
- package/dist/prices/providers/abstract/HttpPriceProvider.js +12 -12
- package/dist/storage/IUnifiedStorage.d.ts +85 -85
- package/dist/storage/IUnifiedStorage.js +2 -2
- package/dist/storage/UnifiedSwapStorage.d.ts +114 -114
- package/dist/storage/UnifiedSwapStorage.js +116 -116
- package/dist/storage-browser/IndexedDBUnifiedStorage.d.ts +63 -63
- package/dist/storage-browser/IndexedDBUnifiedStorage.js +298 -298
- package/dist/storage-browser/LocalStorageManager.d.ts +49 -49
- package/dist/storage-browser/LocalStorageManager.js +93 -93
- package/dist/swapper/Swapper.d.ts +732 -692
- package/dist/swapper/Swapper.js +1713 -1657
- package/dist/swapper/SwapperFactory.d.ts +135 -135
- package/dist/swapper/SwapperFactory.js +162 -162
- package/dist/swapper/SwapperUtils.d.ts +206 -206
- package/dist/swapper/SwapperUtils.js +481 -481
- package/dist/swapper/SwapperWithChain.d.ts +404 -404
- package/dist/swapper/SwapperWithChain.js +469 -469
- package/dist/swapper/SwapperWithSigner.d.ts +322 -322
- package/dist/swapper/SwapperWithSigner.js +318 -318
- package/dist/swaps/IAddressSwap.d.ts +22 -22
- package/dist/swaps/IAddressSwap.js +14 -14
- package/dist/swaps/IBTCWalletSwap.d.ts +73 -73
- package/dist/swaps/IBTCWalletSwap.js +18 -18
- package/dist/swaps/IClaimableSwap.d.ts +49 -49
- package/dist/swaps/IClaimableSwap.js +15 -15
- package/dist/swaps/IClaimableSwapWrapper.d.ts +15 -15
- package/dist/swaps/IClaimableSwapWrapper.js +2 -2
- package/dist/swaps/IRefundableSwap.d.ts +43 -43
- package/dist/swaps/IRefundableSwap.js +14 -14
- package/dist/swaps/ISwap.d.ts +392 -392
- package/dist/swaps/ISwap.js +349 -349
- package/dist/swaps/ISwapWithGasDrop.d.ts +21 -21
- package/dist/swaps/ISwapWithGasDrop.js +12 -12
- package/dist/swaps/ISwapWrapper.d.ts +285 -285
- package/dist/swaps/ISwapWrapper.js +353 -353
- package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.d.ts +98 -98
- package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.js +126 -126
- package/dist/swaps/escrow_swaps/IEscrowSwap.d.ts +139 -139
- package/dist/swaps/escrow_swaps/IEscrowSwap.js +170 -170
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.d.ts +128 -128
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.js +167 -167
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.d.ts +105 -105
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.js +129 -129
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.d.ts +162 -162
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.js +190 -190
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.d.ts +64 -64
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.js +82 -82
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.d.ts +531 -531
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.js +1285 -1285
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.d.ts +190 -190
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.js +432 -432
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.d.ts +583 -583
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.js +1371 -1371
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.d.ts +235 -235
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.js +525 -525
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.d.ts +458 -458
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.js +1126 -1126
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.d.ts +202 -202
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.js +406 -406
- package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.d.ts +403 -403
- package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.js +924 -924
- package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.d.ts +68 -68
- package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.js +117 -117
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.d.ts +127 -127
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.js +256 -256
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.d.ts +251 -251
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.js +536 -536
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.d.ts +73 -73
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.js +155 -155
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.d.ts +132 -132
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.js +286 -286
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.d.ts +637 -631
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.js +1448 -1444
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.d.ts +257 -225
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.js +947 -822
- package/dist/swaps/trusted/ln/LnForGasSwap.d.ts +261 -261
- package/dist/swaps/trusted/ln/LnForGasSwap.js +511 -511
- package/dist/swaps/trusted/ln/LnForGasWrapper.d.ts +40 -40
- package/dist/swaps/trusted/ln/LnForGasWrapper.js +83 -83
- package/dist/swaps/trusted/onchain/OnchainForGasSwap.d.ts +342 -342
- package/dist/swaps/trusted/onchain/OnchainForGasSwap.js +715 -715
- package/dist/swaps/trusted/onchain/OnchainForGasWrapper.d.ts +69 -69
- package/dist/swaps/trusted/onchain/OnchainForGasWrapper.js +93 -93
- package/dist/types/AmountData.d.ts +10 -10
- package/dist/types/AmountData.js +2 -2
- package/dist/types/CustomPriceFunction.d.ts +11 -11
- package/dist/types/CustomPriceFunction.js +2 -2
- package/dist/types/PriceInfoType.d.ts +28 -28
- package/dist/types/PriceInfoType.js +57 -57
- package/dist/types/SwapExecutionAction.d.ts +88 -88
- package/dist/types/SwapExecutionAction.js +2 -2
- package/dist/types/SwapStateInfo.d.ts +5 -5
- package/dist/types/SwapStateInfo.js +2 -2
- package/dist/types/SwapWithSigner.d.ts +17 -17
- package/dist/types/SwapWithSigner.js +43 -43
- package/dist/types/Token.d.ts +99 -99
- package/dist/types/Token.js +76 -76
- package/dist/types/TokenAmount.d.ts +69 -69
- package/dist/types/TokenAmount.js +60 -60
- package/dist/types/fees/Fee.d.ts +50 -50
- package/dist/types/fees/Fee.js +2 -2
- package/dist/types/fees/FeeBreakdown.d.ts +11 -11
- package/dist/types/fees/FeeBreakdown.js +2 -2
- package/dist/types/fees/PercentagePPM.d.ts +17 -17
- package/dist/types/fees/PercentagePPM.js +18 -18
- package/dist/types/lnurl/LNURLPay.d.ts +61 -61
- package/dist/types/lnurl/LNURLPay.js +31 -31
- package/dist/types/lnurl/LNURLWithdraw.d.ts +48 -48
- package/dist/types/lnurl/LNURLWithdraw.js +27 -27
- package/dist/types/wallets/LightningInvoiceCreateService.d.ts +24 -24
- package/dist/types/wallets/LightningInvoiceCreateService.js +15 -15
- package/dist/types/wallets/MinimalBitcoinWalletInterface.d.ts +23 -23
- package/dist/types/wallets/MinimalBitcoinWalletInterface.js +2 -2
- package/dist/types/wallets/MinimalLightningNetworkWalletInterface.d.ts +9 -9
- package/dist/types/wallets/MinimalLightningNetworkWalletInterface.js +2 -2
- package/dist/utils/AutomaticClockDriftCorrection.d.ts +1 -1
- package/dist/utils/AutomaticClockDriftCorrection.js +70 -70
- package/dist/utils/BitcoinUtils.d.ts +16 -14
- package/dist/utils/BitcoinUtils.js +141 -102
- package/dist/utils/BitcoinWalletUtils.d.ts +7 -7
- package/dist/utils/BitcoinWalletUtils.js +14 -14
- package/dist/utils/Logger.d.ts +7 -7
- package/dist/utils/Logger.js +12 -12
- package/dist/utils/RetryUtils.d.ts +22 -22
- package/dist/utils/RetryUtils.js +67 -67
- package/dist/utils/SwapUtils.d.ts +88 -88
- package/dist/utils/SwapUtils.js +72 -72
- package/dist/utils/TimeoutUtils.d.ts +17 -17
- package/dist/utils/TimeoutUtils.js +55 -55
- package/dist/utils/TokenUtils.d.ts +19 -19
- package/dist/utils/TokenUtils.js +37 -37
- package/dist/utils/TypeUtils.d.ts +7 -7
- package/dist/utils/TypeUtils.js +2 -2
- package/dist/utils/Utils.d.ts +67 -67
- package/dist/utils/Utils.js +208 -208
- package/package.json +43 -43
- package/src/SmartChainAssets.ts +186 -186
- package/src/bitcoin/coinselect2/accumulative.ts +69 -68
- package/src/bitcoin/coinselect2/blackjack.ts +50 -49
- package/src/bitcoin/coinselect2/index.ts +93 -92
- package/src/bitcoin/coinselect2/utils.ts +236 -195
- package/src/bitcoin/wallet/BitcoinWallet.ts +439 -427
- package/src/bitcoin/wallet/IBitcoinWallet.ts +140 -99
- package/src/bitcoin/wallet/SingleAddressBitcoinWallet.ts +225 -217
- package/src/enums/FeeType.ts +15 -15
- package/src/enums/SwapAmountType.ts +16 -16
- package/src/enums/SwapDirection.ts +15 -15
- package/src/enums/SwapSide.ts +16 -16
- package/src/enums/SwapType.ts +75 -75
- package/src/errors/IntermediaryError.ts +28 -28
- package/src/errors/RequestError.ts +64 -64
- package/src/errors/UserError.ts +15 -15
- package/src/events/UnifiedSwapEventListener.ts +173 -173
- package/src/http/HttpUtils.ts +91 -91
- package/src/http/paramcoders/IParamReader.ts +9 -9
- package/src/http/paramcoders/ParamDecoder.ts +145 -145
- package/src/http/paramcoders/ParamEncoder.ts +40 -40
- package/src/http/paramcoders/SchemaVerifier.ts +153 -153
- package/src/http/paramcoders/client/ResponseParamDecoder.ts +57 -57
- package/src/http/paramcoders/client/StreamParamEncoder.ts +28 -28
- package/src/http/paramcoders/client/StreamingFetchPromise.ts +192 -192
- package/src/index.ts +140 -140
- package/src/intermediaries/Intermediary.ts +280 -280
- package/src/intermediaries/IntermediaryDiscovery.ts +541 -541
- package/src/intermediaries/apis/IntermediaryAPI.ts +963 -947
- package/src/intermediaries/apis/TrustedIntermediaryAPI.ts +257 -257
- package/src/lnurl/LNURL.ts +402 -402
- package/src/prices/RedundantSwapPrice.ts +264 -264
- package/src/prices/SingleSwapPrice.ts +50 -50
- package/src/prices/SwapPriceWithChain.ts +194 -194
- package/src/prices/abstract/ICachedSwapPrice.ts +85 -85
- package/src/prices/abstract/IPriceProvider.ts +127 -127
- package/src/prices/abstract/ISwapPrice.ts +390 -390
- package/src/prices/providers/BinancePriceProvider.ts +48 -48
- package/src/prices/providers/CoinGeckoPriceProvider.ts +46 -46
- package/src/prices/providers/CoinPaprikaPriceProvider.ts +49 -49
- package/src/prices/providers/CustomPriceProvider.ts +40 -40
- package/src/prices/providers/KrakenPriceProvider.ts +83 -83
- package/src/prices/providers/OKXPriceProvider.ts +59 -59
- package/src/prices/providers/abstract/ExchangePriceProvider.ts +31 -31
- package/src/prices/providers/abstract/HttpPriceProvider.ts +14 -14
- package/src/storage/IUnifiedStorage.ts +95 -95
- package/src/storage/UnifiedSwapStorage.ts +141 -141
- package/src/storage-browser/IndexedDBUnifiedStorage.ts +350 -350
- package/src/storage-browser/LocalStorageManager.ts +106 -106
- package/src/swapper/Swapper.ts +2488 -2416
- package/src/swapper/SwapperFactory.ts +307 -307
- package/src/swapper/SwapperUtils.ts +570 -570
- package/src/swapper/SwapperWithChain.ts +707 -707
- package/src/swapper/SwapperWithSigner.ts +511 -511
- package/src/swaps/IAddressSwap.ts +30 -30
- package/src/swaps/IBTCWalletSwap.ts +92 -92
- package/src/swaps/IClaimableSwap.ts +65 -65
- package/src/swaps/IClaimableSwapWrapper.ts +17 -17
- package/src/swaps/IRefundableSwap.ts +58 -58
- package/src/swaps/ISwap.ts +703 -703
- package/src/swaps/ISwapWithGasDrop.ts +25 -25
- package/src/swaps/ISwapWrapper.ts +539 -539
- package/src/swaps/escrow_swaps/IEscrowSelfInitSwap.ts +217 -217
- package/src/swaps/escrow_swaps/IEscrowSwap.ts +269 -269
- package/src/swaps/escrow_swaps/IEscrowSwapWrapper.ts +282 -282
- package/src/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.ts +169 -169
- package/src/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.ts +300 -300
- package/src/swaps/escrow_swaps/frombtc/IFromBTCWrapper.ts +107 -107
- package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.ts +1473 -1474
- package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.ts +601 -601
- package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.ts +1582 -1582
- package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.ts +750 -750
- package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.ts +1299 -1299
- package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.ts +610 -610
- package/src/swaps/escrow_swaps/tobtc/IToBTCSwap.ts +1096 -1096
- package/src/swaps/escrow_swaps/tobtc/IToBTCWrapper.ts +138 -138
- package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.ts +304 -304
- package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.ts +786 -786
- package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.ts +206 -206
- package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.ts +401 -401
- package/src/swaps/spv_swaps/SpvFromBTCSwap.ts +1812 -1799
- package/src/swaps/spv_swaps/SpvFromBTCWrapper.ts +1236 -1060
- package/src/swaps/trusted/ln/LnForGasSwap.ts +589 -589
- package/src/swaps/trusted/ln/LnForGasWrapper.ts +91 -91
- package/src/swaps/trusted/onchain/OnchainForGasSwap.ts +862 -862
- package/src/swaps/trusted/onchain/OnchainForGasWrapper.ts +131 -131
- package/src/types/AmountData.ts +9 -9
- package/src/types/CustomPriceFunction.ts +11 -11
- package/src/types/PriceInfoType.ts +66 -66
- package/src/types/SwapExecutionAction.ts +99 -99
- package/src/types/SwapStateInfo.ts +6 -6
- package/src/types/SwapWithSigner.ts +61 -61
- package/src/types/Token.ts +163 -163
- package/src/types/TokenAmount.ts +132 -132
- package/src/types/fees/Fee.ts +56 -56
- package/src/types/fees/FeeBreakdown.ts +11 -11
- package/src/types/fees/PercentagePPM.ts +26 -26
- package/src/types/lnurl/LNURLPay.ts +79 -79
- package/src/types/lnurl/LNURLWithdraw.ts +61 -61
- package/src/types/wallets/LightningInvoiceCreateService.ts +30 -30
- package/src/types/wallets/MinimalBitcoinWalletInterface.ts +21 -21
- package/src/types/wallets/MinimalLightningNetworkWalletInterface.ts +9 -9
- package/src/utils/AutomaticClockDriftCorrection.ts +71 -71
- package/src/utils/BitcoinUtils.ts +132 -91
- package/src/utils/BitcoinWalletUtils.ts +15 -15
- package/src/utils/Logger.ts +14 -14
- package/src/utils/RetryUtils.ts +78 -78
- package/src/utils/SwapUtils.ts +99 -99
- package/src/utils/TimeoutUtils.ts +49 -49
- package/src/utils/TokenUtils.ts +33 -33
- package/src/utils/TypeUtils.ts +8 -8
- package/src/utils/Utils.ts +212 -212
|
@@ -1,351 +1,351 @@
|
|
|
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
|
-
*
|
|
64
|
-
* @category Storage
|
|
65
|
-
*/
|
|
66
|
-
export class IndexedDBUnifiedStorage implements IUnifiedStorage<UnifiedSwapStorageIndexes, UnifiedStorageCompositeIndexes> {
|
|
67
|
-
|
|
68
|
-
protected readonly logger: LoggerType;
|
|
69
|
-
|
|
70
|
-
readonly storageKey: string;
|
|
71
|
-
db?: IDBDatabase;
|
|
72
|
-
|
|
73
|
-
constructor(storageKey: string) {
|
|
74
|
-
this.storageKey = storageKey;
|
|
75
|
-
this.logger = getLogger("IndexedDBUnifiedStorage("+this.storageKey+"): ");
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
//Reviver also needs to update the swap to the latest version
|
|
79
|
-
private async tryMigrateLocalStorage(storageKey: string, swapType: SwapType, reviver: (obj: any) => ISwap): Promise<boolean> {
|
|
80
|
-
const txt = window.localStorage.getItem(storageKey);
|
|
81
|
-
if(txt==null) return false;
|
|
82
|
-
|
|
83
|
-
let data: {[key: string]: any};
|
|
84
|
-
try {
|
|
85
|
-
data = JSON.parse(txt);
|
|
86
|
-
} catch (e) {
|
|
87
|
-
this.logger.warn("tryMigrate("+storageKey+"): Tried to migrate the database, but cannot parse old local storage!");
|
|
88
|
-
return false;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
let swaps: ISwap[] = Object.keys(data).map(id => {
|
|
92
|
-
let swapData = data[id];
|
|
93
|
-
swapData.type = swapType;
|
|
94
|
-
return reviver(swapData);
|
|
95
|
-
});
|
|
96
|
-
await this.saveAll(swaps.map(swap => swap.serialize()));
|
|
97
|
-
|
|
98
|
-
window.localStorage.removeItem(storageKey);
|
|
99
|
-
|
|
100
|
-
this.logger.info("tryMigrate("+storageKey+"): Database successfully migrated from localStorage to unifiedIndexedDB!");
|
|
101
|
-
|
|
102
|
-
return true;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
//Reviver also needs to update the swap to the latest version
|
|
106
|
-
private async tryMigrateOldIndexedDB(storageKey: string, swapType: SwapType, reviver: (obj: any) => ISwap): Promise<boolean> {
|
|
107
|
-
const databases = await window.indexedDB.databases();
|
|
108
|
-
if(databases.find(val => val.name===storageKey)==null) {
|
|
109
|
-
this.logger.info("tryMigrateOldIndexedDB("+storageKey+"): Old database not found!");
|
|
110
|
-
return false;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
this.logger.debug("tryMigrateOldIndexedDB("+storageKey+"): Old database found!");
|
|
114
|
-
|
|
115
|
-
let db: IDBDatabase;
|
|
116
|
-
try {
|
|
117
|
-
db = await new Promise<IDBDatabase>((resolve, reject) => {
|
|
118
|
-
const request = window.indexedDB.open(storageKey, 1);
|
|
119
|
-
request.onerror = (e) => reject(e);
|
|
120
|
-
request.onsuccess = (e: any) => resolve(e.target.result);
|
|
121
|
-
});
|
|
122
|
-
} catch (e) {
|
|
123
|
-
this.logger.warn("tryMigrateOldIndexedDB("+storageKey+"): Error opening old IndexedDB!", e);
|
|
124
|
-
return false;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
this.logger.debug("tryMigrateOldIndexedDB("+storageKey+"): Connection opened!");
|
|
128
|
-
|
|
129
|
-
try {
|
|
130
|
-
const data = await new Promise<{ id: string, data: any }[]>((resolve, reject) => {
|
|
131
|
-
const tx = db.transaction("swaps", "readonly", {durability: "strict"});
|
|
132
|
-
const store = tx.objectStore("swaps");
|
|
133
|
-
const req = store.getAll();
|
|
134
|
-
req.onsuccess = (event: any) => resolve(event.target.result);
|
|
135
|
-
req.onerror = (event) => reject(event);
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
this.logger.debug("tryMigrateOldIndexedDB("+storageKey+"): Data retrieved!");
|
|
139
|
-
|
|
140
|
-
let swaps: ISwap[] = data.map(({id, data}) => {
|
|
141
|
-
data.type = swapType;
|
|
142
|
-
return reviver(data);
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
this.logger.debug("tryMigrateOldIndexedDB("+storageKey+"): Data revived!");
|
|
146
|
-
|
|
147
|
-
await this.saveAll(swaps.map(swap => swap.serialize()));
|
|
148
|
-
|
|
149
|
-
this.logger.debug("tryMigrateOldIndexedDB("+storageKey+"): Data saved!");
|
|
150
|
-
|
|
151
|
-
//Remove the old database
|
|
152
|
-
db.close();
|
|
153
|
-
|
|
154
|
-
this.logger.debug("tryMigrateOldIndexedDB("+storageKey+"): DB connection closed!");
|
|
155
|
-
|
|
156
|
-
await new Promise<void>((resolve, reject) => {
|
|
157
|
-
const res = window.indexedDB.deleteDatabase(storageKey);
|
|
158
|
-
res.onsuccess = () => resolve();
|
|
159
|
-
res.onerror = (e) => reject(e);
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
this.logger.info("tryMigrateOldIndexedDB("+storageKey+"): Database successfully migrated from oldIndexedDB to unifiedIndexedDB!");
|
|
163
|
-
return true;
|
|
164
|
-
} catch (e) {
|
|
165
|
-
this.logger.warn("tryMigrateOldIndexedDB("+storageKey+"): Tried to migrate the database, but cannot parse oldIndexedDB!", e);
|
|
166
|
-
return false;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* Attempts to migrate the swap database from old implementations (either using prior version of IndexedDB or
|
|
172
|
-
* Local Storage)
|
|
173
|
-
*
|
|
174
|
-
* NOTE: Reviver also needs to update the swap to the latest version
|
|
175
|
-
*
|
|
176
|
-
* @param storageKeys An array of tuples of storage keys used for the corresponding swap types
|
|
177
|
-
* @param reviver Swap data deserializer
|
|
178
|
-
*/
|
|
179
|
-
public async tryMigrate(storageKeys: [string, SwapType][], reviver: (obj: any) => ISwap): Promise<boolean> {
|
|
180
|
-
let someMigrated = false;
|
|
181
|
-
for(let storageKey of storageKeys) {
|
|
182
|
-
this.logger.info("tryMigrate(): Trying to migrate...", storageKey);
|
|
183
|
-
if(await this.tryMigrateLocalStorage(storageKey[0], storageKey[1], reviver)) someMigrated = true;
|
|
184
|
-
if(await this.tryMigrateOldIndexedDB(storageKey[0], storageKey[1], reviver)) someMigrated = true;
|
|
185
|
-
}
|
|
186
|
-
return someMigrated;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
private executeTransaction<T>(cbk: (tx: IDBObjectStore) => IDBRequest<T>, readonly: boolean): Promise<T> {
|
|
190
|
-
return new Promise<T>((resolve, reject) => {
|
|
191
|
-
if(this.db==null) {
|
|
192
|
-
reject(new Error("Not initiated, call init() first!"));
|
|
193
|
-
return;
|
|
194
|
-
}
|
|
195
|
-
const tx = this.db.transaction("swaps", readonly ? "readonly" : "readwrite", {durability: "strict"});
|
|
196
|
-
const req = cbk(tx.objectStore("swaps"));
|
|
197
|
-
req.onsuccess = (event: any) => resolve(event.target.result);
|
|
198
|
-
req.onerror = (event) => reject(event);
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
private executeTransactionArr<T>(cbk: (tx: IDBObjectStore) => IDBRequest<T>[], readonly: boolean): Promise<T[]> {
|
|
203
|
-
if(this.db==null) throw new Error("Not initiated, call init() first!");
|
|
204
|
-
const tx = this.db.transaction("swaps", readonly ? "readonly" : "readwrite", {durability: "strict"});
|
|
205
|
-
const reqs = cbk(tx.objectStore("swaps"));
|
|
206
|
-
return Promise.all(reqs.map(req => new Promise<T>((resolve, reject) => {
|
|
207
|
-
req.onsuccess = (event: any) => resolve(event.target.result);
|
|
208
|
-
req.onerror = (event) => reject(event);
|
|
209
|
-
})));
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
private async executeTransactionWithCursor<T>(
|
|
213
|
-
cbk: (tx: IDBObjectStore) => IDBRequest<IDBCursorWithValue | null>[],
|
|
214
|
-
valueCbk: (value: T) => boolean
|
|
215
|
-
): Promise<T[]> {
|
|
216
|
-
if(this.db==null) throw new Error("Not initiated, call init() first!");
|
|
217
|
-
const tx = this.db.transaction("swaps", "readonly", {durability: "strict"});
|
|
218
|
-
const cursorRequests = cbk(tx.objectStore("swaps"));
|
|
219
|
-
|
|
220
|
-
const promises = cursorRequests.map(
|
|
221
|
-
cursorRequest => new Promise<T[]>(
|
|
222
|
-
(resolve, reject) => {
|
|
223
|
-
const resultObjects: T[] = [];
|
|
224
|
-
cursorRequest.onsuccess = (event: any) => {
|
|
225
|
-
const cursor = event.target.result;
|
|
226
|
-
if(cursor!=null) {
|
|
227
|
-
const value = cursor.value;
|
|
228
|
-
if(valueCbk(value)) resultObjects.push(value);
|
|
229
|
-
cursor.continue();
|
|
230
|
-
} else {
|
|
231
|
-
resolve(resultObjects);
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
cursorRequest.onerror = (event) => reject(event);
|
|
235
|
-
}
|
|
236
|
-
)
|
|
237
|
-
);
|
|
238
|
-
|
|
239
|
-
const result = await Promise.all(promises);
|
|
240
|
-
return result.flat();
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
/**
|
|
244
|
-
* @inheritDoc
|
|
245
|
-
*/
|
|
246
|
-
async init(): Promise<void> {
|
|
247
|
-
if(this.db==null) {
|
|
248
|
-
this.db = await new Promise<IDBDatabase>((resolve, reject) => {
|
|
249
|
-
const request = window.indexedDB.open(this.storageKey, 1);
|
|
250
|
-
request.onupgradeneeded = (event: any) => {
|
|
251
|
-
const db: IDBDatabase = event.target.result;
|
|
252
|
-
const objectStore = db.createObjectStore("swaps", { keyPath: "id" });
|
|
253
|
-
|
|
254
|
-
Object.keys(indexes).forEach(name => {
|
|
255
|
-
const index = indexes[name];
|
|
256
|
-
objectStore.createIndex(name, index.key, {unique: index.unique});
|
|
257
|
-
})
|
|
258
|
-
};
|
|
259
|
-
request.onerror = (e) => reject(e);
|
|
260
|
-
request.onsuccess = (e: any) => resolve(e.target.result);
|
|
261
|
-
});
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
/**
|
|
266
|
-
* @inheritDoc
|
|
267
|
-
*/
|
|
268
|
-
async query(params: Array<Array<QueryParams>>): Promise<Array<UnifiedStoredObject>> {
|
|
269
|
-
if(params.length===0) return await this.querySingle([]);
|
|
270
|
-
const results = await Promise.all(params.map(singleParam => this.querySingle(singleParam)));
|
|
271
|
-
const resultSet = new Set(results.flat()); //Deduplicate
|
|
272
|
-
return Array.from(resultSet);
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
/**
|
|
276
|
-
* @internal
|
|
277
|
-
*/
|
|
278
|
-
protected async querySingle(params: Array<QueryParams>): Promise<Array<UnifiedStoredObject>> {
|
|
279
|
-
if(params.length===0) {
|
|
280
|
-
return await this.executeTransaction((objectStore) => objectStore.getAll(), true);
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
const queryKeys = params.map(param => param.key);
|
|
284
|
-
const requiredIndex = queryKeys.join(", ");
|
|
285
|
-
|
|
286
|
-
if(requiredIndex==="id") {
|
|
287
|
-
//ID is the index
|
|
288
|
-
const values: any[] = Array.isArray(params[0].value) ? params[0].value : [params[0].value];
|
|
289
|
-
const res = await this.executeTransactionArr((objectStore) => {
|
|
290
|
-
return values.map(val => objectStore.getAll(val));
|
|
291
|
-
}, true);
|
|
292
|
-
return res.flat();
|
|
293
|
-
} else if(indexes[requiredIndex]!=null) {
|
|
294
|
-
//Index exists
|
|
295
|
-
const values: Array<any[]> = params.map(param => Array.isArray(param.value) ? param.value : [param.value]);
|
|
296
|
-
const compositeIndexQueries = toCompositeIndex(values);
|
|
297
|
-
|
|
298
|
-
const resp = await this.executeTransactionArr(objectStore => {
|
|
299
|
-
const index = objectStore.index(requiredIndex);
|
|
300
|
-
return compositeIndexQueries.map(indexQuery => index.getAll(indexQuery));
|
|
301
|
-
}, true);
|
|
302
|
-
|
|
303
|
-
return resp.flat();
|
|
304
|
-
} else {
|
|
305
|
-
//Need to go over all values
|
|
306
|
-
this.logger.warn("query(): Index cannot be used for query, required index: "+requiredIndex+" query params: ", params);
|
|
307
|
-
|
|
308
|
-
const setConditions = toSetConditions(params);
|
|
309
|
-
return await this.executeTransactionWithCursor(
|
|
310
|
-
objectStore => [objectStore.openCursor()],
|
|
311
|
-
(val: any) => matches(setConditions, val)
|
|
312
|
-
);
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
/**
|
|
317
|
-
* @inheritDoc
|
|
318
|
-
*/
|
|
319
|
-
async remove(object: UnifiedStoredObject): Promise<void> {
|
|
320
|
-
await this.executeTransaction<undefined>(store => store.delete(object.id), false)
|
|
321
|
-
.catch(() => null);
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
/**
|
|
325
|
-
* @inheritDoc
|
|
326
|
-
*/
|
|
327
|
-
async removeAll(arr: UnifiedStoredObject[]): Promise<void> {
|
|
328
|
-
if(arr.length===0) return;
|
|
329
|
-
await this.executeTransactionArr<undefined>(store => arr.map(object => {
|
|
330
|
-
return store.delete(object.id);
|
|
331
|
-
}), false);
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
/**
|
|
335
|
-
* @inheritDoc
|
|
336
|
-
*/
|
|
337
|
-
async save(object: UnifiedStoredObject): Promise<void> {
|
|
338
|
-
await this.executeTransaction<IDBValidKey>(store => store.put(object), false);
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
/**
|
|
342
|
-
* @inheritDoc
|
|
343
|
-
*/
|
|
344
|
-
async saveAll(arr: UnifiedStoredObject[]): Promise<void> {
|
|
345
|
-
if(arr.length===0) return;
|
|
346
|
-
await this.executeTransactionArr<IDBValidKey>(store => arr.map(object => {
|
|
347
|
-
return store.put(object);
|
|
348
|
-
}), false);
|
|
349
|
-
}
|
|
350
|
-
|
|
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
|
+
*
|
|
64
|
+
* @category Storage
|
|
65
|
+
*/
|
|
66
|
+
export class IndexedDBUnifiedStorage implements IUnifiedStorage<UnifiedSwapStorageIndexes, UnifiedStorageCompositeIndexes> {
|
|
67
|
+
|
|
68
|
+
protected readonly logger: LoggerType;
|
|
69
|
+
|
|
70
|
+
readonly storageKey: string;
|
|
71
|
+
db?: IDBDatabase;
|
|
72
|
+
|
|
73
|
+
constructor(storageKey: string) {
|
|
74
|
+
this.storageKey = storageKey;
|
|
75
|
+
this.logger = getLogger("IndexedDBUnifiedStorage("+this.storageKey+"): ");
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
//Reviver also needs to update the swap to the latest version
|
|
79
|
+
private async tryMigrateLocalStorage(storageKey: string, swapType: SwapType, reviver: (obj: any) => ISwap): Promise<boolean> {
|
|
80
|
+
const txt = window.localStorage.getItem(storageKey);
|
|
81
|
+
if(txt==null) return false;
|
|
82
|
+
|
|
83
|
+
let data: {[key: string]: any};
|
|
84
|
+
try {
|
|
85
|
+
data = JSON.parse(txt);
|
|
86
|
+
} catch (e) {
|
|
87
|
+
this.logger.warn("tryMigrate("+storageKey+"): Tried to migrate the database, but cannot parse old local storage!");
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
let swaps: ISwap[] = Object.keys(data).map(id => {
|
|
92
|
+
let swapData = data[id];
|
|
93
|
+
swapData.type = swapType;
|
|
94
|
+
return reviver(swapData);
|
|
95
|
+
});
|
|
96
|
+
await this.saveAll(swaps.map(swap => swap.serialize()));
|
|
97
|
+
|
|
98
|
+
window.localStorage.removeItem(storageKey);
|
|
99
|
+
|
|
100
|
+
this.logger.info("tryMigrate("+storageKey+"): Database successfully migrated from localStorage to unifiedIndexedDB!");
|
|
101
|
+
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
//Reviver also needs to update the swap to the latest version
|
|
106
|
+
private async tryMigrateOldIndexedDB(storageKey: string, swapType: SwapType, reviver: (obj: any) => ISwap): Promise<boolean> {
|
|
107
|
+
const databases = await window.indexedDB.databases();
|
|
108
|
+
if(databases.find(val => val.name===storageKey)==null) {
|
|
109
|
+
this.logger.info("tryMigrateOldIndexedDB("+storageKey+"): Old database not found!");
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
this.logger.debug("tryMigrateOldIndexedDB("+storageKey+"): Old database found!");
|
|
114
|
+
|
|
115
|
+
let db: IDBDatabase;
|
|
116
|
+
try {
|
|
117
|
+
db = await new Promise<IDBDatabase>((resolve, reject) => {
|
|
118
|
+
const request = window.indexedDB.open(storageKey, 1);
|
|
119
|
+
request.onerror = (e) => reject(e);
|
|
120
|
+
request.onsuccess = (e: any) => resolve(e.target.result);
|
|
121
|
+
});
|
|
122
|
+
} catch (e) {
|
|
123
|
+
this.logger.warn("tryMigrateOldIndexedDB("+storageKey+"): Error opening old IndexedDB!", e);
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
this.logger.debug("tryMigrateOldIndexedDB("+storageKey+"): Connection opened!");
|
|
128
|
+
|
|
129
|
+
try {
|
|
130
|
+
const data = await new Promise<{ id: string, data: any }[]>((resolve, reject) => {
|
|
131
|
+
const tx = db.transaction("swaps", "readonly", {durability: "strict"});
|
|
132
|
+
const store = tx.objectStore("swaps");
|
|
133
|
+
const req = store.getAll();
|
|
134
|
+
req.onsuccess = (event: any) => resolve(event.target.result);
|
|
135
|
+
req.onerror = (event) => reject(event);
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
this.logger.debug("tryMigrateOldIndexedDB("+storageKey+"): Data retrieved!");
|
|
139
|
+
|
|
140
|
+
let swaps: ISwap[] = data.map(({id, data}) => {
|
|
141
|
+
data.type = swapType;
|
|
142
|
+
return reviver(data);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
this.logger.debug("tryMigrateOldIndexedDB("+storageKey+"): Data revived!");
|
|
146
|
+
|
|
147
|
+
await this.saveAll(swaps.map(swap => swap.serialize()));
|
|
148
|
+
|
|
149
|
+
this.logger.debug("tryMigrateOldIndexedDB("+storageKey+"): Data saved!");
|
|
150
|
+
|
|
151
|
+
//Remove the old database
|
|
152
|
+
db.close();
|
|
153
|
+
|
|
154
|
+
this.logger.debug("tryMigrateOldIndexedDB("+storageKey+"): DB connection closed!");
|
|
155
|
+
|
|
156
|
+
await new Promise<void>((resolve, reject) => {
|
|
157
|
+
const res = window.indexedDB.deleteDatabase(storageKey);
|
|
158
|
+
res.onsuccess = () => resolve();
|
|
159
|
+
res.onerror = (e) => reject(e);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
this.logger.info("tryMigrateOldIndexedDB("+storageKey+"): Database successfully migrated from oldIndexedDB to unifiedIndexedDB!");
|
|
163
|
+
return true;
|
|
164
|
+
} catch (e) {
|
|
165
|
+
this.logger.warn("tryMigrateOldIndexedDB("+storageKey+"): Tried to migrate the database, but cannot parse oldIndexedDB!", e);
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Attempts to migrate the swap database from old implementations (either using prior version of IndexedDB or
|
|
172
|
+
* Local Storage)
|
|
173
|
+
*
|
|
174
|
+
* NOTE: Reviver also needs to update the swap to the latest version
|
|
175
|
+
*
|
|
176
|
+
* @param storageKeys An array of tuples of storage keys used for the corresponding swap types
|
|
177
|
+
* @param reviver Swap data deserializer
|
|
178
|
+
*/
|
|
179
|
+
public async tryMigrate(storageKeys: [string, SwapType][], reviver: (obj: any) => ISwap): Promise<boolean> {
|
|
180
|
+
let someMigrated = false;
|
|
181
|
+
for(let storageKey of storageKeys) {
|
|
182
|
+
this.logger.info("tryMigrate(): Trying to migrate...", storageKey);
|
|
183
|
+
if(await this.tryMigrateLocalStorage(storageKey[0], storageKey[1], reviver)) someMigrated = true;
|
|
184
|
+
if(await this.tryMigrateOldIndexedDB(storageKey[0], storageKey[1], reviver)) someMigrated = true;
|
|
185
|
+
}
|
|
186
|
+
return someMigrated;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
private executeTransaction<T>(cbk: (tx: IDBObjectStore) => IDBRequest<T>, readonly: boolean): Promise<T> {
|
|
190
|
+
return new Promise<T>((resolve, reject) => {
|
|
191
|
+
if(this.db==null) {
|
|
192
|
+
reject(new Error("Not initiated, call init() first!"));
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
const tx = this.db.transaction("swaps", readonly ? "readonly" : "readwrite", {durability: "strict"});
|
|
196
|
+
const req = cbk(tx.objectStore("swaps"));
|
|
197
|
+
req.onsuccess = (event: any) => resolve(event.target.result);
|
|
198
|
+
req.onerror = (event) => reject(event);
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
private executeTransactionArr<T>(cbk: (tx: IDBObjectStore) => IDBRequest<T>[], readonly: boolean): Promise<T[]> {
|
|
203
|
+
if(this.db==null) throw new Error("Not initiated, call init() first!");
|
|
204
|
+
const tx = this.db.transaction("swaps", readonly ? "readonly" : "readwrite", {durability: "strict"});
|
|
205
|
+
const reqs = cbk(tx.objectStore("swaps"));
|
|
206
|
+
return Promise.all(reqs.map(req => new Promise<T>((resolve, reject) => {
|
|
207
|
+
req.onsuccess = (event: any) => resolve(event.target.result);
|
|
208
|
+
req.onerror = (event) => reject(event);
|
|
209
|
+
})));
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
private async executeTransactionWithCursor<T>(
|
|
213
|
+
cbk: (tx: IDBObjectStore) => IDBRequest<IDBCursorWithValue | null>[],
|
|
214
|
+
valueCbk: (value: T) => boolean
|
|
215
|
+
): Promise<T[]> {
|
|
216
|
+
if(this.db==null) throw new Error("Not initiated, call init() first!");
|
|
217
|
+
const tx = this.db.transaction("swaps", "readonly", {durability: "strict"});
|
|
218
|
+
const cursorRequests = cbk(tx.objectStore("swaps"));
|
|
219
|
+
|
|
220
|
+
const promises = cursorRequests.map(
|
|
221
|
+
cursorRequest => new Promise<T[]>(
|
|
222
|
+
(resolve, reject) => {
|
|
223
|
+
const resultObjects: T[] = [];
|
|
224
|
+
cursorRequest.onsuccess = (event: any) => {
|
|
225
|
+
const cursor = event.target.result;
|
|
226
|
+
if(cursor!=null) {
|
|
227
|
+
const value = cursor.value;
|
|
228
|
+
if(valueCbk(value)) resultObjects.push(value);
|
|
229
|
+
cursor.continue();
|
|
230
|
+
} else {
|
|
231
|
+
resolve(resultObjects);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
cursorRequest.onerror = (event) => reject(event);
|
|
235
|
+
}
|
|
236
|
+
)
|
|
237
|
+
);
|
|
238
|
+
|
|
239
|
+
const result = await Promise.all(promises);
|
|
240
|
+
return result.flat();
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* @inheritDoc
|
|
245
|
+
*/
|
|
246
|
+
async init(): Promise<void> {
|
|
247
|
+
if(this.db==null) {
|
|
248
|
+
this.db = await new Promise<IDBDatabase>((resolve, reject) => {
|
|
249
|
+
const request = window.indexedDB.open(this.storageKey, 1);
|
|
250
|
+
request.onupgradeneeded = (event: any) => {
|
|
251
|
+
const db: IDBDatabase = event.target.result;
|
|
252
|
+
const objectStore = db.createObjectStore("swaps", { keyPath: "id" });
|
|
253
|
+
|
|
254
|
+
Object.keys(indexes).forEach(name => {
|
|
255
|
+
const index = indexes[name];
|
|
256
|
+
objectStore.createIndex(name, index.key, {unique: index.unique});
|
|
257
|
+
})
|
|
258
|
+
};
|
|
259
|
+
request.onerror = (e) => reject(e);
|
|
260
|
+
request.onsuccess = (e: any) => resolve(e.target.result);
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* @inheritDoc
|
|
267
|
+
*/
|
|
268
|
+
async query(params: Array<Array<QueryParams>>): Promise<Array<UnifiedStoredObject>> {
|
|
269
|
+
if(params.length===0) return await this.querySingle([]);
|
|
270
|
+
const results = await Promise.all(params.map(singleParam => this.querySingle(singleParam)));
|
|
271
|
+
const resultSet = new Set(results.flat()); //Deduplicate
|
|
272
|
+
return Array.from(resultSet);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* @internal
|
|
277
|
+
*/
|
|
278
|
+
protected async querySingle(params: Array<QueryParams>): Promise<Array<UnifiedStoredObject>> {
|
|
279
|
+
if(params.length===0) {
|
|
280
|
+
return await this.executeTransaction((objectStore) => objectStore.getAll(), true);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
const queryKeys = params.map(param => param.key);
|
|
284
|
+
const requiredIndex = queryKeys.join(", ");
|
|
285
|
+
|
|
286
|
+
if(requiredIndex==="id") {
|
|
287
|
+
//ID is the index
|
|
288
|
+
const values: any[] = Array.isArray(params[0].value) ? params[0].value : [params[0].value];
|
|
289
|
+
const res = await this.executeTransactionArr((objectStore) => {
|
|
290
|
+
return values.map(val => objectStore.getAll(val));
|
|
291
|
+
}, true);
|
|
292
|
+
return res.flat();
|
|
293
|
+
} else if(indexes[requiredIndex]!=null) {
|
|
294
|
+
//Index exists
|
|
295
|
+
const values: Array<any[]> = params.map(param => Array.isArray(param.value) ? param.value : [param.value]);
|
|
296
|
+
const compositeIndexQueries = toCompositeIndex(values);
|
|
297
|
+
|
|
298
|
+
const resp = await this.executeTransactionArr(objectStore => {
|
|
299
|
+
const index = objectStore.index(requiredIndex);
|
|
300
|
+
return compositeIndexQueries.map(indexQuery => index.getAll(indexQuery));
|
|
301
|
+
}, true);
|
|
302
|
+
|
|
303
|
+
return resp.flat();
|
|
304
|
+
} else {
|
|
305
|
+
//Need to go over all values
|
|
306
|
+
this.logger.warn("query(): Index cannot be used for query, required index: "+requiredIndex+" query params: ", params);
|
|
307
|
+
|
|
308
|
+
const setConditions = toSetConditions(params);
|
|
309
|
+
return await this.executeTransactionWithCursor(
|
|
310
|
+
objectStore => [objectStore.openCursor()],
|
|
311
|
+
(val: any) => matches(setConditions, val)
|
|
312
|
+
);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* @inheritDoc
|
|
318
|
+
*/
|
|
319
|
+
async remove(object: UnifiedStoredObject): Promise<void> {
|
|
320
|
+
await this.executeTransaction<undefined>(store => store.delete(object.id), false)
|
|
321
|
+
.catch(() => null);
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* @inheritDoc
|
|
326
|
+
*/
|
|
327
|
+
async removeAll(arr: UnifiedStoredObject[]): Promise<void> {
|
|
328
|
+
if(arr.length===0) return;
|
|
329
|
+
await this.executeTransactionArr<undefined>(store => arr.map(object => {
|
|
330
|
+
return store.delete(object.id);
|
|
331
|
+
}), false);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* @inheritDoc
|
|
336
|
+
*/
|
|
337
|
+
async save(object: UnifiedStoredObject): Promise<void> {
|
|
338
|
+
await this.executeTransaction<IDBValidKey>(store => store.put(object), false);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* @inheritDoc
|
|
343
|
+
*/
|
|
344
|
+
async saveAll(arr: UnifiedStoredObject[]): Promise<void> {
|
|
345
|
+
if(arr.length===0) return;
|
|
346
|
+
await this.executeTransactionArr<IDBValidKey>(store => arr.map(object => {
|
|
347
|
+
return store.put(object);
|
|
348
|
+
}), false);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
351
|
}
|