crypto-aio 0.0.3 → 0.1.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 +17 -0
- package/README.md +144 -14
- 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 +326 -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 +170 -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 +135 -0
- package/dist/adapters/evm/ethers-client.js.map +1 -0
- package/dist/adapters/evm/fees.d.ts +79 -0
- package/dist/adapters/evm/fees.js +234 -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 +11 -0
- package/dist/adapters/evm/index.js.map +1 -0
- package/dist/adapters/evm/network.d.ts +60 -0
- package/dist/adapters/evm/network.js +131 -0
- package/dist/adapters/evm/network.js.map +1 -0
- package/dist/adapters/evm/plugin.d.ts +36 -0
- package/dist/adapters/evm/plugin.js +102 -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 +358 -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 +65 -0
- package/dist/adapters/evm/reader.js +292 -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 +7 -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 +255 -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 +23 -0
- package/dist/adapters/evm/web3-client.js +159 -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 +545 -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 +68 -0
- package/dist/adapters/solana/fees.js +205 -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/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 +41 -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 +121 -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 +83 -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 +813 -0
- package/dist/adapters/ton/proofs.js.map +1 -0
- package/dist/adapters/ton/reader.d.ts +194 -0
- package/dist/adapters/ton/reader.js +781 -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 +48 -0
- package/dist/adapters/ton/trace.js +277 -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 +39 -0
- package/dist/adapters/tron/abi.js +110 -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 +553 -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 +50 -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 +370 -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 +47 -0
- package/dist/adapters/tron/reader.js +203 -0
- package/dist/adapters/tron/reader.js.map +1 -0
- package/dist/adapters/tron/tokens.d.ts +7 -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 +99 -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 +57 -0
- package/dist/adapters/utxo/context.js +118 -0
- package/dist/adapters/utxo/context.js.map +1 -0
- package/dist/adapters/utxo/decode.d.ts +14 -0
- package/dist/adapters/utxo/decode.js +85 -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 +74 -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 +79 -0
- package/dist/adapters/utxo/esplora.js +451 -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 +57 -0
- package/dist/adapters/utxo/proofs.js +331 -0
- package/dist/adapters/utxo/proofs.js.map +1 -0
- package/dist/adapters/utxo/rawtx.d.ts +59 -0
- package/dist/adapters/utxo/rawtx.js +234 -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 +200 -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 +165 -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 +69 -0
- package/dist/core/container/container.js +466 -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 +346 -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 +153 -0
- package/dist/core/errors/codes.js +49 -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 +107 -0
- package/dist/core/lifecycle/engine-rules.js +257 -0
- package/dist/core/lifecycle/engine-rules.js.map +1 -0
- package/dist/core/lifecycle/engine.d.ts +500 -0
- package/dist/core/lifecycle/engine.js +1732 -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 +72 -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 +606 -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 +82 -0
- package/dist/core/lifecycle/workers.js +329 -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 +37 -0
- package/dist/core/model/ids.js +13 -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 +20 -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 +116 -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 +355 -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 +153 -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/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 +246 -0
- package/dist/core/store/types.js +117 -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 +1695 -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 +144 -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 +29 -0
- package/dist/core/util/json.js +165 -0
- package/dist/core/util/json.js.map +1 -0
- package/dist/core/util/names.d.ts +21 -0
- package/dist/core/util/names.js +46 -0
- package/dist/core/util/names.js.map +1 -0
- package/dist/index.d.ts +64 -14
- package/dist/index.js +105 -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 +718 -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 +63 -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 +36 -0
- package/dist/testing/faulty-store.js +66 -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 +188 -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,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, 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, 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(filter.limit === undefined ? found : found.slice(0, filter.limit));\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, 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"]}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import type { SerializedError } from '../errors/error';
|
|
2
|
+
import type { FeeEstimateDraft } from '../model/fee';
|
|
3
|
+
import type { StoredIntent } from '../model/intent';
|
|
4
|
+
import type { OrderingData } from '../model/ordering';
|
|
5
|
+
import type { AttemptRef, Evidence, RawTx, TxState, UnsignedTx } from '../model/transaction';
|
|
6
|
+
import type { SignatureBundle, SignerTicket } from '../signing/types';
|
|
7
|
+
export type OperationState = 'created' | 'prepared' | 'awaiting-signature' | 'signed' | 'submitted' | 'stalled' | 'included' | 'final' | 'failed' | 'expired' | 'abandoned';
|
|
8
|
+
export declare const TERMINAL_STATES: readonly OperationState[];
|
|
9
|
+
export declare const NON_TERMINAL_STATES: readonly OperationState[];
|
|
10
|
+
export declare function isTerminal(state: OperationState): boolean;
|
|
11
|
+
/** Frozen at Operation creation; later handle or config changes never affect it. */
|
|
12
|
+
export interface ExecutionContext {
|
|
13
|
+
readonly chain: string;
|
|
14
|
+
readonly network: string;
|
|
15
|
+
readonly library: string;
|
|
16
|
+
/** Provider names, or `inline:<hash>` for inline configs (never secrets). */
|
|
17
|
+
readonly providers: readonly string[];
|
|
18
|
+
readonly indexers: readonly string[];
|
|
19
|
+
readonly wallet: string;
|
|
20
|
+
readonly signer?: string;
|
|
21
|
+
readonly configHash: string;
|
|
22
|
+
}
|
|
23
|
+
export type AttemptPurpose = 'original' | 'replacement' | 'cancel' | 'rebuild';
|
|
24
|
+
/** One concrete signed transaction. Immutable after insertion. */
|
|
25
|
+
export interface AttemptRecord {
|
|
26
|
+
readonly id: string;
|
|
27
|
+
readonly ref: AttemptRef;
|
|
28
|
+
readonly raw: RawTx;
|
|
29
|
+
readonly ordering: OrderingData;
|
|
30
|
+
readonly fee: FeeEstimateDraft;
|
|
31
|
+
readonly unsigned: UnsignedTx;
|
|
32
|
+
readonly purpose: AttemptPurpose;
|
|
33
|
+
readonly supersedes?: string;
|
|
34
|
+
readonly createdAt: number;
|
|
35
|
+
}
|
|
36
|
+
/** Mutable, versioned view of what the chain says about an Attempt. */
|
|
37
|
+
export interface AttemptObservation {
|
|
38
|
+
readonly attemptId: string;
|
|
39
|
+
readonly operationId: string;
|
|
40
|
+
readonly state: TxState;
|
|
41
|
+
readonly evidence: Evidence;
|
|
42
|
+
readonly txHash?: string;
|
|
43
|
+
readonly blockHash?: string;
|
|
44
|
+
readonly blockHeight?: bigint;
|
|
45
|
+
readonly confirmations: number;
|
|
46
|
+
readonly firstSeenAt?: number;
|
|
47
|
+
readonly lastSeenAt?: number;
|
|
48
|
+
readonly lastBroadcastAt?: number;
|
|
49
|
+
readonly reason?: string;
|
|
50
|
+
readonly replacedBy?: string;
|
|
51
|
+
readonly version: number;
|
|
52
|
+
}
|
|
53
|
+
export interface OperationClaim {
|
|
54
|
+
readonly workerId: string;
|
|
55
|
+
/** Strictly increasing per store (decimal string of a bigint). */
|
|
56
|
+
readonly token: string;
|
|
57
|
+
readonly until: number;
|
|
58
|
+
}
|
|
59
|
+
export interface OperationRecord {
|
|
60
|
+
readonly id: string;
|
|
61
|
+
readonly namespace: string;
|
|
62
|
+
readonly idempotencyKey: string;
|
|
63
|
+
readonly intentHash: string;
|
|
64
|
+
readonly context: ExecutionContext;
|
|
65
|
+
readonly kind: 'transfer';
|
|
66
|
+
readonly state: OperationState;
|
|
67
|
+
readonly outcome?: 'executed' | 'cancelled';
|
|
68
|
+
readonly intent: StoredIntent;
|
|
69
|
+
readonly unsigned?: UnsignedTx;
|
|
70
|
+
readonly reservation?: OrderingData;
|
|
71
|
+
readonly signerTickets?: readonly SignerTicket[];
|
|
72
|
+
readonly partialSignatures?: readonly SignatureBundle[];
|
|
73
|
+
readonly attempts: readonly AttemptRecord[];
|
|
74
|
+
readonly activeAttemptId?: string;
|
|
75
|
+
readonly ambiguous?: boolean;
|
|
76
|
+
readonly version: number;
|
|
77
|
+
readonly claim?: OperationClaim;
|
|
78
|
+
readonly error?: SerializedError;
|
|
79
|
+
readonly createdAt: number;
|
|
80
|
+
readonly updatedAt: number;
|
|
81
|
+
readonly nextCheckAt?: number;
|
|
82
|
+
}
|
|
83
|
+
export type NewOperation = Omit<OperationRecord, 'version' | 'createdAt' | 'updatedAt' | 'claim'>;
|
|
84
|
+
export declare const CLEARABLE_FIELDS: readonly ["outcome", "unsigned", "reservation", "signerTickets", "partialSignatures", "activeAttemptId", "ambiguous", "error", "nextCheckAt"];
|
|
85
|
+
/** The only fields an `OperationPatch` may `clear`; never store-owned state or `state`. */
|
|
86
|
+
export type ClearableField = (typeof CLEARABLE_FIELDS)[number];
|
|
87
|
+
export interface OperationPatch {
|
|
88
|
+
readonly state?: OperationState;
|
|
89
|
+
readonly outcome?: 'executed' | 'cancelled';
|
|
90
|
+
readonly unsigned?: UnsignedTx;
|
|
91
|
+
readonly reservation?: OrderingData;
|
|
92
|
+
readonly signerTickets?: readonly SignerTicket[];
|
|
93
|
+
readonly partialSignatures?: readonly SignatureBundle[];
|
|
94
|
+
readonly activeAttemptId?: string;
|
|
95
|
+
readonly ambiguous?: boolean;
|
|
96
|
+
readonly error?: SerializedError;
|
|
97
|
+
readonly nextCheckAt?: number;
|
|
98
|
+
/** Fields to delete; applied after the values above. */
|
|
99
|
+
readonly clear?: readonly ClearableField[];
|
|
100
|
+
}
|
|
101
|
+
/** Runtime whitelist of writable `OperationPatch` fields (everything but `clear`). */
|
|
102
|
+
export declare const OPERATION_PATCH_KEYS: readonly ["state", "outcome", "unsigned", "reservation", "signerTickets", "partialSignatures", "activeAttemptId", "ambiguous", "error", "nextCheckAt"];
|
|
103
|
+
export interface Fence {
|
|
104
|
+
readonly claimToken: string;
|
|
105
|
+
}
|
|
106
|
+
export interface OperationFilter {
|
|
107
|
+
readonly namespace: string;
|
|
108
|
+
readonly chain?: string;
|
|
109
|
+
readonly network?: string;
|
|
110
|
+
readonly from?: string;
|
|
111
|
+
readonly states?: readonly OperationState[];
|
|
112
|
+
readonly limit?: number;
|
|
113
|
+
}
|
|
114
|
+
export interface CreateResult {
|
|
115
|
+
readonly created: boolean;
|
|
116
|
+
readonly record: OperationRecord;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Durable Operation storage. Required guarantees (verified by the contract suite),
|
|
120
|
+
* binding on every implementation (memory, Redis, Postgres, ...):
|
|
121
|
+
* - `create` is create-if-absent on `(namespace, idempotencyKey)`: a second `create`
|
|
122
|
+
* for an existing key returns the stored record unchanged, regardless of
|
|
123
|
+
* `intentHash` — this store never performs the idempotency-conflict check itself;
|
|
124
|
+
* the calling engine does.
|
|
125
|
+
* - `update`/`appendAttempt` are version-checked (compare-and-set on
|
|
126
|
+
* `expectedVersion`) and optionally fenced by a claim token. Both are restricted to
|
|
127
|
+
* the same runtime patch whitelist (`OPERATION_PATCH_KEYS`), and `clear` may only
|
|
128
|
+
* name `CLEARABLE_FIELDS`; any other key anywhere in the patch rejects the whole
|
|
129
|
+
* call with `INVALID_TRANSITION` before any mutation. An explicit `undefined` value
|
|
130
|
+
* for a writable field is a no-op (the stored value survives); only `clear` removes
|
|
131
|
+
* a field.
|
|
132
|
+
* - `appendAttempt` is atomic with its accompanying patch, never rewrites a
|
|
133
|
+
* previously stored `AttemptRecord`, and rejects a duplicate attempt id. Attempt ids
|
|
134
|
+
* are globally unique across every Operation and namespace (observations are keyed
|
|
135
|
+
* by attempt id alone).
|
|
136
|
+
* - `claimDue` and `list` are scoped by namespace: they never return a record of another
|
|
137
|
+
* namespace, even one with the same id.
|
|
138
|
+
* - `claimDue` returns only non-terminal operations with `nextCheckAt` set and `<=
|
|
139
|
+
* now`, ordered by `(nextCheckAt, createdAt)` with a stable tie-break for equal
|
|
140
|
+
* values, and returns `[]` for `limit <= 0`. A claimed Operation is excluded until
|
|
141
|
+
* its `claim.until <= now`; then another worker may take it over. Claim tokens are
|
|
142
|
+
* strictly increasing per store; fenced writes are rejected after a takeover.
|
|
143
|
+
* - `list` returns matches in creation order.
|
|
144
|
+
* - `ClearableField` is restricted on purpose: `clear` can never remove store-owned or
|
|
145
|
+
* identity fields (`attempts`, `claim`, `version`, `id`, ...) or `state`. An
|
|
146
|
+
* implementation reads the caller's `clear` list once, so the list it validates is
|
|
147
|
+
* the list it applies.
|
|
148
|
+
* - A key set to `undefined`, in an observation or a patch, is never persisted as a value
|
|
149
|
+
* such as `null`. In a patch, the stored field keeps its value. In an
|
|
150
|
+
* observation, which replaces the whole record, the field reads back `undefined` (never
|
|
151
|
+
* `null`).
|
|
152
|
+
*/
|
|
153
|
+
export interface OperationStore {
|
|
154
|
+
create(operation: NewOperation): Promise<CreateResult>;
|
|
155
|
+
get(namespace: string, id: string): Promise<OperationRecord | null>;
|
|
156
|
+
getByKey(namespace: string, idempotencyKey: string): Promise<OperationRecord | null>;
|
|
157
|
+
/**
|
|
158
|
+
* Finds by an Attempt ref id or by an observed canonical tx hash. The engine's
|
|
159
|
+
* AttemptRef guard, which refuses an Attempt whose ref another Operation of the
|
|
160
|
+
* namespace holds, relies on this read being read-your-writes consistent across every
|
|
161
|
+
* process that shares the store: it must see any `appendAttempt` that another store
|
|
162
|
+
* instance committed before it was called (no read replica, no eventually consistent
|
|
163
|
+
* index).
|
|
164
|
+
*/
|
|
165
|
+
findByRef(namespace: string, refOrTxHash: string): Promise<OperationRecord | null>;
|
|
166
|
+
/**
|
|
167
|
+
* Compare-and-set on `expectedVersion`, optionally fenced. Every successful update bumps
|
|
168
|
+
* version, even when the patch changes no field (the engine fences stale writers
|
|
169
|
+
* with such a no-effect update).
|
|
170
|
+
*/
|
|
171
|
+
update(namespace: string, id: string, patch: OperationPatch, expectedVersion: number, fence?: Fence): Promise<OperationRecord>;
|
|
172
|
+
appendAttempt(namespace: string, id: string, attempt: AttemptRecord, patch: OperationPatch, expectedVersion: number, fence?: Fence): Promise<OperationRecord>;
|
|
173
|
+
getObservation(attemptId: string): Promise<AttemptObservation | null>;
|
|
174
|
+
/**
|
|
175
|
+
* Stores `observation` as the whole new record, version-checked. An optional field left
|
|
176
|
+
* out of it or set to `undefined` (a cleared `reason`, `blockHash` or `blockHeight`)
|
|
177
|
+
* reads back `undefined` (never `null`) afterwards. A store must replace the record, never
|
|
178
|
+
* merge fields into the old one. The monitor relies on this to clear stale values.
|
|
179
|
+
*/
|
|
180
|
+
putObservation(observation: Omit<AttemptObservation, 'version'>, expectedVersion: number | null): Promise<AttemptObservation>;
|
|
181
|
+
/** Claims non-terminal operations whose `nextCheckAt` is set and <= now (unscheduled ones are never due). */
|
|
182
|
+
claimDue(namespace: string, workerId: string, now: number, leaseMs: number, limit: number): Promise<OperationRecord[]>;
|
|
183
|
+
releaseClaim(namespace: string, id: string, fence: Fence): Promise<void>;
|
|
184
|
+
list(filter: OperationFilter): Promise<OperationRecord[]>;
|
|
185
|
+
purge?(filter: OperationFilter): Promise<number>;
|
|
186
|
+
}
|
|
187
|
+
export interface Lease {
|
|
188
|
+
readonly key: string;
|
|
189
|
+
readonly owner: string;
|
|
190
|
+
/** Strictly increasing per key across all acquisitions. */
|
|
191
|
+
readonly token: bigint;
|
|
192
|
+
readonly expiresAt: number;
|
|
193
|
+
}
|
|
194
|
+
export interface LockManager {
|
|
195
|
+
acquire(key: string, owner: string, ttlMs: number): Promise<Lease | null>;
|
|
196
|
+
renew(lease: Lease, ttlMs: number): Promise<Lease | null>;
|
|
197
|
+
release(lease: Lease): Promise<void>;
|
|
198
|
+
}
|
|
199
|
+
export interface SequenceState {
|
|
200
|
+
readonly next: bigint;
|
|
201
|
+
readonly released: readonly bigint[];
|
|
202
|
+
readonly fence: bigint;
|
|
203
|
+
readonly version: number;
|
|
204
|
+
}
|
|
205
|
+
export interface SequenceStore {
|
|
206
|
+
get(key: string): Promise<SequenceState | null>;
|
|
207
|
+
/** Rejects on version mismatch (`VERSION_CONFLICT`) or when `fence` < stored fence (`FENCING`). */
|
|
208
|
+
put(key: string, state: Omit<SequenceState, 'version'>, expectedVersion: number | null): Promise<void>;
|
|
209
|
+
}
|
|
210
|
+
export interface ScanCursor {
|
|
211
|
+
readonly height: bigint;
|
|
212
|
+
readonly hash: string;
|
|
213
|
+
readonly recent: readonly {
|
|
214
|
+
readonly height: bigint;
|
|
215
|
+
readonly hash: string;
|
|
216
|
+
}[];
|
|
217
|
+
}
|
|
218
|
+
export interface StoredCursor {
|
|
219
|
+
readonly cursor: ScanCursor;
|
|
220
|
+
readonly version: number;
|
|
221
|
+
}
|
|
222
|
+
export interface CursorStore {
|
|
223
|
+
get(key: string): Promise<StoredCursor | null>;
|
|
224
|
+
/** Returns the new version. */
|
|
225
|
+
put(key: string, cursor: ScanCursor, expectedVersion: number | null): Promise<number>;
|
|
226
|
+
}
|
|
227
|
+
export interface Stores {
|
|
228
|
+
readonly operations: OperationStore;
|
|
229
|
+
readonly locks: LockManager;
|
|
230
|
+
readonly sequences: SequenceStore;
|
|
231
|
+
readonly cursors: CursorStore;
|
|
232
|
+
}
|
|
233
|
+
export type DataClass = 'secret' | 'sensitive' | 'sensitive-until-broadcast' | 'operational';
|
|
234
|
+
/**
|
|
235
|
+
* Field classification so backing stores can apply encryption and retention per field.
|
|
236
|
+
*
|
|
237
|
+
* `operation.reservation` and `attempt.ordering` are `sensitive` because an `inputs`
|
|
238
|
+
* ordering lists UTXO outpoints, which tie a wallet to its coins. A nonce or seqno value
|
|
239
|
+
* on its own is an operational identifier, like an Operation id: the `nonce.allocated`
|
|
240
|
+
* and `nonce.gap` events carry it, and logs may too.
|
|
241
|
+
*/
|
|
242
|
+
export declare const DATA_CLASSIFICATION: {
|
|
243
|
+
readonly operation: Readonly<Record<keyof OperationRecord, DataClass>>;
|
|
244
|
+
readonly attempt: Readonly<Record<keyof AttemptRecord, DataClass>>;
|
|
245
|
+
readonly observation: Readonly<Record<keyof AttemptObservation, DataClass>>;
|
|
246
|
+
};
|