mppx 0.8.15 → 0.8.18

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 (966) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/README.md +15 -0
  3. package/dist/Challenge.js +61 -39
  4. package/dist/Constants.d.ts +17 -17
  5. package/dist/Errors.d.ts +3 -3
  6. package/dist/Method.d.ts +35 -5
  7. package/dist/Method.js +7 -22
  8. package/dist/Store.d.ts +19 -0
  9. package/dist/Store.js +43 -0
  10. package/dist/attestation/Client.d.ts +17 -0
  11. package/dist/attestation/Client.js +28 -0
  12. package/dist/attestation/Constants.d.ts +15 -0
  13. package/dist/attestation/Constants.js +15 -0
  14. package/dist/attestation/Server.d.ts +4 -0
  15. package/dist/attestation/Server.js +8 -0
  16. package/dist/attestation/Types.d.ts +76 -0
  17. package/dist/attestation/Types.js +2 -0
  18. package/dist/attestation/index.d.ts +6 -0
  19. package/dist/attestation/index.js +6 -0
  20. package/dist/attestation/internal/HttpMessageSignature.d.ts +73 -0
  21. package/dist/attestation/internal/HttpMessageSignature.js +320 -0
  22. package/dist/attestation/internal/SigningContext.d.ts +4 -0
  23. package/dist/attestation/internal/SigningContext.js +11 -0
  24. package/dist/bin.js +3 -3
  25. package/dist/cli/THIRD-PARTY-LICENSES.txt +328 -0
  26. package/dist/cli/account.d.ts +14 -14
  27. package/dist/cli/cli.d.ts +6 -6
  28. package/dist/cli/cli.js +253 -1504
  29. package/dist/cli/plugins/index.js +19 -5
  30. package/dist/cli/plugins/tempo.js +7 -3
  31. package/dist/cli/sessions/Manager.js +7 -4
  32. package/dist/cli/sessions/commands.d.ts +4 -4
  33. package/dist/cli/sessions/request.d.ts +2 -0
  34. package/dist/cli/sessions/request.js +18 -0
  35. package/dist/cli/sessions/store.js +28 -14
  36. package/dist/cli/utils.d.ts +1 -1
  37. package/dist/cli/validate/index.d.ts +3 -3
  38. package/dist/client/Mppx.d.ts +3 -0
  39. package/dist/client/Mppx.js +13 -5
  40. package/dist/client/Transport.d.ts +3 -5
  41. package/dist/client/Transport.js +1 -17
  42. package/dist/client/internal/Fetch.js +2 -6
  43. package/dist/discovery/Discovery.js +2 -1
  44. package/dist/discovery/OpenApi.d.ts +3 -5
  45. package/dist/discovery/OpenApi.js +13 -34
  46. package/dist/discovery/internal/Metadata.d.ts +20 -0
  47. package/dist/discovery/internal/Metadata.js +36 -0
  48. package/dist/evm/Methods.d.ts +11 -11
  49. package/dist/evm/Types.d.ts +17 -17
  50. package/dist/evm/client/Charge.d.ts +11 -11
  51. package/dist/evm/client/Charge.js +8 -0
  52. package/dist/evm/client/Methods.d.ts +11 -11
  53. package/dist/evm/server/Charge.d.ts +1 -1
  54. package/dist/evm/server/Charge.js +2 -0
  55. package/dist/evm/server/Methods.d.ts +11 -11
  56. package/dist/internal/HeaderCodec.d.ts +2 -2
  57. package/dist/internal/types.d.ts +6 -0
  58. package/dist/proxy/Proxy.d.ts +2 -0
  59. package/dist/proxy/Proxy.js +117 -9
  60. package/dist/proxy/Service.d.ts +36 -1
  61. package/dist/proxy/Service.js +9 -8
  62. package/dist/proxy/services/anthropic.js +1 -0
  63. package/dist/proxy/services/openai.js +1 -0
  64. package/dist/proxy/services/stripe.js +1 -0
  65. package/dist/server/Mppx.d.ts +75 -13
  66. package/dist/server/Mppx.js +201 -23
  67. package/dist/server/core.d.ts +9 -0
  68. package/dist/server/core.js +9 -0
  69. package/dist/server/internal/html/config.d.ts +9 -9
  70. package/dist/server/internal/html/constants.d.ts +17 -17
  71. package/dist/stripe/Methods.d.ts +10 -10
  72. package/dist/stripe/client/Charge.d.ts +10 -10
  73. package/dist/stripe/client/Methods.d.ts +10 -10
  74. package/dist/stripe/internal/constants.d.ts +1 -1
  75. package/dist/stripe/internal/constants.js +1 -1
  76. package/dist/stripe/internal/types.d.ts +1 -0
  77. package/dist/stripe/server/Charge.d.ts +11 -11
  78. package/dist/stripe/server/Charge.js +51 -5
  79. package/dist/stripe/server/Methods.d.ts +137 -48
  80. package/dist/stripe/server/Methods.js +265 -4
  81. package/dist/stripe/server/internal/deposit-address.d.ts +13 -0
  82. package/dist/stripe/server/internal/deposit-address.js +28 -0
  83. package/dist/stripe/server/internal/html.gen.d.ts +1 -1
  84. package/dist/stripe/server/internal/html.gen.js +1 -1
  85. package/dist/stripe/server/internal/record-payment.d.ts +15 -0
  86. package/dist/stripe/server/internal/record-payment.js +42 -0
  87. package/dist/stripe/server/internal/request.d.ts +25 -0
  88. package/dist/stripe/server/internal/request.js +29 -0
  89. package/dist/stripe/server/spt.d.ts +8 -0
  90. package/dist/stripe/server/spt.js +8 -0
  91. package/dist/tap/Constants.d.ts +28 -0
  92. package/dist/tap/Constants.js +32 -0
  93. package/dist/tap/Types.d.ts +11 -0
  94. package/dist/tap/Types.js +2 -0
  95. package/dist/tap/client/index.d.ts +26 -0
  96. package/dist/tap/client/index.js +33 -0
  97. package/dist/tap/index.d.ts +5 -0
  98. package/dist/tap/index.js +5 -0
  99. package/dist/tap/server/index.d.ts +20 -0
  100. package/dist/tap/server/index.js +36 -0
  101. package/dist/tempo/Attribution.d.ts +1 -1
  102. package/dist/tempo/Methods.d.ts +73 -60
  103. package/dist/tempo/Methods.js +14 -3
  104. package/dist/tempo/Proof.d.ts +16 -16
  105. package/dist/tempo/client/Charge.d.ts +22 -19
  106. package/dist/tempo/client/Charge.js +32 -16
  107. package/dist/tempo/client/Methods.d.ts +51 -38
  108. package/dist/tempo/client/Subscription.d.ts +23 -23
  109. package/dist/tempo/internal/address.d.ts +2 -1
  110. package/dist/tempo/internal/address.js +3 -1
  111. package/dist/tempo/internal/auto-swap.js +4 -19
  112. package/dist/tempo/internal/defaults.d.ts +17 -6
  113. package/dist/tempo/internal/defaults.js +11 -0
  114. package/dist/tempo/internal/fee-payer.d.ts +12 -12
  115. package/dist/tempo/internal/machine-token-charge.d.ts +51 -0
  116. package/dist/tempo/internal/machine-token-charge.js +113 -0
  117. package/dist/tempo/internal/machine-token-session.d.ts +88 -0
  118. package/dist/tempo/internal/machine-token-session.js +173 -0
  119. package/dist/tempo/internal/proof.d.ts +17 -17
  120. package/dist/tempo/internal/signature-envelope.d.ts +14 -0
  121. package/dist/tempo/internal/signature-envelope.js +28 -0
  122. package/dist/tempo/legacy/client/ChannelOps.d.ts +2 -2
  123. package/dist/tempo/legacy/client/ChannelOps.js +11 -5
  124. package/dist/tempo/legacy/client/Session.d.ts +33 -21
  125. package/dist/tempo/legacy/client/Session.js +3 -3
  126. package/dist/tempo/legacy/client/SessionManager.d.ts +3 -1
  127. package/dist/tempo/legacy/client/SessionManager.js +2 -0
  128. package/dist/tempo/legacy/index.d.ts +1 -3
  129. package/dist/tempo/legacy/index.js +1 -3
  130. package/dist/tempo/legacy/session/escrow.abi.d.ts +374 -374
  131. package/dist/tempo/server/Charge.d.ts +28 -11
  132. package/dist/tempo/server/Charge.js +101 -55
  133. package/dist/tempo/server/Methods.d.ts +58 -56
  134. package/dist/tempo/server/Methods.js +8 -18
  135. package/dist/tempo/server/Relay.d.ts +1 -1
  136. package/dist/tempo/server/Relay.js +2 -2
  137. package/dist/tempo/server/Subscription.d.ts +25 -25
  138. package/dist/tempo/server/Subscription.js +2 -0
  139. package/dist/tempo/server/index.d.ts +1 -1
  140. package/dist/tempo/server/index.js +1 -1
  141. package/dist/tempo/server/internal/html.gen.d.ts +1 -1
  142. package/dist/tempo/server/internal/html.gen.js +1 -1
  143. package/dist/tempo/server/internal/transport.d.ts +2 -0
  144. package/dist/tempo/server/internal/transport.js +9 -2
  145. package/dist/tempo/session/client/ChannelOps.d.ts +18 -3
  146. package/dist/tempo/session/client/ChannelOps.js +35 -6
  147. package/dist/tempo/session/client/ChannelStore.d.ts +0 -5
  148. package/dist/tempo/session/client/ChannelStore.js +2 -2
  149. package/dist/tempo/session/client/CredentialState.d.ts +18 -3
  150. package/dist/tempo/session/client/CredentialState.js +77 -76
  151. package/dist/tempo/session/client/Runtime.d.ts +4 -2
  152. package/dist/tempo/session/client/Runtime.js +21 -5
  153. package/dist/tempo/session/client/Session.d.ts +34 -22
  154. package/dist/tempo/session/client/Session.js +186 -63
  155. package/dist/tempo/session/client/SessionManager.d.ts +3 -1
  156. package/dist/tempo/session/client/SessionManager.js +35 -11
  157. package/dist/tempo/session/client/Transports.d.ts +2 -0
  158. package/dist/tempo/session/client/Transports.js +12 -2
  159. package/dist/tempo/session/precompile/Chain.d.ts +37 -2
  160. package/dist/tempo/session/precompile/Chain.js +116 -15
  161. package/dist/tempo/session/precompile/Protocol.d.ts +15 -0
  162. package/dist/tempo/session/precompile/Protocol.js +7 -0
  163. package/dist/tempo/session/precompile/Voucher.d.ts +7 -5
  164. package/dist/tempo/session/precompile/Voucher.js +6 -12
  165. package/dist/tempo/session/precompile/escrow.abi.d.ts +306 -306
  166. package/dist/tempo/session/server/ChannelStore.d.ts +15 -0
  167. package/dist/tempo/session/server/ChannelStore.js +27 -12
  168. package/dist/tempo/session/server/CredentialVerification.d.ts +39 -20
  169. package/dist/tempo/session/server/CredentialVerification.js +359 -89
  170. package/dist/tempo/session/server/MeteredStream.d.ts +4 -1
  171. package/dist/tempo/session/server/MeteredStream.js +8 -5
  172. package/dist/tempo/session/server/RequestState.d.ts +19 -0
  173. package/dist/tempo/session/server/RequestState.js +61 -15
  174. package/dist/tempo/session/server/Session.d.ts +46 -23
  175. package/dist/tempo/session/server/Session.js +150 -56
  176. package/dist/tempo/session/server/Settlement.d.ts +11 -4
  177. package/dist/tempo/session/server/Settlement.js +53 -21
  178. package/dist/tempo/session/server/Sse.d.ts +3 -1
  179. package/dist/tempo/session/server/Sse.js +2 -1
  180. package/dist/tempo/session/server/Transports.d.ts +1 -1
  181. package/dist/tempo/session/server/Transports.js +1 -0
  182. package/dist/tempo/session/server/Ws.d.ts +6 -1
  183. package/dist/tempo/session/server/Ws.js +1 -0
  184. package/dist/tempo/subscription/KeyAuthorization.d.ts +39 -39
  185. package/dist/web-bot-auth/Constants.d.ts +20 -0
  186. package/dist/web-bot-auth/Constants.js +24 -0
  187. package/dist/web-bot-auth/Types.d.ts +10 -0
  188. package/dist/web-bot-auth/Types.js +2 -0
  189. package/dist/web-bot-auth/client/index.d.ts +29 -0
  190. package/dist/web-bot-auth/client/index.js +64 -0
  191. package/dist/web-bot-auth/index.d.ts +7 -0
  192. package/dist/web-bot-auth/index.js +7 -0
  193. package/dist/web-bot-auth/internal/JwkThumbprint.d.ts +5 -0
  194. package/dist/web-bot-auth/internal/JwkThumbprint.js +20 -0
  195. package/dist/web-bot-auth/internal/SignatureAgent.d.ts +3 -0
  196. package/dist/web-bot-auth/internal/SignatureAgent.js +18 -0
  197. package/dist/web-bot-auth/server/index.d.ts +35 -0
  198. package/dist/web-bot-auth/server/index.js +88 -0
  199. package/dist/x402/Types.d.ts +6 -6
  200. package/dist/x402/client/Exact.d.ts +8 -0
  201. package/dist/x402/client/Exact.js +40 -10
  202. package/dist/x402/server/EvmCharge.d.ts +22 -0
  203. package/dist/x402/server/EvmCharge.js +54 -20
  204. package/package.json +28 -34
  205. package/dist/BodyDigest.d.ts.map +0 -1
  206. package/dist/BodyDigest.js.map +0 -1
  207. package/dist/Challenge.d.ts.map +0 -1
  208. package/dist/Challenge.js.map +0 -1
  209. package/dist/Constants.d.ts.map +0 -1
  210. package/dist/Constants.js.map +0 -1
  211. package/dist/Credential.d.ts.map +0 -1
  212. package/dist/Credential.js.map +0 -1
  213. package/dist/Errors.d.ts.map +0 -1
  214. package/dist/Errors.js.map +0 -1
  215. package/dist/Expires.d.ts.map +0 -1
  216. package/dist/Expires.js.map +0 -1
  217. package/dist/Html.d.ts.map +0 -1
  218. package/dist/Html.js.map +0 -1
  219. package/dist/Mcp.d.ts.map +0 -1
  220. package/dist/Mcp.js.map +0 -1
  221. package/dist/Method.d.ts.map +0 -1
  222. package/dist/Method.js.map +0 -1
  223. package/dist/PaymentRequest.d.ts.map +0 -1
  224. package/dist/PaymentRequest.js.map +0 -1
  225. package/dist/Receipt.d.ts.map +0 -1
  226. package/dist/Receipt.js.map +0 -1
  227. package/dist/Store.d.ts.map +0 -1
  228. package/dist/Store.js.map +0 -1
  229. package/dist/bin.d.ts.map +0 -1
  230. package/dist/bin.js.map +0 -1
  231. package/dist/cli/account.d.ts.map +0 -1
  232. package/dist/cli/account.js.map +0 -1
  233. package/dist/cli/cli.d.ts.map +0 -1
  234. package/dist/cli/cli.js.map +0 -1
  235. package/dist/cli/config.d.ts.map +0 -1
  236. package/dist/cli/config.js.map +0 -1
  237. package/dist/cli/internal.d.ts.map +0 -1
  238. package/dist/cli/internal.js.map +0 -1
  239. package/dist/cli/plugins/evm.d.ts.map +0 -1
  240. package/dist/cli/plugins/evm.js.map +0 -1
  241. package/dist/cli/plugins/index.d.ts.map +0 -1
  242. package/dist/cli/plugins/index.js.map +0 -1
  243. package/dist/cli/plugins/plugin.d.ts.map +0 -1
  244. package/dist/cli/plugins/plugin.js.map +0 -1
  245. package/dist/cli/plugins/stripe.d.ts.map +0 -1
  246. package/dist/cli/plugins/stripe.js.map +0 -1
  247. package/dist/cli/plugins/tempo.d.ts.map +0 -1
  248. package/dist/cli/plugins/tempo.js.map +0 -1
  249. package/dist/cli/sessions/Manager.d.ts.map +0 -1
  250. package/dist/cli/sessions/Manager.js.map +0 -1
  251. package/dist/cli/sessions/commands.d.ts.map +0 -1
  252. package/dist/cli/sessions/commands.js.map +0 -1
  253. package/dist/cli/sessions/request.d.ts.map +0 -1
  254. package/dist/cli/sessions/request.js.map +0 -1
  255. package/dist/cli/sessions/store.d.ts.map +0 -1
  256. package/dist/cli/sessions/store.js.map +0 -1
  257. package/dist/cli/utils.d.ts.map +0 -1
  258. package/dist/cli/utils.js.map +0 -1
  259. package/dist/cli/validate/challenge.d.ts.map +0 -1
  260. package/dist/cli/validate/challenge.js.map +0 -1
  261. package/dist/cli/validate/discovery.d.ts.map +0 -1
  262. package/dist/cli/validate/discovery.js.map +0 -1
  263. package/dist/cli/validate/helpers.d.ts.map +0 -1
  264. package/dist/cli/validate/helpers.js.map +0 -1
  265. package/dist/cli/validate/index.d.ts.map +0 -1
  266. package/dist/cli/validate/index.js.map +0 -1
  267. package/dist/cli/validate/messages.d.ts.map +0 -1
  268. package/dist/cli/validate/messages.js.map +0 -1
  269. package/dist/cli/validate/payment.d.ts.map +0 -1
  270. package/dist/cli/validate/payment.js.map +0 -1
  271. package/dist/client/Methods.d.ts.map +0 -1
  272. package/dist/client/Methods.js.map +0 -1
  273. package/dist/client/Mppx.d.ts.map +0 -1
  274. package/dist/client/Mppx.js.map +0 -1
  275. package/dist/client/Transport.d.ts.map +0 -1
  276. package/dist/client/Transport.js.map +0 -1
  277. package/dist/client/index.d.ts.map +0 -1
  278. package/dist/client/index.js.map +0 -1
  279. package/dist/client/internal/Fetch.d.ts.map +0 -1
  280. package/dist/client/internal/Fetch.js.map +0 -1
  281. package/dist/client/internal/MethodChallenge.d.ts.map +0 -1
  282. package/dist/client/internal/MethodChallenge.js.map +0 -1
  283. package/dist/client/internal/MethodResponse.d.ts.map +0 -1
  284. package/dist/client/internal/MethodResponse.js.map +0 -1
  285. package/dist/client/internal/protocols/Mcp.d.ts.map +0 -1
  286. package/dist/client/internal/protocols/Mcp.js.map +0 -1
  287. package/dist/client/internal/protocols/Mpp.d.ts.map +0 -1
  288. package/dist/client/internal/protocols/Mpp.js.map +0 -1
  289. package/dist/client/internal/protocols/Protocol.d.ts.map +0 -1
  290. package/dist/client/internal/protocols/Protocol.js.map +0 -1
  291. package/dist/client/internal/protocols/Shared.d.ts.map +0 -1
  292. package/dist/client/internal/protocols/Shared.js.map +0 -1
  293. package/dist/client/internal/protocols/X402.d.ts.map +0 -1
  294. package/dist/client/internal/protocols/X402.js.map +0 -1
  295. package/dist/client/node.d.ts.map +0 -1
  296. package/dist/client/node.js.map +0 -1
  297. package/dist/discovery/Discovery.d.ts.map +0 -1
  298. package/dist/discovery/Discovery.js.map +0 -1
  299. package/dist/discovery/OpenApi.d.ts.map +0 -1
  300. package/dist/discovery/OpenApi.js.map +0 -1
  301. package/dist/discovery/Validate.d.ts.map +0 -1
  302. package/dist/discovery/Validate.js.map +0 -1
  303. package/dist/discovery/index.d.ts.map +0 -1
  304. package/dist/discovery/index.js.map +0 -1
  305. package/dist/evm/Assets.d.ts.map +0 -1
  306. package/dist/evm/Assets.js.map +0 -1
  307. package/dist/evm/Chains.d.ts.map +0 -1
  308. package/dist/evm/Chains.js.map +0 -1
  309. package/dist/evm/Methods.d.ts.map +0 -1
  310. package/dist/evm/Methods.js.map +0 -1
  311. package/dist/evm/Types.d.ts.map +0 -1
  312. package/dist/evm/Types.js.map +0 -1
  313. package/dist/evm/client/Charge.d.ts.map +0 -1
  314. package/dist/evm/client/Charge.js.map +0 -1
  315. package/dist/evm/client/Methods.d.ts.map +0 -1
  316. package/dist/evm/client/Methods.js.map +0 -1
  317. package/dist/evm/client/index.d.ts.map +0 -1
  318. package/dist/evm/client/index.js.map +0 -1
  319. package/dist/evm/index.d.ts.map +0 -1
  320. package/dist/evm/index.js.map +0 -1
  321. package/dist/evm/server/Charge.d.ts.map +0 -1
  322. package/dist/evm/server/Charge.js.map +0 -1
  323. package/dist/evm/server/Methods.d.ts.map +0 -1
  324. package/dist/evm/server/Methods.js.map +0 -1
  325. package/dist/evm/server/index.d.ts.map +0 -1
  326. package/dist/evm/server/index.js.map +0 -1
  327. package/dist/index.d.ts.map +0 -1
  328. package/dist/index.js.map +0 -1
  329. package/dist/internal/AcceptPayment.d.ts.map +0 -1
  330. package/dist/internal/AcceptPayment.js.map +0 -1
  331. package/dist/internal/HeaderCodec.d.ts.map +0 -1
  332. package/dist/internal/HeaderCodec.js.map +0 -1
  333. package/dist/internal/constantTimeEqual.d.ts.map +0 -1
  334. package/dist/internal/constantTimeEqual.js.map +0 -1
  335. package/dist/internal/env.d.ts.map +0 -1
  336. package/dist/internal/env.js.map +0 -1
  337. package/dist/internal/types.d.ts.map +0 -1
  338. package/dist/internal/types.js.map +0 -1
  339. package/dist/mcp/client/McpClient.d.ts.map +0 -1
  340. package/dist/mcp/client/McpClient.js.map +0 -1
  341. package/dist/mcp/client/index.d.ts.map +0 -1
  342. package/dist/mcp/client/index.js.map +0 -1
  343. package/dist/mcp/server/Transport.d.ts.map +0 -1
  344. package/dist/mcp/server/Transport.js.map +0 -1
  345. package/dist/mcp/server/index.d.ts.map +0 -1
  346. package/dist/mcp/server/index.js.map +0 -1
  347. package/dist/middlewares/elysia.d.ts.map +0 -1
  348. package/dist/middlewares/elysia.js.map +0 -1
  349. package/dist/middlewares/express.d.ts.map +0 -1
  350. package/dist/middlewares/express.js.map +0 -1
  351. package/dist/middlewares/hono.d.ts.map +0 -1
  352. package/dist/middlewares/hono.js.map +0 -1
  353. package/dist/middlewares/internal/mppx.d.ts.map +0 -1
  354. package/dist/middlewares/internal/mppx.js.map +0 -1
  355. package/dist/middlewares/nextjs.d.ts.map +0 -1
  356. package/dist/middlewares/nextjs.js.map +0 -1
  357. package/dist/proxy/Proxy.d.ts.map +0 -1
  358. package/dist/proxy/Proxy.js.map +0 -1
  359. package/dist/proxy/Service.d.ts.map +0 -1
  360. package/dist/proxy/Service.js.map +0 -1
  361. package/dist/proxy/index.d.ts.map +0 -1
  362. package/dist/proxy/index.js.map +0 -1
  363. package/dist/proxy/internal/Headers.d.ts.map +0 -1
  364. package/dist/proxy/internal/Headers.js.map +0 -1
  365. package/dist/proxy/internal/Route.d.ts.map +0 -1
  366. package/dist/proxy/internal/Route.js.map +0 -1
  367. package/dist/proxy/services/anthropic.d.ts.map +0 -1
  368. package/dist/proxy/services/anthropic.js.map +0 -1
  369. package/dist/proxy/services/openai.d.ts.map +0 -1
  370. package/dist/proxy/services/openai.js.map +0 -1
  371. package/dist/proxy/services/stripe.d.ts.map +0 -1
  372. package/dist/proxy/services/stripe.js.map +0 -1
  373. package/dist/server/Methods.d.ts.map +0 -1
  374. package/dist/server/Methods.js.map +0 -1
  375. package/dist/server/Mppx.d.ts.map +0 -1
  376. package/dist/server/Mppx.js.map +0 -1
  377. package/dist/server/NodeListener.d.ts.map +0 -1
  378. package/dist/server/NodeListener.js.map +0 -1
  379. package/dist/server/Request.d.ts.map +0 -1
  380. package/dist/server/Request.js.map +0 -1
  381. package/dist/server/Response.d.ts.map +0 -1
  382. package/dist/server/Response.js.map +0 -1
  383. package/dist/server/Transport.d.ts.map +0 -1
  384. package/dist/server/Transport.js.map +0 -1
  385. package/dist/server/index.d.ts.map +0 -1
  386. package/dist/server/index.js.map +0 -1
  387. package/dist/server/internal/html/compose.main.gen.d.ts.map +0 -1
  388. package/dist/server/internal/html/compose.main.gen.js.map +0 -1
  389. package/dist/server/internal/html/config.d.ts.map +0 -1
  390. package/dist/server/internal/html/config.js.map +0 -1
  391. package/dist/server/internal/html/constants.d.ts.map +0 -1
  392. package/dist/server/internal/html/constants.js.map +0 -1
  393. package/dist/server/internal/html/serviceWorker.client.d.ts.map +0 -1
  394. package/dist/server/internal/html/serviceWorker.client.js.map +0 -1
  395. package/dist/server/internal/html/serviceWorker.gen.d.ts.map +0 -1
  396. package/dist/server/internal/html/serviceWorker.gen.js.map +0 -1
  397. package/dist/server/internal/scope.d.ts.map +0 -1
  398. package/dist/server/internal/scope.js.map +0 -1
  399. package/dist/stripe/Methods.d.ts.map +0 -1
  400. package/dist/stripe/Methods.js.map +0 -1
  401. package/dist/stripe/client/Charge.d.ts.map +0 -1
  402. package/dist/stripe/client/Charge.js.map +0 -1
  403. package/dist/stripe/client/Methods.d.ts.map +0 -1
  404. package/dist/stripe/client/Methods.js.map +0 -1
  405. package/dist/stripe/client/index.d.ts.map +0 -1
  406. package/dist/stripe/client/index.js.map +0 -1
  407. package/dist/stripe/index.d.ts.map +0 -1
  408. package/dist/stripe/index.js.map +0 -1
  409. package/dist/stripe/internal/constants.d.ts.map +0 -1
  410. package/dist/stripe/internal/constants.js.map +0 -1
  411. package/dist/stripe/internal/types.d.ts.map +0 -1
  412. package/dist/stripe/internal/types.js.map +0 -1
  413. package/dist/stripe/server/Charge.d.ts.map +0 -1
  414. package/dist/stripe/server/Charge.js.map +0 -1
  415. package/dist/stripe/server/Methods.d.ts.map +0 -1
  416. package/dist/stripe/server/Methods.js.map +0 -1
  417. package/dist/stripe/server/index.d.ts.map +0 -1
  418. package/dist/stripe/server/index.js.map +0 -1
  419. package/dist/stripe/server/internal/html/types.d.ts.map +0 -1
  420. package/dist/stripe/server/internal/html/types.js.map +0 -1
  421. package/dist/stripe/server/internal/html.gen.d.ts.map +0 -1
  422. package/dist/stripe/server/internal/html.gen.js.map +0 -1
  423. package/dist/tempo/Attribution.d.ts.map +0 -1
  424. package/dist/tempo/Attribution.js.map +0 -1
  425. package/dist/tempo/Methods.d.ts.map +0 -1
  426. package/dist/tempo/Methods.js.map +0 -1
  427. package/dist/tempo/Proof.d.ts.map +0 -1
  428. package/dist/tempo/Proof.js.map +0 -1
  429. package/dist/tempo/client/Charge.d.ts.map +0 -1
  430. package/dist/tempo/client/Charge.js.map +0 -1
  431. package/dist/tempo/client/Methods.d.ts.map +0 -1
  432. package/dist/tempo/client/Methods.js.map +0 -1
  433. package/dist/tempo/client/ResolveAccount.d.ts.map +0 -1
  434. package/dist/tempo/client/ResolveAccount.js.map +0 -1
  435. package/dist/tempo/client/Subscription.d.ts.map +0 -1
  436. package/dist/tempo/client/Subscription.js.map +0 -1
  437. package/dist/tempo/client/index.d.ts.map +0 -1
  438. package/dist/tempo/client/index.js.map +0 -1
  439. package/dist/tempo/index.d.ts.map +0 -1
  440. package/dist/tempo/index.js.map +0 -1
  441. package/dist/tempo/internal/account.d.ts.map +0 -1
  442. package/dist/tempo/internal/account.js.map +0 -1
  443. package/dist/tempo/internal/address.d.ts.map +0 -1
  444. package/dist/tempo/internal/address.js.map +0 -1
  445. package/dist/tempo/internal/auto-swap.d.ts.map +0 -1
  446. package/dist/tempo/internal/auto-swap.js.map +0 -1
  447. package/dist/tempo/internal/charge.d.ts.map +0 -1
  448. package/dist/tempo/internal/charge.js.map +0 -1
  449. package/dist/tempo/internal/defaults.d.ts.map +0 -1
  450. package/dist/tempo/internal/defaults.js.map +0 -1
  451. package/dist/tempo/internal/fee-payer.d.ts.map +0 -1
  452. package/dist/tempo/internal/fee-payer.js.map +0 -1
  453. package/dist/tempo/internal/fee-token.d.ts.map +0 -1
  454. package/dist/tempo/internal/fee-token.js.map +0 -1
  455. package/dist/tempo/internal/proof.d.ts.map +0 -1
  456. package/dist/tempo/internal/proof.js.map +0 -1
  457. package/dist/tempo/internal/selectors.d.ts.map +0 -1
  458. package/dist/tempo/internal/selectors.js.map +0 -1
  459. package/dist/tempo/internal/types.d.ts.map +0 -1
  460. package/dist/tempo/internal/types.js.map +0 -1
  461. package/dist/tempo/legacy/client/ChannelOps.d.ts.map +0 -1
  462. package/dist/tempo/legacy/client/ChannelOps.js.map +0 -1
  463. package/dist/tempo/legacy/client/Session.d.ts.map +0 -1
  464. package/dist/tempo/legacy/client/Session.js.map +0 -1
  465. package/dist/tempo/legacy/client/SessionManager.d.ts.map +0 -1
  466. package/dist/tempo/legacy/client/SessionManager.js.map +0 -1
  467. package/dist/tempo/legacy/client/index.d.ts.map +0 -1
  468. package/dist/tempo/legacy/client/index.js.map +0 -1
  469. package/dist/tempo/legacy/index.d.ts.map +0 -1
  470. package/dist/tempo/legacy/index.js.map +0 -1
  471. package/dist/tempo/legacy/server/Session.d.ts +0 -208
  472. package/dist/tempo/legacy/server/Session.d.ts.map +0 -1
  473. package/dist/tempo/legacy/server/Session.js +0 -698
  474. package/dist/tempo/legacy/server/Session.js.map +0 -1
  475. package/dist/tempo/legacy/server/index.d.ts +0 -5
  476. package/dist/tempo/legacy/server/index.d.ts.map +0 -1
  477. package/dist/tempo/legacy/server/index.js +0 -5
  478. package/dist/tempo/legacy/server/index.js.map +0 -1
  479. package/dist/tempo/legacy/session/Chain.d.ts.map +0 -1
  480. package/dist/tempo/legacy/session/Chain.js.map +0 -1
  481. package/dist/tempo/legacy/session/Channel.d.ts.map +0 -1
  482. package/dist/tempo/legacy/session/Channel.js.map +0 -1
  483. package/dist/tempo/legacy/session/ChannelStore.d.ts +0 -22
  484. package/dist/tempo/legacy/session/ChannelStore.d.ts.map +0 -1
  485. package/dist/tempo/legacy/session/ChannelStore.js +0 -6
  486. package/dist/tempo/legacy/session/ChannelStore.js.map +0 -1
  487. package/dist/tempo/legacy/session/Types.d.ts.map +0 -1
  488. package/dist/tempo/legacy/session/Types.js.map +0 -1
  489. package/dist/tempo/legacy/session/Voucher.d.ts.map +0 -1
  490. package/dist/tempo/legacy/session/Voucher.js.map +0 -1
  491. package/dist/tempo/legacy/session/escrow.abi.d.ts.map +0 -1
  492. package/dist/tempo/legacy/session/escrow.abi.js.map +0 -1
  493. package/dist/tempo/legacy/session/index.d.ts.map +0 -1
  494. package/dist/tempo/legacy/session/index.js.map +0 -1
  495. package/dist/tempo/server/Charge.d.ts.map +0 -1
  496. package/dist/tempo/server/Charge.js.map +0 -1
  497. package/dist/tempo/server/Methods.d.ts.map +0 -1
  498. package/dist/tempo/server/Methods.js.map +0 -1
  499. package/dist/tempo/server/Relay.d.ts.map +0 -1
  500. package/dist/tempo/server/Relay.js.map +0 -1
  501. package/dist/tempo/server/SponsorBudget.d.ts.map +0 -1
  502. package/dist/tempo/server/SponsorBudget.js.map +0 -1
  503. package/dist/tempo/server/Subscription.d.ts.map +0 -1
  504. package/dist/tempo/server/Subscription.js.map +0 -1
  505. package/dist/tempo/server/index.d.ts.map +0 -1
  506. package/dist/tempo/server/index.js.map +0 -1
  507. package/dist/tempo/server/internal/html.gen.d.ts.map +0 -1
  508. package/dist/tempo/server/internal/html.gen.js.map +0 -1
  509. package/dist/tempo/server/internal/request-body.d.ts.map +0 -1
  510. package/dist/tempo/server/internal/request-body.js.map +0 -1
  511. package/dist/tempo/server/internal/transport.d.ts.map +0 -1
  512. package/dist/tempo/server/internal/transport.js.map +0 -1
  513. package/dist/tempo/session/Snapshot.d.ts.map +0 -1
  514. package/dist/tempo/session/Snapshot.js.map +0 -1
  515. package/dist/tempo/session/client/ChannelOps.d.ts.map +0 -1
  516. package/dist/tempo/session/client/ChannelOps.js.map +0 -1
  517. package/dist/tempo/session/client/ChannelStore.d.ts.map +0 -1
  518. package/dist/tempo/session/client/ChannelStore.js.map +0 -1
  519. package/dist/tempo/session/client/CredentialState.d.ts.map +0 -1
  520. package/dist/tempo/session/client/CredentialState.js.map +0 -1
  521. package/dist/tempo/session/client/ReceiptCoordinator.d.ts.map +0 -1
  522. package/dist/tempo/session/client/ReceiptCoordinator.js.map +0 -1
  523. package/dist/tempo/session/client/Runtime.d.ts.map +0 -1
  524. package/dist/tempo/session/client/Runtime.js.map +0 -1
  525. package/dist/tempo/session/client/Session.d.ts.map +0 -1
  526. package/dist/tempo/session/client/Session.js.map +0 -1
  527. package/dist/tempo/session/client/SessionManager.d.ts.map +0 -1
  528. package/dist/tempo/session/client/SessionManager.js.map +0 -1
  529. package/dist/tempo/session/client/Transports.d.ts.map +0 -1
  530. package/dist/tempo/session/client/Transports.js.map +0 -1
  531. package/dist/tempo/session/client/index.d.ts.map +0 -1
  532. package/dist/tempo/session/client/index.js.map +0 -1
  533. package/dist/tempo/session/client/internal/SessionManager.d.ts.map +0 -1
  534. package/dist/tempo/session/client/internal/SessionManager.js.map +0 -1
  535. package/dist/tempo/session/index.d.ts.map +0 -1
  536. package/dist/tempo/session/index.js.map +0 -1
  537. package/dist/tempo/session/precompile/Chain.d.ts.map +0 -1
  538. package/dist/tempo/session/precompile/Chain.js.map +0 -1
  539. package/dist/tempo/session/precompile/Channel.d.ts.map +0 -1
  540. package/dist/tempo/session/precompile/Channel.js.map +0 -1
  541. package/dist/tempo/session/precompile/Protocol.d.ts.map +0 -1
  542. package/dist/tempo/session/precompile/Protocol.js.map +0 -1
  543. package/dist/tempo/session/precompile/Voucher.d.ts.map +0 -1
  544. package/dist/tempo/session/precompile/Voucher.js.map +0 -1
  545. package/dist/tempo/session/precompile/escrow.abi.d.ts.map +0 -1
  546. package/dist/tempo/session/precompile/escrow.abi.js.map +0 -1
  547. package/dist/tempo/session/precompile/index.d.ts.map +0 -1
  548. package/dist/tempo/session/precompile/index.js.map +0 -1
  549. package/dist/tempo/session/server/ChannelOps.d.ts.map +0 -1
  550. package/dist/tempo/session/server/ChannelOps.js.map +0 -1
  551. package/dist/tempo/session/server/ChannelStore.d.ts.map +0 -1
  552. package/dist/tempo/session/server/ChannelStore.js.map +0 -1
  553. package/dist/tempo/session/server/CredentialVerification.d.ts.map +0 -1
  554. package/dist/tempo/session/server/CredentialVerification.js.map +0 -1
  555. package/dist/tempo/session/server/MeteredStream.d.ts.map +0 -1
  556. package/dist/tempo/session/server/MeteredStream.js.map +0 -1
  557. package/dist/tempo/session/server/RequestState.d.ts.map +0 -1
  558. package/dist/tempo/session/server/RequestState.js.map +0 -1
  559. package/dist/tempo/session/server/Session.d.ts.map +0 -1
  560. package/dist/tempo/session/server/Session.js.map +0 -1
  561. package/dist/tempo/session/server/Settlement.d.ts.map +0 -1
  562. package/dist/tempo/session/server/Settlement.js.map +0 -1
  563. package/dist/tempo/session/server/Sse.d.ts.map +0 -1
  564. package/dist/tempo/session/server/Sse.js.map +0 -1
  565. package/dist/tempo/session/server/Transports.d.ts.map +0 -1
  566. package/dist/tempo/session/server/Transports.js.map +0 -1
  567. package/dist/tempo/session/server/Ws.d.ts.map +0 -1
  568. package/dist/tempo/session/server/Ws.js.map +0 -1
  569. package/dist/tempo/session/server/index.d.ts.map +0 -1
  570. package/dist/tempo/session/server/index.js.map +0 -1
  571. package/dist/tempo/subscription/KeyAuthorization.d.ts.map +0 -1
  572. package/dist/tempo/subscription/KeyAuthorization.js.map +0 -1
  573. package/dist/tempo/subscription/Receipt.d.ts.map +0 -1
  574. package/dist/tempo/subscription/Receipt.js.map +0 -1
  575. package/dist/tempo/subscription/Store.d.ts.map +0 -1
  576. package/dist/tempo/subscription/Store.js.map +0 -1
  577. package/dist/tempo/subscription/Types.d.ts.map +0 -1
  578. package/dist/tempo/subscription/Types.js.map +0 -1
  579. package/dist/tempo/subscription/index.d.ts.map +0 -1
  580. package/dist/tempo/subscription/index.js.map +0 -1
  581. package/dist/validation/core.d.ts.map +0 -1
  582. package/dist/validation/core.js.map +0 -1
  583. package/dist/validation/index.d.ts.map +0 -1
  584. package/dist/validation/index.js.map +0 -1
  585. package/dist/viem/Account.d.ts.map +0 -1
  586. package/dist/viem/Account.js.map +0 -1
  587. package/dist/viem/Client.d.ts.map +0 -1
  588. package/dist/viem/Client.js.map +0 -1
  589. package/dist/x402/Assets.d.ts.map +0 -1
  590. package/dist/x402/Assets.js.map +0 -1
  591. package/dist/x402/Header.d.ts.map +0 -1
  592. package/dist/x402/Header.js.map +0 -1
  593. package/dist/x402/Types.d.ts.map +0 -1
  594. package/dist/x402/Types.js.map +0 -1
  595. package/dist/x402/client/Exact.d.ts.map +0 -1
  596. package/dist/x402/client/Exact.js.map +0 -1
  597. package/dist/x402/index.d.ts.map +0 -1
  598. package/dist/x402/index.js.map +0 -1
  599. package/dist/x402/internal/ChallengeBrand.d.ts.map +0 -1
  600. package/dist/x402/internal/ChallengeBrand.js.map +0 -1
  601. package/dist/x402/internal/RouteBinding.d.ts.map +0 -1
  602. package/dist/x402/internal/RouteBinding.js.map +0 -1
  603. package/dist/x402/server/EvmCharge.d.ts.map +0 -1
  604. package/dist/x402/server/EvmCharge.js.map +0 -1
  605. package/dist/x402/server/Facilitator.d.ts.map +0 -1
  606. package/dist/x402/server/Facilitator.js.map +0 -1
  607. package/dist/zod.d.ts.map +0 -1
  608. package/dist/zod.js.map +0 -1
  609. package/src/BodyDigest.test.ts +0 -43
  610. package/src/BodyDigest.ts +0 -55
  611. package/src/Challenge.fuzz.test.ts +0 -121
  612. package/src/Challenge.test-d.ts +0 -82
  613. package/src/Challenge.test.ts +0 -995
  614. package/src/Challenge.ts +0 -683
  615. package/src/Constants.ts +0 -58
  616. package/src/Credential.fuzz.test.ts +0 -62
  617. package/src/Credential.test.ts +0 -378
  618. package/src/Credential.ts +0 -217
  619. package/src/Errors.test.ts +0 -520
  620. package/src/Errors.ts +0 -448
  621. package/src/Expires.test.ts +0 -112
  622. package/src/Expires.ts +0 -59
  623. package/src/Html.ts +0 -67
  624. package/src/Mcp.ts +0 -85
  625. package/src/Method.test.ts +0 -177
  626. package/src/Method.ts +0 -617
  627. package/src/PaymentRequest.test.ts +0 -147
  628. package/src/PaymentRequest.ts +0 -108
  629. package/src/Receipt.test.ts +0 -151
  630. package/src/Receipt.ts +0 -146
  631. package/src/Store.test-d.ts +0 -195
  632. package/src/Store.test.ts +0 -357
  633. package/src/Store.ts +0 -329
  634. package/src/bin.ts +0 -4
  635. package/src/cli/account.ts +0 -269
  636. package/src/cli/cli.test.ts +0 -2221
  637. package/src/cli/cli.ts +0 -1649
  638. package/src/cli/config.test.ts +0 -89
  639. package/src/cli/config.ts +0 -50
  640. package/src/cli/internal.ts +0 -114
  641. package/src/cli/mcp.test.ts +0 -262
  642. package/src/cli/plugins/evm.ts +0 -55
  643. package/src/cli/plugins/index.ts +0 -4
  644. package/src/cli/plugins/plugin.ts +0 -84
  645. package/src/cli/plugins/stripe.ts +0 -174
  646. package/src/cli/plugins/tempo.ts +0 -1102
  647. package/src/cli/sessions/Manager.test.ts +0 -249
  648. package/src/cli/sessions/Manager.ts +0 -93
  649. package/src/cli/sessions/commands.ts +0 -444
  650. package/src/cli/sessions/request.test.ts +0 -51
  651. package/src/cli/sessions/request.ts +0 -353
  652. package/src/cli/sessions/store.test.ts +0 -581
  653. package/src/cli/sessions/store.ts +0 -940
  654. package/src/cli/utils.test.ts +0 -156
  655. package/src/cli/utils.ts +0 -394
  656. package/src/cli/validate/challenge.ts +0 -565
  657. package/src/cli/validate/discovery.test.ts +0 -435
  658. package/src/cli/validate/discovery.ts +0 -221
  659. package/src/cli/validate/helpers.ts +0 -166
  660. package/src/cli/validate/index.ts +0 -229
  661. package/src/cli/validate/messages.ts +0 -7
  662. package/src/cli/validate/payment.ts +0 -774
  663. package/src/cli/validate.test.ts +0 -843
  664. package/src/client/Methods.ts +0 -8
  665. package/src/client/Mppx.test-d.ts +0 -270
  666. package/src/client/Mppx.test.ts +0 -1065
  667. package/src/client/Mppx.ts +0 -466
  668. package/src/client/Transport.test.ts +0 -619
  669. package/src/client/Transport.ts +0 -191
  670. package/src/client/index.ts +0 -29
  671. package/src/client/internal/Fetch.browser.test.ts +0 -197
  672. package/src/client/internal/Fetch.test-d.ts +0 -109
  673. package/src/client/internal/Fetch.test.ts +0 -2336
  674. package/src/client/internal/Fetch.ts +0 -1079
  675. package/src/client/internal/MethodChallenge.ts +0 -35
  676. package/src/client/internal/MethodResponse.ts +0 -67
  677. package/src/client/internal/protocols/Mcp.test.ts +0 -220
  678. package/src/client/internal/protocols/Mcp.ts +0 -186
  679. package/src/client/internal/protocols/Mpp.ts +0 -21
  680. package/src/client/internal/protocols/Protocol.ts +0 -10
  681. package/src/client/internal/protocols/Shared.ts +0 -25
  682. package/src/client/internal/protocols/X402.ts +0 -46
  683. package/src/client/node.test.ts +0 -115
  684. package/src/client/node.ts +0 -247
  685. package/src/discovery/Discovery.test.ts +0 -214
  686. package/src/discovery/Discovery.ts +0 -105
  687. package/src/discovery/OpenApi.test.ts +0 -453
  688. package/src/discovery/OpenApi.ts +0 -224
  689. package/src/discovery/Validate.test.ts +0 -305
  690. package/src/discovery/Validate.ts +0 -77
  691. package/src/discovery/index.ts +0 -3
  692. package/src/env.d.ts +0 -12
  693. package/src/evm/Assets.ts +0 -1
  694. package/src/evm/Chains.ts +0 -11
  695. package/src/evm/Methods.ts +0 -44
  696. package/src/evm/PublicInterface.test-d.ts +0 -134
  697. package/src/evm/Types.ts +0 -140
  698. package/src/evm/client/Charge.test.ts +0 -347
  699. package/src/evm/client/Charge.ts +0 -187
  700. package/src/evm/client/Methods.ts +0 -19
  701. package/src/evm/client/index.ts +0 -6
  702. package/src/evm/index.ts +0 -16
  703. package/src/evm/server/Charge.test.ts +0 -339
  704. package/src/evm/server/Charge.ts +0 -290
  705. package/src/evm/server/Methods.ts +0 -22
  706. package/src/evm/server/index.ts +0 -6
  707. package/src/index.ts +0 -14
  708. package/src/internal/AcceptPayment.test.ts +0 -343
  709. package/src/internal/AcceptPayment.ts +0 -366
  710. package/src/internal/HeaderCodec.ts +0 -36
  711. package/src/internal/changeset.test.ts +0 -106
  712. package/src/internal/constantTimeEqual.test.ts +0 -47
  713. package/src/internal/constantTimeEqual.ts +0 -10
  714. package/src/internal/env.test.ts +0 -42
  715. package/src/internal/env.ts +0 -49
  716. package/src/internal/types.test-d.ts +0 -21
  717. package/src/internal/types.ts +0 -470
  718. package/src/mcp/client/McpClient.integration.test.ts +0 -652
  719. package/src/mcp/client/McpClient.test-d.ts +0 -144
  720. package/src/mcp/client/McpClient.test.ts +0 -463
  721. package/src/mcp/client/McpClient.ts +0 -307
  722. package/src/mcp/client/McpClient.unit.test.ts +0 -135
  723. package/src/mcp/client/index.ts +0 -2
  724. package/src/mcp/server/Transport.test.ts +0 -191
  725. package/src/mcp/server/Transport.ts +0 -111
  726. package/src/mcp/server/index.ts +0 -1
  727. package/src/middlewares/elysia.test.ts +0 -295
  728. package/src/middlewares/elysia.ts +0 -116
  729. package/src/middlewares/express.test.ts +0 -371
  730. package/src/middlewares/express.ts +0 -140
  731. package/src/middlewares/hono.test.ts +0 -476
  732. package/src/middlewares/hono.ts +0 -153
  733. package/src/middlewares/internal/mppx.test.ts +0 -177
  734. package/src/middlewares/internal/mppx.ts +0 -67
  735. package/src/middlewares/nextjs.test.ts +0 -369
  736. package/src/middlewares/nextjs.ts +0 -107
  737. package/src/proxy/Proxy.test.ts +0 -1031
  738. package/src/proxy/Proxy.ts +0 -345
  739. package/src/proxy/Service.test.ts +0 -182
  740. package/src/proxy/Service.ts +0 -253
  741. package/src/proxy/index.ts +0 -6
  742. package/src/proxy/internal/Headers.test.ts +0 -139
  743. package/src/proxy/internal/Headers.ts +0 -66
  744. package/src/proxy/internal/Route.test.ts +0 -217
  745. package/src/proxy/internal/Route.ts +0 -64
  746. package/src/proxy/services/anthropic.test.ts +0 -132
  747. package/src/proxy/services/anthropic.ts +0 -52
  748. package/src/proxy/services/openai.test.ts +0 -157
  749. package/src/proxy/services/openai.ts +0 -59
  750. package/src/proxy/services/stripe.test.ts +0 -175
  751. package/src/proxy/services/stripe.ts +0 -58
  752. package/src/server/Methods.ts +0 -3
  753. package/src/server/Mppx.authorize.test.ts +0 -210
  754. package/src/server/Mppx.test-d.ts +0 -360
  755. package/src/server/Mppx.test.ts +0 -5813
  756. package/src/server/Mppx.ts +0 -2623
  757. package/src/server/NodeListener.test.ts +0 -293
  758. package/src/server/NodeListener.ts +0 -45
  759. package/src/server/Request.test.ts +0 -255
  760. package/src/server/Request.ts +0 -155
  761. package/src/server/Response.test.ts +0 -32
  762. package/src/server/Response.ts +0 -45
  763. package/src/server/Transport.test.ts +0 -598
  764. package/src/server/Transport.ts +0 -320
  765. package/src/server/index.ts +0 -9
  766. package/src/server/internal/html/compose.main.gen.ts +0 -2
  767. package/src/server/internal/html/compose.main.ts +0 -88
  768. package/src/server/internal/html/config.ts +0 -672
  769. package/src/server/internal/html/constants.ts +0 -28
  770. package/src/server/internal/html/serviceWorker.client.ts +0 -28
  771. package/src/server/internal/html/serviceWorker.gen.ts +0 -2
  772. package/src/server/internal/html/serviceWorker.ts +0 -27
  773. package/src/server/internal/html/tsconfig.compose.json +0 -8
  774. package/src/server/internal/html/tsconfig.worker.client.json +0 -8
  775. package/src/server/internal/html/tsconfig.worker.json +0 -8
  776. package/src/server/internal/scope.ts +0 -43
  777. package/src/stripe/Charge.integration.test.ts +0 -329
  778. package/src/stripe/Methods.test.ts +0 -62
  779. package/src/stripe/Methods.ts +0 -44
  780. package/src/stripe/client/Charge.test.ts +0 -205
  781. package/src/stripe/client/Charge.ts +0 -132
  782. package/src/stripe/client/Methods.ts +0 -37
  783. package/src/stripe/client/index.ts +0 -2
  784. package/src/stripe/index.ts +0 -1
  785. package/src/stripe/internal/constants.ts +0 -7
  786. package/src/stripe/internal/types.ts +0 -46
  787. package/src/stripe/server/Charge.test-d.ts +0 -66
  788. package/src/stripe/server/Charge.test.ts +0 -621
  789. package/src/stripe/server/Charge.ts +0 -434
  790. package/src/stripe/server/Methods.ts +0 -24
  791. package/src/stripe/server/index.ts +0 -2
  792. package/src/stripe/server/internal/html/main.ts +0 -165
  793. package/src/stripe/server/internal/html/node_modules/.bin/mppx +0 -22
  794. package/src/stripe/server/internal/html/node_modules/.bin/mppx.src +0 -22
  795. package/src/stripe/server/internal/html/package.json +0 -9
  796. package/src/stripe/server/internal/html/stripe-js-pure.d.ts +0 -7
  797. package/src/stripe/server/internal/html/tsconfig.json +0 -8
  798. package/src/stripe/server/internal/html/types.ts +0 -5
  799. package/src/stripe/server/internal/html.gen.ts +0 -2
  800. package/src/tempo/AccessKeyAuthorization.test.ts +0 -141
  801. package/src/tempo/Attribution.test.ts +0 -294
  802. package/src/tempo/Attribution.ts +0 -185
  803. package/src/tempo/Methods.test.ts +0 -425
  804. package/src/tempo/Methods.ts +0 -367
  805. package/src/tempo/Proof.conformance.test.ts +0 -146
  806. package/src/tempo/Proof.test-d.ts +0 -32
  807. package/src/tempo/Proof.test.ts +0 -40
  808. package/src/tempo/Proof.ts +0 -69
  809. package/src/tempo/PublicExports.test-d.ts +0 -130
  810. package/src/tempo/Subscription.integration.test.ts +0 -591
  811. package/src/tempo/client/Charge.test.ts +0 -501
  812. package/src/tempo/client/Charge.ts +0 -289
  813. package/src/tempo/client/Methods.ts +0 -45
  814. package/src/tempo/client/ResolveAccount.ts +0 -46
  815. package/src/tempo/client/Subscription.test.ts +0 -180
  816. package/src/tempo/client/Subscription.ts +0 -156
  817. package/src/tempo/client/index.ts +0 -17
  818. package/src/tempo/index.ts +0 -5
  819. package/src/tempo/internal/account.ts +0 -56
  820. package/src/tempo/internal/address.ts +0 -6
  821. package/src/tempo/internal/auto-swap.test.ts +0 -198
  822. package/src/tempo/internal/auto-swap.ts +0 -188
  823. package/src/tempo/internal/charge.test.ts +0 -66
  824. package/src/tempo/internal/charge.ts +0 -43
  825. package/src/tempo/internal/defaults.test.ts +0 -95
  826. package/src/tempo/internal/defaults.ts +0 -53
  827. package/src/tempo/internal/fee-payer.test.ts +0 -1177
  828. package/src/tempo/internal/fee-payer.ts +0 -808
  829. package/src/tempo/internal/fee-token.test.ts +0 -165
  830. package/src/tempo/internal/fee-token.ts +0 -72
  831. package/src/tempo/internal/proof.test.ts +0 -97
  832. package/src/tempo/internal/proof.ts +0 -87
  833. package/src/tempo/internal/selectors.ts +0 -10
  834. package/src/tempo/internal/types.ts +0 -19
  835. package/src/tempo/legacy/AccessKeyAuthorization.test.ts +0 -162
  836. package/src/tempo/legacy/README.md +0 -9
  837. package/src/tempo/legacy/client/ChannelOps.test.ts +0 -379
  838. package/src/tempo/legacy/client/ChannelOps.ts +0 -271
  839. package/src/tempo/legacy/client/Session.test.ts +0 -800
  840. package/src/tempo/legacy/client/Session.ts +0 -397
  841. package/src/tempo/legacy/client/SessionManager.test.ts +0 -468
  842. package/src/tempo/legacy/client/SessionManager.ts +0 -909
  843. package/src/tempo/legacy/client/index.ts +0 -6
  844. package/src/tempo/legacy/index.ts +0 -6
  845. package/src/tempo/legacy/server/Defaults.test-d.ts +0 -9
  846. package/src/tempo/legacy/server/Session.test.ts +0 -6370
  847. package/src/tempo/legacy/server/Session.ts +0 -1024
  848. package/src/tempo/legacy/server/index.ts +0 -4
  849. package/src/tempo/legacy/session/Chain.test.ts +0 -1349
  850. package/src/tempo/legacy/session/Chain.ts +0 -830
  851. package/src/tempo/legacy/session/Channel.test.ts +0 -109
  852. package/src/tempo/legacy/session/Channel.ts +0 -51
  853. package/src/tempo/legacy/session/ChannelStore.test.ts +0 -58
  854. package/src/tempo/legacy/session/ChannelStore.ts +0 -39
  855. package/src/tempo/legacy/session/Types.ts +0 -91
  856. package/src/tempo/legacy/session/Voucher.test.ts +0 -410
  857. package/src/tempo/legacy/session/Voucher.ts +0 -183
  858. package/src/tempo/legacy/session/escrow.abi.ts +0 -760
  859. package/src/tempo/legacy/session/index.ts +0 -8
  860. package/src/tempo/server/AtomicStore.test-d.ts +0 -50
  861. package/src/tempo/server/Charge.test.ts +0 -6121
  862. package/src/tempo/server/Charge.ts +0 -1351
  863. package/src/tempo/server/Methods.ts +0 -106
  864. package/src/tempo/server/Relay.test.ts +0 -677
  865. package/src/tempo/server/Relay.ts +0 -297
  866. package/src/tempo/server/SponsorBudget.test.ts +0 -154
  867. package/src/tempo/server/SponsorBudget.ts +0 -219
  868. package/src/tempo/server/Sse.test.ts +0 -321
  869. package/src/tempo/server/Subscription.test.ts +0 -1944
  870. package/src/tempo/server/Subscription.ts +0 -1333
  871. package/src/tempo/server/index.ts +0 -12
  872. package/src/tempo/server/internal/html/main.ts +0 -115
  873. package/src/tempo/server/internal/html/node_modules/.bin/mppx +0 -22
  874. package/src/tempo/server/internal/html/node_modules/.bin/mppx.src +0 -22
  875. package/src/tempo/server/internal/html/package.json +0 -10
  876. package/src/tempo/server/internal/html/tsconfig.json +0 -8
  877. package/src/tempo/server/internal/html.gen.ts +0 -2
  878. package/src/tempo/server/internal/request-body.test.ts +0 -210
  879. package/src/tempo/server/internal/request-body.ts +0 -61
  880. package/src/tempo/server/internal/transport.test.ts +0 -903
  881. package/src/tempo/server/internal/transport.ts +0 -310
  882. package/src/tempo/session/README.md +0 -208
  883. package/src/tempo/session/Snapshot.test.ts +0 -41
  884. package/src/tempo/session/Snapshot.ts +0 -95
  885. package/src/tempo/session/client/ChannelOps.test.ts +0 -218
  886. package/src/tempo/session/client/ChannelOps.ts +0 -348
  887. package/src/tempo/session/client/ChannelStore.ts +0 -111
  888. package/src/tempo/session/client/CredentialState.test.ts +0 -789
  889. package/src/tempo/session/client/CredentialState.ts +0 -942
  890. package/src/tempo/session/client/ReceiptCoordinator.ts +0 -95
  891. package/src/tempo/session/client/Runtime.test.ts +0 -1104
  892. package/src/tempo/session/client/Runtime.ts +0 -1008
  893. package/src/tempo/session/client/Session.test.ts +0 -1355
  894. package/src/tempo/session/client/Session.ts +0 -420
  895. package/src/tempo/session/client/SessionManager.test.ts +0 -1899
  896. package/src/tempo/session/client/SessionManager.ts +0 -996
  897. package/src/tempo/session/client/Transports.test.ts +0 -1141
  898. package/src/tempo/session/client/Transports.ts +0 -1534
  899. package/src/tempo/session/client/index.ts +0 -40
  900. package/src/tempo/session/client/internal/SessionManager.ts +0 -36
  901. package/src/tempo/session/index.ts +0 -7
  902. package/src/tempo/session/precompile/Chain.integration.test.ts +0 -339
  903. package/src/tempo/session/precompile/Chain.test.ts +0 -1641
  904. package/src/tempo/session/precompile/Chain.ts +0 -1149
  905. package/src/tempo/session/precompile/Channel.test.ts +0 -147
  906. package/src/tempo/session/precompile/Channel.ts +0 -108
  907. package/src/tempo/session/precompile/Protocol.test.ts +0 -358
  908. package/src/tempo/session/precompile/Protocol.ts +0 -520
  909. package/src/tempo/session/precompile/Voucher.test.ts +0 -354
  910. package/src/tempo/session/precompile/Voucher.ts +0 -162
  911. package/src/tempo/session/precompile/escrow.abi.ts +0 -226
  912. package/src/tempo/session/precompile/index.ts +0 -33
  913. package/src/tempo/session/server/ChannelOps.test.ts +0 -129
  914. package/src/tempo/session/server/ChannelOps.ts +0 -157
  915. package/src/tempo/session/server/ChannelStore.test.ts +0 -1093
  916. package/src/tempo/session/server/ChannelStore.ts +0 -835
  917. package/src/tempo/session/server/CredentialVerification.test.ts +0 -299
  918. package/src/tempo/session/server/CredentialVerification.ts +0 -775
  919. package/src/tempo/session/server/MeteredStream.ts +0 -95
  920. package/src/tempo/session/server/RequestState.test.ts +0 -574
  921. package/src/tempo/session/server/RequestState.ts +0 -507
  922. package/src/tempo/session/server/Session.integration.test.ts +0 -449
  923. package/src/tempo/session/server/Session.test.ts +0 -3862
  924. package/src/tempo/session/server/Session.ts +0 -570
  925. package/src/tempo/session/server/Settlement.test.ts +0 -345
  926. package/src/tempo/session/server/Settlement.ts +0 -527
  927. package/src/tempo/session/server/Sse.fuzz.test.ts +0 -138
  928. package/src/tempo/session/server/Sse.test.ts +0 -557
  929. package/src/tempo/session/server/Sse.ts +0 -254
  930. package/src/tempo/session/server/Transports.test.ts +0 -346
  931. package/src/tempo/session/server/Transports.ts +0 -255
  932. package/src/tempo/session/server/Ws.test.ts +0 -594
  933. package/src/tempo/session/server/Ws.ts +0 -385
  934. package/src/tempo/session/server/index.ts +0 -12
  935. package/src/tempo/subscription/KeyAuthorization.test.ts +0 -282
  936. package/src/tempo/subscription/KeyAuthorization.ts +0 -396
  937. package/src/tempo/subscription/Receipt.ts +0 -28
  938. package/src/tempo/subscription/Store.test.ts +0 -609
  939. package/src/tempo/subscription/Store.ts +0 -449
  940. package/src/tempo/subscription/Types.ts +0 -68
  941. package/src/tempo/subscription/index.ts +0 -23
  942. package/src/tsconfig.json +0 -10
  943. package/src/validation/core.ts +0 -386
  944. package/src/validation/index.ts +0 -11
  945. package/src/viem/Account.test.ts +0 -72
  946. package/src/viem/Account.ts +0 -30
  947. package/src/viem/Client.test.ts +0 -366
  948. package/src/viem/Client.ts +0 -93
  949. package/src/x402/Assets.test.ts +0 -253
  950. package/src/x402/Assets.ts +0 -221
  951. package/src/x402/Exact.e2e.test.ts +0 -448
  952. package/src/x402/Exact.localnet.test.ts +0 -475
  953. package/src/x402/Header.test.ts +0 -73
  954. package/src/x402/Header.ts +0 -79
  955. package/src/x402/PublicInterface.test-d.ts +0 -39
  956. package/src/x402/Types.ts +0 -248
  957. package/src/x402/client/Exact.test.ts +0 -309
  958. package/src/x402/client/Exact.ts +0 -186
  959. package/src/x402/index.ts +0 -6
  960. package/src/x402/internal/ChallengeBrand.ts +0 -14
  961. package/src/x402/internal/RouteBinding.ts +0 -18
  962. package/src/x402/server/EvmCharge.ts +0 -394
  963. package/src/x402/server/Facilitator.test.ts +0 -111
  964. package/src/x402/server/Facilitator.ts +0 -56
  965. package/src/zod.test.ts +0 -169
  966. package/src/zod.ts +0 -71
@@ -1,940 +0,0 @@
1
- import { createHash, randomUUID } from 'node:crypto'
2
- import * as fs from 'node:fs/promises'
3
- import * as os from 'node:os'
4
- import * as path from 'node:path'
5
-
6
- import type { Address, Hex } from 'viem'
7
-
8
- import * as Challenge from '../../Challenge.js'
9
- import { resolveEscrow, type ChannelEntry } from '../../tempo/session/client/ChannelOps.js'
10
- import {
11
- deserializeEntry,
12
- entryKey,
13
- serializeEntry,
14
- type ChannelStore,
15
- type StoredChannel,
16
- } from '../../tempo/session/client/ChannelStore.js'
17
- import {
18
- isTempoSessionChallenge,
19
- type TempoSessionChallenge,
20
- } from '../../tempo/session/client/Transports.js'
21
- import type { SessionReceipt } from '../../tempo/session/precompile/Protocol.js'
22
- import * as z from '../../zod.js'
23
-
24
- const sessionStateVersion = 1 as const
25
-
26
- /** Lifecycle state recorded for a managed CLI session. */
27
- export type SessionStatus = 'opening' | 'open' | 'closing' | 'stale'
28
-
29
- /** Account identity required to resume or close a managed session. */
30
- export type SessionAccount = {
31
- /** Optional mppx account name. */
32
- name?: string | undefined
33
- /** Payer wallet address. */
34
- address: Address
35
- }
36
-
37
- /** Payment scope used to isolate preferred sessions and process locks. */
38
- export type SessionScope = {
39
- payer: Address
40
- payee: Address
41
- token: Address
42
- escrow: Address
43
- chainId: number
44
- }
45
-
46
- /** Durable session record returned by the CLI registry. */
47
- export type ManagedSession = {
48
- version: typeof sessionStateVersion
49
- status: SessionStatus
50
- channel: ChannelEntry
51
- account: SessionAccount
52
- endpoint: string
53
- challenge: TempoSessionChallenge
54
- receipt?: SessionReceipt | undefined
55
- spent: bigint
56
- units: number
57
- createdAt: string
58
- updatedAt: string
59
- }
60
-
61
- /** Input persisted by {@link SessionRegistry.upsert}. */
62
- export type SessionUpsert = {
63
- status: SessionStatus
64
- channel: ChannelEntry
65
- account: SessionAccount
66
- endpoint: string
67
- challenge: Challenge.Challenge
68
- receipt?: SessionReceipt | undefined
69
- spent?: bigint | undefined
70
- units?: number | undefined
71
- }
72
-
73
- /** Dynamic context used when adapting the registry to the SDK channel store. */
74
- export type SessionPersistenceContext = Omit<SessionUpsert, 'channel'>
75
-
76
- /** Selection policy used by a persistent CLI request. */
77
- export type SessionSelection = 'auto' | 'new' | Hex
78
-
79
- /** Held process lock for a session scope. */
80
- export type SessionLock = {
81
- /** Releases the lock if this process still owns it. */
82
- release(): Promise<void>
83
- }
84
-
85
- /** Filesystem-backed persistent session registry. */
86
- export type SessionRegistry = {
87
- /** Versioned registry root. */
88
- readonly root: string
89
- /** Returns a managed session by full channel ID. */
90
- get(channelId: string): Promise<ManagedSession | undefined>
91
- /** Lists managed sessions. */
92
- list(): Promise<ManagedSession[]>
93
- /** Creates or monotonically updates a managed session. */
94
- upsert(input: SessionUpsert): Promise<ManagedSession>
95
- /** Removes a validated managed session and its preferred mappings. */
96
- remove(channelId: string): Promise<void>
97
- /** Returns the preferred channel ID for a payer and payment scope. */
98
- getPreferred(scope: SessionScope): Promise<Hex | undefined>
99
- /** Sets the preferred channel after verifying it matches the scope. */
100
- setPreferred(scope: SessionScope, channelId: string): Promise<void>
101
- /** Clears the preferred channel, optionally only when it matches `channelId`. */
102
- clearPreferred(scope: SessionScope, channelId?: string | undefined): Promise<void>
103
- /** Acquires an exclusive process lock for a payer and payment scope. */
104
- acquire(scope: SessionScope): Promise<SessionLock>
105
- }
106
-
107
- /** Options for {@link createSessionRegistry}. */
108
- export type CreateSessionRegistryOptions = {
109
- /** Override the versioned state root. */
110
- stateRoot?: string | undefined
111
- /** Host identity written to lock files. */
112
- hostname?: string | undefined
113
- /** Process ID written to lock files. */
114
- pid?: number | undefined
115
- /** Clock used for persisted timestamps. */
116
- now?: (() => Date) | undefined
117
- /** Process liveness probe used for same-host lock reclamation. */
118
- isProcessAlive?: ((pid: number) => boolean) | undefined
119
- }
120
-
121
- /** Invalid, corrupt, or inconsistent persistent session state. */
122
- export class SessionStateError extends Error {
123
- override readonly name = 'SessionStateError'
124
- readonly code = 'SESSION_STATE_INVALID'
125
- readonly file?: string | undefined
126
-
127
- constructor(message: string, options: { cause?: unknown; file?: string | undefined } = {}) {
128
- super(message, options.cause === undefined ? undefined : { cause: options.cause })
129
- this.file = options.file
130
- }
131
- }
132
-
133
- /** A session scope currently owned by another live process. */
134
- export class SessionBusyError extends Error {
135
- override readonly name = 'SessionBusyError'
136
- readonly code = 'SESSION_BUSY'
137
- readonly exitCode = 75
138
- readonly scope: string
139
- readonly owner: { hostname: string; pid: number }
140
-
141
- constructor(scope: string, owner: { hostname: string; pid: number }) {
142
- super(`Session scope is busy in process ${owner.pid} on ${owner.hostname}.`)
143
- this.scope = scope
144
- this.owner = owner
145
- }
146
- }
147
-
148
- const storedChannelSchema = z.object({
149
- channelId: z.hash(),
150
- cumulativeAmount: z.string(),
151
- deposit: z.string(),
152
- descriptor: z.object({
153
- payer: z.address(),
154
- payee: z.address(),
155
- operator: z.address(),
156
- token: z.address(),
157
- salt: z.hash(),
158
- authorizedSigner: z.address(),
159
- expiringNonceHash: z.hash(),
160
- }),
161
- escrow: z.address(),
162
- chainId: z.number(),
163
- opened: z.boolean(),
164
- })
165
- const accountSchema = z.object({
166
- name: z.optional(z.string()),
167
- address: z.address(),
168
- })
169
- const receiptSchema = z.object({
170
- method: z.literal('tempo'),
171
- intent: z.literal('session'),
172
- status: z.literal('success'),
173
- timestamp: z.string(),
174
- reference: z.string(),
175
- challengeId: z.string(),
176
- channelId: z.hash(),
177
- acceptedCumulative: z.string(),
178
- spent: z.string(),
179
- units: z.optional(z.number()),
180
- txHash: z.optional(z.hash()),
181
- })
182
- const storedSessionSchema = z.object({
183
- version: z.literal(sessionStateVersion),
184
- method: z.literal('tempo'),
185
- intent: z.literal('session'),
186
- status: z.enum(['opening', 'open', 'closing', 'stale']),
187
- channel: storedChannelSchema,
188
- account: accountSchema,
189
- endpoint: z.string(),
190
- challenge: Challenge.Schema,
191
- receipt: z.optional(receiptSchema),
192
- spent: z.string(),
193
- units: z.number(),
194
- createdAt: z.string(),
195
- updatedAt: z.string(),
196
- })
197
- const preferredSessionSchema = z.object({
198
- version: z.literal(sessionStateVersion),
199
- channelId: z.hash(),
200
- })
201
- const lockOwnerSchema = z.object({
202
- version: z.literal(sessionStateVersion),
203
- scope: z.string(),
204
- hostname: z.string(),
205
- pid: z.number(),
206
- token: z.string(),
207
- createdAt: z.string(),
208
- })
209
-
210
- type StoredManagedSession = Omit<
211
- z.infer<typeof storedSessionSchema>,
212
- 'account' | 'challenge' | 'channel' | 'receipt'
213
- > & {
214
- account: SessionAccount
215
- challenge: TempoSessionChallenge
216
- channel: StoredChannel
217
- receipt?: SessionReceipt | undefined
218
- }
219
- type PreferredSession = z.infer<typeof preferredSessionSchema>
220
- type LockOwner = z.infer<typeof lockOwnerSchema>
221
-
222
- function parseStored<schema extends z.ZodMiniType>(
223
- schema: schema,
224
- value: unknown,
225
- file: string | undefined,
226
- message: string,
227
- ): z.output<schema> {
228
- const parsed = schema.safeParse(value)
229
- if (!parsed.success) throw stateError(file, message, parsed.error)
230
- return parsed.data
231
- }
232
-
233
- type RegistryPaths = {
234
- root: string
235
- channels: string
236
- locks: string
237
- preferred: string
238
- }
239
-
240
- /** Returns the stable payer-qualified key for a persistent session scope. */
241
- export function sessionScopeKey(scope: SessionScope): string {
242
- const normalized = normalizeScope(scope)
243
- return [
244
- normalized.payer,
245
- normalized.payee,
246
- normalized.token,
247
- normalized.escrow,
248
- normalized.chainId,
249
- ].join(':')
250
- }
251
-
252
- /** Returns the persistent payment scope for a channel. */
253
- export function sessionScope(channel: ChannelEntry): SessionScope {
254
- return {
255
- payer: channel.descriptor.payer,
256
- payee: channel.descriptor.payee,
257
- token: channel.descriptor.token,
258
- escrow: channel.escrow,
259
- chainId: channel.chainId,
260
- }
261
- }
262
-
263
- /** Creates a filesystem-backed CLI session registry. */
264
- export function createSessionRegistry(options: CreateSessionRegistryOptions = {}): SessionRegistry {
265
- const root = options.stateRoot ?? sessionStateRoot()
266
- const paths: RegistryPaths = {
267
- root,
268
- channels: path.join(root, 'channels'),
269
- locks: path.join(root, 'locks'),
270
- preferred: path.join(root, 'preferred'),
271
- }
272
- const hostname = options.hostname ?? os.hostname()
273
- const pid = options.pid ?? process.pid
274
- const now = options.now ?? (() => new Date())
275
- const isProcessAlive = options.isProcessAlive ?? processIsAlive
276
-
277
- async function ensureDirectories(): Promise<void> {
278
- for (const directory of [paths.root, paths.channels, paths.locks, paths.preferred]) {
279
- await fs.mkdir(directory, { recursive: true, mode: 0o700 })
280
- await fs.chmod(directory, 0o700)
281
- }
282
- }
283
-
284
- async function get(channelId: string): Promise<ManagedSession | undefined> {
285
- const normalizedId = normalizeChannelId(channelId)
286
- const file = channelFile(paths, normalizedId)
287
- const value = await readJson(file)
288
- if (value === undefined) return undefined
289
- const record = parseStoredSession(value, file)
290
- if (record.channel.channelId.toLowerCase() !== normalizedId)
291
- throw stateError(file, 'Session filename does not match its channel ID.')
292
- return deserializeSession(record)
293
- }
294
-
295
- async function list(): Promise<ManagedSession[]> {
296
- let entries: import('node:fs').Dirent[]
297
- try {
298
- entries = await fs.readdir(paths.channels, { withFileTypes: true })
299
- } catch (error) {
300
- if (hasCode(error, 'ENOENT')) return []
301
- throw stateError(paths.channels, 'Unable to list managed sessions.', error)
302
- }
303
-
304
- const records: ManagedSession[] = []
305
- for (const entry of entries) {
306
- if (!entry.isFile() || entry.name.includes('.tmp-')) continue
307
- if (!entry.name.endsWith('.json')) continue
308
- const channelId = entry.name.slice(0, -'.json'.length)
309
- normalizeChannelId(channelId)
310
- const record = await get(channelId)
311
- if (record) records.push(record)
312
- }
313
- return records.sort((left, right) => left.createdAt.localeCompare(right.createdAt))
314
- }
315
-
316
- async function upsert(input: SessionUpsert): Promise<ManagedSession> {
317
- await ensureDirectories()
318
- const channel = sanitizeChannel(input.channel)
319
- const normalizedId = normalizeChannelId(channel.channelId)
320
- const file = channelFile(paths, normalizedId)
321
- const previousValue = await readJson(file)
322
- const previous =
323
- previousValue === undefined ? undefined : parseStoredSession(previousValue, file)
324
- if (previous) assertSameSession(previous, input, file)
325
-
326
- const challenge = parseSessionChallenge(input.challenge, file)
327
- assertChallengeMatchesChannel(challenge, channel, file)
328
- const receipt = input.receipt
329
- ? sanitizeReceipt(input.receipt, channel.channelId, file)
330
- : undefined
331
- const previousChannel = previous ? deserializeEntry(previous.channel) : undefined
332
- const cumulativeAmount = maxBigInt(
333
- channel.cumulativeAmount,
334
- previousChannel?.cumulativeAmount ?? 0n,
335
- )
336
- const spent = maxBigInt(
337
- input.spent ?? 0n,
338
- receipt ? BigInt(receipt.spent) : 0n,
339
- previous ? BigInt(previous.spent) : 0n,
340
- )
341
- if (spent > cumulativeAmount)
342
- throw stateError(file, 'Session spend exceeds the locally authorized cumulative amount.')
343
-
344
- const storedChannel = sanitizeStoredChannel(
345
- serializeEntry({ ...channel, cumulativeAmount }),
346
- file,
347
- )
348
- const timestamp = monotonicTimestamp(previous?.updatedAt, now(), file)
349
- const latestReceipt = selectLatestReceipt(previous?.receipt, receipt)
350
- const account = sanitizeAccount(input.account, file)
351
- const record: StoredManagedSession = {
352
- version: sessionStateVersion,
353
- method: 'tempo',
354
- intent: 'session',
355
- status: input.status,
356
- channel: storedChannel,
357
- account: {
358
- ...(account.name !== undefined
359
- ? { name: account.name }
360
- : previous?.account.name !== undefined
361
- ? { name: previous.account.name }
362
- : {}),
363
- address: account.address,
364
- },
365
- endpoint: sessionResourceUrl(input.endpoint, file),
366
- challenge,
367
- ...(latestReceipt !== undefined && { receipt: latestReceipt }),
368
- spent: spent.toString(),
369
- units: Math.max(previous?.units ?? 0, input.units ?? 0, receipt?.units ?? 0),
370
- createdAt: previous?.createdAt ?? timestamp,
371
- updatedAt: timestamp,
372
- }
373
- const parsed = parseStoredSession(record, file)
374
- await writeJsonAtomic(file, parsed)
375
- return deserializeSession(parsed)
376
- }
377
-
378
- async function getPreferred(scope: SessionScope): Promise<Hex | undefined> {
379
- const file = preferredFile(paths, scope)
380
- const value = await readJson(file)
381
- if (value === undefined) return undefined
382
- const { channelId } = parseStored(
383
- preferredSessionSchema,
384
- value,
385
- file,
386
- 'Preferred session is invalid.',
387
- )
388
- const record = await get(channelId)
389
- if (!record) throw stateError(file, `Preferred session ${channelId} does not exist.`)
390
- assertChannelScope(record.channel, scope, file)
391
- return channelId as Hex
392
- }
393
-
394
- async function setPreferred(scope: SessionScope, channelId: string): Promise<void> {
395
- const normalizedId = normalizeChannelId(channelId)
396
- const record = await get(normalizedId)
397
- const file = preferredFile(paths, scope)
398
- if (!record) throw stateError(file, `Session ${normalizedId} does not exist.`)
399
- assertChannelScope(record.channel, scope, file)
400
- await writeJsonAtomic(file, {
401
- version: sessionStateVersion,
402
- channelId: normalizedId as Hex,
403
- } satisfies PreferredSession)
404
- }
405
-
406
- async function clearPreferred(
407
- scope: SessionScope,
408
- channelId?: string | undefined,
409
- ): Promise<void> {
410
- const file = preferredFile(paths, scope)
411
- const normalizedId = channelId === undefined ? undefined : normalizeChannelId(channelId)
412
- const value = await readJson(file)
413
- if (value === undefined) return
414
- const current = parseStored(
415
- preferredSessionSchema,
416
- value,
417
- file,
418
- 'Preferred session is invalid.',
419
- ).channelId
420
- if (normalizedId && current.toLowerCase() !== normalizedId) return
421
- await removeFile(file, 'Unable to clear preferred session.')
422
- }
423
-
424
- async function remove(channelId: string): Promise<void> {
425
- const normalizedId = normalizeChannelId(channelId)
426
- const record = await get(normalizedId)
427
- if (!record) return
428
- await clearPreferred(sessionScope(record.channel), normalizedId)
429
- const file = channelFile(paths, normalizedId)
430
- await removeFile(file, 'Unable to remove session.')
431
- }
432
-
433
- async function acquireKey(scope: string): Promise<SessionLock> {
434
- await ensureDirectories()
435
- const file = lockFile(paths, scope)
436
- for (let attempt = 0; attempt < 3; attempt++) {
437
- const owner: LockOwner = {
438
- version: sessionStateVersion,
439
- scope,
440
- hostname,
441
- pid,
442
- token: randomUUID(),
443
- createdAt: now().toISOString(),
444
- }
445
- try {
446
- await createLock(file, owner)
447
- if (await fileExists(deadLockClaimFile(file))) {
448
- await removeOwnedLock(file, owner)
449
- continue
450
- }
451
- return {
452
- async release() {
453
- await removeOwnedLock(file, owner)
454
- },
455
- }
456
- } catch (error) {
457
- if (!hasCode(error, 'EEXIST')) throw error
458
- }
459
-
460
- const value = await readJson(file)
461
- if (value === undefined) continue
462
- const current = parseStored(lockOwnerSchema, value, file, 'Session lock is invalid.')
463
- if (current.scope !== scope) throw stateError(file, 'Session lock scope is invalid.')
464
- if (current.hostname !== hostname || isProcessAlive(current.pid))
465
- throw new SessionBusyError(scope, current)
466
- await removeDeadLock(file, current)
467
- }
468
- const value = await readJson(file)
469
- if (value === undefined) throw stateError(file, 'Unable to acquire session lock.')
470
- const owner = parseStored(lockOwnerSchema, value, file, 'Session lock is invalid.')
471
- throw new SessionBusyError(scope, owner)
472
- }
473
-
474
- async function acquire(scope: SessionScope): Promise<SessionLock> {
475
- return acquireKey(sessionScopeKey(scope))
476
- }
477
-
478
- return {
479
- root,
480
- get,
481
- list,
482
- upsert,
483
- remove,
484
- getPreferred,
485
- setPreferred,
486
- clearPreferred,
487
- acquire,
488
- }
489
- }
490
-
491
- /** Adapts a persistent registry selection to the session manager's channel store. */
492
- export function toChannelStore(
493
- registry: SessionRegistry,
494
- options: {
495
- scope: SessionScope
496
- selection: SessionSelection
497
- context: () => SessionPersistenceContext
498
- onNewChannel?: ((channel: ChannelEntry) => void) | undefined
499
- },
500
- ): ChannelStore {
501
- const expectedKey = scopeEntryKey(options.scope)
502
- let selectedChannelId: Hex | undefined =
503
- options.selection === 'auto' || options.selection === 'new'
504
- ? undefined
505
- : (normalizeChannelId(options.selection) as Hex)
506
-
507
- function assertKey(key: string): void {
508
- if (key.toLowerCase() !== expectedKey)
509
- throw new SessionStateError('Session manager requested an unexpected payment scope.')
510
- }
511
-
512
- async function selected(reusableOnly = true): Promise<ManagedSession | undefined> {
513
- if (options.selection === 'new' && !selectedChannelId) return undefined
514
- const channelId = selectedChannelId ?? (await registry.getPreferred(options.scope))
515
- if (!channelId) return undefined
516
- const record = await registry.get(channelId)
517
- if (!record) throw new SessionStateError(`Session ${channelId} does not exist.`)
518
- assertChannelScope(record.channel, options.scope)
519
- if (reusableOnly && (record.status !== 'open' || !record.channel.opened)) return undefined
520
- selectedChannelId = channelId
521
- return record
522
- }
523
-
524
- return {
525
- async get(key) {
526
- assertKey(key)
527
- return (await selected())?.channel
528
- },
529
- async set(channel) {
530
- assertKey(entryKey(channel))
531
- assertChannelScope(channel, options.scope)
532
- if (selectedChannelId && selectedChannelId.toLowerCase() !== channel.channelId.toLowerCase())
533
- throw new SessionStateError(
534
- `Session manager selected ${selectedChannelId}, but attempted to store ${channel.channelId}.`,
535
- )
536
- if (!selectedChannelId) options.onNewChannel?.(channel)
537
- const record = await registry.upsert({ ...options.context(), channel })
538
- selectedChannelId = record.channel.channelId
539
- await registry.setPreferred(options.scope, record.channel.channelId)
540
- },
541
- async delete(key) {
542
- assertKey(key)
543
- const record = await selected(false)
544
- if (!record) return
545
- const context = options.context()
546
- await registry.upsert({
547
- ...record,
548
- ...context,
549
- status: context.status === 'closing' ? 'closing' : 'stale',
550
- channel: record.channel,
551
- spent: context.spent ?? record.spent,
552
- units: context.units ?? record.units,
553
- })
554
- if (context.status !== 'closing')
555
- await registry.clearPreferred(options.scope, record.channel.channelId)
556
- selectedChannelId = undefined
557
- },
558
- }
559
- }
560
-
561
- function sessionStateRoot(): string {
562
- const stateHome = process.env.XDG_STATE_HOME || path.join(os.homedir(), '.local', 'state')
563
- return path.join(stateHome, 'mppx', 'sessions', `v${sessionStateVersion}`)
564
- }
565
-
566
- function channelFile(paths: RegistryPaths, channelId: string): string {
567
- return path.join(paths.channels, `${channelId}.json`)
568
- }
569
-
570
- function lockFile(paths: RegistryPaths, scope: string): string {
571
- const digest = createHash('sha256').update(scope).digest('hex')
572
- return path.join(paths.locks, `${digest}.lock`)
573
- }
574
-
575
- function preferredFile(paths: RegistryPaths, scope: SessionScope): string {
576
- const digest = createHash('sha256').update(sessionScopeKey(scope)).digest('hex')
577
- return path.join(paths.preferred, `${digest}.json`)
578
- }
579
-
580
- function normalizeChannelId(channelId: string): string {
581
- return parseStored(
582
- z.hash(),
583
- channelId,
584
- undefined,
585
- `Invalid session channel ID: ${channelId}.`,
586
- ).toLowerCase()
587
- }
588
-
589
- function normalizeAddress(value: unknown, label: string, file?: string | undefined): Address {
590
- return parseStored(z.address(), value, file, `Invalid ${label}.`).toLowerCase() as Address
591
- }
592
-
593
- function normalizeScope(scope: SessionScope): SessionScope {
594
- if (!Number.isSafeInteger(scope.chainId) || scope.chainId < 0)
595
- throw new SessionStateError('Invalid session chain ID.')
596
- return {
597
- payer: normalizeAddress(scope.payer, 'session payer'),
598
- payee: normalizeAddress(scope.payee, 'session payee'),
599
- token: normalizeAddress(scope.token, 'session token'),
600
- escrow: normalizeAddress(scope.escrow, 'session escrow'),
601
- chainId: scope.chainId,
602
- }
603
- }
604
-
605
- function scopeEntryKey(scope: SessionScope): string {
606
- const normalized = normalizeScope(scope)
607
- return [normalized.payee, normalized.token, normalized.escrow, normalized.chainId].join(':')
608
- }
609
-
610
- /** Returns the exact HTTP resource URL persisted for session management. */
611
- export function sessionResourceUrl(endpoint: unknown, file?: string | undefined): string {
612
- if (typeof endpoint !== 'string') throw stateError(file, 'Session endpoint is invalid.')
613
- let parsed: URL
614
- try {
615
- parsed = new URL(endpoint)
616
- } catch (cause) {
617
- throw stateError(file, 'Session endpoint is invalid.', cause)
618
- }
619
- if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:')
620
- throw stateError(file, 'Session endpoint must use HTTP or HTTPS.')
621
- if (parsed.username || parsed.password)
622
- throw stateError(file, 'Session endpoint must not contain credentials.')
623
- const fragment = endpoint.indexOf('#')
624
- return fragment === -1 ? endpoint : endpoint.slice(0, fragment)
625
- }
626
-
627
- function sanitizeAccount(value: unknown, file?: string | undefined): SessionAccount {
628
- return parseStored(accountSchema, value, file, 'Session account is invalid.') as SessionAccount
629
- }
630
-
631
- function sanitizeChannel(channel: ChannelEntry): ChannelEntry {
632
- const stored = sanitizeStoredChannel(serializeEntry(channel))
633
- return deserializeEntry(stored)
634
- }
635
-
636
- function sanitizeStoredChannel(value: unknown, file?: string | undefined): StoredChannel {
637
- return parseStored(
638
- storedChannelSchema,
639
- value,
640
- file,
641
- 'Stored session channel is invalid.',
642
- ) as StoredChannel
643
- }
644
-
645
- function parseSessionChallenge(value: unknown, file?: string | undefined): TempoSessionChallenge {
646
- const parsed = Challenge.Schema.safeParse(value)
647
- if (!parsed.success || !isTempoSessionChallenge(parsed.data))
648
- throw stateError(file, 'Stored session challenge is invalid.')
649
- return parsed.data
650
- }
651
-
652
- function sanitizeReceipt(
653
- value: unknown,
654
- channelId: string,
655
- file?: string | undefined,
656
- ): SessionReceipt {
657
- const receipt = parseStored(
658
- receiptSchema,
659
- value,
660
- file,
661
- 'Stored session receipt is invalid.',
662
- ) as SessionReceipt
663
- if (receipt.channelId !== channelId.toLowerCase())
664
- throw stateError(file, 'Stored session receipt has a different channel ID.')
665
- if (receipt.reference.toLowerCase() !== channelId.toLowerCase())
666
- throw stateError(file, 'Stored session receipt has a different reference.')
667
- if (BigInt(receipt.spent) > BigInt(receipt.acceptedCumulative))
668
- throw stateError(file, 'Stored session receipt spend exceeds its accepted amount.')
669
- return receipt
670
- }
671
-
672
- function parseStoredSession(value: unknown, file: string): StoredManagedSession {
673
- const candidate = parseStored(storedSessionSchema, value, file, 'Stored session is invalid.')
674
- const { receipt: candidateReceipt, ...rest } = candidate
675
- const channel = candidate.channel as StoredChannel
676
- const account = candidate.account as SessionAccount
677
- if (account.address.toLowerCase() !== channel.descriptor.payer.toLowerCase())
678
- throw stateError(file, 'Stored session account does not match the channel payer.')
679
- const receipt = candidateReceipt
680
- ? sanitizeReceipt(candidateReceipt, channel.channelId, file)
681
- : undefined
682
- const spent = candidate.spent
683
- const cumulativeAmount = BigInt(channel.cumulativeAmount)
684
- if (BigInt(spent) > cumulativeAmount)
685
- throw stateError(file, 'Stored session spend exceeds its cumulative authorization.')
686
- if (receipt && BigInt(receipt.acceptedCumulative) > cumulativeAmount)
687
- throw stateError(file, 'Stored receipt exceeds the cumulative authorization.')
688
- if (Date.parse(candidate.updatedAt) < Date.parse(candidate.createdAt))
689
- throw stateError(file, 'Stored session timestamps are not monotonic.')
690
- const endpoint = sessionResourceUrl(candidate.endpoint, file)
691
- if (endpoint !== candidate.endpoint)
692
- throw stateError(file, 'Stored session endpoint contains a fragment.')
693
- const challenge = parseSessionChallenge(candidate.challenge, file)
694
- assertChallengeMatchesChannel(challenge, deserializeEntry(channel), file)
695
- return {
696
- ...rest,
697
- account,
698
- channel,
699
- endpoint,
700
- challenge,
701
- ...(receipt && { receipt }),
702
- }
703
- }
704
-
705
- function deserializeSession(record: StoredManagedSession): ManagedSession {
706
- return {
707
- version: sessionStateVersion,
708
- status: record.status,
709
- channel: deserializeEntry(record.channel),
710
- account: record.account,
711
- endpoint: record.endpoint,
712
- challenge: record.challenge,
713
- ...(record.receipt && { receipt: record.receipt }),
714
- spent: BigInt(record.spent),
715
- units: record.units,
716
- createdAt: record.createdAt,
717
- updatedAt: record.updatedAt,
718
- }
719
- }
720
-
721
- function assertSameSession(
722
- previous: StoredManagedSession,
723
- input: SessionUpsert,
724
- file: string,
725
- ): void {
726
- const channel = sanitizeChannel(input.channel)
727
- const account = sanitizeAccount(input.account, file)
728
- const previousChannel = deserializeEntry(previous.channel)
729
- if (JSON.stringify(channelIdentity(channel)) !== JSON.stringify(channelIdentity(previousChannel)))
730
- throw stateError(file, 'Session update changed immutable channel identity.')
731
- if (account.address.toLowerCase() !== previous.account.address.toLowerCase())
732
- throw stateError(file, 'Session update changed the payer account.')
733
- }
734
-
735
- function channelIdentity(channel: ChannelEntry): object {
736
- return {
737
- channelId: channel.channelId.toLowerCase(),
738
- descriptor: Object.fromEntries(
739
- Object.entries(channel.descriptor).map(([key, value]) => [
740
- key,
741
- typeof value === 'string' ? value.toLowerCase() : value,
742
- ]),
743
- ),
744
- escrow: channel.escrow.toLowerCase(),
745
- chainId: channel.chainId,
746
- }
747
- }
748
-
749
- function assertChallengeMatchesChannel(
750
- challenge: Challenge.Challenge,
751
- channel: ChannelEntry,
752
- file?: string | undefined,
753
- ): void {
754
- const payee = normalizeAddress(challenge.request.recipient, 'challenge recipient', file)
755
- const token = normalizeAddress(challenge.request.currency, 'challenge currency', file)
756
- if (payee !== channel.descriptor.payee.toLowerCase())
757
- throw stateError(file, 'Session challenge payee does not match the channel.')
758
- if (token !== channel.descriptor.token.toLowerCase())
759
- throw stateError(file, 'Session challenge token does not match the channel.')
760
- if (resolveEscrow(challenge).toLowerCase() !== channel.escrow.toLowerCase())
761
- throw stateError(file, 'Session challenge escrow does not match the channel.')
762
- if (isObject(challenge.request.methodDetails)) {
763
- const methodDetails = challenge.request.methodDetails
764
- if (methodDetails.chainId !== undefined && methodDetails.chainId !== channel.chainId)
765
- throw stateError(file, 'Session challenge chain does not match the channel.')
766
- }
767
- }
768
-
769
- function assertChannelScope(
770
- channel: ChannelEntry,
771
- scope: SessionScope,
772
- file?: string | undefined,
773
- ): void {
774
- const normalized = normalizeScope(scope)
775
- if (
776
- channel.descriptor.payer.toLowerCase() !== normalized.payer ||
777
- channel.descriptor.payee.toLowerCase() !== normalized.payee ||
778
- channel.descriptor.token.toLowerCase() !== normalized.token ||
779
- channel.escrow.toLowerCase() !== normalized.escrow ||
780
- channel.chainId !== normalized.chainId
781
- )
782
- throw stateError(file, 'Session channel does not match the selected payment scope.')
783
- }
784
-
785
- function selectLatestReceipt(
786
- previous: SessionReceipt | undefined,
787
- next: SessionReceipt | undefined,
788
- ): SessionReceipt | undefined {
789
- if (!previous) return next
790
- if (!next) return previous
791
- return Date.parse(next.timestamp) >= Date.parse(previous.timestamp) ? next : previous
792
- }
793
-
794
- function monotonicTimestamp(previous: string | undefined, next: Date, file: string): string {
795
- if (!Number.isFinite(next.getTime())) throw stateError(file, 'Session clock is invalid.')
796
- const nextTimestamp = next.toISOString()
797
- if (!previous || Date.parse(nextTimestamp) >= Date.parse(previous)) return nextTimestamp
798
- return previous
799
- }
800
-
801
- function maxBigInt(...values: bigint[]): bigint {
802
- return values.reduce((maximum, value) => (value > maximum ? value : maximum), 0n)
803
- }
804
-
805
- async function readJson(file: string): Promise<unknown | undefined> {
806
- let source: string
807
- try {
808
- source = await fs.readFile(file, 'utf8')
809
- } catch (error) {
810
- if (hasCode(error, 'ENOENT')) return undefined
811
- throw stateError(file, 'Unable to read session state.', error)
812
- }
813
- try {
814
- const value: unknown = JSON.parse(source)
815
- return value
816
- } catch (cause) {
817
- throw stateError(file, 'Session state contains invalid JSON.', cause)
818
- }
819
- }
820
-
821
- async function writeJsonAtomic(file: string, value: unknown): Promise<void> {
822
- await fs.mkdir(path.dirname(file), { recursive: true, mode: 0o700 })
823
- await fs.chmod(path.dirname(file), 0o700)
824
- const temporary = `${file}.tmp-${process.pid}-${randomUUID()}`
825
- let handle: fs.FileHandle | undefined
826
- try {
827
- handle = await fs.open(temporary, 'wx', 0o600)
828
- await handle.writeFile(`${JSON.stringify(value, null, 2)}\n`, 'utf8')
829
- await handle.sync()
830
- await handle.close()
831
- handle = undefined
832
- await fs.rename(temporary, file)
833
- await fs.chmod(file, 0o600)
834
- await syncDirectory(path.dirname(file))
835
- } catch (cause) {
836
- await handle?.close().catch(() => undefined)
837
- await fs.unlink(temporary).catch(() => undefined)
838
- if (cause instanceof SessionStateError) throw cause
839
- throw stateError(file, 'Unable to write session state.', cause)
840
- }
841
- }
842
-
843
- async function createLock(file: string, owner: LockOwner): Promise<void> {
844
- let handle: fs.FileHandle | undefined
845
- try {
846
- handle = await fs.open(file, 'wx', 0o600)
847
- await handle.writeFile(`${JSON.stringify(owner)}\n`, 'utf8')
848
- await handle.sync()
849
- await handle.close()
850
- handle = undefined
851
- await syncDirectory(path.dirname(file))
852
- } catch (error) {
853
- await handle?.close().catch(() => undefined)
854
- if (handle) await fs.unlink(file).catch(() => undefined)
855
- throw error
856
- }
857
- }
858
-
859
- async function removeDeadLock(file: string, expected: LockOwner): Promise<void> {
860
- const claim = deadLockClaimFile(file)
861
- try {
862
- await fs.link(file, claim)
863
- } catch (error) {
864
- if (hasCode(error, 'EEXIST') || hasCode(error, 'ENOENT')) return
865
- throw stateError(file, 'Unable to claim dead lock.', error)
866
- }
867
-
868
- try {
869
- const currentValue = await readJson(claim)
870
- if (currentValue === undefined) return
871
- const current = parseStored(lockOwnerSchema, currentValue, claim, 'Session lock is invalid.')
872
- if (current.token !== expected.token) return
873
- await removeFile(file, 'Unable to reclaim dead lock.')
874
- } finally {
875
- await removeFile(claim, 'Unable to release dead lock claim.')
876
- }
877
- }
878
-
879
- function deadLockClaimFile(file: string): string {
880
- return `${file}.reclaim`
881
- }
882
-
883
- async function fileExists(file: string): Promise<boolean> {
884
- try {
885
- await fs.access(file)
886
- return true
887
- } catch (error) {
888
- if (hasCode(error, 'ENOENT')) return false
889
- throw stateError(file, 'Unable to inspect session lock.', error)
890
- }
891
- }
892
-
893
- async function removeOwnedLock(file: string, expected: LockOwner): Promise<void> {
894
- const currentValue = await readJson(file)
895
- if (currentValue === undefined) return
896
- const current = parseStored(lockOwnerSchema, currentValue, file, 'Session lock is invalid.')
897
- if (current.token !== expected.token) return
898
- await removeFile(file, 'Unable to release session lock.')
899
- }
900
-
901
- async function removeFile(file: string, message: string): Promise<void> {
902
- try {
903
- await fs.unlink(file)
904
- await syncDirectory(path.dirname(file))
905
- } catch (error) {
906
- if (!hasCode(error, 'ENOENT')) throw stateError(file, message, error)
907
- }
908
- }
909
-
910
- async function syncDirectory(directory: string): Promise<void> {
911
- const handle = await fs.open(directory, 'r')
912
- try {
913
- await handle.sync()
914
- } finally {
915
- await handle.close()
916
- }
917
- }
918
-
919
- function processIsAlive(pid: number): boolean {
920
- try {
921
- process.kill(pid, 0)
922
- return true
923
- } catch (error) {
924
- if (hasCode(error, 'ESRCH')) return false
925
- if (hasCode(error, 'EPERM')) return true
926
- throw error
927
- }
928
- }
929
-
930
- function isObject(value: unknown): value is Record<string, unknown> {
931
- return typeof value === 'object' && value !== null && !Array.isArray(value)
932
- }
933
-
934
- function hasCode(error: unknown, code: string): boolean {
935
- return error instanceof Error && 'code' in error && error.code === code
936
- }
937
-
938
- function stateError(file: string | undefined, message: string, cause?: unknown): SessionStateError {
939
- return new SessionStateError(message, { ...(cause !== undefined && { cause }), file })
940
- }