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,1534 +0,0 @@
1
- import { Hex } from 'ox'
2
-
3
- import * as Challenge from '../../../Challenge.js'
4
- import * as Fetch from '../../../client/internal/Fetch.js'
5
- import * as Constants from '../../../Constants.js'
6
- import * as PaymentCredential from '../../../Credential.js'
7
- import * as z from '../../../zod.js'
8
- import * as Methods from '../../Methods.js'
9
- import {
10
- deserializeSessionReceipt,
11
- isEventStream,
12
- parseEvent,
13
- readSessionChallengeAmount,
14
- uint96,
15
- type NeedVoucherEvent,
16
- type SessionCredentialPayload,
17
- type SessionReceipt,
18
- } from '../precompile/Protocol.js'
19
- import * as Ws from '../precompile/Protocol.js'
20
- import type { SessionSnapshot } from '../Snapshot.js'
21
- import type { ChannelEntry } from './ChannelOps.js'
22
- import type { SessionContext } from './CredentialState.js'
23
- import {
24
- activeStateFromChannel,
25
- activeStateFromReceipt,
26
- isExpectedCloseReceipt,
27
- parseManagerAmount,
28
- type CloseTarget,
29
- type SessionState,
30
- } from './Runtime.js'
31
-
32
- /** Runtime WebSocket constructor accepted by `sessionManager()` in non-browser environments. */
33
- export type WebSocketConstructor = {
34
- new (url: string | URL, protocols?: string | string[]): WebSocket
35
- }
36
-
37
- /** Numeric ready-state constants used by browser-compatible WebSocket clients. */
38
- export const WebSocketReadyState = {
39
- CONNECTING: 0,
40
- OPEN: 1,
41
- CLOSING: 2,
42
- CLOSED: 3,
43
- } as const
44
-
45
- // Browser-style WebSocket clients may only initiate close with 1000 or 3000-4999.
46
- // Keep protocol/policy close codes on the server side and use an app-defined code here.
47
- /** Client-side close code used for payment protocol errors. */
48
- export const ClientWebSocketProtocolErrorCloseCode = 3008
49
-
50
- const webSocketChallengeRefreshWindowMs = 5_000
51
-
52
- type EventType = 'close' | 'error' | 'message' | 'open'
53
- type ManagedEventMap = {
54
- close: { code: number; reason: string; type: 'close'; wasClean: boolean }
55
- error: { type: 'error' }
56
- message: { data: string; type: 'message' }
57
- open: { type: 'open' }
58
- }
59
- type ListenerValue<type extends EventType = EventType> =
60
- | ((event: ManagedEventMap[type]) => void)
61
- | { handleEvent(event: ManagedEventMap[type]): void }
62
- type Listener = {
63
- once: boolean
64
- value: ListenerValue<EventType>
65
- }
66
- type ManagedSocketShape = {
67
- onclose: ((event: ManagedEventMap['close']) => void) | null
68
- onerror: ((event: ManagedEventMap['error']) => void) | null
69
- onmessage: ((event: ManagedEventMap['message']) => void) | null
70
- onopen: ((event: ManagedEventMap['open']) => void) | null
71
- }
72
-
73
- /** Managed socket facade returned to callers after payment protocol frames are intercepted. */
74
- export type SessionManagedWebSocket = ManagedSocketShape & {
75
- addEventListener<type extends EventType>(
76
- type: type,
77
- listener: ListenerValue<type>,
78
- options?: boolean | AddEventListenerOptions,
79
- ): void
80
- readonly bufferedAmount: WebSocket['bufferedAmount']
81
- close(code?: number, reason?: string): void
82
- readonly extensions: WebSocket['extensions']
83
- on<type extends EventType>(type: type, listener: (event: ManagedEventMap[type]) => void): void
84
- off<type extends EventType>(type: type, listener: (event: ManagedEventMap[type]) => void): void
85
- readonly protocol: WebSocket['protocol']
86
- readonly readyState: WebSocket['readyState']
87
- removeEventListener<type extends EventType>(type: type, listener: ListenerValue<type>): void
88
- send(data: string): void
89
- readonly url: WebSocket['url']
90
- }
91
-
92
- /** Wraps a raw WebSocket so protocol frames can be handled before user listeners see messages. */
93
- export function createManagedSocket(socket: WebSocket) {
94
- const listeners = new Map<EventType, Set<Listener>>()
95
- let emittedClose = false
96
- let messageBuffer: ManagedEventMap['message'][] | null = []
97
- let readyState = socket.readyState
98
-
99
- const add = <type extends EventType>(
100
- type: type,
101
- listener: ListenerValue<type>,
102
- options?: boolean | AddEventListenerOptions,
103
- ) => {
104
- let set = listeners.get(type)
105
- if (!set) {
106
- set = new Set()
107
- listeners.set(type, set)
108
- }
109
- set.add({
110
- once: typeof options === 'object' ? options.once === true : false,
111
- value: listener as ListenerValue<EventType>,
112
- })
113
- if (type === 'message' && messageBuffer) {
114
- const buffered = messageBuffer
115
- messageBuffer = null
116
- for (const event of buffered) emit('message', event)
117
- }
118
- }
119
-
120
- const remove = <type extends EventType>(type: type, listener: ListenerValue<type>) => {
121
- const set = listeners.get(type)
122
- if (!set) return
123
- for (const entry of set) {
124
- if (entry.value === listener) set.delete(entry)
125
- }
126
- }
127
-
128
- function emit<type extends EventType>(type: type, event: ManagedEventMap[type]) {
129
- if (event.type === 'close') {
130
- if (emittedClose) return
131
- emittedClose = true
132
- readyState = WebSocketReadyState.CLOSED
133
- messageBuffer = null
134
- }
135
- if (event.type === 'open') readyState = WebSocketReadyState.OPEN
136
-
137
- if (event.type === 'message' && messageBuffer) {
138
- messageBuffer.push(event)
139
- return
140
- }
141
-
142
- switch (event.type) {
143
- case 'close':
144
- managed.onclose?.(event)
145
- break
146
- case 'error':
147
- managed.onerror?.(event)
148
- break
149
- case 'message':
150
- managed.onmessage?.(event)
151
- break
152
- case 'open':
153
- managed.onopen?.(event)
154
- break
155
- }
156
-
157
- const set = listeners.get(type)
158
- if (!set) return
159
- for (const entry of Array.from(set)) {
160
- if (typeof entry.value === 'function') entry.value(event)
161
- else entry.value.handleEvent(event)
162
- if (entry.once) set.delete(entry)
163
- }
164
- }
165
-
166
- let onmessage: ManagedSocketShape['onmessage'] = null
167
- const managed: SessionManagedWebSocket = {
168
- addEventListener: add,
169
- close(code?: number, reason?: string) {
170
- socket.close(code, reason)
171
- },
172
- get bufferedAmount() {
173
- return socket.bufferedAmount
174
- },
175
- get extensions() {
176
- return socket.extensions
177
- },
178
- on<type extends EventType>(type: type, listener: (event: ManagedEventMap[type]) => void) {
179
- add(type, listener)
180
- },
181
- onclose: null as ManagedSocketShape['onclose'],
182
- onerror: null as ManagedSocketShape['onerror'],
183
- get onmessage() {
184
- return onmessage
185
- },
186
- set onmessage(fn: ManagedSocketShape['onmessage']) {
187
- onmessage = fn
188
- if (fn && messageBuffer) {
189
- const buffered = messageBuffer
190
- messageBuffer = null
191
- for (const event of buffered) emit('message', event)
192
- }
193
- },
194
- onopen: null as ManagedSocketShape['onopen'],
195
- off<type extends EventType>(type: type, listener: (event: ManagedEventMap[type]) => void) {
196
- remove(type, listener)
197
- },
198
- get protocol() {
199
- return socket.protocol
200
- },
201
- get readyState() {
202
- return readyState
203
- },
204
- removeEventListener: remove,
205
- send(data: string) {
206
- socket.send(data)
207
- },
208
- get url() {
209
- return socket.url
210
- },
211
- }
212
-
213
- return {
214
- emit,
215
- socket: managed,
216
- }
217
- }
218
-
219
- /** Top-up requirement emitted by HTTP, SSE, or WebSocket session flows. */
220
- export type TopUpRequirement = {
221
- /** Challenge used to authorize the management request. */
222
- challenge: TempoSessionChallenge
223
- /** Channel that requires more deposit. */
224
- channelId: Hex.Hex
225
- /** Current channel deposit in raw units. */
226
- deposit: bigint
227
- /** Original paid resource URL; converted to a management URL by the caller. */
228
- input: RequestInfo | URL
229
- /** Minimum cumulative voucher amount the server needs. */
230
- requiredCumulative: bigint
231
- }
232
-
233
- /** Inputs needed to validate a caller-requested manager top-up. */
234
- export type ResolveManualTopUpParameters = {
235
- /** Human-readable or raw top-up amount passed to `SessionManager.topUp()`. */
236
- amount: string | bigint
237
- /** Local policy guard for cumulative voucher authorization. */
238
- assertVoucherWithinLocalLimit(cumulativeAmount: bigint): void
239
- /** Active channel cache entry, when one exists. */
240
- channel: ChannelEntry | null
241
- /** Token decimals used to parse string amounts. */
242
- decimals: number
243
- /** Last challenge observed by the manager. */
244
- lastChallenge: TempoSessionChallenge | null
245
- /** Last paid resource or management URL available to the manager. */
246
- lastUrl: RequestInfo | URL | null
247
- }
248
-
249
- /** Validated target for a caller-requested manager top-up. */
250
- export type ManualTopUpTarget = {
251
- /** Additional deposit in raw token units. */
252
- additionalDeposit: bigint
253
- /** Challenge used to authorize the top-up credential. */
254
- challenge: TempoSessionChallenge
255
- /** Channel ID receiving the top-up. */
256
- channelId: Hex.Hex
257
- /** URL used for the top-up management POST. */
258
- input: RequestInfo | URL
259
- }
260
-
261
- /** Inputs for applying a successful top-up POST to local manager state. */
262
- export type ApplyTopUpResultParameters = {
263
- /** Additional deposit accepted by the top-up credential. */
264
- additionalDeposit: bigint
265
- /** Active local channel cache entry, when one exists. */
266
- channel: ChannelEntry | null
267
- /** Channel ID targeted by the top-up. */
268
- channelId: Hex.Hex
269
- /** Current active challenge ID, used when the server did not return a receipt. */
270
- challengeId?: string | undefined
271
- /** Current active machine state, used to preserve paid unit count when possible. */
272
- currentState: SessionState
273
- /** Highest deposit known before the top-up. */
274
- knownDeposit?: bigint | undefined
275
- /** Receipt returned by the top-up POST, when present. */
276
- receipt?: SessionReceipt | undefined
277
- /** Latest locally observed spend in raw units. */
278
- spent: bigint
279
- }
280
-
281
- /** Local runtime updates produced by a top-up POST. */
282
- export type AppliedTopUpResult = {
283
- /** Channel with updated deposit. */
284
- channel: ChannelEntry
285
- /** Next public machine state, when enough context is available to project one. */
286
- state?: SessionState | undefined
287
- }
288
-
289
- /** Parsed raw-unit amounts from a server need-voucher event. */
290
- export type NeedVoucherEventAmounts = {
291
- /** Highest voucher amount currently accepted by the server. */
292
- acceptedCumulative: bigint
293
- /** Current on-chain deposit reported by the server. */
294
- deposit: bigint
295
- /** Minimum cumulative voucher amount required by the server. */
296
- requiredCumulative: bigint
297
- }
298
-
299
- /** Inputs used to satisfy a server need-voucher event. */
300
- export type ResolveNeedVoucherContextParameters = {
301
- /** Local policy guard for cumulative voucher authorization. */
302
- assertVoucherWithinLocalLimit(cumulativeAmount: bigint): void
303
- /** Challenge used for follow-up management credentials. */
304
- challenge: TempoSessionChallenge
305
- /** Server need-voucher event. */
306
- event: NeedVoucherEvent
307
- /** Expected channel ID for this transport flow. */
308
- expectedChannelId: Hex.Hex
309
- /** Reads the latest active channel after any top-up. */
310
- getChannel(): ChannelEntry | null
311
- /** Original paid resource URL; converted to management URL by the caller. */
312
- input: RequestInfo | URL
313
- /** Performs the deposit top-up when server-required cumulative exceeds deposit. */
314
- topUpIfNeeded(parameters: TopUpRequirement): Promise<void>
315
- }
316
-
317
- /** Result of handling a server need-voucher event. */
318
- export type NeedVoucherResolution =
319
- | {
320
- /** A voucher credential can be signed with this context. */
321
- status: 'ready'
322
- /** Context passed to the low-level session credential method. */
323
- context: SessionContext
324
- }
325
- | {
326
- /** No voucher should be sent for this event. */
327
- status: 'ignored'
328
- /** Why the event was ignored. */
329
- reason: 'channel-mismatch' | 'missing-channel'
330
- }
331
-
332
- /** Parses raw-unit numeric fields from a need-voucher event. */
333
- export function readNeedVoucherEventAmounts(event: NeedVoucherEvent): NeedVoucherEventAmounts {
334
- return {
335
- acceptedCumulative: BigInt(event.acceptedCumulative),
336
- deposit: BigInt(event.deposit),
337
- requiredCumulative: BigInt(event.requiredCumulative),
338
- }
339
- }
340
-
341
- /** Validates local manager state and returns the concrete top-up operation to execute. */
342
- export function resolveManualTopUp(parameters: ResolveManualTopUpParameters): ManualTopUpTarget {
343
- const { amount, assertVoucherWithinLocalLimit, channel, decimals, lastChallenge, lastUrl } =
344
- parameters
345
-
346
- if (!channel?.opened) throw new Error('Cannot top up session: no open channel.')
347
- if (!lastChallenge) {
348
- throw new Error('Cannot top up session: no challenge available. Make a request first.')
349
- }
350
- if (!lastUrl) {
351
- throw new Error('Cannot top up session: no URL available. Call fetch(), sse(), or ws() first.')
352
- }
353
-
354
- const additionalDeposit = parseManagerAmount(amount, decimals)
355
- if (additionalDeposit <= 0n) throw new Error('Top-up amount must be greater than zero.')
356
- assertVoucherWithinLocalLimit(channel.cumulativeAmount + additionalDeposit)
357
-
358
- return {
359
- additionalDeposit,
360
- challenge: lastChallenge,
361
- channelId: channel.channelId,
362
- input: lastUrl,
363
- }
364
- }
365
-
366
- /**
367
- * Applies local deposit and state bookkeeping for a top-up response.
368
- *
369
- * Deposit advances from the highest known baseline. Receipt cumulative values
370
- * only update accepted spend authorization; they do not replace deposit.
371
- */
372
- export function applyTopUpResult(
373
- parameters: ApplyTopUpResultParameters,
374
- ): AppliedTopUpResult | undefined {
375
- const {
376
- additionalDeposit,
377
- channel,
378
- channelId,
379
- challengeId,
380
- currentState,
381
- knownDeposit,
382
- receipt,
383
- spent,
384
- } = parameters
385
- if (channel?.channelId !== channelId) return undefined
386
-
387
- const baseline =
388
- knownDeposit !== undefined && knownDeposit > channel.deposit ? knownDeposit : channel.deposit
389
- const updated = { ...channel, deposit: baseline + additionalDeposit }
390
-
391
- if (receipt) return { channel: updated, state: activeStateFromReceipt(receipt, updated) }
392
- if (!challengeId) return { channel: updated }
393
-
394
- return {
395
- channel: updated,
396
- state: activeStateFromChannel({
397
- challengeId,
398
- entry: updated,
399
- spent: spent.toString(),
400
- units: currentState.status === 'active' ? currentState.units : 0,
401
- }),
402
- }
403
- }
404
-
405
- /**
406
- * Applies local top-up/cumulative bookkeeping for a need-voucher event and
407
- * returns an explicit transport decision.
408
- */
409
- export async function resolveNeedVoucherContext(
410
- parameters: ResolveNeedVoucherContextParameters,
411
- ): Promise<NeedVoucherResolution> {
412
- if (parameters.event.channelId !== parameters.expectedChannelId) {
413
- return { status: 'ignored', reason: 'channel-mismatch' }
414
- }
415
-
416
- const eventAmounts = readNeedVoucherEventAmounts(parameters.event)
417
- parameters.assertVoucherWithinLocalLimit(eventAmounts.requiredCumulative)
418
-
419
- await parameters.topUpIfNeeded({
420
- challenge: parameters.challenge,
421
- input: parameters.input,
422
- channelId: parameters.expectedChannelId,
423
- deposit: eventAmounts.deposit,
424
- requiredCumulative: eventAmounts.requiredCumulative,
425
- })
426
-
427
- const channel = parameters.getChannel()
428
- if (!channel || channel.channelId !== parameters.expectedChannelId) {
429
- return { status: 'ignored', reason: 'missing-channel' }
430
- }
431
-
432
- const cumulativeAmount =
433
- channel.cumulativeAmount > eventAmounts.requiredCumulative
434
- ? channel.cumulativeAmount
435
- : uint96(eventAmounts.requiredCumulative)
436
-
437
- return {
438
- status: 'ready',
439
- context: {
440
- action: 'voucher',
441
- channelId: parameters.expectedChannelId,
442
- descriptor: channel.descriptor,
443
- cumulativeAmountRaw: cumulativeAmount.toString(),
444
- },
445
- }
446
- }
447
-
448
- /** Canonical challenge shape for built-in `tempo/session` requests. */
449
- export type TempoSessionChallenge = Challenge.Challenge<
450
- z.output<typeof Methods.session.schema.request>,
451
- typeof Constants.Intents.session,
452
- typeof Constants.Methods.tempo
453
- >
454
-
455
- /** Creates a credential bound to the current session challenge. */
456
- export type CreateSessionCredential = (
457
- challenge: TempoSessionChallenge,
458
- context: SessionContext,
459
- ) => Promise<string>
460
-
461
- /** Inputs for posting a precompile session top-up credential. */
462
- export type PostTopUpParameters = {
463
- /** Additional deposit in raw token units. */
464
- additionalDeposit: bigint
465
- /** Challenge used to authorize the management request. */
466
- challenge: TempoSessionChallenge
467
- /** Local channel expected to receive the top-up. */
468
- channel: ChannelEntry | null
469
- /** Channel ID being topped up. */
470
- channelId: Hex.Hex
471
- /** Creates the signed top-up credential. */
472
- createSessionCredential: CreateSessionCredential
473
- /** Fetch implementation used for the management POST. */
474
- fetch: typeof globalThis.fetch
475
- /** Original paid resource URL; normalized to a management URL before posting. */
476
- input: RequestInfo | URL
477
- }
478
-
479
- /** Inputs for retrying an HTTP 402 with a top-up/voucher management round trip. */
480
- export type RetryHttpPaymentRequiredParameters = {
481
- /** Creates the signed voucher credential. */
482
- createSessionCredential: CreateSessionCredential
483
- /** Fetch implementation used for the paid retry. */
484
- fetch: typeof globalThis.fetch
485
- /** Returns the current active channel after any top-up side effects. */
486
- getChannel(): ChannelEntry | null
487
- /** Original request init used by the paid resource request. */
488
- init?: RequestInit | undefined
489
- /** Original paid resource URL. */
490
- input: RequestInfo | URL
491
- /** Failed HTTP response that may contain a session challenge. */
492
- response: Response
493
- /** Restores local cumulative authorization if the voucher retry fails. */
494
- restoreCumulative(channelId: Hex.Hex, cumulativeAmount: bigint): void | Promise<void>
495
- /** Stores the selected follow-up challenge on the manager. */
496
- setChallenge(challenge: TempoSessionChallenge): void
497
- /** Performs automatic top-up before the voucher retry when deposit is insufficient. */
498
- topUpIfNeeded(parameters: TopUpRequirement): Promise<void>
499
- }
500
-
501
- /** Resolved data needed to perform an automatic HTTP voucher retry. */
502
- export type RetryHttpPaymentContext = {
503
- /** Channel active before the retry attempt. */
504
- channel: ChannelEntry
505
- /** Follow-up challenge selected from the 402 response. */
506
- challenge: TempoSessionChallenge
507
- /** Server snapshot describing the required voucher boundary. */
508
- snapshot: NonNullable<ReturnType<typeof getSessionSnapshot>>
509
- }
510
-
511
- /** Inputs for posting a cooperative HTTP close credential. */
512
- export type CloseHttpSessionParameters = {
513
- /** Creates the signed close credential. */
514
- createSessionCredential: CreateSessionCredential
515
- /** Fetch implementation used for the close POST. */
516
- fetch: typeof globalThis.fetch
517
- /** Last paid resource URL; used as the management endpoint base. */
518
- lastUrl: RequestInfo | URL | null
519
- /** Resolves the close amount again when the server refreshes the challenge. */
520
- resolveSignedCloseAmount?: ((challenge: TempoSessionChallenge) => string) | undefined
521
- /** Final cumulative amount the client is willing to sign. */
522
- signedCloseAmount: string
523
- /** Stores a fresh close challenge when the first close credential expired. */
524
- setChallenge?: ((challenge: TempoSessionChallenge) => void) | undefined
525
- /** Channel/challenge pair being closed. */
526
- target: CloseTarget
527
- }
528
-
529
- /** Returns true when a payment challenge is the built-in `tempo/session` method. */
530
- export function isTempoSessionChallenge(
531
- challenge: Challenge.Challenge,
532
- ): challenge is TempoSessionChallenge {
533
- return (
534
- challenge.method === Constants.Methods.tempo && challenge.intent === Constants.Intents.session
535
- )
536
- }
537
-
538
- /** Returns true when a challenge selects the TIP-1034 session protocol. */
539
- export function isTip1034SessionChallenge(
540
- challenge: Challenge.Challenge,
541
- ): challenge is TempoSessionChallenge {
542
- return (
543
- isTempoSessionChallenge(challenge) &&
544
- Constants.getMethodDetail(
545
- challenge.request.methodDetails,
546
- Constants.MethodDetailKeys.sessionProtocol,
547
- ) === Constants.SessionProtocols.v2
548
- )
549
- }
550
-
551
- /** Reads a server-provided session snapshot from challenge method details. */
552
- export function getSessionSnapshot(challenge: TempoSessionChallenge): SessionSnapshot | undefined {
553
- return Constants.getMethodDetail<SessionSnapshot>(
554
- challenge.request.methodDetails,
555
- Constants.MethodDetailKeys.sessionSnapshot,
556
- )
557
- }
558
-
559
- /** Merges request headers and sets the payment authorization header for a retry. */
560
- export function requestInitWithAuthorization(
561
- input: RequestInfo | URL,
562
- init: RequestInit | undefined,
563
- credential: string,
564
- ): RequestInit {
565
- const requestHeaders = input instanceof Request ? input.headers : undefined
566
- return {
567
- ...init,
568
- headers: {
569
- ...Fetch.normalizeHeaders(requestHeaders),
570
- ...Fetch.normalizeHeaders(init?.headers),
571
- [Constants.Headers.authorization]: credential,
572
- },
573
- }
574
- }
575
-
576
- /** Returns the exact resource URL used for out-of-band management POSTs, without its fragment. */
577
- export function managementInput(input: RequestInfo | URL): RequestInfo | URL {
578
- try {
579
- const base =
580
- typeof location === 'undefined' ? undefined : (location.href as `${string}:${string}`)
581
- const url =
582
- input instanceof Request
583
- ? new URL(input.url)
584
- : input instanceof URL
585
- ? new URL(input)
586
- : new URL(String(input), base)
587
- url.hash = ''
588
- return url
589
- } catch {
590
- return input
591
- }
592
- }
593
-
594
- /** Converts a WebSocket URL into the HTTP URL used for its payment challenge probe. */
595
- export function webSocketProbeUrl(input: string | URL): URL {
596
- const url = new URL(input.toString())
597
- if (url.protocol === 'ws:') url.protocol = 'http:'
598
- if (url.protocol === 'wss:') url.protocol = 'https:'
599
- return url
600
- }
601
-
602
- /** Reads an HTTP problem detail body, falling back to raw text for non-problem responses. */
603
- export async function readProblemDetail(response: Response) {
604
- const body = await response.text().catch(() => '')
605
- if (!body) return ''
606
- if (!response.headers.get('Content-Type')?.includes('application/problem+json')) return body
607
- try {
608
- const problem = JSON.parse(body) as { detail?: string }
609
- return problem.detail ?? body
610
- } catch {
611
- return body
612
- }
613
- }
614
-
615
- /** Posts a top-up management credential and returns its receipt, when present. */
616
- export async function postTopUp(
617
- parameters: PostTopUpParameters,
618
- ): Promise<SessionReceipt | undefined> {
619
- const { channel, channelId } = parameters
620
- if (!channel?.descriptor || channel.channelId !== channelId) {
621
- throw new Error('Cannot top up session: no local channel descriptor available.')
622
- }
623
-
624
- const response = await postManagementCredential({
625
- challenge: parameters.challenge,
626
- context: {
627
- action: 'topUp',
628
- channelId,
629
- descriptor: channel.descriptor,
630
- additionalDepositRaw: parameters.additionalDeposit.toString(),
631
- },
632
- createSessionCredential: parameters.createSessionCredential,
633
- fetch: parameters.fetch,
634
- input: parameters.input,
635
- })
636
- if (!response.ok) throw new Error(`Top-up POST failed with status ${response.status}`)
637
-
638
- const receiptHeader = response.headers.get(Constants.Headers.paymentReceipt)
639
- return receiptHeader ? deserializeSessionReceipt(receiptHeader) : undefined
640
- }
641
-
642
- /** Posts a management credential and retries once with a refreshed TIP-1034 challenge. */
643
- async function postManagementCredential(parameters: {
644
- challenge: TempoSessionChallenge
645
- context: SessionContext
646
- createSessionCredential: CreateSessionCredential
647
- fetch: typeof globalThis.fetch
648
- input: RequestInfo | URL
649
- }): Promise<Response> {
650
- const post = async (challenge: TempoSessionChallenge) =>
651
- parameters.fetch(managementInput(parameters.input), {
652
- method: 'POST',
653
- headers: {
654
- [Constants.Headers.authorization]: await parameters.createSessionCredential(
655
- challenge,
656
- parameters.context,
657
- ),
658
- },
659
- })
660
- const response = await post(parameters.challenge)
661
- if (response.status !== 402) return response
662
- const challenge = Challenge.fromResponseList(response).find(isTip1034SessionChallenge)
663
- return challenge ? post(challenge) : response
664
- }
665
-
666
- /** Retries an HTTP 402 when the server snapshot asks for more voucher headroom. */
667
- export async function retryHttpPaymentRequired(
668
- parameters: RetryHttpPaymentRequiredParameters,
669
- ): Promise<Response | undefined> {
670
- const context = resolveRetryHttpPaymentContext({
671
- channel: parameters.getChannel(),
672
- response: parameters.response,
673
- })
674
- if (!context) return undefined
675
- const { channel, challenge, snapshot } = context
676
-
677
- parameters.setChallenge(challenge)
678
- const requiredCumulative = BigInt(snapshot.requiredCumulative)
679
- const cumulativeBeforeVoucher = channel.cumulativeAmount
680
-
681
- await parameters.topUpIfNeeded({
682
- challenge,
683
- input: parameters.input,
684
- channelId: snapshot.channelId,
685
- deposit: BigInt(snapshot.deposit),
686
- requiredCumulative,
687
- })
688
-
689
- const currentChannel = parameters.getChannel()
690
- if (!currentChannel?.descriptor || currentChannel.channelId !== snapshot.channelId) {
691
- return undefined
692
- }
693
- const cumulativeAmount =
694
- currentChannel.cumulativeAmount > requiredCumulative
695
- ? currentChannel.cumulativeAmount
696
- : requiredCumulative
697
- const restore = () => parameters.restoreCumulative(snapshot.channelId, cumulativeBeforeVoucher)
698
- let retry: Response
699
- try {
700
- const credential = await parameters.createSessionCredential(challenge, {
701
- action: 'voucher',
702
- channelId: snapshot.channelId,
703
- descriptor: currentChannel.descriptor,
704
- cumulativeAmountRaw: cumulativeAmount.toString(),
705
- })
706
- retry = await parameters.fetch(
707
- parameters.input,
708
- requestInitWithAuthorization(parameters.input, parameters.init, credential),
709
- )
710
- } catch (error) {
711
- await restore()
712
- throw error
713
- }
714
- if (!retry.ok && !retry.headers.get(Constants.Headers.paymentReceipt)) {
715
- await restore()
716
- }
717
- return retry
718
- }
719
-
720
- /** Resolves whether a 402 response can be handled by an automatic session voucher retry. */
721
- export function resolveRetryHttpPaymentContext(parameters: {
722
- channel: ChannelEntry | null
723
- response: Response
724
- }): RetryHttpPaymentContext | undefined {
725
- const challenge = Challenge.fromResponseList(parameters.response).find(isTip1034SessionChallenge)
726
- if (!challenge) return undefined
727
-
728
- const snapshot = getSessionSnapshot(challenge)
729
- if (!snapshot) return undefined
730
-
731
- const { channel } = parameters
732
- if (!channel?.descriptor || channel.channelId !== snapshot.channelId) return undefined
733
-
734
- return { channel, challenge, snapshot }
735
- }
736
-
737
- /** Posts a cooperative close credential over HTTP and returns its receipt, when present. */
738
- export async function closeHttpSession(
739
- parameters: CloseHttpSessionParameters,
740
- ): Promise<SessionReceipt | undefined> {
741
- if (!parameters.lastUrl) {
742
- throw new Error(
743
- 'Cannot close session: no URL available. This usually means close() was called on a SessionManager instance that was recreated after the session was opened. Use the same SessionManager instance that opened the session, or call fetch()/sse() before close().',
744
- )
745
- }
746
-
747
- let closeChallenge = parameters.target.challenge
748
- let signedCloseAmount = parameters.signedCloseAmount
749
- const postClose = async (challenge: TempoSessionChallenge, refreshed = false) => {
750
- closeChallenge = challenge
751
- signedCloseAmount =
752
- (refreshed ? parameters.resolveSignedCloseAmount?.(challenge) : undefined) ??
753
- parameters.signedCloseAmount
754
- const credential = await parameters.createSessionCredential(challenge, {
755
- action: 'close',
756
- channelId: parameters.target.channelId,
757
- descriptor: parameters.target.channel.descriptor,
758
- cumulativeAmountRaw: signedCloseAmount,
759
- })
760
- return parameters.fetch(parameters.lastUrl!, {
761
- method: 'POST',
762
- headers: { [Constants.Headers.authorization]: credential },
763
- })
764
- }
765
-
766
- let response = await postClose(parameters.target.challenge)
767
- if (response.status === 402) {
768
- const challenge = Challenge.fromResponseList(response).find(isTip1034SessionChallenge)
769
- if (challenge) {
770
- parameters.setChallenge?.(challenge)
771
- response = await postClose(challenge, true)
772
- }
773
- }
774
- if (!response.ok) {
775
- const detail = await readProblemDetail(response)
776
- const wwwAuth = response.headers.get(Constants.Headers.wwwAuthenticate) ?? ''
777
- throw new Error(
778
- `Close request failed with status ${response.status}${detail ? `: ${detail}` : ''}${wwwAuth ? ` [${Constants.Headers.wwwAuthenticate}: ${wwwAuth}]` : ''}`,
779
- )
780
- }
781
-
782
- const receiptHeader = response.headers.get(Constants.Headers.paymentReceipt)
783
- if (!receiptHeader) return undefined
784
- const receipt = deserializeSessionReceipt(receiptHeader)
785
- if (
786
- !receipt.txHash ||
787
- !Hex.validate(receipt.txHash, { strict: true }) ||
788
- Hex.size(receipt.txHash) !== 32 ||
789
- !isExpectedCloseReceipt({
790
- challengeId: closeChallenge.id,
791
- channelId: parameters.target.channelId,
792
- expectedCloseAmount: signedCloseAmount,
793
- receipt,
794
- })
795
- )
796
- throw new Error('Session close response included a mismatched payment receipt.')
797
- return receipt
798
- }
799
-
800
- /** Options accepted by the auto-driving SSE session flow. */
801
- export type SseDriverOptions = RequestInit & {
802
- /** Called for each payment receipt emitted by the SSE stream. */
803
- onReceipt?: ((receipt: SessionReceipt) => void) | undefined
804
- /** Abort signal used to cancel the stream. */
805
- signal?: AbortSignal | undefined
806
- }
807
-
808
- /** @internal Options used when consuming an already-paid SSE response. */
809
- export type SseResponseOptions = {
810
- onReceipt?: ((receipt: SessionReceipt) => void) | undefined
811
- signal?: AbortSignal | undefined
812
- }
813
-
814
- /** Dependencies the SSE driver needs from `SessionManager`. */
815
- export type OpenSseSessionParameters = {
816
- /** Creates a session credential for the selected challenge/context. */
817
- createSessionCredential(
818
- challenge: TempoSessionChallenge,
819
- context: SessionContext,
820
- ): Promise<string>
821
- /** Paid fetch flow used for the initial SSE request and any retry. */
822
- doFetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>
823
- /** Fetch implementation used for management voucher posts. */
824
- fetch: typeof globalThis.fetch
825
- /** Returns the active channel, if any. */
826
- getChannel(): ChannelEntry | null
827
- /** Returns the latest challenge observed by the manager. */
828
- getChallenge(): TempoSessionChallenge | null
829
- /** Validates a cumulative amount against local client policy. */
830
- assertVoucherWithinLocalLimit(cumulativeAmount: bigint): void
831
- /** Applies an incoming receipt to manager state. */
832
- acceptReceipt(receipt: SessionReceipt): void
833
- /** Performs an automatic channel top-up when deposit is insufficient. */
834
- topUpIfNeeded(parameters: TopUpRequirement): Promise<void>
835
- }
836
-
837
- /** Session payment operations shared with fetch-backed streams. */
838
- export type SsePaymentDriver = Pick<
839
- OpenSseSessionParameters,
840
- | 'assertVoucherWithinLocalLimit'
841
- | 'createSessionCredential'
842
- | 'fetch'
843
- | 'getChannel'
844
- | 'topUpIfNeeded'
845
- >
846
-
847
- /**
848
- * Opens an auto-driving paid SSE stream.
849
- *
850
- * The driver owns only transport parsing and management posts. Session state,
851
- * credential creation, and top-up policy stay in `SessionManager`.
852
- */
853
- export async function openSseSession(
854
- input: RequestInfo | URL,
855
- init: SseDriverOptions | undefined,
856
- driver: OpenSseSessionParameters,
857
- ): Promise<AsyncIterable<string>> {
858
- const { onReceipt, signal, ...fetchInit } = init ?? {}
859
- const sseInit = {
860
- ...fetchInit,
861
- headers: {
862
- ...Fetch.normalizeHeaders(fetchInit.headers),
863
- Accept: 'text/event-stream',
864
- },
865
- ...(signal ? { signal } : {}),
866
- }
867
-
868
- let response = await driver.doFetch(input, sseInit)
869
- if (!isEventStream(response) && driver.getChannel()?.opened)
870
- response = await driver.doFetch(input, sseInit)
871
-
872
- return consumeSseSessionResponse(input, response, { onReceipt, signal }, driver)
873
- }
874
-
875
- /** @internal Consumes an already-paid SSE response with the session transport driver. */
876
- export function consumeSseSessionResponse(
877
- input: RequestInfo | URL,
878
- response: Response,
879
- options: SseResponseOptions | undefined,
880
- driver: OpenSseSessionParameters,
881
- ): AsyncIterable<string> {
882
- if (!isEventStream(response)) throw new Error('SSE response is not an event stream.')
883
- if (!response.body) throw new Error('Response has no body.')
884
- const challenge = driver.getChallenge()
885
-
886
- return iterateSseMessages({
887
- onNeedVoucher: (event) => handleSseNeedVoucher({ challenge, driver, input }, event),
888
- onReceipt(receipt) {
889
- driver.acceptReceipt(receipt)
890
- options?.onReceipt?.(receipt)
891
- },
892
- response,
893
- signal: options?.signal,
894
- })
895
- }
896
-
897
- /** Application SSE frame emitted after session payment events are handled. */
898
- export type SseResponseFrame = {
899
- /** Parsed application data, when present. */
900
- data?: string | undefined
901
- /** Original frame text, including its separator. */
902
- raw: string
903
- }
904
-
905
- /** Inputs for driving an open paid SSE response. */
906
- export type DriveSseResponseParameters = {
907
- /** Handles a request for the stream's next cumulative voucher. */
908
- onNeedVoucher(event: NeedVoucherEvent): Promise<void>
909
- /** Handles a payment receipt emitted by the stream. */
910
- onReceipt(receipt: SessionReceipt): void
911
- /** Open SSE response to drive. */
912
- response: Response
913
- /** Abort signal used to stop reading the response. */
914
- signal?: AbortSignal | undefined
915
- }
916
-
917
- async function* iterateSseMessages(parameters: DriveSseResponseParameters): AsyncGenerator<string> {
918
- for await (const frame of driveSseResponse(parameters)) {
919
- if (frame.data !== undefined) yield frame.data
920
- }
921
- }
922
-
923
- /** Handles session payment events and yields application SSE frames unchanged. */
924
- export async function* driveSseResponse(
925
- parameters: DriveSseResponseParameters,
926
- ): AsyncGenerator<SseResponseFrame> {
927
- if (!parameters.response.body) throw new Error('Response has no body.')
928
- const reader = parameters.response.body.getReader()
929
- const decoder = new TextDecoder()
930
- let buffer = ''
931
- let complete = false
932
- const cancel = () => {
933
- void reader.cancel(parameters.signal?.reason).catch(() => undefined)
934
- }
935
- parameters.signal?.addEventListener('abort', cancel, { once: true })
936
- if (parameters.signal?.aborted) cancel()
937
-
938
- try {
939
- while (true) {
940
- if (parameters.signal?.aborted) break
941
-
942
- const { done, value } = await reader.read()
943
- if (done) {
944
- complete = true
945
- buffer += decoder.decode()
946
- } else buffer += decoder.decode(value, { stream: true })
947
-
948
- while (true) {
949
- const separator = findSseSeparator(buffer, done)
950
- if (!separator) break
951
- const end = separator.index + separator.length
952
- const part = buffer.slice(0, separator.index)
953
- const raw = buffer.slice(0, end)
954
- buffer = buffer.slice(end)
955
- if (!part.trim()) continue
956
- const event = parseEvent(part.replace(/\r\n|\r/g, '\n'))
957
- if (!event) {
958
- yield { raw }
959
- continue
960
- }
961
-
962
- switch (event.type) {
963
- case 'message':
964
- yield { data: event.data, raw }
965
- break
966
- case 'payment-need-voucher':
967
- await parameters.onNeedVoucher(event.data)
968
- break
969
- case 'payment-receipt':
970
- parameters.onReceipt(event.data)
971
- break
972
- }
973
- }
974
- if (done) break
975
- }
976
- } finally {
977
- parameters.signal?.removeEventListener('abort', cancel)
978
- if (!complete) await reader.cancel().catch(() => undefined)
979
- reader.releaseLock()
980
- }
981
- }
982
-
983
- function findSseSeparator(
984
- value: string,
985
- complete: boolean,
986
- ): { index: number; length: number } | undefined {
987
- for (let index = 0; index < value.length; index++) {
988
- const first = lineEndingLength(value, index, complete)
989
- if (!first) continue
990
- const second = lineEndingLength(value, index + first, complete)
991
- if (second) return { index, length: first + second }
992
- index += first - 1
993
- }
994
- return undefined
995
- }
996
-
997
- function lineEndingLength(value: string, index: number, complete: boolean): number {
998
- if (value[index] === '\n') return 1
999
- if (value[index] !== '\r') return 0
1000
- if (value[index + 1] === '\n') return 2
1001
- if (index + 1 === value.length && !complete) return 0
1002
- return 1
1003
- }
1004
-
1005
- /** Wraps an SSE response while handling session payment frames in-band. */
1006
- export function wrapSseResponse(parameters: DriveSseResponseParameters): Response {
1007
- const abortController = new AbortController()
1008
- const abort = () => abortController.abort(parameters.signal?.reason)
1009
- parameters.signal?.addEventListener('abort', abort, { once: true })
1010
- if (parameters.signal?.aborted) abort()
1011
-
1012
- const iterator = driveSseResponse({ ...parameters, signal: abortController.signal })
1013
- const encoder = new TextEncoder()
1014
- const headers = new Headers(parameters.response.headers)
1015
- headers.delete('content-length')
1016
- const cleanup = () => parameters.signal?.removeEventListener('abort', abort)
1017
-
1018
- const response = new Response(
1019
- new ReadableStream({
1020
- async pull(controller) {
1021
- try {
1022
- const frame = await iterator.next()
1023
- if (frame.done) {
1024
- cleanup()
1025
- return controller.close()
1026
- }
1027
- controller.enqueue(encoder.encode(frame.value.raw))
1028
- } catch (error) {
1029
- cleanup()
1030
- throw error
1031
- }
1032
- },
1033
- async cancel() {
1034
- cleanup()
1035
- abortController.abort()
1036
- await iterator.return(undefined)
1037
- },
1038
- }),
1039
- {
1040
- headers,
1041
- status: parameters.response.status,
1042
- statusText: parameters.response.statusText,
1043
- },
1044
- )
1045
-
1046
- for (const property of ['redirected', 'type', 'url'] as const)
1047
- Object.defineProperty(response, property, {
1048
- configurable: true,
1049
- get: () => parameters.response[property],
1050
- })
1051
-
1052
- return response
1053
- }
1054
-
1055
- /** Handles an in-band voucher request using the shared SSE payment driver. */
1056
- export async function handleSseNeedVoucher(
1057
- parameters: {
1058
- challenge: TempoSessionChallenge | null
1059
- driver: SsePaymentDriver
1060
- input: RequestInfo | URL
1061
- },
1062
- event: NeedVoucherEvent,
1063
- ) {
1064
- const channel = parameters.driver.getChannel()
1065
- if (!channel || !parameters.challenge) return
1066
-
1067
- const resolution = await resolveNeedVoucherContext({
1068
- assertVoucherWithinLocalLimit: parameters.driver.assertVoucherWithinLocalLimit,
1069
- challenge: parameters.challenge,
1070
- event,
1071
- expectedChannelId: channel.channelId,
1072
- getChannel: parameters.driver.getChannel,
1073
- input: parameters.input,
1074
- topUpIfNeeded: parameters.driver.topUpIfNeeded,
1075
- })
1076
- if (resolution.status !== 'ready') return
1077
-
1078
- const voucherResponse = await postManagementCredential({
1079
- challenge: parameters.challenge,
1080
- context: resolution.context,
1081
- createSessionCredential: parameters.driver.createSessionCredential,
1082
- fetch: parameters.driver.fetch,
1083
- input: parameters.input,
1084
- })
1085
- if (!voucherResponse.ok) {
1086
- throw new Error(`Voucher POST failed with status ${voucherResponse.status}`)
1087
- }
1088
- }
1089
-
1090
- /** Options accepted by the auto-driving WebSocket session flow. */
1091
- export type WebSocketDriverOptions = {
1092
- /** Called for each payment receipt emitted by the WebSocket flow. */
1093
- onReceipt?: ((receipt: SessionReceipt) => void) | undefined
1094
- /** WebSocket subprotocols passed to the runtime constructor. */
1095
- protocols?: string | string[] | undefined
1096
- /** Abort signal used to cancel the socket payment flow. */
1097
- signal?: AbortSignal | undefined
1098
- }
1099
-
1100
- /** Creates a session credential for a WebSocket payment challenge. */
1101
- export type CreateWebSocketCredential = (
1102
- challenge: TempoSessionChallenge,
1103
- context: SessionContext,
1104
- ) => Promise<string>
1105
-
1106
- /** Inputs for probing and authorizing a paid WebSocket session. */
1107
- export type PrepareWebSocketSessionParameters = {
1108
- /** Creates the opening session credential. */
1109
- createSessionCredential: CreateWebSocketCredential
1110
- /** Fetch implementation used for the HTTP 402 probe. */
1111
- fetch: typeof globalThis.fetch
1112
- /** WebSocket URL requested by the caller. */
1113
- input: string | URL
1114
- /** Called after resolving the HTTP probe URL, before the network request. */
1115
- onProbeUrl?: ((httpUrl: URL) => void) | undefined
1116
- /** Optional request init for the HTTP probe. */
1117
- probeInit?: RequestInit | undefined
1118
- /** Optional abort signal applied to the HTTP probe. */
1119
- signal?: AbortSignal | undefined
1120
- }
1121
-
1122
- /** Inputs for probing a paid WebSocket endpoint without creating a credential. */
1123
- export type ProbeWebSocketSessionParameters = Omit<
1124
- PrepareWebSocketSessionParameters,
1125
- 'createSessionCredential'
1126
- >
1127
-
1128
- /** Result of resolving the current payment challenge for a WebSocket endpoint. */
1129
- export type ProbedWebSocketSession = Omit<PreparedWebSocketSession, 'credential'>
1130
-
1131
- /** Result of the HTTP probe and opening credential creation for a WebSocket session. */
1132
- export type PreparedWebSocketSession = {
1133
- /** Selected tempo/session challenge from the HTTP probe. */
1134
- challenge: TempoSessionChallenge
1135
- /** Opening authorization credential to send in-band after the socket opens. */
1136
- credential: string
1137
- /** HTTP URL used for probe and out-of-band management requests. */
1138
- httpUrl: URL
1139
- /** WebSocket URL to open. */
1140
- wsUrl: URL
1141
- }
1142
-
1143
- /** Active WebSocket session bookkeeping shared by the manager and socket driver. */
1144
- export type ActiveSocketSession = {
1145
- /** Challenge used to create credentials for this socket. */
1146
- challenge: TempoSessionChallenge
1147
- /** Channel authorized by the opening credential. */
1148
- channelId: Hex.Hex
1149
- /** Server close-ready receipt, when the stream is ready to close. */
1150
- closeReadyReceipt: SessionReceipt | null
1151
- /** Number of application chunks delivered through the managed socket. */
1152
- deliveredChunks: bigint
1153
- /** Expected final close amount while a close credential is in flight. */
1154
- expectedCloseAmount: string | null
1155
- /** Raw socket while open; set to null after close. */
1156
- socket: WebSocket | null
1157
- /** Raw token cost per delivered chunk. */
1158
- tickCost: bigint
1159
- }
1160
-
1161
- /** Inputs for creating initial WebSocket payment runtime state. */
1162
- export type CreateActiveSocketSessionParameters = {
1163
- /** Challenge selected by the HTTP probe. */
1164
- challenge: TempoSessionChallenge
1165
- /** Opening credential sent when the socket opens. */
1166
- credential: string
1167
- /** Raw runtime socket. */
1168
- socket: WebSocket
1169
- }
1170
-
1171
- /** Dependencies the WebSocket driver needs from `SessionManager`. */
1172
- export type OpenWebSocketSessionParameters = {
1173
- /** Challenge selected by the HTTP probe. */
1174
- challenge: TempoSessionChallenge
1175
- /** Opening credential to send in-band after the socket opens. */
1176
- credential: string
1177
- /** URL used for automatic top-up management calls. */
1178
- httpUrl: URL
1179
- /** WebSocket constructor for the current runtime. */
1180
- WebSocket: WebSocketConstructor
1181
- /** WebSocket URL to open. */
1182
- wsUrl: URL
1183
- /** Optional WebSocket call options. */
1184
- options?: WebSocketDriverOptions | undefined
1185
- /** Creates a session credential for the selected challenge/context. */
1186
- createSessionCredential(
1187
- challenge: TempoSessionChallenge,
1188
- context: SessionContext,
1189
- ): Promise<string>
1190
- /** Returns the active channel, if any. */
1191
- getChannel(): ChannelEntry | null
1192
- /** Stores the active socket state in the manager. */
1193
- setSocketSession(session: ActiveSocketSession): void
1194
- /** Fetches the route's current challenge after the active one expires. */
1195
- refreshChallenge(): Promise<TempoSessionChallenge>
1196
- /** Validates a cumulative amount against local client policy. */
1197
- assertVoucherWithinLocalLimit(cumulativeAmount: bigint): void
1198
- /** Applies an incoming receipt to manager state. */
1199
- acceptReceipt(receipt: SessionReceipt): void
1200
- /** Rejects any pending close-ready wait. */
1201
- rejectCloseReady(error: Error): void
1202
- /** Rejects any pending receipt wait. */
1203
- rejectReceipt(error: Error): void
1204
- /** Records a close-ready receipt. */
1205
- settleCloseReady(receipt: SessionReceipt): void
1206
- /** Records a payment receipt. */
1207
- settleReceipt(receipt: SessionReceipt): void
1208
- /** Performs an automatic channel top-up when deposit is insufficient. */
1209
- topUpIfNeeded(parameters: TopUpRequirement): Promise<void>
1210
- /** Waits for the opening receipt before returning the managed socket. */
1211
- waitForReceipt(): Promise<SessionReceipt>
1212
- }
1213
-
1214
- /** Inputs for validating a receipt belongs to the active WebSocket payment flow. */
1215
- export type ExpectedSocketReceiptParameters = {
1216
- /** Active WebSocket challenge ID. */
1217
- challengeId: string
1218
- /** Active WebSocket channel ID. */
1219
- channelId: Hex.Hex
1220
- /** Receipt received from a WebSocket payment frame. */
1221
- receipt: SessionReceipt
1222
- }
1223
-
1224
- /** Inputs for validating a payment-close-ready frame. */
1225
- export type ValidateSocketCloseReadyReceiptParameters = ExpectedSocketReceiptParameters & {
1226
- /** Local cumulative voucher authorization for the active channel. */
1227
- cumulativeAmount: bigint
1228
- }
1229
-
1230
- /** Inputs for validating a payment-receipt frame. */
1231
- export type ValidateSocketPaymentReceiptParameters = ExpectedSocketReceiptParameters & {
1232
- /** Expected final close amount while a close credential is in flight. */
1233
- expectedCloseAmount: string | null
1234
- }
1235
-
1236
- /** Probes a WebSocket endpoint over HTTP and returns its current session challenge. */
1237
- export async function probeWebSocketSession(
1238
- parameters: ProbeWebSocketSessionParameters,
1239
- ): Promise<ProbedWebSocketSession> {
1240
- const wsUrl = new URL(parameters.input.toString())
1241
- const httpUrl = webSocketProbeUrl(wsUrl)
1242
- parameters.onProbeUrl?.(httpUrl)
1243
- const probe = await parameters.fetch(httpUrl, {
1244
- ...parameters.probeInit,
1245
- ...(parameters.signal ? { signal: parameters.signal } : {}),
1246
- })
1247
- if (probe.status !== 402) {
1248
- throw new Error(
1249
- `Expected a 402 payment challenge from ${httpUrl}, received ${probe.status} instead.`,
1250
- )
1251
- }
1252
-
1253
- const challenge = Challenge.fromResponseList(probe).find(isTip1034SessionChallenge)
1254
- if (!challenge) {
1255
- throw new Error(
1256
- 'No payment challenge received from HTTP endpoint for this WebSocket URL. The server may not require payment or did not advertise a challenge.',
1257
- )
1258
- }
1259
-
1260
- return {
1261
- challenge,
1262
- httpUrl,
1263
- wsUrl,
1264
- }
1265
- }
1266
-
1267
- /** Probes a WebSocket endpoint over HTTP and creates the opening credential. */
1268
- export async function prepareWebSocketSession(
1269
- parameters: PrepareWebSocketSessionParameters,
1270
- ): Promise<PreparedWebSocketSession> {
1271
- const probed = await probeWebSocketSession(parameters)
1272
- return {
1273
- ...probed,
1274
- credential: await parameters.createSessionCredential(probed.challenge, {}),
1275
- }
1276
- }
1277
-
1278
- /** Creates the initial runtime state for a paid WebSocket from its opening credential. */
1279
- export function createActiveSocketSession(
1280
- parameters: CreateActiveSocketSessionParameters,
1281
- ): ActiveSocketSession {
1282
- const { challenge, credential, socket } = parameters
1283
- return {
1284
- challenge,
1285
- channelId:
1286
- PaymentCredential.deserialize<SessionCredentialPayload>(credential).payload.channelId,
1287
- closeReadyReceipt: null,
1288
- deliveredChunks: 0n,
1289
- expectedCloseAmount: null,
1290
- socket,
1291
- tickCost: readSessionChallengeAmount(challenge),
1292
- }
1293
- }
1294
-
1295
- /** Returns whether a receipt belongs to the active WebSocket session. */
1296
- export function isExpectedSocketReceipt(parameters: ExpectedSocketReceiptParameters): boolean {
1297
- const { challengeId, channelId, receipt } = parameters
1298
- return receipt.challengeId === challengeId && receipt.channelId === channelId
1299
- }
1300
-
1301
- /** Returns a protocol failure message when a close-ready receipt is invalid. */
1302
- export function validateSocketCloseReadyReceipt(
1303
- parameters: ValidateSocketCloseReadyReceiptParameters,
1304
- ): string | undefined {
1305
- if (!isExpectedSocketReceipt(parameters)) return 'received mismatched payment-close-ready frame'
1306
- if (BigInt(parameters.receipt.spent) > parameters.cumulativeAmount) {
1307
- return 'received payment-close-ready beyond local voucher state'
1308
- }
1309
- return undefined
1310
- }
1311
-
1312
- /** Returns a protocol failure message when a payment receipt is invalid. */
1313
- export function validateSocketPaymentReceipt(
1314
- parameters: ValidateSocketPaymentReceiptParameters,
1315
- ): string | undefined {
1316
- const { challengeId, channelId, expectedCloseAmount, receipt } = parameters
1317
- if (!isExpectedSocketReceipt(parameters)) return 'received mismatched payment-receipt frame'
1318
- if (
1319
- expectedCloseAmount !== null &&
1320
- Boolean(receipt.txHash) &&
1321
- !isExpectedCloseReceipt({ challengeId, channelId, expectedCloseAmount, receipt })
1322
- ) {
1323
- return 'received mismatched payment-close receipt frame'
1324
- }
1325
- return undefined
1326
- }
1327
-
1328
- /**
1329
- * Opens an auto-driving paid WebSocket session.
1330
- *
1331
- * The driver owns socket protocol frames. Session state, credential creation,
1332
- * and top-up policy remain supplied by `SessionManager`.
1333
- */
1334
- export async function openWebSocketSession(
1335
- parameters: OpenWebSocketSessionParameters,
1336
- ): Promise<SessionManagedWebSocket> {
1337
- const { challenge, credential, options, WebSocket: WebSocketImpl, wsUrl } = parameters
1338
- const rawSocket = new WebSocketImpl(wsUrl, options?.protocols)
1339
- const socketState = createActiveSocketSession({
1340
- challenge,
1341
- credential,
1342
- socket: rawSocket,
1343
- })
1344
- parameters.setSocketSession(socketState)
1345
-
1346
- const managedSocket = createManagedSocket(rawSocket)
1347
- const failSocketFlow = (message: string) => {
1348
- parameters.rejectReceipt(new Error(message))
1349
- parameters.rejectCloseReady(new Error(message))
1350
- if (
1351
- rawSocket.readyState === WebSocketReadyState.CONNECTING ||
1352
- rawSocket.readyState === WebSocketReadyState.OPEN
1353
- ) {
1354
- rawSocket.close(ClientWebSocketProtocolErrorCloseCode, message)
1355
- }
1356
- }
1357
- rawSocket.addEventListener('close', (event) => {
1358
- socketState.socket = null
1359
- socketState.expectedCloseAmount = null
1360
- parameters.rejectReceipt(new Error('WebSocket closed before the payment flow completed.'))
1361
- parameters.rejectCloseReady(new Error('WebSocket closed before the payment flow completed.'))
1362
- managedSocket.emit('close', {
1363
- code: (event as CloseEvent).code ?? 1000,
1364
- reason: (event as CloseEvent).reason ?? '',
1365
- type: 'close',
1366
- wasClean: true,
1367
- })
1368
- })
1369
- rawSocket.addEventListener('error', () => {
1370
- managedSocket.emit('error', { type: 'error' })
1371
- })
1372
- rawSocket.addEventListener('message', async (event) => {
1373
- const raw = typeof event.data === 'string' ? event.data : undefined
1374
- if (!raw) return
1375
- await handleSocketMessage({
1376
- driver: parameters,
1377
- failSocketFlow,
1378
- managedEmit: managedSocket.emit,
1379
- message: raw,
1380
- rawSocket,
1381
- socketState,
1382
- })
1383
- })
1384
- options?.signal?.addEventListener(
1385
- 'abort',
1386
- () => {
1387
- parameters.rejectReceipt(new Error('WebSocket payment flow aborted.'))
1388
- parameters.rejectCloseReady(new Error('WebSocket payment flow aborted.'))
1389
- rawSocket.close()
1390
- },
1391
- { once: true },
1392
- )
1393
-
1394
- await waitForSocketOpen(rawSocket, managedSocket.emit, wsUrl)
1395
- rawSocket.send(Ws.formatAuthorizationMessage(credential))
1396
- await parameters.waitForReceipt()
1397
- return managedSocket.socket
1398
- }
1399
-
1400
- type ManagedEmit = ReturnType<typeof createManagedSocket>['emit']
1401
-
1402
- function waitForSocketOpen(rawSocket: WebSocket, managedEmit: ManagedEmit, wsUrl: URL) {
1403
- return new Promise<void>((resolve, reject) => {
1404
- const onOpen = () => {
1405
- rawSocket.removeEventListener('error', onError)
1406
- managedEmit('open', { type: 'open' })
1407
- resolve()
1408
- }
1409
- const onError = () => {
1410
- rawSocket.removeEventListener('open', onOpen)
1411
- reject(new Error(`WebSocket connection to ${wsUrl} failed to open.`))
1412
- }
1413
- rawSocket.addEventListener('open', onOpen, { once: true })
1414
- rawSocket.addEventListener('error', onError, { once: true })
1415
- })
1416
- }
1417
-
1418
- type HandleSocketMessageParameters = {
1419
- driver: OpenWebSocketSessionParameters
1420
- failSocketFlow(message: string): void
1421
- managedEmit: ManagedEmit
1422
- message: string
1423
- rawSocket: WebSocket
1424
- socketState: ActiveSocketSession
1425
- }
1426
-
1427
- async function handleSocketMessage(parameters: HandleSocketMessageParameters) {
1428
- const parsed = Ws.parseMessage(parameters.message)
1429
- if (!parsed) {
1430
- parameters.managedEmit('message', { data: parameters.message, type: 'message' })
1431
- return
1432
- }
1433
-
1434
- switch (parsed.mpp) {
1435
- case 'authorization':
1436
- return
1437
- case 'message':
1438
- parameters.socketState.deliveredChunks += 1n
1439
- parameters.managedEmit('message', { data: parsed.data, type: 'message' })
1440
- return
1441
- case 'payment-close-ready':
1442
- handleCloseReady(parameters, parsed.data)
1443
- return
1444
- case 'payment-error':
1445
- parameters.driver.rejectReceipt(new Error(parsed.message))
1446
- parameters.driver.rejectCloseReady(new Error(parsed.message))
1447
- return
1448
- case 'payment-need-voucher':
1449
- await handleNeedVoucher(parameters, parsed.data)
1450
- return
1451
- case 'payment-receipt':
1452
- handleReceipt(parameters, parsed.data)
1453
- return
1454
- }
1455
- }
1456
-
1457
- function handleCloseReady(parameters: HandleSocketMessageParameters, receipt: SessionReceipt) {
1458
- const cumulativeAmount = parameters.driver.getChannel()?.cumulativeAmount ?? 0n
1459
- const error = validateSocketCloseReadyReceipt({
1460
- challengeId: parameters.driver.challenge.id,
1461
- channelId: parameters.socketState.channelId,
1462
- cumulativeAmount,
1463
- receipt,
1464
- })
1465
- if (error) {
1466
- parameters.failSocketFlow(error)
1467
- return
1468
- }
1469
- parameters.driver.acceptReceipt(receipt)
1470
- parameters.driver.options?.onReceipt?.(receipt)
1471
- parameters.driver.settleCloseReady(receipt)
1472
- parameters.managedEmit('close', {
1473
- code: 1000,
1474
- reason: 'stream complete',
1475
- type: 'close',
1476
- wasClean: true,
1477
- })
1478
- }
1479
-
1480
- async function handleNeedVoucher(
1481
- parameters: HandleSocketMessageParameters,
1482
- event: NeedVoucherEvent,
1483
- ) {
1484
- try {
1485
- let challenge = parameters.driver.challenge
1486
- if (
1487
- challenge.expires &&
1488
- new Date(challenge.expires).getTime() <= Date.now() + webSocketChallengeRefreshWindowMs
1489
- ) {
1490
- challenge = await parameters.driver.refreshChallenge()
1491
- parameters.driver.challenge = challenge
1492
- parameters.socketState.challenge = challenge
1493
- }
1494
- const resolution = await resolveNeedVoucherContext({
1495
- assertVoucherWithinLocalLimit: parameters.driver.assertVoucherWithinLocalLimit,
1496
- challenge,
1497
- event,
1498
- expectedChannelId: parameters.socketState.channelId,
1499
- getChannel: parameters.driver.getChannel,
1500
- input: parameters.driver.httpUrl,
1501
- topUpIfNeeded: parameters.driver.topUpIfNeeded,
1502
- })
1503
- if (resolution.status === 'ignored') {
1504
- parameters.failSocketFlow(
1505
- resolution.reason === 'channel-mismatch'
1506
- ? 'received mismatched payment-need-voucher frame'
1507
- : 'cannot create voucher: no active channel',
1508
- )
1509
- return
1510
- }
1511
- const voucher = await parameters.driver.createSessionCredential(challenge, resolution.context)
1512
- parameters.rawSocket.send(Ws.formatAuthorizationMessage(voucher))
1513
- } catch (error) {
1514
- parameters.failSocketFlow(
1515
- error instanceof Error ? error.message : 'failed to create websocket voucher',
1516
- )
1517
- }
1518
- }
1519
-
1520
- function handleReceipt(parameters: HandleSocketMessageParameters, receipt: SessionReceipt) {
1521
- const error = validateSocketPaymentReceipt({
1522
- challengeId: parameters.driver.challenge.id,
1523
- channelId: parameters.socketState.channelId,
1524
- expectedCloseAmount: parameters.socketState.expectedCloseAmount,
1525
- receipt,
1526
- })
1527
- if (error) {
1528
- parameters.failSocketFlow(error)
1529
- return
1530
- }
1531
- parameters.driver.acceptReceipt(receipt)
1532
- parameters.driver.options?.onReceipt?.(receipt)
1533
- parameters.driver.settleReceipt(receipt)
1534
- }