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.
Files changed (700) hide show
  1. package/CHANGELOG.md +167 -0
  2. package/README.md +163 -13
  3. package/dist/adapters/avalanche/address.d.ts +15 -0
  4. package/dist/adapters/avalanche/address.js +74 -0
  5. package/dist/adapters/avalanche/address.js.map +1 -0
  6. package/dist/adapters/avalanche/api.d.ts +100 -0
  7. package/dist/adapters/avalanche/api.js +381 -0
  8. package/dist/adapters/avalanche/api.js.map +1 -0
  9. package/dist/adapters/avalanche/builder.d.ts +13 -0
  10. package/dist/adapters/avalanche/builder.js +336 -0
  11. package/dist/adapters/avalanche/builder.js.map +1 -0
  12. package/dist/adapters/avalanche/cb58.d.ts +7 -0
  13. package/dist/adapters/avalanche/cb58.js +49 -0
  14. package/dist/adapters/avalanche/cb58.js.map +1 -0
  15. package/dist/adapters/avalanche/chains.d.ts +21 -0
  16. package/dist/adapters/avalanche/chains.js +79 -0
  17. package/dist/adapters/avalanche/chains.js.map +1 -0
  18. package/dist/adapters/avalanche/codec.d.ts +94 -0
  19. package/dist/adapters/avalanche/codec.js +371 -0
  20. package/dist/adapters/avalanche/codec.js.map +1 -0
  21. package/dist/adapters/avalanche/context.d.ts +59 -0
  22. package/dist/adapters/avalanche/context.js +114 -0
  23. package/dist/adapters/avalanche/context.js.map +1 -0
  24. package/dist/adapters/avalanche/decode.d.ts +16 -0
  25. package/dist/adapters/avalanche/decode.js +101 -0
  26. package/dist/adapters/avalanche/decode.js.map +1 -0
  27. package/dist/adapters/avalanche/driver.d.ts +22 -0
  28. package/dist/adapters/avalanche/driver.js +81 -0
  29. package/dist/adapters/avalanche/driver.js.map +1 -0
  30. package/dist/adapters/avalanche/errors.d.ts +18 -0
  31. package/dist/adapters/avalanche/errors.js +61 -0
  32. package/dist/adapters/avalanche/errors.js.map +1 -0
  33. package/dist/adapters/avalanche/fees.d.ts +23 -0
  34. package/dist/adapters/avalanche/fees.js +105 -0
  35. package/dist/adapters/avalanche/fees.js.map +1 -0
  36. package/dist/adapters/avalanche/index.d.ts +19 -0
  37. package/dist/adapters/avalanche/index.js +8 -0
  38. package/dist/adapters/avalanche/index.js.map +1 -0
  39. package/dist/adapters/avalanche/network.d.ts +37 -0
  40. package/dist/adapters/avalanche/network.js +135 -0
  41. package/dist/adapters/avalanche/network.js.map +1 -0
  42. package/dist/adapters/avalanche/plugin.d.ts +21 -0
  43. package/dist/adapters/avalanche/plugin.js +46 -0
  44. package/dist/adapters/avalanche/plugin.js.map +1 -0
  45. package/dist/adapters/avalanche/presets.d.ts +6 -0
  46. package/dist/adapters/avalanche/presets.js +86 -0
  47. package/dist/adapters/avalanche/presets.js.map +1 -0
  48. package/dist/adapters/avalanche/proofs.d.ts +41 -0
  49. package/dist/adapters/avalanche/proofs.js +270 -0
  50. package/dist/adapters/avalanche/proofs.js.map +1 -0
  51. package/dist/adapters/avalanche/reader.d.ts +40 -0
  52. package/dist/adapters/avalanche/reader.js +231 -0
  53. package/dist/adapters/avalanche/reader.js.map +1 -0
  54. package/dist/adapters/avalanche/sdk.d.ts +182 -0
  55. package/dist/adapters/avalanche/sdk.js +21 -0
  56. package/dist/adapters/avalanche/sdk.js.map +1 -0
  57. package/dist/adapters/avalanche/types.d.ts +86 -0
  58. package/dist/{type/common.js → adapters/avalanche/types.js} +1 -1
  59. package/dist/adapters/avalanche/types.js.map +1 -0
  60. package/dist/adapters/evm/builder.d.ts +11 -0
  61. package/dist/adapters/evm/builder.js +386 -0
  62. package/dist/adapters/evm/builder.js.map +1 -0
  63. package/dist/adapters/evm/chains.d.ts +6 -0
  64. package/dist/adapters/evm/chains.js +203 -0
  65. package/dist/adapters/evm/chains.js.map +1 -0
  66. package/dist/adapters/evm/client.d.ts +84 -0
  67. package/dist/adapters/evm/client.js +335 -0
  68. package/dist/adapters/evm/client.js.map +1 -0
  69. package/dist/adapters/evm/decode.d.ts +35 -0
  70. package/dist/adapters/evm/decode.js +175 -0
  71. package/dist/adapters/evm/decode.js.map +1 -0
  72. package/dist/adapters/evm/driver.d.ts +8 -0
  73. package/dist/adapters/evm/driver.js +61 -0
  74. package/dist/adapters/evm/driver.js.map +1 -0
  75. package/dist/adapters/evm/errors.d.ts +20 -0
  76. package/dist/adapters/evm/errors.js +110 -0
  77. package/dist/adapters/evm/errors.js.map +1 -0
  78. package/dist/adapters/evm/ethers-client.d.ts +43 -0
  79. package/dist/adapters/evm/ethers-client.js +139 -0
  80. package/dist/adapters/evm/ethers-client.js.map +1 -0
  81. package/dist/adapters/evm/fees.d.ts +103 -0
  82. package/dist/adapters/evm/fees.js +277 -0
  83. package/dist/adapters/evm/fees.js.map +1 -0
  84. package/dist/adapters/evm/index.d.ts +20 -0
  85. package/dist/adapters/evm/index.js +12 -0
  86. package/dist/adapters/evm/index.js.map +1 -0
  87. package/dist/adapters/evm/network.d.ts +65 -0
  88. package/dist/adapters/evm/network.js +150 -0
  89. package/dist/adapters/evm/network.js.map +1 -0
  90. package/dist/adapters/evm/plugin.d.ts +35 -0
  91. package/dist/adapters/evm/plugin.js +150 -0
  92. package/dist/adapters/evm/plugin.js.map +1 -0
  93. package/dist/adapters/evm/presets.d.ts +2 -0
  94. package/dist/adapters/evm/presets.js +105 -0
  95. package/dist/adapters/evm/presets.js.map +1 -0
  96. package/dist/adapters/evm/proofs.d.ts +19 -0
  97. package/dist/adapters/evm/proofs.js +370 -0
  98. package/dist/adapters/evm/proofs.js.map +1 -0
  99. package/dist/adapters/evm/rawtx.d.ts +25 -0
  100. package/dist/adapters/evm/rawtx.js +176 -0
  101. package/dist/adapters/evm/rawtx.js.map +1 -0
  102. package/dist/adapters/evm/reader.d.ts +83 -0
  103. package/dist/adapters/evm/reader.js +326 -0
  104. package/dist/adapters/evm/reader.js.map +1 -0
  105. package/dist/adapters/evm/rpc.d.ts +39 -0
  106. package/dist/adapters/evm/rpc.js +152 -0
  107. package/dist/adapters/evm/rpc.js.map +1 -0
  108. package/dist/adapters/evm/tokens.d.ts +10 -0
  109. package/dist/adapters/evm/tokens.js +23 -0
  110. package/dist/adapters/evm/tokens.js.map +1 -0
  111. package/dist/adapters/evm/types.d.ts +265 -0
  112. package/dist/{type/account.js → adapters/evm/types.js} +1 -1
  113. package/dist/adapters/evm/types.js.map +1 -0
  114. package/dist/adapters/evm/web3-client.d.ts +26 -0
  115. package/dist/adapters/evm/web3-client.js +176 -0
  116. package/dist/adapters/evm/web3-client.js.map +1 -0
  117. package/dist/adapters/solana/builder.d.ts +18 -0
  118. package/dist/adapters/solana/builder.js +556 -0
  119. package/dist/adapters/solana/builder.js.map +1 -0
  120. package/dist/adapters/solana/chains.d.ts +13 -0
  121. package/dist/adapters/solana/chains.js +37 -0
  122. package/dist/adapters/solana/chains.js.map +1 -0
  123. package/dist/adapters/solana/decode.d.ts +111 -0
  124. package/dist/adapters/solana/decode.js +595 -0
  125. package/dist/adapters/solana/decode.js.map +1 -0
  126. package/dist/adapters/solana/driver.d.ts +15 -0
  127. package/dist/adapters/solana/driver.js +72 -0
  128. package/dist/adapters/solana/driver.js.map +1 -0
  129. package/dist/adapters/solana/errors.d.ts +36 -0
  130. package/dist/adapters/solana/errors.js +154 -0
  131. package/dist/adapters/solana/errors.js.map +1 -0
  132. package/dist/adapters/solana/fees.d.ts +77 -0
  133. package/dist/adapters/solana/fees.js +214 -0
  134. package/dist/adapters/solana/fees.js.map +1 -0
  135. package/dist/adapters/solana/heights.d.ts +47 -0
  136. package/dist/adapters/solana/heights.js +185 -0
  137. package/dist/adapters/solana/heights.js.map +1 -0
  138. package/dist/adapters/solana/history.d.ts +10 -0
  139. package/dist/adapters/solana/history.js +71 -0
  140. package/dist/adapters/solana/history.js.map +1 -0
  141. package/dist/adapters/solana/index.d.ts +16 -0
  142. package/dist/adapters/solana/index.js +9 -0
  143. package/dist/adapters/solana/index.js.map +1 -0
  144. package/dist/adapters/solana/keys.d.ts +13 -0
  145. package/dist/adapters/solana/keys.js +69 -0
  146. package/dist/adapters/solana/keys.js.map +1 -0
  147. package/dist/adapters/solana/message.d.ts +15 -0
  148. package/dist/adapters/solana/message.js +120 -0
  149. package/dist/adapters/solana/message.js.map +1 -0
  150. package/dist/adapters/solana/network.d.ts +24 -0
  151. package/dist/adapters/solana/network.js +95 -0
  152. package/dist/adapters/solana/network.js.map +1 -0
  153. package/dist/adapters/solana/plugin.d.ts +18 -0
  154. package/dist/adapters/solana/plugin.js +44 -0
  155. package/dist/adapters/solana/plugin.js.map +1 -0
  156. package/dist/adapters/solana/presets.d.ts +2 -0
  157. package/dist/adapters/solana/presets.js +77 -0
  158. package/dist/adapters/solana/presets.js.map +1 -0
  159. package/dist/adapters/solana/programs.d.ts +44 -0
  160. package/dist/adapters/solana/programs.js +159 -0
  161. package/dist/adapters/solana/programs.js.map +1 -0
  162. package/dist/adapters/solana/proofs.d.ts +56 -0
  163. package/dist/adapters/solana/proofs.js +540 -0
  164. package/dist/adapters/solana/proofs.js.map +1 -0
  165. package/dist/adapters/solana/reader.d.ts +82 -0
  166. package/dist/adapters/solana/reader.js +326 -0
  167. package/dist/adapters/solana/reader.js.map +1 -0
  168. package/dist/adapters/solana/rpc.d.ts +102 -0
  169. package/dist/adapters/solana/rpc.js +301 -0
  170. package/dist/adapters/solana/rpc.js.map +1 -0
  171. package/dist/adapters/solana/tokens.d.ts +7 -0
  172. package/dist/adapters/solana/tokens.js +19 -0
  173. package/dist/adapters/solana/tokens.js.map +1 -0
  174. package/dist/adapters/solana/types.d.ts +124 -0
  175. package/dist/{type/contract.js → adapters/solana/types.js} +1 -1
  176. package/dist/adapters/solana/types.js.map +1 -0
  177. package/dist/adapters/solana/web3.d.ts +5 -0
  178. package/dist/adapters/solana/web3.js +61 -0
  179. package/dist/adapters/solana/web3.js.map +1 -0
  180. package/dist/adapters/solana/wire.d.ts +62 -0
  181. package/dist/adapters/solana/wire.js +168 -0
  182. package/dist/adapters/solana/wire.js.map +1 -0
  183. package/dist/adapters/ton/address.d.ts +43 -0
  184. package/dist/adapters/ton/address.js +168 -0
  185. package/dist/adapters/ton/address.js.map +1 -0
  186. package/dist/adapters/ton/api.d.ts +344 -0
  187. package/dist/adapters/ton/api.js +942 -0
  188. package/dist/adapters/ton/api.js.map +1 -0
  189. package/dist/adapters/ton/builder.d.ts +18 -0
  190. package/dist/adapters/ton/builder.js +701 -0
  191. package/dist/adapters/ton/builder.js.map +1 -0
  192. package/dist/adapters/ton/chains.d.ts +16 -0
  193. package/dist/adapters/ton/chains.js +39 -0
  194. package/dist/adapters/ton/chains.js.map +1 -0
  195. package/dist/adapters/ton/decode.d.ts +43 -0
  196. package/dist/adapters/ton/decode.js +219 -0
  197. package/dist/adapters/ton/decode.js.map +1 -0
  198. package/dist/adapters/ton/driver.d.ts +10 -0
  199. package/dist/adapters/ton/driver.js +117 -0
  200. package/dist/adapters/ton/driver.js.map +1 -0
  201. package/dist/adapters/ton/errors.d.ts +36 -0
  202. package/dist/adapters/ton/errors.js +89 -0
  203. package/dist/adapters/ton/errors.js.map +1 -0
  204. package/dist/adapters/ton/fees.d.ts +28 -0
  205. package/dist/adapters/ton/fees.js +121 -0
  206. package/dist/adapters/ton/fees.js.map +1 -0
  207. package/dist/adapters/ton/index.d.ts +16 -0
  208. package/dist/adapters/ton/index.js +9 -0
  209. package/dist/adapters/ton/index.js.map +1 -0
  210. package/dist/adapters/ton/messages.d.ts +157 -0
  211. package/dist/adapters/ton/messages.js +397 -0
  212. package/dist/adapters/ton/messages.js.map +1 -0
  213. package/dist/adapters/ton/native-client.d.ts +10 -0
  214. package/dist/adapters/ton/native-client.js +47 -0
  215. package/dist/adapters/ton/native-client.js.map +1 -0
  216. package/dist/adapters/ton/network.d.ts +58 -0
  217. package/dist/adapters/ton/network.js +207 -0
  218. package/dist/adapters/ton/network.js.map +1 -0
  219. package/dist/adapters/ton/plugin.d.ts +24 -0
  220. package/dist/adapters/ton/plugin.js +57 -0
  221. package/dist/adapters/ton/plugin.js.map +1 -0
  222. package/dist/adapters/ton/presets.d.ts +6 -0
  223. package/dist/adapters/ton/presets.js +94 -0
  224. package/dist/adapters/ton/presets.js.map +1 -0
  225. package/dist/adapters/ton/proofs.d.ts +66 -0
  226. package/dist/adapters/ton/proofs.js +755 -0
  227. package/dist/adapters/ton/proofs.js.map +1 -0
  228. package/dist/adapters/ton/reader.d.ts +235 -0
  229. package/dist/adapters/ton/reader.js +976 -0
  230. package/dist/adapters/ton/reader.js.map +1 -0
  231. package/dist/adapters/ton/tokens.d.ts +10 -0
  232. package/dist/adapters/ton/tokens.js +27 -0
  233. package/dist/adapters/ton/tokens.js.map +1 -0
  234. package/dist/adapters/ton/trace.d.ts +74 -0
  235. package/dist/adapters/ton/trace.js +303 -0
  236. package/dist/adapters/ton/trace.js.map +1 -0
  237. package/dist/adapters/ton/types.d.ts +105 -0
  238. package/dist/{type/transact.js → adapters/ton/types.js} +1 -1
  239. package/dist/adapters/ton/types.js.map +1 -0
  240. package/dist/adapters/ton/wallets.d.ts +86 -0
  241. package/dist/adapters/ton/wallets.js +373 -0
  242. package/dist/adapters/ton/wallets.js.map +1 -0
  243. package/dist/adapters/tron/abi.d.ts +41 -0
  244. package/dist/adapters/tron/abi.js +112 -0
  245. package/dist/adapters/tron/abi.js.map +1 -0
  246. package/dist/adapters/tron/address.d.ts +20 -0
  247. package/dist/adapters/tron/address.js +110 -0
  248. package/dist/adapters/tron/address.js.map +1 -0
  249. package/dist/adapters/tron/builder.d.ts +12 -0
  250. package/dist/adapters/tron/builder.js +569 -0
  251. package/dist/adapters/tron/builder.js.map +1 -0
  252. package/dist/adapters/tron/chains.d.ts +12 -0
  253. package/dist/adapters/tron/chains.js +35 -0
  254. package/dist/adapters/tron/chains.js.map +1 -0
  255. package/dist/adapters/tron/codec.d.ts +10 -0
  256. package/dist/adapters/tron/codec.js +322 -0
  257. package/dist/adapters/tron/codec.js.map +1 -0
  258. package/dist/adapters/tron/decode.d.ts +52 -0
  259. package/dist/adapters/tron/decode.js +280 -0
  260. package/dist/adapters/tron/decode.js.map +1 -0
  261. package/dist/adapters/tron/driver.d.ts +12 -0
  262. package/dist/adapters/tron/driver.js +106 -0
  263. package/dist/adapters/tron/driver.js.map +1 -0
  264. package/dist/adapters/tron/errors.d.ts +74 -0
  265. package/dist/adapters/tron/errors.js +261 -0
  266. package/dist/adapters/tron/errors.js.map +1 -0
  267. package/dist/adapters/tron/fees.d.ts +49 -0
  268. package/dist/adapters/tron/fees.js +166 -0
  269. package/dist/adapters/tron/fees.js.map +1 -0
  270. package/dist/adapters/tron/http.d.ts +173 -0
  271. package/dist/adapters/tron/http.js +729 -0
  272. package/dist/adapters/tron/http.js.map +1 -0
  273. package/dist/adapters/tron/index.d.ts +16 -0
  274. package/dist/adapters/tron/index.js +15 -0
  275. package/dist/adapters/tron/index.js.map +1 -0
  276. package/dist/adapters/tron/network.d.ts +44 -0
  277. package/dist/adapters/tron/network.js +163 -0
  278. package/dist/adapters/tron/network.js.map +1 -0
  279. package/dist/adapters/tron/plugin.d.ts +17 -0
  280. package/dist/adapters/tron/plugin.js +39 -0
  281. package/dist/adapters/tron/plugin.js.map +1 -0
  282. package/dist/adapters/tron/presets.d.ts +5 -0
  283. package/dist/adapters/tron/presets.js +68 -0
  284. package/dist/adapters/tron/presets.js.map +1 -0
  285. package/dist/adapters/tron/proofs.d.ts +80 -0
  286. package/dist/adapters/tron/proofs.js +371 -0
  287. package/dist/adapters/tron/proofs.js.map +1 -0
  288. package/dist/adapters/tron/protobuf.d.ts +36 -0
  289. package/dist/adapters/tron/protobuf.js +90 -0
  290. package/dist/adapters/tron/protobuf.js.map +1 -0
  291. package/dist/adapters/tron/reader.d.ts +57 -0
  292. package/dist/adapters/tron/reader.js +220 -0
  293. package/dist/adapters/tron/reader.js.map +1 -0
  294. package/dist/adapters/tron/tokens.d.ts +9 -0
  295. package/dist/adapters/tron/tokens.js +14 -0
  296. package/dist/adapters/tron/tokens.js.map +1 -0
  297. package/dist/adapters/tron/types.d.ts +166 -0
  298. package/dist/adapters/tron/types.js +3 -0
  299. package/dist/adapters/tron/types.js.map +1 -0
  300. package/dist/adapters/utxo/address.d.ts +51 -0
  301. package/dist/adapters/utxo/address.js +341 -0
  302. package/dist/adapters/utxo/address.js.map +1 -0
  303. package/dist/adapters/utxo/builder.d.ts +35 -0
  304. package/dist/adapters/utxo/builder.js +380 -0
  305. package/dist/adapters/utxo/builder.js.map +1 -0
  306. package/dist/adapters/utxo/chains.d.ts +17 -0
  307. package/dist/adapters/utxo/chains.js +100 -0
  308. package/dist/adapters/utxo/chains.js.map +1 -0
  309. package/dist/adapters/utxo/codec.d.ts +120 -0
  310. package/dist/adapters/utxo/codec.js +408 -0
  311. package/dist/adapters/utxo/codec.js.map +1 -0
  312. package/dist/adapters/utxo/coinselect.d.ts +48 -0
  313. package/dist/adapters/utxo/coinselect.js +131 -0
  314. package/dist/adapters/utxo/coinselect.js.map +1 -0
  315. package/dist/adapters/utxo/context.d.ts +63 -0
  316. package/dist/adapters/utxo/context.js +125 -0
  317. package/dist/adapters/utxo/context.js.map +1 -0
  318. package/dist/adapters/utxo/decode.d.ts +22 -0
  319. package/dist/adapters/utxo/decode.js +121 -0
  320. package/dist/adapters/utxo/decode.js.map +1 -0
  321. package/dist/adapters/utxo/driver.d.ts +16 -0
  322. package/dist/adapters/utxo/driver.js +79 -0
  323. package/dist/adapters/utxo/driver.js.map +1 -0
  324. package/dist/adapters/utxo/ecc.d.ts +9 -0
  325. package/dist/adapters/utxo/ecc.js +26 -0
  326. package/dist/adapters/utxo/ecc.js.map +1 -0
  327. package/dist/adapters/utxo/errors.d.ts +52 -0
  328. package/dist/adapters/utxo/errors.js +191 -0
  329. package/dist/adapters/utxo/errors.js.map +1 -0
  330. package/dist/adapters/utxo/esplora.d.ts +100 -0
  331. package/dist/adapters/utxo/esplora.js +498 -0
  332. package/dist/adapters/utxo/esplora.js.map +1 -0
  333. package/dist/adapters/utxo/fees.d.ts +41 -0
  334. package/dist/adapters/utxo/fees.js +125 -0
  335. package/dist/adapters/utxo/fees.js.map +1 -0
  336. package/dist/adapters/utxo/index.d.ts +17 -0
  337. package/dist/adapters/utxo/index.js +8 -0
  338. package/dist/adapters/utxo/index.js.map +1 -0
  339. package/dist/adapters/utxo/network.d.ts +50 -0
  340. package/dist/adapters/utxo/network.js +165 -0
  341. package/dist/adapters/utxo/network.js.map +1 -0
  342. package/dist/adapters/utxo/plugin.d.ts +17 -0
  343. package/dist/adapters/utxo/plugin.js +41 -0
  344. package/dist/adapters/utxo/plugin.js.map +1 -0
  345. package/dist/adapters/utxo/presets.d.ts +12 -0
  346. package/dist/adapters/utxo/presets.js +47 -0
  347. package/dist/adapters/utxo/presets.js.map +1 -0
  348. package/dist/adapters/utxo/preview.d.ts +3 -0
  349. package/dist/adapters/utxo/preview.js +65 -0
  350. package/dist/adapters/utxo/preview.js.map +1 -0
  351. package/dist/adapters/utxo/proofs.d.ts +66 -0
  352. package/dist/adapters/utxo/proofs.js +469 -0
  353. package/dist/adapters/utxo/proofs.js.map +1 -0
  354. package/dist/adapters/utxo/rawblock.d.ts +46 -0
  355. package/dist/adapters/utxo/rawblock.js +159 -0
  356. package/dist/adapters/utxo/rawblock.js.map +1 -0
  357. package/dist/adapters/utxo/rawtx.d.ts +73 -0
  358. package/dist/adapters/utxo/rawtx.js +264 -0
  359. package/dist/adapters/utxo/rawtx.js.map +1 -0
  360. package/dist/adapters/utxo/reader.d.ts +36 -0
  361. package/dist/adapters/utxo/reader.js +265 -0
  362. package/dist/adapters/utxo/reader.js.map +1 -0
  363. package/dist/adapters/utxo/sdk.d.ts +18 -0
  364. package/dist/adapters/utxo/sdk.js +17 -0
  365. package/dist/adapters/utxo/sdk.js.map +1 -0
  366. package/dist/adapters/utxo/signed-psbt.d.ts +36 -0
  367. package/dist/adapters/utxo/signed-psbt.js +428 -0
  368. package/dist/adapters/utxo/signed-psbt.js.map +1 -0
  369. package/dist/adapters/utxo/spend.d.ts +59 -0
  370. package/dist/adapters/utxo/spend.js +230 -0
  371. package/dist/adapters/utxo/spend.js.map +1 -0
  372. package/dist/adapters/utxo/types.d.ts +167 -0
  373. package/dist/adapters/utxo/types.js +3 -0
  374. package/dist/adapters/utxo/types.js.map +1 -0
  375. package/dist/core/assets/service.d.ts +18 -0
  376. package/dist/core/assets/service.js +69 -0
  377. package/dist/core/assets/service.js.map +1 -0
  378. package/dist/core/blockchain/default-ref.d.ts +4 -0
  379. package/dist/core/blockchain/default-ref.js +16 -0
  380. package/dist/core/blockchain/default-ref.js.map +1 -0
  381. package/dist/core/blockchain/handle.d.ts +179 -0
  382. package/dist/core/blockchain/handle.js +579 -0
  383. package/dist/core/blockchain/handle.js.map +1 -0
  384. package/dist/core/blockchain/internal.d.ts +19 -0
  385. package/dist/core/blockchain/internal.js +16 -0
  386. package/dist/core/blockchain/internal.js.map +1 -0
  387. package/dist/core/blockchain/mapping.d.ts +22 -0
  388. package/dist/core/blockchain/mapping.js +136 -0
  389. package/dist/core/blockchain/mapping.js.map +1 -0
  390. package/dist/core/config/env.d.ts +8 -0
  391. package/dist/core/config/env.js +60 -0
  392. package/dist/core/config/env.js.map +1 -0
  393. package/dist/core/config/merge.d.ts +26 -0
  394. package/dist/core/config/merge.js +144 -0
  395. package/dist/core/config/merge.js.map +1 -0
  396. package/dist/core/config/resolve.d.ts +12 -0
  397. package/dist/core/config/resolve.js +251 -0
  398. package/dist/core/config/resolve.js.map +1 -0
  399. package/dist/core/config/types.d.ts +180 -0
  400. package/dist/core/config/types.js +3 -0
  401. package/dist/core/config/types.js.map +1 -0
  402. package/dist/core/container/builtins.d.ts +4 -0
  403. package/dist/core/container/builtins.js +13 -0
  404. package/dist/core/container/builtins.js.map +1 -0
  405. package/dist/core/container/container.d.ts +62 -0
  406. package/dist/core/container/container.js +500 -0
  407. package/dist/core/container/container.js.map +1 -0
  408. package/dist/core/container/default.d.ts +15 -0
  409. package/dist/core/container/default.js +70 -0
  410. package/dist/core/container/default.js.map +1 -0
  411. package/dist/core/container/internals.d.ts +54 -0
  412. package/dist/core/container/internals.js +21 -0
  413. package/dist/core/container/internals.js.map +1 -0
  414. package/dist/core/container/pool.d.ts +27 -0
  415. package/dist/core/container/pool.js +77 -0
  416. package/dist/core/container/pool.js.map +1 -0
  417. package/dist/core/driver/types.d.ts +379 -0
  418. package/dist/core/driver/types.js +3 -0
  419. package/dist/core/driver/types.js.map +1 -0
  420. package/dist/core/errors/codes.d.ts +163 -0
  421. package/dist/core/errors/codes.js +53 -0
  422. package/dist/core/errors/codes.js.map +1 -0
  423. package/dist/core/errors/error.d.ts +66 -0
  424. package/dist/core/errors/error.js +129 -0
  425. package/dist/core/errors/error.js.map +1 -0
  426. package/dist/core/events/bus.d.ts +12 -0
  427. package/dist/core/events/bus.js +46 -0
  428. package/dist/core/events/bus.js.map +1 -0
  429. package/dist/core/events/logger.d.ts +13 -0
  430. package/dist/core/events/logger.js +42 -0
  431. package/dist/core/events/logger.js.map +1 -0
  432. package/dist/core/events/types.d.ts +131 -0
  433. package/dist/core/events/types.js +3 -0
  434. package/dist/core/events/types.js.map +1 -0
  435. package/dist/core/lifecycle/engine-rules.d.ts +106 -0
  436. package/dist/core/lifecycle/engine-rules.js +267 -0
  437. package/dist/core/lifecycle/engine-rules.js.map +1 -0
  438. package/dist/core/lifecycle/engine.d.ts +502 -0
  439. package/dist/core/lifecycle/engine.js +1750 -0
  440. package/dist/core/lifecycle/engine.js.map +1 -0
  441. package/dist/core/lifecycle/evaluate.d.ts +19 -0
  442. package/dist/core/lifecycle/evaluate.js +77 -0
  443. package/dist/core/lifecycle/evaluate.js.map +1 -0
  444. package/dist/core/lifecycle/intent.d.ts +11 -0
  445. package/dist/core/lifecycle/intent.js +88 -0
  446. package/dist/core/lifecycle/intent.js.map +1 -0
  447. package/dist/core/lifecycle/monitor.d.ts +138 -0
  448. package/dist/core/lifecycle/monitor.js +616 -0
  449. package/dist/core/lifecycle/monitor.js.map +1 -0
  450. package/dist/core/lifecycle/observations.d.ts +17 -0
  451. package/dist/core/lifecycle/observations.js +59 -0
  452. package/dist/core/lifecycle/observations.js.map +1 -0
  453. package/dist/core/lifecycle/reconcile.d.ts +58 -0
  454. package/dist/core/lifecycle/reconcile.js +112 -0
  455. package/dist/core/lifecycle/reconcile.js.map +1 -0
  456. package/dist/core/lifecycle/views.d.ts +49 -0
  457. package/dist/core/lifecycle/views.js +57 -0
  458. package/dist/core/lifecycle/views.js.map +1 -0
  459. package/dist/core/lifecycle/workers.d.ts +88 -0
  460. package/dist/core/lifecycle/workers.js +347 -0
  461. package/dist/core/lifecycle/workers.js.map +1 -0
  462. package/dist/core/model/address.d.ts +32 -0
  463. package/dist/core/model/address.js +43 -0
  464. package/dist/core/model/address.js.map +1 -0
  465. package/dist/core/model/amount.d.ts +25 -0
  466. package/dist/core/model/amount.js +102 -0
  467. package/dist/core/model/amount.js.map +1 -0
  468. package/dist/core/model/asset.d.ts +28 -0
  469. package/dist/core/model/asset.js +47 -0
  470. package/dist/core/model/asset.js.map +1 -0
  471. package/dist/core/model/capability.d.ts +3 -0
  472. package/dist/core/model/capability.js +18 -0
  473. package/dist/core/model/capability.js.map +1 -0
  474. package/dist/core/model/chain.d.ts +63 -0
  475. package/dist/core/model/chain.js +8 -0
  476. package/dist/core/model/chain.js.map +1 -0
  477. package/dist/core/model/fee.d.ts +36 -0
  478. package/dist/core/model/fee.js +17 -0
  479. package/dist/core/model/fee.js.map +1 -0
  480. package/dist/core/model/ids.d.ts +38 -0
  481. package/dist/core/model/ids.js +14 -0
  482. package/dist/core/model/ids.js.map +1 -0
  483. package/dist/core/model/intent.d.ts +63 -0
  484. package/dist/core/model/intent.js +81 -0
  485. package/dist/core/model/intent.js.map +1 -0
  486. package/dist/core/model/ordering.d.ts +28 -0
  487. package/dist/core/model/ordering.js +29 -0
  488. package/dist/core/model/ordering.js.map +1 -0
  489. package/dist/core/model/transaction.d.ts +123 -0
  490. package/dist/{type/lib-types.js → core/model/transaction.js} +1 -1
  491. package/dist/core/model/transaction.js.map +1 -0
  492. package/dist/core/observe/scanner.d.ts +135 -0
  493. package/dist/core/observe/scanner.js +358 -0
  494. package/dist/core/observe/scanner.js.map +1 -0
  495. package/dist/core/ordering/reservations.d.ts +16 -0
  496. package/dist/core/ordering/reservations.js +53 -0
  497. package/dist/core/ordering/reservations.js.map +1 -0
  498. package/dist/core/ordering/sequence.d.ts +61 -0
  499. package/dist/core/ordering/sequence.js +155 -0
  500. package/dist/core/ordering/sequence.js.map +1 -0
  501. package/dist/core/registry/adapters.d.ts +10 -0
  502. package/dist/core/registry/adapters.js +56 -0
  503. package/dist/core/registry/adapters.js.map +1 -0
  504. package/dist/core/registry/assets.d.ts +18 -0
  505. package/dist/core/registry/assets.js +90 -0
  506. package/dist/core/registry/assets.js.map +1 -0
  507. package/dist/core/registry/chains.d.ts +10 -0
  508. package/dist/core/registry/chains.js +80 -0
  509. package/dist/core/registry/chains.js.map +1 -0
  510. package/dist/core/registry/plugin.d.ts +41 -0
  511. package/dist/core/registry/plugin.js +109 -0
  512. package/dist/core/registry/plugin.js.map +1 -0
  513. package/dist/core/registry/providers.d.ts +31 -0
  514. package/dist/core/registry/providers.js +43 -0
  515. package/dist/core/registry/providers.js.map +1 -0
  516. package/dist/core/registry/schemes.d.ts +30 -0
  517. package/dist/core/registry/schemes.js +84 -0
  518. package/dist/core/registry/schemes.js.map +1 -0
  519. package/dist/core/secret/fragments.d.ts +33 -0
  520. package/dist/core/secret/fragments.js +110 -0
  521. package/dist/core/secret/fragments.js.map +1 -0
  522. package/dist/core/secret/redact.d.ts +10 -0
  523. package/dist/core/secret/redact.js +110 -0
  524. package/dist/core/secret/redact.js.map +1 -0
  525. package/dist/core/secret/secret.d.ts +14 -0
  526. package/dist/core/secret/secret.js +42 -0
  527. package/dist/core/secret/secret.js.map +1 -0
  528. package/dist/core/signing/callback.d.ts +10 -0
  529. package/dist/core/signing/callback.js +22 -0
  530. package/dist/core/signing/callback.js.map +1 -0
  531. package/dist/core/signing/guard.d.ts +18 -0
  532. package/dist/core/signing/guard.js +72 -0
  533. package/dist/core/signing/guard.js.map +1 -0
  534. package/dist/core/signing/hd.d.ts +36 -0
  535. package/dist/core/signing/hd.js +167 -0
  536. package/dist/core/signing/hd.js.map +1 -0
  537. package/dist/core/signing/local.d.ts +48 -0
  538. package/dist/core/signing/local.js +190 -0
  539. package/dist/core/signing/local.js.map +1 -0
  540. package/dist/core/signing/orchestrator.d.ts +40 -0
  541. package/dist/core/signing/orchestrator.js +300 -0
  542. package/dist/core/signing/orchestrator.js.map +1 -0
  543. package/dist/core/signing/types.d.ts +64 -0
  544. package/dist/core/signing/types.js +3 -0
  545. package/dist/core/signing/types.js.map +1 -0
  546. package/dist/core/signing/wallet.d.ts +48 -0
  547. package/dist/core/signing/wallet.js +161 -0
  548. package/dist/core/signing/wallet.js.map +1 -0
  549. package/dist/core/store/clone.d.ts +25 -0
  550. package/dist/core/store/clone.js +71 -0
  551. package/dist/core/store/clone.js.map +1 -0
  552. package/dist/core/store/format.d.ts +20 -0
  553. package/dist/core/store/format.js +86 -0
  554. package/dist/core/store/format.js.map +1 -0
  555. package/dist/core/store/memory.d.ts +38 -0
  556. package/dist/core/store/memory.js +325 -0
  557. package/dist/core/store/memory.js.map +1 -0
  558. package/dist/core/store/types.d.ts +258 -0
  559. package/dist/core/store/types.js +119 -0
  560. package/dist/core/store/types.js.map +1 -0
  561. package/dist/core/transport/backoff.d.ts +8 -0
  562. package/dist/core/transport/backoff.js +27 -0
  563. package/dist/core/transport/backoff.js.map +1 -0
  564. package/dist/core/transport/circuit.d.ts +25 -0
  565. package/dist/core/transport/circuit.js +61 -0
  566. package/dist/core/transport/circuit.js.map +1 -0
  567. package/dist/core/transport/http-transport.d.ts +30 -0
  568. package/dist/core/transport/http-transport.js +1703 -0
  569. package/dist/core/transport/http-transport.js.map +1 -0
  570. package/dist/core/transport/rate-limit.d.ts +27 -0
  571. package/dist/core/transport/rate-limit.js +78 -0
  572. package/dist/core/transport/rate-limit.js.map +1 -0
  573. package/dist/core/transport/stale-view.d.ts +11 -0
  574. package/dist/core/transport/stale-view.js +17 -0
  575. package/dist/core/transport/stale-view.js.map +1 -0
  576. package/dist/core/transport/types.d.ts +159 -0
  577. package/dist/core/transport/types.js +6 -0
  578. package/dist/core/transport/types.js.map +1 -0
  579. package/dist/core/util/bytes.d.ts +9 -0
  580. package/dist/core/util/bytes.js +40 -0
  581. package/dist/core/util/bytes.js.map +1 -0
  582. package/dist/core/util/clock.d.ts +6 -0
  583. package/dist/core/util/clock.js +26 -0
  584. package/dist/core/util/clock.js.map +1 -0
  585. package/dist/core/util/freeze.d.ts +8 -0
  586. package/dist/core/util/freeze.js +31 -0
  587. package/dist/core/util/freeze.js.map +1 -0
  588. package/dist/core/util/json.d.ts +35 -0
  589. package/dist/core/util/json.js +174 -0
  590. package/dist/core/util/json.js.map +1 -0
  591. package/dist/core/util/names.d.ts +27 -0
  592. package/dist/core/util/names.js +56 -0
  593. package/dist/core/util/names.js.map +1 -0
  594. package/dist/index.d.ts +65 -14
  595. package/dist/index.js +107 -49
  596. package/dist/index.js.map +1 -1
  597. package/dist/native.d.ts +21 -0
  598. package/dist/native.js +44 -0
  599. package/dist/native.js.map +1 -0
  600. package/dist/testing/contracts/api.d.ts +12 -0
  601. package/dist/testing/contracts/api.js +58 -0
  602. package/dist/testing/contracts/api.js.map +1 -0
  603. package/dist/testing/contracts/cursors.d.ts +6 -0
  604. package/dist/testing/contracts/cursors.js +43 -0
  605. package/dist/testing/contracts/cursors.js.map +1 -0
  606. package/dist/testing/contracts/locks.d.ts +10 -0
  607. package/dist/testing/contracts/locks.js +63 -0
  608. package/dist/testing/contracts/locks.js.map +1 -0
  609. package/dist/testing/contracts/operations.d.ts +21 -0
  610. package/dist/testing/contracts/operations.js +737 -0
  611. package/dist/testing/contracts/operations.js.map +1 -0
  612. package/dist/testing/contracts/sequences.d.ts +6 -0
  613. package/dist/testing/contracts/sequences.js +68 -0
  614. package/dist/testing/contracts/sequences.js.map +1 -0
  615. package/dist/testing/env.d.ts +68 -0
  616. package/dist/testing/env.js +105 -0
  617. package/dist/testing/env.js.map +1 -0
  618. package/dist/testing/fake-chain.d.ts +118 -0
  619. package/dist/testing/fake-chain.js +536 -0
  620. package/dist/testing/fake-chain.js.map +1 -0
  621. package/dist/testing/fake-clock.d.ts +15 -0
  622. package/dist/testing/fake-clock.js +86 -0
  623. package/dist/testing/fake-clock.js.map +1 -0
  624. package/dist/testing/fake-driver.d.ts +15 -0
  625. package/dist/testing/fake-driver.js +458 -0
  626. package/dist/testing/fake-driver.js.map +1 -0
  627. package/dist/testing/fake-fetch.d.ts +32 -0
  628. package/dist/testing/fake-fetch.js +81 -0
  629. package/dist/testing/fake-fetch.js.map +1 -0
  630. package/dist/testing/fake-plugin.d.ts +30 -0
  631. package/dist/testing/fake-plugin.js +66 -0
  632. package/dist/testing/fake-plugin.js.map +1 -0
  633. package/dist/testing/faulty-store.d.ts +38 -0
  634. package/dist/testing/faulty-store.js +71 -0
  635. package/dist/testing/faulty-store.js.map +1 -0
  636. package/dist/testing/generation.d.ts +60 -0
  637. package/dist/testing/generation.js +252 -0
  638. package/dist/testing/generation.js.map +1 -0
  639. package/dist/testing/index.d.ts +28 -0
  640. package/dist/testing/index.js +51 -0
  641. package/dist/testing/index.js.map +1 -0
  642. package/package.json +198 -45
  643. package/dist/libs/eth/account.d.ts +0 -9
  644. package/dist/libs/eth/account.js +0 -58
  645. package/dist/libs/eth/account.js.map +0 -1
  646. package/dist/libs/eth/contract.d.ts +0 -7
  647. package/dist/libs/eth/contract.js +0 -42
  648. package/dist/libs/eth/contract.js.map +0 -1
  649. package/dist/libs/eth/index.d.ts +0 -24
  650. package/dist/libs/eth/index.js +0 -72
  651. package/dist/libs/eth/index.js.map +0 -1
  652. package/dist/libs/eth/transact.d.ts +0 -7
  653. package/dist/libs/eth/transact.js +0 -26
  654. package/dist/libs/eth/transact.js.map +0 -1
  655. package/dist/libs/index.d.ts +0 -2
  656. package/dist/libs/index.js +0 -19
  657. package/dist/libs/index.js.map +0 -1
  658. package/dist/libs/trx/account.d.ts +0 -9
  659. package/dist/libs/trx/account.js +0 -55
  660. package/dist/libs/trx/account.js.map +0 -1
  661. package/dist/libs/trx/contract.d.ts +0 -7
  662. package/dist/libs/trx/contract.js +0 -27
  663. package/dist/libs/trx/contract.js.map +0 -1
  664. package/dist/libs/trx/index.d.ts +0 -22
  665. package/dist/libs/trx/index.js +0 -64
  666. package/dist/libs/trx/index.js.map +0 -1
  667. package/dist/libs/trx/transact.d.ts +0 -7
  668. package/dist/libs/trx/transact.js +0 -26
  669. package/dist/libs/trx/transact.js.map +0 -1
  670. package/dist/tool/common.d.ts +0 -28
  671. package/dist/tool/common.js +0 -33
  672. package/dist/tool/common.js.map +0 -1
  673. package/dist/tool/eth-tools.d.ts +0 -3
  674. package/dist/tool/eth-tools.js +0 -33
  675. package/dist/tool/eth-tools.js.map +0 -1
  676. package/dist/tool/index.d.ts +0 -5
  677. package/dist/tool/index.js +0 -22
  678. package/dist/tool/index.js.map +0 -1
  679. package/dist/tool/logging.d.ts +0 -3
  680. package/dist/tool/logging.js +0 -11
  681. package/dist/tool/logging.js.map +0 -1
  682. package/dist/tool/options.d.ts +0 -6
  683. package/dist/tool/options.js +0 -41
  684. package/dist/tool/options.js.map +0 -1
  685. package/dist/tool/trx-tools.d.ts +0 -3
  686. package/dist/tool/trx-tools.js +0 -20
  687. package/dist/tool/trx-tools.js.map +0 -1
  688. package/dist/type/account.d.ts +0 -9
  689. package/dist/type/account.js.map +0 -1
  690. package/dist/type/common.d.ts +0 -18
  691. package/dist/type/common.js.map +0 -1
  692. package/dist/type/contract.d.ts +0 -10
  693. package/dist/type/contract.js.map +0 -1
  694. package/dist/type/index.d.ts +0 -5
  695. package/dist/type/index.js +0 -22
  696. package/dist/type/index.js.map +0 -1
  697. package/dist/type/lib-types.d.ts +0 -9
  698. package/dist/type/lib-types.js.map +0 -1
  699. package/dist/type/transact.d.ts +0 -7
  700. 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"]}