crypto-aio 0.0.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +167 -0
- package/README.md +163 -13
- package/dist/adapters/avalanche/address.d.ts +15 -0
- package/dist/adapters/avalanche/address.js +74 -0
- package/dist/adapters/avalanche/address.js.map +1 -0
- package/dist/adapters/avalanche/api.d.ts +100 -0
- package/dist/adapters/avalanche/api.js +381 -0
- package/dist/adapters/avalanche/api.js.map +1 -0
- package/dist/adapters/avalanche/builder.d.ts +13 -0
- package/dist/adapters/avalanche/builder.js +336 -0
- package/dist/adapters/avalanche/builder.js.map +1 -0
- package/dist/adapters/avalanche/cb58.d.ts +7 -0
- package/dist/adapters/avalanche/cb58.js +49 -0
- package/dist/adapters/avalanche/cb58.js.map +1 -0
- package/dist/adapters/avalanche/chains.d.ts +21 -0
- package/dist/adapters/avalanche/chains.js +79 -0
- package/dist/adapters/avalanche/chains.js.map +1 -0
- package/dist/adapters/avalanche/codec.d.ts +94 -0
- package/dist/adapters/avalanche/codec.js +371 -0
- package/dist/adapters/avalanche/codec.js.map +1 -0
- package/dist/adapters/avalanche/context.d.ts +59 -0
- package/dist/adapters/avalanche/context.js +114 -0
- package/dist/adapters/avalanche/context.js.map +1 -0
- package/dist/adapters/avalanche/decode.d.ts +16 -0
- package/dist/adapters/avalanche/decode.js +101 -0
- package/dist/adapters/avalanche/decode.js.map +1 -0
- package/dist/adapters/avalanche/driver.d.ts +22 -0
- package/dist/adapters/avalanche/driver.js +81 -0
- package/dist/adapters/avalanche/driver.js.map +1 -0
- package/dist/adapters/avalanche/errors.d.ts +18 -0
- package/dist/adapters/avalanche/errors.js +61 -0
- package/dist/adapters/avalanche/errors.js.map +1 -0
- package/dist/adapters/avalanche/fees.d.ts +23 -0
- package/dist/adapters/avalanche/fees.js +105 -0
- package/dist/adapters/avalanche/fees.js.map +1 -0
- package/dist/adapters/avalanche/index.d.ts +19 -0
- package/dist/adapters/avalanche/index.js +8 -0
- package/dist/adapters/avalanche/index.js.map +1 -0
- package/dist/adapters/avalanche/network.d.ts +37 -0
- package/dist/adapters/avalanche/network.js +135 -0
- package/dist/adapters/avalanche/network.js.map +1 -0
- package/dist/adapters/avalanche/plugin.d.ts +21 -0
- package/dist/adapters/avalanche/plugin.js +46 -0
- package/dist/adapters/avalanche/plugin.js.map +1 -0
- package/dist/adapters/avalanche/presets.d.ts +6 -0
- package/dist/adapters/avalanche/presets.js +86 -0
- package/dist/adapters/avalanche/presets.js.map +1 -0
- package/dist/adapters/avalanche/proofs.d.ts +41 -0
- package/dist/adapters/avalanche/proofs.js +270 -0
- package/dist/adapters/avalanche/proofs.js.map +1 -0
- package/dist/adapters/avalanche/reader.d.ts +40 -0
- package/dist/adapters/avalanche/reader.js +231 -0
- package/dist/adapters/avalanche/reader.js.map +1 -0
- package/dist/adapters/avalanche/sdk.d.ts +182 -0
- package/dist/adapters/avalanche/sdk.js +21 -0
- package/dist/adapters/avalanche/sdk.js.map +1 -0
- package/dist/adapters/avalanche/types.d.ts +86 -0
- package/dist/{type/common.js → adapters/avalanche/types.js} +1 -1
- package/dist/adapters/avalanche/types.js.map +1 -0
- package/dist/adapters/evm/builder.d.ts +11 -0
- package/dist/adapters/evm/builder.js +386 -0
- package/dist/adapters/evm/builder.js.map +1 -0
- package/dist/adapters/evm/chains.d.ts +6 -0
- package/dist/adapters/evm/chains.js +203 -0
- package/dist/adapters/evm/chains.js.map +1 -0
- package/dist/adapters/evm/client.d.ts +84 -0
- package/dist/adapters/evm/client.js +335 -0
- package/dist/adapters/evm/client.js.map +1 -0
- package/dist/adapters/evm/decode.d.ts +35 -0
- package/dist/adapters/evm/decode.js +175 -0
- package/dist/adapters/evm/decode.js.map +1 -0
- package/dist/adapters/evm/driver.d.ts +8 -0
- package/dist/adapters/evm/driver.js +61 -0
- package/dist/adapters/evm/driver.js.map +1 -0
- package/dist/adapters/evm/errors.d.ts +20 -0
- package/dist/adapters/evm/errors.js +110 -0
- package/dist/adapters/evm/errors.js.map +1 -0
- package/dist/adapters/evm/ethers-client.d.ts +43 -0
- package/dist/adapters/evm/ethers-client.js +139 -0
- package/dist/adapters/evm/ethers-client.js.map +1 -0
- package/dist/adapters/evm/fees.d.ts +103 -0
- package/dist/adapters/evm/fees.js +277 -0
- package/dist/adapters/evm/fees.js.map +1 -0
- package/dist/adapters/evm/index.d.ts +20 -0
- package/dist/adapters/evm/index.js +12 -0
- package/dist/adapters/evm/index.js.map +1 -0
- package/dist/adapters/evm/network.d.ts +65 -0
- package/dist/adapters/evm/network.js +150 -0
- package/dist/adapters/evm/network.js.map +1 -0
- package/dist/adapters/evm/plugin.d.ts +35 -0
- package/dist/adapters/evm/plugin.js +150 -0
- package/dist/adapters/evm/plugin.js.map +1 -0
- package/dist/adapters/evm/presets.d.ts +2 -0
- package/dist/adapters/evm/presets.js +105 -0
- package/dist/adapters/evm/presets.js.map +1 -0
- package/dist/adapters/evm/proofs.d.ts +19 -0
- package/dist/adapters/evm/proofs.js +370 -0
- package/dist/adapters/evm/proofs.js.map +1 -0
- package/dist/adapters/evm/rawtx.d.ts +25 -0
- package/dist/adapters/evm/rawtx.js +176 -0
- package/dist/adapters/evm/rawtx.js.map +1 -0
- package/dist/adapters/evm/reader.d.ts +83 -0
- package/dist/adapters/evm/reader.js +326 -0
- package/dist/adapters/evm/reader.js.map +1 -0
- package/dist/adapters/evm/rpc.d.ts +39 -0
- package/dist/adapters/evm/rpc.js +152 -0
- package/dist/adapters/evm/rpc.js.map +1 -0
- package/dist/adapters/evm/tokens.d.ts +10 -0
- package/dist/adapters/evm/tokens.js +23 -0
- package/dist/adapters/evm/tokens.js.map +1 -0
- package/dist/adapters/evm/types.d.ts +265 -0
- package/dist/{type/account.js → adapters/evm/types.js} +1 -1
- package/dist/adapters/evm/types.js.map +1 -0
- package/dist/adapters/evm/web3-client.d.ts +26 -0
- package/dist/adapters/evm/web3-client.js +176 -0
- package/dist/adapters/evm/web3-client.js.map +1 -0
- package/dist/adapters/solana/builder.d.ts +18 -0
- package/dist/adapters/solana/builder.js +556 -0
- package/dist/adapters/solana/builder.js.map +1 -0
- package/dist/adapters/solana/chains.d.ts +13 -0
- package/dist/adapters/solana/chains.js +37 -0
- package/dist/adapters/solana/chains.js.map +1 -0
- package/dist/adapters/solana/decode.d.ts +111 -0
- package/dist/adapters/solana/decode.js +595 -0
- package/dist/adapters/solana/decode.js.map +1 -0
- package/dist/adapters/solana/driver.d.ts +15 -0
- package/dist/adapters/solana/driver.js +72 -0
- package/dist/adapters/solana/driver.js.map +1 -0
- package/dist/adapters/solana/errors.d.ts +36 -0
- package/dist/adapters/solana/errors.js +154 -0
- package/dist/adapters/solana/errors.js.map +1 -0
- package/dist/adapters/solana/fees.d.ts +77 -0
- package/dist/adapters/solana/fees.js +214 -0
- package/dist/adapters/solana/fees.js.map +1 -0
- package/dist/adapters/solana/heights.d.ts +47 -0
- package/dist/adapters/solana/heights.js +185 -0
- package/dist/adapters/solana/heights.js.map +1 -0
- package/dist/adapters/solana/history.d.ts +10 -0
- package/dist/adapters/solana/history.js +71 -0
- package/dist/adapters/solana/history.js.map +1 -0
- package/dist/adapters/solana/index.d.ts +16 -0
- package/dist/adapters/solana/index.js +9 -0
- package/dist/adapters/solana/index.js.map +1 -0
- package/dist/adapters/solana/keys.d.ts +13 -0
- package/dist/adapters/solana/keys.js +69 -0
- package/dist/adapters/solana/keys.js.map +1 -0
- package/dist/adapters/solana/message.d.ts +15 -0
- package/dist/adapters/solana/message.js +120 -0
- package/dist/adapters/solana/message.js.map +1 -0
- package/dist/adapters/solana/network.d.ts +24 -0
- package/dist/adapters/solana/network.js +95 -0
- package/dist/adapters/solana/network.js.map +1 -0
- package/dist/adapters/solana/plugin.d.ts +18 -0
- package/dist/adapters/solana/plugin.js +44 -0
- package/dist/adapters/solana/plugin.js.map +1 -0
- package/dist/adapters/solana/presets.d.ts +2 -0
- package/dist/adapters/solana/presets.js +77 -0
- package/dist/adapters/solana/presets.js.map +1 -0
- package/dist/adapters/solana/programs.d.ts +44 -0
- package/dist/adapters/solana/programs.js +159 -0
- package/dist/adapters/solana/programs.js.map +1 -0
- package/dist/adapters/solana/proofs.d.ts +56 -0
- package/dist/adapters/solana/proofs.js +540 -0
- package/dist/adapters/solana/proofs.js.map +1 -0
- package/dist/adapters/solana/reader.d.ts +82 -0
- package/dist/adapters/solana/reader.js +326 -0
- package/dist/adapters/solana/reader.js.map +1 -0
- package/dist/adapters/solana/rpc.d.ts +102 -0
- package/dist/adapters/solana/rpc.js +301 -0
- package/dist/adapters/solana/rpc.js.map +1 -0
- package/dist/adapters/solana/tokens.d.ts +7 -0
- package/dist/adapters/solana/tokens.js +19 -0
- package/dist/adapters/solana/tokens.js.map +1 -0
- package/dist/adapters/solana/types.d.ts +124 -0
- package/dist/{type/contract.js → adapters/solana/types.js} +1 -1
- package/dist/adapters/solana/types.js.map +1 -0
- package/dist/adapters/solana/web3.d.ts +5 -0
- package/dist/adapters/solana/web3.js +61 -0
- package/dist/adapters/solana/web3.js.map +1 -0
- package/dist/adapters/solana/wire.d.ts +62 -0
- package/dist/adapters/solana/wire.js +168 -0
- package/dist/adapters/solana/wire.js.map +1 -0
- package/dist/adapters/ton/address.d.ts +43 -0
- package/dist/adapters/ton/address.js +168 -0
- package/dist/adapters/ton/address.js.map +1 -0
- package/dist/adapters/ton/api.d.ts +344 -0
- package/dist/adapters/ton/api.js +942 -0
- package/dist/adapters/ton/api.js.map +1 -0
- package/dist/adapters/ton/builder.d.ts +18 -0
- package/dist/adapters/ton/builder.js +701 -0
- package/dist/adapters/ton/builder.js.map +1 -0
- package/dist/adapters/ton/chains.d.ts +16 -0
- package/dist/adapters/ton/chains.js +39 -0
- package/dist/adapters/ton/chains.js.map +1 -0
- package/dist/adapters/ton/decode.d.ts +43 -0
- package/dist/adapters/ton/decode.js +219 -0
- package/dist/adapters/ton/decode.js.map +1 -0
- package/dist/adapters/ton/driver.d.ts +10 -0
- package/dist/adapters/ton/driver.js +117 -0
- package/dist/adapters/ton/driver.js.map +1 -0
- package/dist/adapters/ton/errors.d.ts +36 -0
- package/dist/adapters/ton/errors.js +89 -0
- package/dist/adapters/ton/errors.js.map +1 -0
- package/dist/adapters/ton/fees.d.ts +28 -0
- package/dist/adapters/ton/fees.js +121 -0
- package/dist/adapters/ton/fees.js.map +1 -0
- package/dist/adapters/ton/index.d.ts +16 -0
- package/dist/adapters/ton/index.js +9 -0
- package/dist/adapters/ton/index.js.map +1 -0
- package/dist/adapters/ton/messages.d.ts +157 -0
- package/dist/adapters/ton/messages.js +397 -0
- package/dist/adapters/ton/messages.js.map +1 -0
- package/dist/adapters/ton/native-client.d.ts +10 -0
- package/dist/adapters/ton/native-client.js +47 -0
- package/dist/adapters/ton/native-client.js.map +1 -0
- package/dist/adapters/ton/network.d.ts +58 -0
- package/dist/adapters/ton/network.js +207 -0
- package/dist/adapters/ton/network.js.map +1 -0
- package/dist/adapters/ton/plugin.d.ts +24 -0
- package/dist/adapters/ton/plugin.js +57 -0
- package/dist/adapters/ton/plugin.js.map +1 -0
- package/dist/adapters/ton/presets.d.ts +6 -0
- package/dist/adapters/ton/presets.js +94 -0
- package/dist/adapters/ton/presets.js.map +1 -0
- package/dist/adapters/ton/proofs.d.ts +66 -0
- package/dist/adapters/ton/proofs.js +755 -0
- package/dist/adapters/ton/proofs.js.map +1 -0
- package/dist/adapters/ton/reader.d.ts +235 -0
- package/dist/adapters/ton/reader.js +976 -0
- package/dist/adapters/ton/reader.js.map +1 -0
- package/dist/adapters/ton/tokens.d.ts +10 -0
- package/dist/adapters/ton/tokens.js +27 -0
- package/dist/adapters/ton/tokens.js.map +1 -0
- package/dist/adapters/ton/trace.d.ts +74 -0
- package/dist/adapters/ton/trace.js +303 -0
- package/dist/adapters/ton/trace.js.map +1 -0
- package/dist/adapters/ton/types.d.ts +105 -0
- package/dist/{type/transact.js → adapters/ton/types.js} +1 -1
- package/dist/adapters/ton/types.js.map +1 -0
- package/dist/adapters/ton/wallets.d.ts +86 -0
- package/dist/adapters/ton/wallets.js +373 -0
- package/dist/adapters/ton/wallets.js.map +1 -0
- package/dist/adapters/tron/abi.d.ts +41 -0
- package/dist/adapters/tron/abi.js +112 -0
- package/dist/adapters/tron/abi.js.map +1 -0
- package/dist/adapters/tron/address.d.ts +20 -0
- package/dist/adapters/tron/address.js +110 -0
- package/dist/adapters/tron/address.js.map +1 -0
- package/dist/adapters/tron/builder.d.ts +12 -0
- package/dist/adapters/tron/builder.js +569 -0
- package/dist/adapters/tron/builder.js.map +1 -0
- package/dist/adapters/tron/chains.d.ts +12 -0
- package/dist/adapters/tron/chains.js +35 -0
- package/dist/adapters/tron/chains.js.map +1 -0
- package/dist/adapters/tron/codec.d.ts +10 -0
- package/dist/adapters/tron/codec.js +322 -0
- package/dist/adapters/tron/codec.js.map +1 -0
- package/dist/adapters/tron/decode.d.ts +52 -0
- package/dist/adapters/tron/decode.js +280 -0
- package/dist/adapters/tron/decode.js.map +1 -0
- package/dist/adapters/tron/driver.d.ts +12 -0
- package/dist/adapters/tron/driver.js +106 -0
- package/dist/adapters/tron/driver.js.map +1 -0
- package/dist/adapters/tron/errors.d.ts +74 -0
- package/dist/adapters/tron/errors.js +261 -0
- package/dist/adapters/tron/errors.js.map +1 -0
- package/dist/adapters/tron/fees.d.ts +49 -0
- package/dist/adapters/tron/fees.js +166 -0
- package/dist/adapters/tron/fees.js.map +1 -0
- package/dist/adapters/tron/http.d.ts +173 -0
- package/dist/adapters/tron/http.js +729 -0
- package/dist/adapters/tron/http.js.map +1 -0
- package/dist/adapters/tron/index.d.ts +16 -0
- package/dist/adapters/tron/index.js +15 -0
- package/dist/adapters/tron/index.js.map +1 -0
- package/dist/adapters/tron/network.d.ts +44 -0
- package/dist/adapters/tron/network.js +163 -0
- package/dist/adapters/tron/network.js.map +1 -0
- package/dist/adapters/tron/plugin.d.ts +17 -0
- package/dist/adapters/tron/plugin.js +39 -0
- package/dist/adapters/tron/plugin.js.map +1 -0
- package/dist/adapters/tron/presets.d.ts +5 -0
- package/dist/adapters/tron/presets.js +68 -0
- package/dist/adapters/tron/presets.js.map +1 -0
- package/dist/adapters/tron/proofs.d.ts +80 -0
- package/dist/adapters/tron/proofs.js +371 -0
- package/dist/adapters/tron/proofs.js.map +1 -0
- package/dist/adapters/tron/protobuf.d.ts +36 -0
- package/dist/adapters/tron/protobuf.js +90 -0
- package/dist/adapters/tron/protobuf.js.map +1 -0
- package/dist/adapters/tron/reader.d.ts +57 -0
- package/dist/adapters/tron/reader.js +220 -0
- package/dist/adapters/tron/reader.js.map +1 -0
- package/dist/adapters/tron/tokens.d.ts +9 -0
- package/dist/adapters/tron/tokens.js +14 -0
- package/dist/adapters/tron/tokens.js.map +1 -0
- package/dist/adapters/tron/types.d.ts +166 -0
- package/dist/adapters/tron/types.js +3 -0
- package/dist/adapters/tron/types.js.map +1 -0
- package/dist/adapters/utxo/address.d.ts +51 -0
- package/dist/adapters/utxo/address.js +341 -0
- package/dist/adapters/utxo/address.js.map +1 -0
- package/dist/adapters/utxo/builder.d.ts +35 -0
- package/dist/adapters/utxo/builder.js +380 -0
- package/dist/adapters/utxo/builder.js.map +1 -0
- package/dist/adapters/utxo/chains.d.ts +17 -0
- package/dist/adapters/utxo/chains.js +100 -0
- package/dist/adapters/utxo/chains.js.map +1 -0
- package/dist/adapters/utxo/codec.d.ts +120 -0
- package/dist/adapters/utxo/codec.js +408 -0
- package/dist/adapters/utxo/codec.js.map +1 -0
- package/dist/adapters/utxo/coinselect.d.ts +48 -0
- package/dist/adapters/utxo/coinselect.js +131 -0
- package/dist/adapters/utxo/coinselect.js.map +1 -0
- package/dist/adapters/utxo/context.d.ts +63 -0
- package/dist/adapters/utxo/context.js +125 -0
- package/dist/adapters/utxo/context.js.map +1 -0
- package/dist/adapters/utxo/decode.d.ts +22 -0
- package/dist/adapters/utxo/decode.js +121 -0
- package/dist/adapters/utxo/decode.js.map +1 -0
- package/dist/adapters/utxo/driver.d.ts +16 -0
- package/dist/adapters/utxo/driver.js +79 -0
- package/dist/adapters/utxo/driver.js.map +1 -0
- package/dist/adapters/utxo/ecc.d.ts +9 -0
- package/dist/adapters/utxo/ecc.js +26 -0
- package/dist/adapters/utxo/ecc.js.map +1 -0
- package/dist/adapters/utxo/errors.d.ts +52 -0
- package/dist/adapters/utxo/errors.js +191 -0
- package/dist/adapters/utxo/errors.js.map +1 -0
- package/dist/adapters/utxo/esplora.d.ts +100 -0
- package/dist/adapters/utxo/esplora.js +498 -0
- package/dist/adapters/utxo/esplora.js.map +1 -0
- package/dist/adapters/utxo/fees.d.ts +41 -0
- package/dist/adapters/utxo/fees.js +125 -0
- package/dist/adapters/utxo/fees.js.map +1 -0
- package/dist/adapters/utxo/index.d.ts +17 -0
- package/dist/adapters/utxo/index.js +8 -0
- package/dist/adapters/utxo/index.js.map +1 -0
- package/dist/adapters/utxo/network.d.ts +50 -0
- package/dist/adapters/utxo/network.js +165 -0
- package/dist/adapters/utxo/network.js.map +1 -0
- package/dist/adapters/utxo/plugin.d.ts +17 -0
- package/dist/adapters/utxo/plugin.js +41 -0
- package/dist/adapters/utxo/plugin.js.map +1 -0
- package/dist/adapters/utxo/presets.d.ts +12 -0
- package/dist/adapters/utxo/presets.js +47 -0
- package/dist/adapters/utxo/presets.js.map +1 -0
- package/dist/adapters/utxo/preview.d.ts +3 -0
- package/dist/adapters/utxo/preview.js +65 -0
- package/dist/adapters/utxo/preview.js.map +1 -0
- package/dist/adapters/utxo/proofs.d.ts +66 -0
- package/dist/adapters/utxo/proofs.js +469 -0
- package/dist/adapters/utxo/proofs.js.map +1 -0
- package/dist/adapters/utxo/rawblock.d.ts +46 -0
- package/dist/adapters/utxo/rawblock.js +159 -0
- package/dist/adapters/utxo/rawblock.js.map +1 -0
- package/dist/adapters/utxo/rawtx.d.ts +73 -0
- package/dist/adapters/utxo/rawtx.js +264 -0
- package/dist/adapters/utxo/rawtx.js.map +1 -0
- package/dist/adapters/utxo/reader.d.ts +36 -0
- package/dist/adapters/utxo/reader.js +265 -0
- package/dist/adapters/utxo/reader.js.map +1 -0
- package/dist/adapters/utxo/sdk.d.ts +18 -0
- package/dist/adapters/utxo/sdk.js +17 -0
- package/dist/adapters/utxo/sdk.js.map +1 -0
- package/dist/adapters/utxo/signed-psbt.d.ts +36 -0
- package/dist/adapters/utxo/signed-psbt.js +428 -0
- package/dist/adapters/utxo/signed-psbt.js.map +1 -0
- package/dist/adapters/utxo/spend.d.ts +59 -0
- package/dist/adapters/utxo/spend.js +230 -0
- package/dist/adapters/utxo/spend.js.map +1 -0
- package/dist/adapters/utxo/types.d.ts +167 -0
- package/dist/adapters/utxo/types.js +3 -0
- package/dist/adapters/utxo/types.js.map +1 -0
- package/dist/core/assets/service.d.ts +18 -0
- package/dist/core/assets/service.js +69 -0
- package/dist/core/assets/service.js.map +1 -0
- package/dist/core/blockchain/default-ref.d.ts +4 -0
- package/dist/core/blockchain/default-ref.js +16 -0
- package/dist/core/blockchain/default-ref.js.map +1 -0
- package/dist/core/blockchain/handle.d.ts +179 -0
- package/dist/core/blockchain/handle.js +579 -0
- package/dist/core/blockchain/handle.js.map +1 -0
- package/dist/core/blockchain/internal.d.ts +19 -0
- package/dist/core/blockchain/internal.js +16 -0
- package/dist/core/blockchain/internal.js.map +1 -0
- package/dist/core/blockchain/mapping.d.ts +22 -0
- package/dist/core/blockchain/mapping.js +136 -0
- package/dist/core/blockchain/mapping.js.map +1 -0
- package/dist/core/config/env.d.ts +8 -0
- package/dist/core/config/env.js +60 -0
- package/dist/core/config/env.js.map +1 -0
- package/dist/core/config/merge.d.ts +26 -0
- package/dist/core/config/merge.js +144 -0
- package/dist/core/config/merge.js.map +1 -0
- package/dist/core/config/resolve.d.ts +12 -0
- package/dist/core/config/resolve.js +251 -0
- package/dist/core/config/resolve.js.map +1 -0
- package/dist/core/config/types.d.ts +180 -0
- package/dist/core/config/types.js +3 -0
- package/dist/core/config/types.js.map +1 -0
- package/dist/core/container/builtins.d.ts +4 -0
- package/dist/core/container/builtins.js +13 -0
- package/dist/core/container/builtins.js.map +1 -0
- package/dist/core/container/container.d.ts +62 -0
- package/dist/core/container/container.js +500 -0
- package/dist/core/container/container.js.map +1 -0
- package/dist/core/container/default.d.ts +15 -0
- package/dist/core/container/default.js +70 -0
- package/dist/core/container/default.js.map +1 -0
- package/dist/core/container/internals.d.ts +54 -0
- package/dist/core/container/internals.js +21 -0
- package/dist/core/container/internals.js.map +1 -0
- package/dist/core/container/pool.d.ts +27 -0
- package/dist/core/container/pool.js +77 -0
- package/dist/core/container/pool.js.map +1 -0
- package/dist/core/driver/types.d.ts +379 -0
- package/dist/core/driver/types.js +3 -0
- package/dist/core/driver/types.js.map +1 -0
- package/dist/core/errors/codes.d.ts +163 -0
- package/dist/core/errors/codes.js +53 -0
- package/dist/core/errors/codes.js.map +1 -0
- package/dist/core/errors/error.d.ts +66 -0
- package/dist/core/errors/error.js +129 -0
- package/dist/core/errors/error.js.map +1 -0
- package/dist/core/events/bus.d.ts +12 -0
- package/dist/core/events/bus.js +46 -0
- package/dist/core/events/bus.js.map +1 -0
- package/dist/core/events/logger.d.ts +13 -0
- package/dist/core/events/logger.js +42 -0
- package/dist/core/events/logger.js.map +1 -0
- package/dist/core/events/types.d.ts +131 -0
- package/dist/core/events/types.js +3 -0
- package/dist/core/events/types.js.map +1 -0
- package/dist/core/lifecycle/engine-rules.d.ts +106 -0
- package/dist/core/lifecycle/engine-rules.js +267 -0
- package/dist/core/lifecycle/engine-rules.js.map +1 -0
- package/dist/core/lifecycle/engine.d.ts +502 -0
- package/dist/core/lifecycle/engine.js +1750 -0
- package/dist/core/lifecycle/engine.js.map +1 -0
- package/dist/core/lifecycle/evaluate.d.ts +19 -0
- package/dist/core/lifecycle/evaluate.js +77 -0
- package/dist/core/lifecycle/evaluate.js.map +1 -0
- package/dist/core/lifecycle/intent.d.ts +11 -0
- package/dist/core/lifecycle/intent.js +88 -0
- package/dist/core/lifecycle/intent.js.map +1 -0
- package/dist/core/lifecycle/monitor.d.ts +138 -0
- package/dist/core/lifecycle/monitor.js +616 -0
- package/dist/core/lifecycle/monitor.js.map +1 -0
- package/dist/core/lifecycle/observations.d.ts +17 -0
- package/dist/core/lifecycle/observations.js +59 -0
- package/dist/core/lifecycle/observations.js.map +1 -0
- package/dist/core/lifecycle/reconcile.d.ts +58 -0
- package/dist/core/lifecycle/reconcile.js +112 -0
- package/dist/core/lifecycle/reconcile.js.map +1 -0
- package/dist/core/lifecycle/views.d.ts +49 -0
- package/dist/core/lifecycle/views.js +57 -0
- package/dist/core/lifecycle/views.js.map +1 -0
- package/dist/core/lifecycle/workers.d.ts +88 -0
- package/dist/core/lifecycle/workers.js +347 -0
- package/dist/core/lifecycle/workers.js.map +1 -0
- package/dist/core/model/address.d.ts +32 -0
- package/dist/core/model/address.js +43 -0
- package/dist/core/model/address.js.map +1 -0
- package/dist/core/model/amount.d.ts +25 -0
- package/dist/core/model/amount.js +102 -0
- package/dist/core/model/amount.js.map +1 -0
- package/dist/core/model/asset.d.ts +28 -0
- package/dist/core/model/asset.js +47 -0
- package/dist/core/model/asset.js.map +1 -0
- package/dist/core/model/capability.d.ts +3 -0
- package/dist/core/model/capability.js +18 -0
- package/dist/core/model/capability.js.map +1 -0
- package/dist/core/model/chain.d.ts +63 -0
- package/dist/core/model/chain.js +8 -0
- package/dist/core/model/chain.js.map +1 -0
- package/dist/core/model/fee.d.ts +36 -0
- package/dist/core/model/fee.js +17 -0
- package/dist/core/model/fee.js.map +1 -0
- package/dist/core/model/ids.d.ts +38 -0
- package/dist/core/model/ids.js +14 -0
- package/dist/core/model/ids.js.map +1 -0
- package/dist/core/model/intent.d.ts +63 -0
- package/dist/core/model/intent.js +81 -0
- package/dist/core/model/intent.js.map +1 -0
- package/dist/core/model/ordering.d.ts +28 -0
- package/dist/core/model/ordering.js +29 -0
- package/dist/core/model/ordering.js.map +1 -0
- package/dist/core/model/transaction.d.ts +123 -0
- package/dist/{type/lib-types.js → core/model/transaction.js} +1 -1
- package/dist/core/model/transaction.js.map +1 -0
- package/dist/core/observe/scanner.d.ts +135 -0
- package/dist/core/observe/scanner.js +358 -0
- package/dist/core/observe/scanner.js.map +1 -0
- package/dist/core/ordering/reservations.d.ts +16 -0
- package/dist/core/ordering/reservations.js +53 -0
- package/dist/core/ordering/reservations.js.map +1 -0
- package/dist/core/ordering/sequence.d.ts +61 -0
- package/dist/core/ordering/sequence.js +155 -0
- package/dist/core/ordering/sequence.js.map +1 -0
- package/dist/core/registry/adapters.d.ts +10 -0
- package/dist/core/registry/adapters.js +56 -0
- package/dist/core/registry/adapters.js.map +1 -0
- package/dist/core/registry/assets.d.ts +18 -0
- package/dist/core/registry/assets.js +90 -0
- package/dist/core/registry/assets.js.map +1 -0
- package/dist/core/registry/chains.d.ts +10 -0
- package/dist/core/registry/chains.js +80 -0
- package/dist/core/registry/chains.js.map +1 -0
- package/dist/core/registry/plugin.d.ts +41 -0
- package/dist/core/registry/plugin.js +109 -0
- package/dist/core/registry/plugin.js.map +1 -0
- package/dist/core/registry/providers.d.ts +31 -0
- package/dist/core/registry/providers.js +43 -0
- package/dist/core/registry/providers.js.map +1 -0
- package/dist/core/registry/schemes.d.ts +30 -0
- package/dist/core/registry/schemes.js +84 -0
- package/dist/core/registry/schemes.js.map +1 -0
- package/dist/core/secret/fragments.d.ts +33 -0
- package/dist/core/secret/fragments.js +110 -0
- package/dist/core/secret/fragments.js.map +1 -0
- package/dist/core/secret/redact.d.ts +10 -0
- package/dist/core/secret/redact.js +110 -0
- package/dist/core/secret/redact.js.map +1 -0
- package/dist/core/secret/secret.d.ts +14 -0
- package/dist/core/secret/secret.js +42 -0
- package/dist/core/secret/secret.js.map +1 -0
- package/dist/core/signing/callback.d.ts +10 -0
- package/dist/core/signing/callback.js +22 -0
- package/dist/core/signing/callback.js.map +1 -0
- package/dist/core/signing/guard.d.ts +18 -0
- package/dist/core/signing/guard.js +72 -0
- package/dist/core/signing/guard.js.map +1 -0
- package/dist/core/signing/hd.d.ts +36 -0
- package/dist/core/signing/hd.js +167 -0
- package/dist/core/signing/hd.js.map +1 -0
- package/dist/core/signing/local.d.ts +48 -0
- package/dist/core/signing/local.js +190 -0
- package/dist/core/signing/local.js.map +1 -0
- package/dist/core/signing/orchestrator.d.ts +40 -0
- package/dist/core/signing/orchestrator.js +300 -0
- package/dist/core/signing/orchestrator.js.map +1 -0
- package/dist/core/signing/types.d.ts +64 -0
- package/dist/core/signing/types.js +3 -0
- package/dist/core/signing/types.js.map +1 -0
- package/dist/core/signing/wallet.d.ts +48 -0
- package/dist/core/signing/wallet.js +161 -0
- package/dist/core/signing/wallet.js.map +1 -0
- package/dist/core/store/clone.d.ts +25 -0
- package/dist/core/store/clone.js +71 -0
- package/dist/core/store/clone.js.map +1 -0
- package/dist/core/store/format.d.ts +20 -0
- package/dist/core/store/format.js +86 -0
- package/dist/core/store/format.js.map +1 -0
- package/dist/core/store/memory.d.ts +38 -0
- package/dist/core/store/memory.js +325 -0
- package/dist/core/store/memory.js.map +1 -0
- package/dist/core/store/types.d.ts +258 -0
- package/dist/core/store/types.js +119 -0
- package/dist/core/store/types.js.map +1 -0
- package/dist/core/transport/backoff.d.ts +8 -0
- package/dist/core/transport/backoff.js +27 -0
- package/dist/core/transport/backoff.js.map +1 -0
- package/dist/core/transport/circuit.d.ts +25 -0
- package/dist/core/transport/circuit.js +61 -0
- package/dist/core/transport/circuit.js.map +1 -0
- package/dist/core/transport/http-transport.d.ts +30 -0
- package/dist/core/transport/http-transport.js +1703 -0
- package/dist/core/transport/http-transport.js.map +1 -0
- package/dist/core/transport/rate-limit.d.ts +27 -0
- package/dist/core/transport/rate-limit.js +78 -0
- package/dist/core/transport/rate-limit.js.map +1 -0
- package/dist/core/transport/stale-view.d.ts +11 -0
- package/dist/core/transport/stale-view.js +17 -0
- package/dist/core/transport/stale-view.js.map +1 -0
- package/dist/core/transport/types.d.ts +159 -0
- package/dist/core/transport/types.js +6 -0
- package/dist/core/transport/types.js.map +1 -0
- package/dist/core/util/bytes.d.ts +9 -0
- package/dist/core/util/bytes.js +40 -0
- package/dist/core/util/bytes.js.map +1 -0
- package/dist/core/util/clock.d.ts +6 -0
- package/dist/core/util/clock.js +26 -0
- package/dist/core/util/clock.js.map +1 -0
- package/dist/core/util/freeze.d.ts +8 -0
- package/dist/core/util/freeze.js +31 -0
- package/dist/core/util/freeze.js.map +1 -0
- package/dist/core/util/json.d.ts +35 -0
- package/dist/core/util/json.js +174 -0
- package/dist/core/util/json.js.map +1 -0
- package/dist/core/util/names.d.ts +27 -0
- package/dist/core/util/names.js +56 -0
- package/dist/core/util/names.js.map +1 -0
- package/dist/index.d.ts +65 -14
- package/dist/index.js +107 -49
- package/dist/index.js.map +1 -1
- package/dist/native.d.ts +21 -0
- package/dist/native.js +44 -0
- package/dist/native.js.map +1 -0
- package/dist/testing/contracts/api.d.ts +12 -0
- package/dist/testing/contracts/api.js +58 -0
- package/dist/testing/contracts/api.js.map +1 -0
- package/dist/testing/contracts/cursors.d.ts +6 -0
- package/dist/testing/contracts/cursors.js +43 -0
- package/dist/testing/contracts/cursors.js.map +1 -0
- package/dist/testing/contracts/locks.d.ts +10 -0
- package/dist/testing/contracts/locks.js +63 -0
- package/dist/testing/contracts/locks.js.map +1 -0
- package/dist/testing/contracts/operations.d.ts +21 -0
- package/dist/testing/contracts/operations.js +737 -0
- package/dist/testing/contracts/operations.js.map +1 -0
- package/dist/testing/contracts/sequences.d.ts +6 -0
- package/dist/testing/contracts/sequences.js +68 -0
- package/dist/testing/contracts/sequences.js.map +1 -0
- package/dist/testing/env.d.ts +68 -0
- package/dist/testing/env.js +105 -0
- package/dist/testing/env.js.map +1 -0
- package/dist/testing/fake-chain.d.ts +118 -0
- package/dist/testing/fake-chain.js +536 -0
- package/dist/testing/fake-chain.js.map +1 -0
- package/dist/testing/fake-clock.d.ts +15 -0
- package/dist/testing/fake-clock.js +86 -0
- package/dist/testing/fake-clock.js.map +1 -0
- package/dist/testing/fake-driver.d.ts +15 -0
- package/dist/testing/fake-driver.js +458 -0
- package/dist/testing/fake-driver.js.map +1 -0
- package/dist/testing/fake-fetch.d.ts +32 -0
- package/dist/testing/fake-fetch.js +81 -0
- package/dist/testing/fake-fetch.js.map +1 -0
- package/dist/testing/fake-plugin.d.ts +30 -0
- package/dist/testing/fake-plugin.js +66 -0
- package/dist/testing/fake-plugin.js.map +1 -0
- package/dist/testing/faulty-store.d.ts +38 -0
- package/dist/testing/faulty-store.js +71 -0
- package/dist/testing/faulty-store.js.map +1 -0
- package/dist/testing/generation.d.ts +60 -0
- package/dist/testing/generation.js +252 -0
- package/dist/testing/generation.js.map +1 -0
- package/dist/testing/index.d.ts +28 -0
- package/dist/testing/index.js +51 -0
- package/dist/testing/index.js.map +1 -0
- package/package.json +198 -45
- package/dist/libs/eth/account.d.ts +0 -9
- package/dist/libs/eth/account.js +0 -58
- package/dist/libs/eth/account.js.map +0 -1
- package/dist/libs/eth/contract.d.ts +0 -7
- package/dist/libs/eth/contract.js +0 -42
- package/dist/libs/eth/contract.js.map +0 -1
- package/dist/libs/eth/index.d.ts +0 -24
- package/dist/libs/eth/index.js +0 -72
- package/dist/libs/eth/index.js.map +0 -1
- package/dist/libs/eth/transact.d.ts +0 -7
- package/dist/libs/eth/transact.js +0 -26
- package/dist/libs/eth/transact.js.map +0 -1
- package/dist/libs/index.d.ts +0 -2
- package/dist/libs/index.js +0 -19
- package/dist/libs/index.js.map +0 -1
- package/dist/libs/trx/account.d.ts +0 -9
- package/dist/libs/trx/account.js +0 -55
- package/dist/libs/trx/account.js.map +0 -1
- package/dist/libs/trx/contract.d.ts +0 -7
- package/dist/libs/trx/contract.js +0 -27
- package/dist/libs/trx/contract.js.map +0 -1
- package/dist/libs/trx/index.d.ts +0 -22
- package/dist/libs/trx/index.js +0 -64
- package/dist/libs/trx/index.js.map +0 -1
- package/dist/libs/trx/transact.d.ts +0 -7
- package/dist/libs/trx/transact.js +0 -26
- package/dist/libs/trx/transact.js.map +0 -1
- package/dist/tool/common.d.ts +0 -28
- package/dist/tool/common.js +0 -33
- package/dist/tool/common.js.map +0 -1
- package/dist/tool/eth-tools.d.ts +0 -3
- package/dist/tool/eth-tools.js +0 -33
- package/dist/tool/eth-tools.js.map +0 -1
- package/dist/tool/index.d.ts +0 -5
- package/dist/tool/index.js +0 -22
- package/dist/tool/index.js.map +0 -1
- package/dist/tool/logging.d.ts +0 -3
- package/dist/tool/logging.js +0 -11
- package/dist/tool/logging.js.map +0 -1
- package/dist/tool/options.d.ts +0 -6
- package/dist/tool/options.js +0 -41
- package/dist/tool/options.js.map +0 -1
- package/dist/tool/trx-tools.d.ts +0 -3
- package/dist/tool/trx-tools.js +0 -20
- package/dist/tool/trx-tools.js.map +0 -1
- package/dist/type/account.d.ts +0 -9
- package/dist/type/account.js.map +0 -1
- package/dist/type/common.d.ts +0 -18
- package/dist/type/common.js.map +0 -1
- package/dist/type/contract.d.ts +0 -10
- package/dist/type/contract.js.map +0 -1
- package/dist/type/index.d.ts +0 -5
- package/dist/type/index.js +0 -22
- package/dist/type/index.js.map +0 -1
- package/dist/type/lib-types.d.ts +0 -9
- package/dist/type/lib-types.js.map +0 -1
- package/dist/type/transact.d.ts +0 -7
- package/dist/type/transact.js.map +0 -1
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type Clock } from '../util/clock';
|
|
2
|
+
import type { AttemptObservation, AttemptRecord, CreateResult, CursorStore, Fence, Lease, LockManager, NewOperation, OperationFilter, OperationPatch, OperationRecord, OperationStore, ScanCursor, SequenceState, SequenceStore, Stores, StoredCursor } from './types';
|
|
3
|
+
export declare class MemoryLockManager implements LockManager {
|
|
4
|
+
#private;
|
|
5
|
+
private readonly clock;
|
|
6
|
+
constructor(clock?: Clock);
|
|
7
|
+
acquire(key: string, owner: string, ttlMs: number): Promise<Lease | null>;
|
|
8
|
+
renew(lease: Lease, ttlMs: number): Promise<Lease | null>;
|
|
9
|
+
release(lease: Lease): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
export declare class MemorySequenceStore implements SequenceStore {
|
|
12
|
+
#private;
|
|
13
|
+
get(key: string): Promise<SequenceState | null>;
|
|
14
|
+
put(key: string, state: Omit<SequenceState, 'version'>, expectedVersion: number | null): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
export declare class MemoryCursorStore implements CursorStore {
|
|
17
|
+
#private;
|
|
18
|
+
get(key: string): Promise<StoredCursor | null>;
|
|
19
|
+
put(key: string, cursor: ScanCursor, expectedVersion: number | null): Promise<number>;
|
|
20
|
+
}
|
|
21
|
+
export declare class MemoryOperationStore implements OperationStore {
|
|
22
|
+
#private;
|
|
23
|
+
private readonly clock;
|
|
24
|
+
constructor(clock?: Clock);
|
|
25
|
+
create(operation: NewOperation): Promise<CreateResult>;
|
|
26
|
+
get(namespace: string, id: string): Promise<OperationRecord | null>;
|
|
27
|
+
getByKey(namespace: string, idempotencyKey: string): Promise<OperationRecord | null>;
|
|
28
|
+
findByRef(namespace: string, refOrTxHash: string): Promise<OperationRecord | null>;
|
|
29
|
+
update(namespace: string, id: string, patch: OperationPatch, expectedVersion: number, fence?: Fence): Promise<OperationRecord>;
|
|
30
|
+
appendAttempt(namespace: string, id: string, attempt: AttemptRecord, patch: OperationPatch, expectedVersion: number, fence?: Fence): Promise<OperationRecord>;
|
|
31
|
+
getObservation(attemptId: string): Promise<AttemptObservation | null>;
|
|
32
|
+
putObservation(observation: Omit<AttemptObservation, 'version'>, expectedVersion: number | null): Promise<AttemptObservation>;
|
|
33
|
+
claimDue(namespace: string, workerId: string, now: number, leaseMs: number, limit: number): Promise<OperationRecord[]>;
|
|
34
|
+
releaseClaim(namespace: string, id: string, fence: Fence): Promise<void>;
|
|
35
|
+
list(filter: OperationFilter): Promise<OperationRecord[]>;
|
|
36
|
+
purge(filter: OperationFilter): Promise<number>;
|
|
37
|
+
}
|
|
38
|
+
export declare function createMemoryStores(clock?: Clock): Stores;
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MemoryOperationStore = exports.MemoryCursorStore = exports.MemorySequenceStore = exports.MemoryLockManager = void 0;
|
|
4
|
+
exports.createMemoryStores = createMemoryStores;
|
|
5
|
+
const error_1 = require("../errors/error");
|
|
6
|
+
const clock_1 = require("../util/clock");
|
|
7
|
+
const clone_1 = require("./clone");
|
|
8
|
+
const types_1 = require("./types");
|
|
9
|
+
class MemoryLockManager {
|
|
10
|
+
clock;
|
|
11
|
+
#held = new Map();
|
|
12
|
+
#tokens = new Map();
|
|
13
|
+
constructor(clock = clock_1.systemClock) {
|
|
14
|
+
this.clock = clock;
|
|
15
|
+
}
|
|
16
|
+
async acquire(key, owner, ttlMs) {
|
|
17
|
+
const now = this.clock.now();
|
|
18
|
+
const current = this.#held.get(key);
|
|
19
|
+
if (current && current.expiresAt > now)
|
|
20
|
+
return null;
|
|
21
|
+
const token = (this.#tokens.get(key) ?? 0n) + 1n;
|
|
22
|
+
this.#tokens.set(key, token);
|
|
23
|
+
const lease = Object.freeze({ key, owner, token, expiresAt: now + ttlMs });
|
|
24
|
+
this.#held.set(key, lease);
|
|
25
|
+
return lease;
|
|
26
|
+
}
|
|
27
|
+
async renew(lease, ttlMs) {
|
|
28
|
+
const now = this.clock.now();
|
|
29
|
+
const current = this.#held.get(lease.key);
|
|
30
|
+
if (!current || current.token !== lease.token || current.owner !== lease.owner)
|
|
31
|
+
return null;
|
|
32
|
+
if (current.expiresAt <= now)
|
|
33
|
+
return null;
|
|
34
|
+
const renewed = Object.freeze({ ...current, expiresAt: now + ttlMs });
|
|
35
|
+
this.#held.set(lease.key, renewed);
|
|
36
|
+
return renewed;
|
|
37
|
+
}
|
|
38
|
+
async release(lease) {
|
|
39
|
+
const current = this.#held.get(lease.key);
|
|
40
|
+
if (current && current.token === lease.token && current.owner === lease.owner) {
|
|
41
|
+
this.#held.delete(lease.key);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.MemoryLockManager = MemoryLockManager;
|
|
46
|
+
// Sequence and cursor error messages omit the key: it embeds a wallet address, and
|
|
47
|
+
// error messages reach logs.
|
|
48
|
+
class MemorySequenceStore {
|
|
49
|
+
#states = new Map();
|
|
50
|
+
async get(key) {
|
|
51
|
+
const state = this.#states.get(key);
|
|
52
|
+
return state ? (0, clone_1.clone)(state) : null;
|
|
53
|
+
}
|
|
54
|
+
async put(key, state, expectedVersion) {
|
|
55
|
+
const current = this.#states.get(key);
|
|
56
|
+
if ((current?.version ?? null) !== expectedVersion) {
|
|
57
|
+
throw new error_1.StateError('VERSION_CONFLICT', 'the sequence was modified concurrently');
|
|
58
|
+
}
|
|
59
|
+
if (current && state.fence < current.fence) {
|
|
60
|
+
throw new error_1.StateError('FENCING', 'stale fencing token for the sequence');
|
|
61
|
+
}
|
|
62
|
+
this.#states.set(key, (0, clone_1.clone)({ ...state, version: (current?.version ?? 0) + 1 }));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.MemorySequenceStore = MemorySequenceStore;
|
|
66
|
+
class MemoryCursorStore {
|
|
67
|
+
#cursors = new Map();
|
|
68
|
+
async get(key) {
|
|
69
|
+
const stored = this.#cursors.get(key);
|
|
70
|
+
return stored ? (0, clone_1.clone)(stored) : null;
|
|
71
|
+
}
|
|
72
|
+
async put(key, cursor, expectedVersion) {
|
|
73
|
+
const current = this.#cursors.get(key);
|
|
74
|
+
if ((current?.version ?? null) !== expectedVersion) {
|
|
75
|
+
throw new error_1.StateError('VERSION_CONFLICT', 'the cursor was modified concurrently');
|
|
76
|
+
}
|
|
77
|
+
const version = (current?.version ?? 0) + 1;
|
|
78
|
+
this.#cursors.set(key, (0, clone_1.clone)({ cursor, version }));
|
|
79
|
+
return version;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
exports.MemoryCursorStore = MemoryCursorStore;
|
|
83
|
+
const compositeKey = (namespace, id) => `${namespace}\u0000${id}`;
|
|
84
|
+
const OPERATION_PATCH_KEY_SET = new Set(types_1.OPERATION_PATCH_KEYS);
|
|
85
|
+
const CLEARABLE_FIELD_SET = new Set(types_1.CLEARABLE_FIELDS);
|
|
86
|
+
/**
|
|
87
|
+
* Validates a pre-read snapshot of a patch's own keys, so a spread-typed patch (e.g.
|
|
88
|
+
* `{ ...record, state }` forced through `as unknown as OperationPatch`) cannot write
|
|
89
|
+
* or clear a field outside the writable whitelist — `attempts`, `claim`, `id`,
|
|
90
|
+
* `namespace`, `idempotencyKey`, `intentHash`, `context`, `kind`, `version`,
|
|
91
|
+
* `createdAt` and `updatedAt` are never reachable through `update`/`appendAttempt`.
|
|
92
|
+
*/
|
|
93
|
+
function assertValidPatch(entries, clearList) {
|
|
94
|
+
for (const [key] of entries) {
|
|
95
|
+
if (key !== 'clear' && !OPERATION_PATCH_KEY_SET.has(key)) {
|
|
96
|
+
throw new error_1.StateError('INVALID_TRANSITION', `unsupported patch field '${key}'`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
for (const key of clearList) {
|
|
100
|
+
if (!CLEARABLE_FIELD_SET.has(key)) {
|
|
101
|
+
throw new error_1.StateError('INVALID_TRANSITION', `unsupported patch field '${key}'`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function applyPatch(current, patch, now) {
|
|
106
|
+
// Read the patch's own keys exactly once: the same snapshot is both validated and
|
|
107
|
+
// applied, so an accessor (a getter or Proxy trap) on the patch object can't change
|
|
108
|
+
// what keys are visible between validation and application.
|
|
109
|
+
const entries = Object.entries(patch);
|
|
110
|
+
// The caller's `clear` list is read once too, so what is validated is what is cleared.
|
|
111
|
+
// Only an array is a list; a number, an object or a Set would not survive a serialized
|
|
112
|
+
// store as a list either, so it is refused rather than read as `[]`.
|
|
113
|
+
const clear = entries.find(([key]) => key === 'clear')?.[1];
|
|
114
|
+
if (clear !== undefined && !Array.isArray(clear)) {
|
|
115
|
+
throw new error_1.StateError('INVALID_TRANSITION', "unsupported patch field 'clear'");
|
|
116
|
+
}
|
|
117
|
+
const clearList = clear === undefined ? [] : Array.from(clear);
|
|
118
|
+
assertValidPatch(entries, clearList);
|
|
119
|
+
const next = { ...current };
|
|
120
|
+
for (const [key, value] of entries) {
|
|
121
|
+
if (key === 'clear')
|
|
122
|
+
continue;
|
|
123
|
+
if (value !== undefined)
|
|
124
|
+
next[key] = (0, clone_1.clone)(value);
|
|
125
|
+
}
|
|
126
|
+
for (const key of clearList)
|
|
127
|
+
delete next[key];
|
|
128
|
+
next.version = current.version + 1;
|
|
129
|
+
next.updatedAt = now;
|
|
130
|
+
return next;
|
|
131
|
+
}
|
|
132
|
+
function matches(record, filter) {
|
|
133
|
+
return (record.namespace === filter.namespace &&
|
|
134
|
+
(filter.chain === undefined || record.context.chain === filter.chain) &&
|
|
135
|
+
(filter.network === undefined || record.context.network === filter.network) &&
|
|
136
|
+
(filter.from === undefined || record.intent.from === filter.from) &&
|
|
137
|
+
(filter.states === undefined || filter.states.includes(record.state)));
|
|
138
|
+
}
|
|
139
|
+
class MemoryOperationStore {
|
|
140
|
+
clock;
|
|
141
|
+
#records = new Map();
|
|
142
|
+
#keys = new Map();
|
|
143
|
+
#observations = new Map();
|
|
144
|
+
#claims = 0n;
|
|
145
|
+
constructor(clock = clock_1.systemClock) {
|
|
146
|
+
this.clock = clock;
|
|
147
|
+
}
|
|
148
|
+
async create(operation) {
|
|
149
|
+
for (const key of ['claim', 'version', 'createdAt', 'updatedAt']) {
|
|
150
|
+
if (Object.prototype.hasOwnProperty.call(operation, key)) {
|
|
151
|
+
throw new error_1.StateError('INVALID_TRANSITION', `unsupported operation field '${key}'`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
const keyIndex = compositeKey(operation.namespace, operation.idempotencyKey);
|
|
155
|
+
const existingId = this.#keys.get(keyIndex);
|
|
156
|
+
if (existingId !== undefined) {
|
|
157
|
+
return {
|
|
158
|
+
created: false,
|
|
159
|
+
record: (0, clone_1.clone)(this.#require(operation.namespace, existingId)),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
const recordKey = compositeKey(operation.namespace, operation.id);
|
|
163
|
+
if (this.#records.has(recordKey)) {
|
|
164
|
+
throw new error_1.StateError('INVALID_TRANSITION', `operation '${operation.id}' already exists`);
|
|
165
|
+
}
|
|
166
|
+
const now = this.clock.now();
|
|
167
|
+
const record = {
|
|
168
|
+
...(0, clone_1.clone)(operation),
|
|
169
|
+
version: 1,
|
|
170
|
+
createdAt: now,
|
|
171
|
+
updatedAt: now,
|
|
172
|
+
};
|
|
173
|
+
this.#records.set(recordKey, record);
|
|
174
|
+
this.#keys.set(keyIndex, operation.id);
|
|
175
|
+
return { created: true, record: (0, clone_1.clone)(record) };
|
|
176
|
+
}
|
|
177
|
+
async get(namespace, id) {
|
|
178
|
+
const record = this.#records.get(compositeKey(namespace, id));
|
|
179
|
+
return record ? (0, clone_1.clone)(record) : null;
|
|
180
|
+
}
|
|
181
|
+
async getByKey(namespace, idempotencyKey) {
|
|
182
|
+
const id = this.#keys.get(compositeKey(namespace, idempotencyKey));
|
|
183
|
+
return id !== undefined ? this.get(namespace, id) : null;
|
|
184
|
+
}
|
|
185
|
+
async findByRef(namespace, refOrTxHash) {
|
|
186
|
+
for (const record of this.#records.values()) {
|
|
187
|
+
if (record.namespace === namespace &&
|
|
188
|
+
record.attempts.some((a) => a.ref.id === refOrTxHash)) {
|
|
189
|
+
return (0, clone_1.clone)(record);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
for (const observation of this.#observations.values()) {
|
|
193
|
+
if (observation.txHash !== refOrTxHash)
|
|
194
|
+
continue;
|
|
195
|
+
const record = this.#records.get(compositeKey(namespace, observation.operationId));
|
|
196
|
+
// The observed attempt must actually belong to this record: two namespaces can
|
|
197
|
+
// otherwise share an operation id and resolve the tx hash to the wrong operation.
|
|
198
|
+
if (record && record.attempts.some((a) => a.id === observation.attemptId)) {
|
|
199
|
+
return (0, clone_1.clone)(record);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
async update(namespace, id, patch, expectedVersion, fence) {
|
|
205
|
+
const current = this.#check(namespace, id, expectedVersion, fence);
|
|
206
|
+
const next = applyPatch(current, patch, this.clock.now());
|
|
207
|
+
this.#records.set(compositeKey(namespace, id), next);
|
|
208
|
+
return (0, clone_1.clone)(next);
|
|
209
|
+
}
|
|
210
|
+
async appendAttempt(namespace, id, attempt, patch, expectedVersion, fence) {
|
|
211
|
+
const current = this.#check(namespace, id, expectedVersion, fence);
|
|
212
|
+
if (current.attempts.some((a) => a.id === attempt.id)) {
|
|
213
|
+
throw new error_1.StateError('INVALID_TRANSITION', `attempt '${attempt.id}' already exists`);
|
|
214
|
+
}
|
|
215
|
+
const withAttempt = {
|
|
216
|
+
...current,
|
|
217
|
+
attempts: [...current.attempts, (0, clone_1.clone)(attempt)],
|
|
218
|
+
activeAttemptId: attempt.id,
|
|
219
|
+
};
|
|
220
|
+
const next = applyPatch(withAttempt, patch, this.clock.now());
|
|
221
|
+
this.#records.set(compositeKey(namespace, id), next);
|
|
222
|
+
return (0, clone_1.clone)(next);
|
|
223
|
+
}
|
|
224
|
+
async getObservation(attemptId) {
|
|
225
|
+
const observation = this.#observations.get(attemptId);
|
|
226
|
+
return observation ? (0, clone_1.clone)(observation) : null;
|
|
227
|
+
}
|
|
228
|
+
async putObservation(observation, expectedVersion) {
|
|
229
|
+
const current = this.#observations.get(observation.attemptId);
|
|
230
|
+
if ((current?.version ?? null) !== expectedVersion) {
|
|
231
|
+
throw new error_1.StateError('VERSION_CONFLICT', `observation '${observation.attemptId}' was modified concurrently`);
|
|
232
|
+
}
|
|
233
|
+
const next = {
|
|
234
|
+
...(0, clone_1.clone)(observation),
|
|
235
|
+
version: (current?.version ?? 0) + 1,
|
|
236
|
+
};
|
|
237
|
+
this.#observations.set(observation.attemptId, next);
|
|
238
|
+
return (0, clone_1.clone)(next);
|
|
239
|
+
}
|
|
240
|
+
async claimDue(namespace, workerId, now, leaseMs, limit) {
|
|
241
|
+
if (limit <= 0)
|
|
242
|
+
return [];
|
|
243
|
+
const due = [...this.#records.values()]
|
|
244
|
+
.filter((r) => r.namespace === namespace &&
|
|
245
|
+
!(0, types_1.isTerminal)(r.state) &&
|
|
246
|
+
r.nextCheckAt !== undefined &&
|
|
247
|
+
r.nextCheckAt <= now &&
|
|
248
|
+
(!r.claim || r.claim.until <= now))
|
|
249
|
+
.sort((a, b) => a.nextCheckAt - b.nextCheckAt ||
|
|
250
|
+
a.createdAt - b.createdAt)
|
|
251
|
+
.slice(0, limit);
|
|
252
|
+
return due.map((record) => {
|
|
253
|
+
this.#claims += 1n;
|
|
254
|
+
const next = {
|
|
255
|
+
...record,
|
|
256
|
+
claim: { workerId, token: this.#claims.toString(), until: now + leaseMs },
|
|
257
|
+
version: record.version + 1,
|
|
258
|
+
updatedAt: this.clock.now(),
|
|
259
|
+
};
|
|
260
|
+
this.#records.set(compositeKey(namespace, record.id), next);
|
|
261
|
+
return (0, clone_1.clone)(next);
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
async releaseClaim(namespace, id, fence) {
|
|
265
|
+
const current = this.#require(namespace, id);
|
|
266
|
+
if (current.claim?.token !== fence.claimToken) {
|
|
267
|
+
throw new error_1.StateError('FENCING', `claim on operation '${id}' is no longer held`);
|
|
268
|
+
}
|
|
269
|
+
const { claim: _claim, ...rest } = current;
|
|
270
|
+
this.#records.set(compositeKey(namespace, id), {
|
|
271
|
+
...rest,
|
|
272
|
+
version: current.version + 1,
|
|
273
|
+
updatedAt: this.clock.now(),
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
async list(filter) {
|
|
277
|
+
const found = [...this.#records.values()]
|
|
278
|
+
.filter((r) => matches(r, filter))
|
|
279
|
+
.sort((a, b) => a.createdAt - b.createdAt);
|
|
280
|
+
return (0, clone_1.clone)(filter.limit === undefined ? found : found.slice(0, Math.max(0, filter.limit)));
|
|
281
|
+
}
|
|
282
|
+
async purge(filter) {
|
|
283
|
+
// As `list` does: the oldest matches first, and at most `limit` of them.
|
|
284
|
+
const found = [...this.#records.values()]
|
|
285
|
+
.filter((r) => matches(r, filter))
|
|
286
|
+
.sort((a, b) => a.createdAt - b.createdAt);
|
|
287
|
+
let removed = 0;
|
|
288
|
+
for (const record of filter.limit === undefined
|
|
289
|
+
? found
|
|
290
|
+
: found.slice(0, Math.max(0, filter.limit))) {
|
|
291
|
+
this.#records.delete(compositeKey(record.namespace, record.id));
|
|
292
|
+
this.#keys.delete(compositeKey(record.namespace, record.idempotencyKey));
|
|
293
|
+
for (const attempt of record.attempts)
|
|
294
|
+
this.#observations.delete(attempt.id);
|
|
295
|
+
removed += 1;
|
|
296
|
+
}
|
|
297
|
+
return removed;
|
|
298
|
+
}
|
|
299
|
+
#require(namespace, id) {
|
|
300
|
+
const record = this.#records.get(compositeKey(namespace, id));
|
|
301
|
+
if (!record)
|
|
302
|
+
throw new error_1.StateError('NOT_FOUND', `operation '${id}' not found`);
|
|
303
|
+
return record;
|
|
304
|
+
}
|
|
305
|
+
#check(namespace, id, expectedVersion, fence) {
|
|
306
|
+
const record = this.#require(namespace, id);
|
|
307
|
+
if (record.version !== expectedVersion) {
|
|
308
|
+
throw new error_1.StateError('VERSION_CONFLICT', `operation '${id}' was modified concurrently (expected v${expectedVersion}, found v${record.version})`);
|
|
309
|
+
}
|
|
310
|
+
if (fence && record.claim?.token !== fence.claimToken) {
|
|
311
|
+
throw new error_1.StateError('FENCING', `claim on operation '${id}' is no longer held`);
|
|
312
|
+
}
|
|
313
|
+
return record;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
exports.MemoryOperationStore = MemoryOperationStore;
|
|
317
|
+
function createMemoryStores(clock = clock_1.systemClock) {
|
|
318
|
+
return {
|
|
319
|
+
operations: new MemoryOperationStore(clock),
|
|
320
|
+
locks: new MemoryLockManager(clock),
|
|
321
|
+
sequences: new MemorySequenceStore(),
|
|
322
|
+
cursors: new MemoryCursorStore(),
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/core/store/memory.ts"],"names":[],"mappings":"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","sourcesContent":["import { StateError } from '../errors/error';\nimport { systemClock, type Clock } from '../util/clock';\nimport { clone } from './clone';\nimport { CLEARABLE_FIELDS, isTerminal, OPERATION_PATCH_KEYS } from './types';\nimport type {\n AttemptObservation,\n AttemptRecord,\n CreateResult,\n CursorStore,\n Fence,\n Lease,\n LockManager,\n NewOperation,\n OperationFilter,\n OperationPatch,\n OperationRecord,\n OperationStore,\n ScanCursor,\n SequenceState,\n SequenceStore,\n Stores,\n StoredCursor,\n} from './types';\n\nexport class MemoryLockManager implements LockManager {\n readonly #held = new Map<string, Lease>();\n readonly #tokens = new Map<string, bigint>();\n\n constructor(private readonly clock: Clock = systemClock) {}\n\n async acquire(key: string, owner: string, ttlMs: number): Promise<Lease | null> {\n const now = this.clock.now();\n const current = this.#held.get(key);\n if (current && current.expiresAt > now) return null;\n const token = (this.#tokens.get(key) ?? 0n) + 1n;\n this.#tokens.set(key, token);\n const lease: Lease = Object.freeze({ key, owner, token, expiresAt: now + ttlMs });\n this.#held.set(key, lease);\n return lease;\n }\n\n async renew(lease: Lease, ttlMs: number): Promise<Lease | null> {\n const now = this.clock.now();\n const current = this.#held.get(lease.key);\n if (!current || current.token !== lease.token || current.owner !== lease.owner)\n return null;\n if (current.expiresAt <= now) return null;\n const renewed: Lease = Object.freeze({ ...current, expiresAt: now + ttlMs });\n this.#held.set(lease.key, renewed);\n return renewed;\n }\n\n async release(lease: Lease): Promise<void> {\n const current = this.#held.get(lease.key);\n if (current && current.token === lease.token && current.owner === lease.owner) {\n this.#held.delete(lease.key);\n }\n }\n}\n\n// Sequence and cursor error messages omit the key: it embeds a wallet address, and\n// error messages reach logs.\nexport class MemorySequenceStore implements SequenceStore {\n readonly #states = new Map<string, SequenceState>();\n\n async get(key: string): Promise<SequenceState | null> {\n const state = this.#states.get(key);\n return state ? clone(state) : null;\n }\n\n async put(\n key: string,\n state: Omit<SequenceState, 'version'>,\n expectedVersion: number | null,\n ): Promise<void> {\n const current = this.#states.get(key);\n if ((current?.version ?? null) !== expectedVersion) {\n throw new StateError('VERSION_CONFLICT', 'the sequence was modified concurrently');\n }\n if (current && state.fence < current.fence) {\n throw new StateError('FENCING', 'stale fencing token for the sequence');\n }\n this.#states.set(key, clone({ ...state, version: (current?.version ?? 0) + 1 }));\n }\n}\n\nexport class MemoryCursorStore implements CursorStore {\n readonly #cursors = new Map<string, StoredCursor>();\n\n async get(key: string): Promise<StoredCursor | null> {\n const stored = this.#cursors.get(key);\n return stored ? clone(stored) : null;\n }\n\n async put(\n key: string,\n cursor: ScanCursor,\n expectedVersion: number | null,\n ): Promise<number> {\n const current = this.#cursors.get(key);\n if ((current?.version ?? null) !== expectedVersion) {\n throw new StateError('VERSION_CONFLICT', 'the cursor was modified concurrently');\n }\n const version = (current?.version ?? 0) + 1;\n this.#cursors.set(key, clone({ cursor, version }));\n return version;\n }\n}\n\nconst compositeKey = (namespace: string, id: string): string => `${namespace}\\u0000${id}`;\n\nconst OPERATION_PATCH_KEY_SET: ReadonlySet<string> = new Set(OPERATION_PATCH_KEYS);\nconst CLEARABLE_FIELD_SET: ReadonlySet<string> = new Set(CLEARABLE_FIELDS);\n\n/**\n * Validates a pre-read snapshot of a patch's own keys, so a spread-typed patch (e.g.\n * `{ ...record, state }` forced through `as unknown as OperationPatch`) cannot write\n * or clear a field outside the writable whitelist — `attempts`, `claim`, `id`,\n * `namespace`, `idempotencyKey`, `intentHash`, `context`, `kind`, `version`,\n * `createdAt` and `updatedAt` are never reachable through `update`/`appendAttempt`.\n */\nfunction assertValidPatch(\n entries: readonly (readonly [string, unknown])[],\n clearList: readonly string[],\n): void {\n for (const [key] of entries) {\n if (key !== 'clear' && !OPERATION_PATCH_KEY_SET.has(key)) {\n throw new StateError('INVALID_TRANSITION', `unsupported patch field '${key}'`);\n }\n }\n for (const key of clearList) {\n if (!CLEARABLE_FIELD_SET.has(key)) {\n throw new StateError('INVALID_TRANSITION', `unsupported patch field '${key}'`);\n }\n }\n}\n\nfunction applyPatch(\n current: OperationRecord,\n patch: OperationPatch,\n now: number,\n): OperationRecord {\n // Read the patch's own keys exactly once: the same snapshot is both validated and\n // applied, so an accessor (a getter or Proxy trap) on the patch object can't change\n // what keys are visible between validation and application.\n const entries = Object.entries(patch) as readonly (readonly [string, unknown])[];\n // The caller's `clear` list is read once too, so what is validated is what is cleared.\n // Only an array is a list; a number, an object or a Set would not survive a serialized\n // store as a list either, so it is refused rather than read as `[]`.\n const clear = entries.find(([key]) => key === 'clear')?.[1];\n if (clear !== undefined && !Array.isArray(clear)) {\n throw new StateError('INVALID_TRANSITION', \"unsupported patch field 'clear'\");\n }\n const clearList: readonly string[] = clear === undefined ? [] : Array.from(clear);\n assertValidPatch(entries, clearList);\n const next: Record<string, unknown> = { ...current };\n for (const [key, value] of entries) {\n if (key === 'clear') continue;\n if (value !== undefined) next[key] = clone(value);\n }\n for (const key of clearList) delete next[key];\n next.version = current.version + 1;\n next.updatedAt = now;\n return next as unknown as OperationRecord;\n}\n\nfunction matches(record: OperationRecord, filter: OperationFilter): boolean {\n return (\n record.namespace === filter.namespace &&\n (filter.chain === undefined || record.context.chain === filter.chain) &&\n (filter.network === undefined || record.context.network === filter.network) &&\n (filter.from === undefined || record.intent.from === filter.from) &&\n (filter.states === undefined || filter.states.includes(record.state))\n );\n}\n\nexport class MemoryOperationStore implements OperationStore {\n readonly #records = new Map<string, OperationRecord>();\n readonly #keys = new Map<string, string>();\n readonly #observations = new Map<string, AttemptObservation>();\n #claims = 0n;\n\n constructor(private readonly clock: Clock = systemClock) {}\n\n async create(operation: NewOperation): Promise<CreateResult> {\n for (const key of ['claim', 'version', 'createdAt', 'updatedAt']) {\n if (Object.prototype.hasOwnProperty.call(operation, key)) {\n throw new StateError(\n 'INVALID_TRANSITION',\n `unsupported operation field '${key}'`,\n );\n }\n }\n const keyIndex = compositeKey(operation.namespace, operation.idempotencyKey);\n const existingId = this.#keys.get(keyIndex);\n if (existingId !== undefined) {\n return {\n created: false,\n record: clone(this.#require(operation.namespace, existingId)),\n };\n }\n const recordKey = compositeKey(operation.namespace, operation.id);\n if (this.#records.has(recordKey)) {\n throw new StateError(\n 'INVALID_TRANSITION',\n `operation '${operation.id}' already exists`,\n );\n }\n const now = this.clock.now();\n const record = {\n ...clone(operation),\n version: 1,\n createdAt: now,\n updatedAt: now,\n } as OperationRecord;\n this.#records.set(recordKey, record);\n this.#keys.set(keyIndex, operation.id);\n return { created: true, record: clone(record) };\n }\n\n async get(namespace: string, id: string): Promise<OperationRecord | null> {\n const record = this.#records.get(compositeKey(namespace, id));\n return record ? clone(record) : null;\n }\n\n async getByKey(\n namespace: string,\n idempotencyKey: string,\n ): Promise<OperationRecord | null> {\n const id = this.#keys.get(compositeKey(namespace, idempotencyKey));\n return id !== undefined ? this.get(namespace, id) : null;\n }\n\n async findByRef(\n namespace: string,\n refOrTxHash: string,\n ): Promise<OperationRecord | null> {\n for (const record of this.#records.values()) {\n if (\n record.namespace === namespace &&\n record.attempts.some((a) => a.ref.id === refOrTxHash)\n ) {\n return clone(record);\n }\n }\n for (const observation of this.#observations.values()) {\n if (observation.txHash !== refOrTxHash) continue;\n const record = this.#records.get(compositeKey(namespace, observation.operationId));\n // The observed attempt must actually belong to this record: two namespaces can\n // otherwise share an operation id and resolve the tx hash to the wrong operation.\n if (record && record.attempts.some((a) => a.id === observation.attemptId)) {\n return clone(record);\n }\n }\n return null;\n }\n\n async update(\n namespace: string,\n id: string,\n patch: OperationPatch,\n expectedVersion: number,\n fence?: Fence,\n ): Promise<OperationRecord> {\n const current = this.#check(namespace, id, expectedVersion, fence);\n const next = applyPatch(current, patch, this.clock.now());\n this.#records.set(compositeKey(namespace, id), next);\n return clone(next);\n }\n\n async appendAttempt(\n namespace: string,\n id: string,\n attempt: AttemptRecord,\n patch: OperationPatch,\n expectedVersion: number,\n fence?: Fence,\n ): Promise<OperationRecord> {\n const current = this.#check(namespace, id, expectedVersion, fence);\n if (current.attempts.some((a) => a.id === attempt.id)) {\n throw new StateError(\n 'INVALID_TRANSITION',\n `attempt '${attempt.id}' already exists`,\n );\n }\n const withAttempt: OperationRecord = {\n ...current,\n attempts: [...current.attempts, clone(attempt)],\n activeAttemptId: attempt.id,\n };\n const next = applyPatch(withAttempt, patch, this.clock.now());\n this.#records.set(compositeKey(namespace, id), next);\n return clone(next);\n }\n\n async getObservation(attemptId: string): Promise<AttemptObservation | null> {\n const observation = this.#observations.get(attemptId);\n return observation ? clone(observation) : null;\n }\n\n async putObservation(\n observation: Omit<AttemptObservation, 'version'>,\n expectedVersion: number | null,\n ): Promise<AttemptObservation> {\n const current = this.#observations.get(observation.attemptId);\n if ((current?.version ?? null) !== expectedVersion) {\n throw new StateError(\n 'VERSION_CONFLICT',\n `observation '${observation.attemptId}' was modified concurrently`,\n );\n }\n const next: AttemptObservation = {\n ...clone(observation),\n version: (current?.version ?? 0) + 1,\n };\n this.#observations.set(observation.attemptId, next);\n return clone(next);\n }\n\n async claimDue(\n namespace: string,\n workerId: string,\n now: number,\n leaseMs: number,\n limit: number,\n ): Promise<OperationRecord[]> {\n if (limit <= 0) return [];\n const due = [...this.#records.values()]\n .filter(\n (r) =>\n r.namespace === namespace &&\n !isTerminal(r.state) &&\n r.nextCheckAt !== undefined &&\n r.nextCheckAt <= now &&\n (!r.claim || r.claim.until <= now),\n )\n .sort(\n (a, b) =>\n (a.nextCheckAt as number) - (b.nextCheckAt as number) ||\n a.createdAt - b.createdAt,\n )\n .slice(0, limit);\n return due.map((record) => {\n this.#claims += 1n;\n const next: OperationRecord = {\n ...record,\n claim: { workerId, token: this.#claims.toString(), until: now + leaseMs },\n version: record.version + 1,\n updatedAt: this.clock.now(),\n };\n this.#records.set(compositeKey(namespace, record.id), next);\n return clone(next);\n });\n }\n\n async releaseClaim(namespace: string, id: string, fence: Fence): Promise<void> {\n const current = this.#require(namespace, id);\n if (current.claim?.token !== fence.claimToken) {\n throw new StateError('FENCING', `claim on operation '${id}' is no longer held`);\n }\n const { claim: _claim, ...rest } = current;\n this.#records.set(compositeKey(namespace, id), {\n ...rest,\n version: current.version + 1,\n updatedAt: this.clock.now(),\n });\n }\n\n async list(filter: OperationFilter): Promise<OperationRecord[]> {\n const found = [...this.#records.values()]\n .filter((r) => matches(r, filter))\n .sort((a, b) => a.createdAt - b.createdAt);\n return clone(\n filter.limit === undefined ? found : found.slice(0, Math.max(0, filter.limit)),\n );\n }\n\n async purge(filter: OperationFilter): Promise<number> {\n // As `list` does: the oldest matches first, and at most `limit` of them.\n const found = [...this.#records.values()]\n .filter((r) => matches(r, filter))\n .sort((a, b) => a.createdAt - b.createdAt);\n let removed = 0;\n for (const record of filter.limit === undefined\n ? found\n : found.slice(0, Math.max(0, filter.limit))) {\n this.#records.delete(compositeKey(record.namespace, record.id));\n this.#keys.delete(compositeKey(record.namespace, record.idempotencyKey));\n for (const attempt of record.attempts) this.#observations.delete(attempt.id);\n removed += 1;\n }\n return removed;\n }\n\n #require(namespace: string, id: string): OperationRecord {\n const record = this.#records.get(compositeKey(namespace, id));\n if (!record) throw new StateError('NOT_FOUND', `operation '${id}' not found`);\n return record;\n }\n\n #check(\n namespace: string,\n id: string,\n expectedVersion: number,\n fence?: Fence,\n ): OperationRecord {\n const record = this.#require(namespace, id);\n if (record.version !== expectedVersion) {\n throw new StateError(\n 'VERSION_CONFLICT',\n `operation '${id}' was modified concurrently (expected v${expectedVersion}, found v${record.version})`,\n );\n }\n if (fence && record.claim?.token !== fence.claimToken) {\n throw new StateError('FENCING', `claim on operation '${id}' is no longer held`);\n }\n return record;\n }\n}\n\nexport function createMemoryStores(clock: Clock = systemClock): Stores {\n return {\n operations: new MemoryOperationStore(clock),\n locks: new MemoryLockManager(clock),\n sequences: new MemorySequenceStore(),\n cursors: new MemoryCursorStore(),\n };\n}\n"]}
|