mppx 0.8.17 → 0.8.19

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 (914) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/README.md +15 -0
  3. package/dist/Challenge.js +21 -4
  4. package/dist/bin.js +3 -3
  5. package/dist/cli/THIRD-PARTY-LICENSES.txt +328 -0
  6. package/dist/cli/cli.js +253 -1505
  7. package/dist/cli/plugins/index.js +19 -5
  8. package/dist/cli/plugins/tempo.js +7 -3
  9. package/dist/cli/sessions/Manager.js +7 -4
  10. package/dist/cli/sessions/request.d.ts +2 -0
  11. package/dist/cli/sessions/request.js +18 -0
  12. package/dist/cli/sessions/store.js +28 -14
  13. package/dist/discovery/Discovery.js +2 -1
  14. package/dist/evm/client/Charge.js +8 -0
  15. package/dist/server/core.d.ts +9 -0
  16. package/dist/server/core.js +9 -0
  17. package/dist/stripe/server/Charge.js +2 -4
  18. package/dist/stripe/server/Methods.d.ts +2 -2
  19. package/dist/stripe/server/Methods.js +17 -11
  20. package/dist/stripe/server/internal/html.gen.d.ts +1 -1
  21. package/dist/stripe/server/internal/html.gen.js +1 -1
  22. package/dist/stripe/server/spt.d.ts +8 -0
  23. package/dist/stripe/server/spt.js +8 -0
  24. package/dist/tempo/Methods.d.ts +13 -0
  25. package/dist/tempo/Methods.js +14 -3
  26. package/dist/tempo/client/Charge.d.ts +3 -0
  27. package/dist/tempo/client/Charge.js +31 -9
  28. package/dist/tempo/client/Methods.d.ts +13 -0
  29. package/dist/tempo/internal/defaults.d.ts +11 -0
  30. package/dist/tempo/internal/defaults.js +11 -0
  31. package/dist/tempo/internal/machine-token-charge.d.ts +51 -0
  32. package/dist/tempo/internal/machine-token-charge.js +113 -0
  33. package/dist/tempo/internal/machine-token-session.d.ts +88 -0
  34. package/dist/tempo/internal/machine-token-session.js +173 -0
  35. package/dist/tempo/internal/signature-envelope.d.ts +14 -0
  36. package/dist/tempo/internal/signature-envelope.js +28 -0
  37. package/dist/tempo/legacy/client/ChannelOps.d.ts +2 -2
  38. package/dist/tempo/legacy/client/ChannelOps.js +11 -5
  39. package/dist/tempo/legacy/client/Session.d.ts +13 -1
  40. package/dist/tempo/legacy/client/Session.js +3 -3
  41. package/dist/tempo/legacy/client/SessionManager.d.ts +3 -1
  42. package/dist/tempo/legacy/client/SessionManager.js +2 -0
  43. package/dist/tempo/server/Charge.d.ts +3 -0
  44. package/dist/tempo/server/Charge.js +58 -17
  45. package/dist/tempo/server/Methods.d.ts +21 -4
  46. package/dist/tempo/server/Methods.js +8 -4
  47. package/dist/tempo/server/internal/html.gen.d.ts +1 -1
  48. package/dist/tempo/server/internal/html.gen.js +1 -1
  49. package/dist/tempo/session/client/ChannelOps.d.ts +18 -3
  50. package/dist/tempo/session/client/ChannelOps.js +35 -6
  51. package/dist/tempo/session/client/ChannelStore.d.ts +0 -5
  52. package/dist/tempo/session/client/ChannelStore.js +2 -2
  53. package/dist/tempo/session/client/CredentialState.d.ts +17 -2
  54. package/dist/tempo/session/client/CredentialState.js +77 -76
  55. package/dist/tempo/session/client/Runtime.d.ts +4 -2
  56. package/dist/tempo/session/client/Runtime.js +21 -5
  57. package/dist/tempo/session/client/Session.d.ts +15 -3
  58. package/dist/tempo/session/client/Session.js +186 -63
  59. package/dist/tempo/session/client/SessionManager.d.ts +3 -1
  60. package/dist/tempo/session/client/SessionManager.js +35 -11
  61. package/dist/tempo/session/client/Transports.d.ts +2 -0
  62. package/dist/tempo/session/client/Transports.js +12 -2
  63. package/dist/tempo/session/precompile/Chain.d.ts +10 -2
  64. package/dist/tempo/session/precompile/Chain.js +51 -10
  65. package/dist/tempo/session/precompile/Protocol.d.ts +15 -0
  66. package/dist/tempo/session/precompile/Protocol.js +7 -0
  67. package/dist/tempo/session/precompile/Voucher.d.ts +3 -1
  68. package/dist/tempo/session/precompile/Voucher.js +6 -12
  69. package/dist/tempo/session/server/ChannelStore.d.ts +6 -0
  70. package/dist/tempo/session/server/ChannelStore.js +11 -4
  71. package/dist/tempo/session/server/CredentialVerification.d.ts +11 -9
  72. package/dist/tempo/session/server/CredentialVerification.js +185 -109
  73. package/dist/tempo/session/server/MeteredStream.d.ts +1 -1
  74. package/dist/tempo/session/server/MeteredStream.js +5 -4
  75. package/dist/tempo/session/server/RequestState.d.ts +19 -0
  76. package/dist/tempo/session/server/RequestState.js +61 -15
  77. package/dist/tempo/session/server/Session.d.ts +14 -2
  78. package/dist/tempo/session/server/Session.js +37 -6
  79. package/dist/tempo/session/server/Settlement.d.ts +11 -4
  80. package/dist/tempo/session/server/Settlement.js +53 -21
  81. package/dist/x402/client/Exact.d.ts +8 -0
  82. package/dist/x402/client/Exact.js +40 -10
  83. package/dist/x402/server/EvmCharge.d.ts +22 -0
  84. package/dist/x402/server/EvmCharge.js +23 -1
  85. package/package.json +15 -37
  86. package/dist/BodyDigest.d.ts.map +0 -1
  87. package/dist/BodyDigest.js.map +0 -1
  88. package/dist/Challenge.d.ts.map +0 -1
  89. package/dist/Challenge.js.map +0 -1
  90. package/dist/Constants.d.ts.map +0 -1
  91. package/dist/Constants.js.map +0 -1
  92. package/dist/Credential.d.ts.map +0 -1
  93. package/dist/Credential.js.map +0 -1
  94. package/dist/Errors.d.ts.map +0 -1
  95. package/dist/Errors.js.map +0 -1
  96. package/dist/Expires.d.ts.map +0 -1
  97. package/dist/Expires.js.map +0 -1
  98. package/dist/Html.d.ts.map +0 -1
  99. package/dist/Html.js.map +0 -1
  100. package/dist/Mcp.d.ts.map +0 -1
  101. package/dist/Mcp.js.map +0 -1
  102. package/dist/Method.d.ts.map +0 -1
  103. package/dist/Method.js.map +0 -1
  104. package/dist/PaymentRequest.d.ts.map +0 -1
  105. package/dist/PaymentRequest.js.map +0 -1
  106. package/dist/Receipt.d.ts.map +0 -1
  107. package/dist/Receipt.js.map +0 -1
  108. package/dist/Store.d.ts.map +0 -1
  109. package/dist/Store.js.map +0 -1
  110. package/dist/attestation/Client.d.ts.map +0 -1
  111. package/dist/attestation/Client.js.map +0 -1
  112. package/dist/attestation/Constants.d.ts.map +0 -1
  113. package/dist/attestation/Constants.js.map +0 -1
  114. package/dist/attestation/Server.d.ts.map +0 -1
  115. package/dist/attestation/Server.js.map +0 -1
  116. package/dist/attestation/Types.d.ts.map +0 -1
  117. package/dist/attestation/Types.js.map +0 -1
  118. package/dist/attestation/index.d.ts.map +0 -1
  119. package/dist/attestation/index.js.map +0 -1
  120. package/dist/attestation/internal/HttpMessageSignature.d.ts.map +0 -1
  121. package/dist/attestation/internal/HttpMessageSignature.js.map +0 -1
  122. package/dist/attestation/internal/SigningContext.d.ts.map +0 -1
  123. package/dist/attestation/internal/SigningContext.js.map +0 -1
  124. package/dist/bin.d.ts.map +0 -1
  125. package/dist/bin.js.map +0 -1
  126. package/dist/cli/account.d.ts.map +0 -1
  127. package/dist/cli/account.js.map +0 -1
  128. package/dist/cli/cli.d.ts.map +0 -1
  129. package/dist/cli/cli.js.map +0 -1
  130. package/dist/cli/config.d.ts.map +0 -1
  131. package/dist/cli/config.js.map +0 -1
  132. package/dist/cli/internal.d.ts.map +0 -1
  133. package/dist/cli/internal.js.map +0 -1
  134. package/dist/cli/plugins/evm.d.ts.map +0 -1
  135. package/dist/cli/plugins/evm.js.map +0 -1
  136. package/dist/cli/plugins/index.d.ts.map +0 -1
  137. package/dist/cli/plugins/index.js.map +0 -1
  138. package/dist/cli/plugins/plugin.d.ts.map +0 -1
  139. package/dist/cli/plugins/plugin.js.map +0 -1
  140. package/dist/cli/plugins/stripe.d.ts.map +0 -1
  141. package/dist/cli/plugins/stripe.js.map +0 -1
  142. package/dist/cli/plugins/tempo.d.ts.map +0 -1
  143. package/dist/cli/plugins/tempo.js.map +0 -1
  144. package/dist/cli/sessions/Manager.d.ts.map +0 -1
  145. package/dist/cli/sessions/Manager.js.map +0 -1
  146. package/dist/cli/sessions/commands.d.ts.map +0 -1
  147. package/dist/cli/sessions/commands.js.map +0 -1
  148. package/dist/cli/sessions/request.d.ts.map +0 -1
  149. package/dist/cli/sessions/request.js.map +0 -1
  150. package/dist/cli/sessions/store.d.ts.map +0 -1
  151. package/dist/cli/sessions/store.js.map +0 -1
  152. package/dist/cli/utils.d.ts.map +0 -1
  153. package/dist/cli/utils.js.map +0 -1
  154. package/dist/cli/validate/challenge.d.ts.map +0 -1
  155. package/dist/cli/validate/challenge.js.map +0 -1
  156. package/dist/cli/validate/discovery.d.ts.map +0 -1
  157. package/dist/cli/validate/discovery.js.map +0 -1
  158. package/dist/cli/validate/helpers.d.ts.map +0 -1
  159. package/dist/cli/validate/helpers.js.map +0 -1
  160. package/dist/cli/validate/index.d.ts.map +0 -1
  161. package/dist/cli/validate/index.js.map +0 -1
  162. package/dist/cli/validate/messages.d.ts.map +0 -1
  163. package/dist/cli/validate/messages.js.map +0 -1
  164. package/dist/cli/validate/payment.d.ts.map +0 -1
  165. package/dist/cli/validate/payment.js.map +0 -1
  166. package/dist/client/Methods.d.ts.map +0 -1
  167. package/dist/client/Methods.js.map +0 -1
  168. package/dist/client/Mppx.d.ts.map +0 -1
  169. package/dist/client/Mppx.js.map +0 -1
  170. package/dist/client/Transport.d.ts.map +0 -1
  171. package/dist/client/Transport.js.map +0 -1
  172. package/dist/client/index.d.ts.map +0 -1
  173. package/dist/client/index.js.map +0 -1
  174. package/dist/client/internal/Fetch.d.ts.map +0 -1
  175. package/dist/client/internal/Fetch.js.map +0 -1
  176. package/dist/client/internal/MethodChallenge.d.ts.map +0 -1
  177. package/dist/client/internal/MethodChallenge.js.map +0 -1
  178. package/dist/client/internal/MethodResponse.d.ts.map +0 -1
  179. package/dist/client/internal/MethodResponse.js.map +0 -1
  180. package/dist/client/internal/protocols/Mcp.d.ts.map +0 -1
  181. package/dist/client/internal/protocols/Mcp.js.map +0 -1
  182. package/dist/client/internal/protocols/Mpp.d.ts.map +0 -1
  183. package/dist/client/internal/protocols/Mpp.js.map +0 -1
  184. package/dist/client/internal/protocols/Protocol.d.ts.map +0 -1
  185. package/dist/client/internal/protocols/Protocol.js.map +0 -1
  186. package/dist/client/internal/protocols/Shared.d.ts.map +0 -1
  187. package/dist/client/internal/protocols/Shared.js.map +0 -1
  188. package/dist/client/internal/protocols/X402.d.ts.map +0 -1
  189. package/dist/client/internal/protocols/X402.js.map +0 -1
  190. package/dist/client/node.d.ts.map +0 -1
  191. package/dist/client/node.js.map +0 -1
  192. package/dist/discovery/Discovery.d.ts.map +0 -1
  193. package/dist/discovery/Discovery.js.map +0 -1
  194. package/dist/discovery/OpenApi.d.ts.map +0 -1
  195. package/dist/discovery/OpenApi.js.map +0 -1
  196. package/dist/discovery/Validate.d.ts.map +0 -1
  197. package/dist/discovery/Validate.js.map +0 -1
  198. package/dist/discovery/index.d.ts.map +0 -1
  199. package/dist/discovery/index.js.map +0 -1
  200. package/dist/discovery/internal/Metadata.d.ts.map +0 -1
  201. package/dist/discovery/internal/Metadata.js.map +0 -1
  202. package/dist/evm/Assets.d.ts.map +0 -1
  203. package/dist/evm/Assets.js.map +0 -1
  204. package/dist/evm/Chains.d.ts.map +0 -1
  205. package/dist/evm/Chains.js.map +0 -1
  206. package/dist/evm/Methods.d.ts.map +0 -1
  207. package/dist/evm/Methods.js.map +0 -1
  208. package/dist/evm/Types.d.ts.map +0 -1
  209. package/dist/evm/Types.js.map +0 -1
  210. package/dist/evm/client/Charge.d.ts.map +0 -1
  211. package/dist/evm/client/Charge.js.map +0 -1
  212. package/dist/evm/client/Methods.d.ts.map +0 -1
  213. package/dist/evm/client/Methods.js.map +0 -1
  214. package/dist/evm/client/index.d.ts.map +0 -1
  215. package/dist/evm/client/index.js.map +0 -1
  216. package/dist/evm/index.d.ts.map +0 -1
  217. package/dist/evm/index.js.map +0 -1
  218. package/dist/evm/server/Charge.d.ts.map +0 -1
  219. package/dist/evm/server/Charge.js.map +0 -1
  220. package/dist/evm/server/Methods.d.ts.map +0 -1
  221. package/dist/evm/server/Methods.js.map +0 -1
  222. package/dist/evm/server/index.d.ts.map +0 -1
  223. package/dist/evm/server/index.js.map +0 -1
  224. package/dist/index.d.ts.map +0 -1
  225. package/dist/index.js.map +0 -1
  226. package/dist/internal/AcceptPayment.d.ts.map +0 -1
  227. package/dist/internal/AcceptPayment.js.map +0 -1
  228. package/dist/internal/HeaderCodec.d.ts.map +0 -1
  229. package/dist/internal/HeaderCodec.js.map +0 -1
  230. package/dist/internal/constantTimeEqual.d.ts.map +0 -1
  231. package/dist/internal/constantTimeEqual.js.map +0 -1
  232. package/dist/internal/env.d.ts.map +0 -1
  233. package/dist/internal/env.js.map +0 -1
  234. package/dist/internal/types.d.ts.map +0 -1
  235. package/dist/internal/types.js.map +0 -1
  236. package/dist/mcp/client/McpClient.d.ts.map +0 -1
  237. package/dist/mcp/client/McpClient.js.map +0 -1
  238. package/dist/mcp/client/index.d.ts.map +0 -1
  239. package/dist/mcp/client/index.js.map +0 -1
  240. package/dist/mcp/server/Transport.d.ts.map +0 -1
  241. package/dist/mcp/server/Transport.js.map +0 -1
  242. package/dist/mcp/server/index.d.ts.map +0 -1
  243. package/dist/mcp/server/index.js.map +0 -1
  244. package/dist/middlewares/elysia.d.ts.map +0 -1
  245. package/dist/middlewares/elysia.js.map +0 -1
  246. package/dist/middlewares/express.d.ts.map +0 -1
  247. package/dist/middlewares/express.js.map +0 -1
  248. package/dist/middlewares/hono.d.ts.map +0 -1
  249. package/dist/middlewares/hono.js.map +0 -1
  250. package/dist/middlewares/internal/mppx.d.ts.map +0 -1
  251. package/dist/middlewares/internal/mppx.js.map +0 -1
  252. package/dist/middlewares/nextjs.d.ts.map +0 -1
  253. package/dist/middlewares/nextjs.js.map +0 -1
  254. package/dist/proxy/Proxy.d.ts.map +0 -1
  255. package/dist/proxy/Proxy.js.map +0 -1
  256. package/dist/proxy/Service.d.ts.map +0 -1
  257. package/dist/proxy/Service.js.map +0 -1
  258. package/dist/proxy/index.d.ts.map +0 -1
  259. package/dist/proxy/index.js.map +0 -1
  260. package/dist/proxy/internal/Headers.d.ts.map +0 -1
  261. package/dist/proxy/internal/Headers.js.map +0 -1
  262. package/dist/proxy/internal/Route.d.ts.map +0 -1
  263. package/dist/proxy/internal/Route.js.map +0 -1
  264. package/dist/proxy/services/anthropic.d.ts.map +0 -1
  265. package/dist/proxy/services/anthropic.js.map +0 -1
  266. package/dist/proxy/services/openai.d.ts.map +0 -1
  267. package/dist/proxy/services/openai.js.map +0 -1
  268. package/dist/proxy/services/stripe.d.ts.map +0 -1
  269. package/dist/proxy/services/stripe.js.map +0 -1
  270. package/dist/server/Methods.d.ts.map +0 -1
  271. package/dist/server/Methods.js.map +0 -1
  272. package/dist/server/Mppx.d.ts.map +0 -1
  273. package/dist/server/Mppx.js.map +0 -1
  274. package/dist/server/NodeListener.d.ts.map +0 -1
  275. package/dist/server/NodeListener.js.map +0 -1
  276. package/dist/server/Request.d.ts.map +0 -1
  277. package/dist/server/Request.js.map +0 -1
  278. package/dist/server/Response.d.ts.map +0 -1
  279. package/dist/server/Response.js.map +0 -1
  280. package/dist/server/Transport.d.ts.map +0 -1
  281. package/dist/server/Transport.js.map +0 -1
  282. package/dist/server/index.d.ts.map +0 -1
  283. package/dist/server/index.js.map +0 -1
  284. package/dist/server/internal/html/compose.main.gen.d.ts.map +0 -1
  285. package/dist/server/internal/html/compose.main.gen.js.map +0 -1
  286. package/dist/server/internal/html/config.d.ts.map +0 -1
  287. package/dist/server/internal/html/config.js.map +0 -1
  288. package/dist/server/internal/html/constants.d.ts.map +0 -1
  289. package/dist/server/internal/html/constants.js.map +0 -1
  290. package/dist/server/internal/html/serviceWorker.client.d.ts.map +0 -1
  291. package/dist/server/internal/html/serviceWorker.client.js.map +0 -1
  292. package/dist/server/internal/html/serviceWorker.gen.d.ts.map +0 -1
  293. package/dist/server/internal/html/serviceWorker.gen.js.map +0 -1
  294. package/dist/server/internal/scope.d.ts.map +0 -1
  295. package/dist/server/internal/scope.js.map +0 -1
  296. package/dist/stripe/Methods.d.ts.map +0 -1
  297. package/dist/stripe/Methods.js.map +0 -1
  298. package/dist/stripe/client/Charge.d.ts.map +0 -1
  299. package/dist/stripe/client/Charge.js.map +0 -1
  300. package/dist/stripe/client/Methods.d.ts.map +0 -1
  301. package/dist/stripe/client/Methods.js.map +0 -1
  302. package/dist/stripe/client/index.d.ts.map +0 -1
  303. package/dist/stripe/client/index.js.map +0 -1
  304. package/dist/stripe/index.d.ts.map +0 -1
  305. package/dist/stripe/index.js.map +0 -1
  306. package/dist/stripe/internal/constants.d.ts.map +0 -1
  307. package/dist/stripe/internal/constants.js.map +0 -1
  308. package/dist/stripe/internal/types.d.ts.map +0 -1
  309. package/dist/stripe/internal/types.js.map +0 -1
  310. package/dist/stripe/server/Charge.d.ts.map +0 -1
  311. package/dist/stripe/server/Charge.js.map +0 -1
  312. package/dist/stripe/server/Methods.d.ts.map +0 -1
  313. package/dist/stripe/server/Methods.js.map +0 -1
  314. package/dist/stripe/server/index.d.ts.map +0 -1
  315. package/dist/stripe/server/index.js.map +0 -1
  316. package/dist/stripe/server/internal/deposit-address.d.ts.map +0 -1
  317. package/dist/stripe/server/internal/deposit-address.js.map +0 -1
  318. package/dist/stripe/server/internal/html/types.d.ts.map +0 -1
  319. package/dist/stripe/server/internal/html/types.js.map +0 -1
  320. package/dist/stripe/server/internal/html.gen.d.ts.map +0 -1
  321. package/dist/stripe/server/internal/html.gen.js.map +0 -1
  322. package/dist/stripe/server/internal/record-payment.d.ts.map +0 -1
  323. package/dist/stripe/server/internal/record-payment.js.map +0 -1
  324. package/dist/stripe/server/internal/request.d.ts.map +0 -1
  325. package/dist/stripe/server/internal/request.js.map +0 -1
  326. package/dist/tap/Constants.d.ts.map +0 -1
  327. package/dist/tap/Constants.js.map +0 -1
  328. package/dist/tap/Types.d.ts.map +0 -1
  329. package/dist/tap/Types.js.map +0 -1
  330. package/dist/tap/client/index.d.ts.map +0 -1
  331. package/dist/tap/client/index.js.map +0 -1
  332. package/dist/tap/index.d.ts.map +0 -1
  333. package/dist/tap/index.js.map +0 -1
  334. package/dist/tap/server/index.d.ts.map +0 -1
  335. package/dist/tap/server/index.js.map +0 -1
  336. package/dist/tempo/Attribution.d.ts.map +0 -1
  337. package/dist/tempo/Attribution.js.map +0 -1
  338. package/dist/tempo/Methods.d.ts.map +0 -1
  339. package/dist/tempo/Methods.js.map +0 -1
  340. package/dist/tempo/Proof.d.ts.map +0 -1
  341. package/dist/tempo/Proof.js.map +0 -1
  342. package/dist/tempo/client/Charge.d.ts.map +0 -1
  343. package/dist/tempo/client/Charge.js.map +0 -1
  344. package/dist/tempo/client/Methods.d.ts.map +0 -1
  345. package/dist/tempo/client/Methods.js.map +0 -1
  346. package/dist/tempo/client/ResolveAccount.d.ts.map +0 -1
  347. package/dist/tempo/client/ResolveAccount.js.map +0 -1
  348. package/dist/tempo/client/Subscription.d.ts.map +0 -1
  349. package/dist/tempo/client/Subscription.js.map +0 -1
  350. package/dist/tempo/client/index.d.ts.map +0 -1
  351. package/dist/tempo/client/index.js.map +0 -1
  352. package/dist/tempo/index.d.ts.map +0 -1
  353. package/dist/tempo/index.js.map +0 -1
  354. package/dist/tempo/internal/account.d.ts.map +0 -1
  355. package/dist/tempo/internal/account.js.map +0 -1
  356. package/dist/tempo/internal/address.d.ts.map +0 -1
  357. package/dist/tempo/internal/address.js.map +0 -1
  358. package/dist/tempo/internal/auto-swap.d.ts.map +0 -1
  359. package/dist/tempo/internal/auto-swap.js.map +0 -1
  360. package/dist/tempo/internal/charge.d.ts.map +0 -1
  361. package/dist/tempo/internal/charge.js.map +0 -1
  362. package/dist/tempo/internal/defaults.d.ts.map +0 -1
  363. package/dist/tempo/internal/defaults.js.map +0 -1
  364. package/dist/tempo/internal/fee-payer.d.ts.map +0 -1
  365. package/dist/tempo/internal/fee-payer.js.map +0 -1
  366. package/dist/tempo/internal/fee-token.d.ts.map +0 -1
  367. package/dist/tempo/internal/fee-token.js.map +0 -1
  368. package/dist/tempo/internal/proof.d.ts.map +0 -1
  369. package/dist/tempo/internal/proof.js.map +0 -1
  370. package/dist/tempo/internal/selectors.d.ts.map +0 -1
  371. package/dist/tempo/internal/selectors.js.map +0 -1
  372. package/dist/tempo/internal/types.d.ts.map +0 -1
  373. package/dist/tempo/internal/types.js.map +0 -1
  374. package/dist/tempo/legacy/client/ChannelOps.d.ts.map +0 -1
  375. package/dist/tempo/legacy/client/ChannelOps.js.map +0 -1
  376. package/dist/tempo/legacy/client/Session.d.ts.map +0 -1
  377. package/dist/tempo/legacy/client/Session.js.map +0 -1
  378. package/dist/tempo/legacy/client/SessionManager.d.ts.map +0 -1
  379. package/dist/tempo/legacy/client/SessionManager.js.map +0 -1
  380. package/dist/tempo/legacy/client/index.d.ts.map +0 -1
  381. package/dist/tempo/legacy/client/index.js.map +0 -1
  382. package/dist/tempo/legacy/index.d.ts.map +0 -1
  383. package/dist/tempo/legacy/index.js.map +0 -1
  384. package/dist/tempo/legacy/session/Chain.d.ts.map +0 -1
  385. package/dist/tempo/legacy/session/Chain.js.map +0 -1
  386. package/dist/tempo/legacy/session/Channel.d.ts.map +0 -1
  387. package/dist/tempo/legacy/session/Channel.js.map +0 -1
  388. package/dist/tempo/legacy/session/Types.d.ts.map +0 -1
  389. package/dist/tempo/legacy/session/Types.js.map +0 -1
  390. package/dist/tempo/legacy/session/Voucher.d.ts.map +0 -1
  391. package/dist/tempo/legacy/session/Voucher.js.map +0 -1
  392. package/dist/tempo/legacy/session/escrow.abi.d.ts.map +0 -1
  393. package/dist/tempo/legacy/session/escrow.abi.js.map +0 -1
  394. package/dist/tempo/legacy/session/index.d.ts.map +0 -1
  395. package/dist/tempo/legacy/session/index.js.map +0 -1
  396. package/dist/tempo/server/Charge.d.ts.map +0 -1
  397. package/dist/tempo/server/Charge.js.map +0 -1
  398. package/dist/tempo/server/Methods.d.ts.map +0 -1
  399. package/dist/tempo/server/Methods.js.map +0 -1
  400. package/dist/tempo/server/Relay.d.ts.map +0 -1
  401. package/dist/tempo/server/Relay.js.map +0 -1
  402. package/dist/tempo/server/SponsorBudget.d.ts.map +0 -1
  403. package/dist/tempo/server/SponsorBudget.js.map +0 -1
  404. package/dist/tempo/server/Subscription.d.ts.map +0 -1
  405. package/dist/tempo/server/Subscription.js.map +0 -1
  406. package/dist/tempo/server/index.d.ts.map +0 -1
  407. package/dist/tempo/server/index.js.map +0 -1
  408. package/dist/tempo/server/internal/html.gen.d.ts.map +0 -1
  409. package/dist/tempo/server/internal/html.gen.js.map +0 -1
  410. package/dist/tempo/server/internal/request-body.d.ts.map +0 -1
  411. package/dist/tempo/server/internal/request-body.js.map +0 -1
  412. package/dist/tempo/server/internal/transport.d.ts.map +0 -1
  413. package/dist/tempo/server/internal/transport.js.map +0 -1
  414. package/dist/tempo/session/Snapshot.d.ts.map +0 -1
  415. package/dist/tempo/session/Snapshot.js.map +0 -1
  416. package/dist/tempo/session/client/ChannelOps.d.ts.map +0 -1
  417. package/dist/tempo/session/client/ChannelOps.js.map +0 -1
  418. package/dist/tempo/session/client/ChannelStore.d.ts.map +0 -1
  419. package/dist/tempo/session/client/ChannelStore.js.map +0 -1
  420. package/dist/tempo/session/client/CredentialState.d.ts.map +0 -1
  421. package/dist/tempo/session/client/CredentialState.js.map +0 -1
  422. package/dist/tempo/session/client/ReceiptCoordinator.d.ts.map +0 -1
  423. package/dist/tempo/session/client/ReceiptCoordinator.js.map +0 -1
  424. package/dist/tempo/session/client/Runtime.d.ts.map +0 -1
  425. package/dist/tempo/session/client/Runtime.js.map +0 -1
  426. package/dist/tempo/session/client/Session.d.ts.map +0 -1
  427. package/dist/tempo/session/client/Session.js.map +0 -1
  428. package/dist/tempo/session/client/SessionManager.d.ts.map +0 -1
  429. package/dist/tempo/session/client/SessionManager.js.map +0 -1
  430. package/dist/tempo/session/client/Transports.d.ts.map +0 -1
  431. package/dist/tempo/session/client/Transports.js.map +0 -1
  432. package/dist/tempo/session/client/index.d.ts.map +0 -1
  433. package/dist/tempo/session/client/index.js.map +0 -1
  434. package/dist/tempo/session/client/internal/SessionManager.d.ts.map +0 -1
  435. package/dist/tempo/session/client/internal/SessionManager.js.map +0 -1
  436. package/dist/tempo/session/index.d.ts.map +0 -1
  437. package/dist/tempo/session/index.js.map +0 -1
  438. package/dist/tempo/session/precompile/Chain.d.ts.map +0 -1
  439. package/dist/tempo/session/precompile/Chain.js.map +0 -1
  440. package/dist/tempo/session/precompile/Channel.d.ts.map +0 -1
  441. package/dist/tempo/session/precompile/Channel.js.map +0 -1
  442. package/dist/tempo/session/precompile/Protocol.d.ts.map +0 -1
  443. package/dist/tempo/session/precompile/Protocol.js.map +0 -1
  444. package/dist/tempo/session/precompile/Voucher.d.ts.map +0 -1
  445. package/dist/tempo/session/precompile/Voucher.js.map +0 -1
  446. package/dist/tempo/session/precompile/escrow.abi.d.ts.map +0 -1
  447. package/dist/tempo/session/precompile/escrow.abi.js.map +0 -1
  448. package/dist/tempo/session/precompile/index.d.ts.map +0 -1
  449. package/dist/tempo/session/precompile/index.js.map +0 -1
  450. package/dist/tempo/session/server/ChannelOps.d.ts.map +0 -1
  451. package/dist/tempo/session/server/ChannelOps.js.map +0 -1
  452. package/dist/tempo/session/server/ChannelStore.d.ts.map +0 -1
  453. package/dist/tempo/session/server/ChannelStore.js.map +0 -1
  454. package/dist/tempo/session/server/CredentialVerification.d.ts.map +0 -1
  455. package/dist/tempo/session/server/CredentialVerification.js.map +0 -1
  456. package/dist/tempo/session/server/MeteredStream.d.ts.map +0 -1
  457. package/dist/tempo/session/server/MeteredStream.js.map +0 -1
  458. package/dist/tempo/session/server/RequestState.d.ts.map +0 -1
  459. package/dist/tempo/session/server/RequestState.js.map +0 -1
  460. package/dist/tempo/session/server/Session.d.ts.map +0 -1
  461. package/dist/tempo/session/server/Session.js.map +0 -1
  462. package/dist/tempo/session/server/Settlement.d.ts.map +0 -1
  463. package/dist/tempo/session/server/Settlement.js.map +0 -1
  464. package/dist/tempo/session/server/Sse.d.ts.map +0 -1
  465. package/dist/tempo/session/server/Sse.js.map +0 -1
  466. package/dist/tempo/session/server/Transports.d.ts.map +0 -1
  467. package/dist/tempo/session/server/Transports.js.map +0 -1
  468. package/dist/tempo/session/server/Ws.d.ts.map +0 -1
  469. package/dist/tempo/session/server/Ws.js.map +0 -1
  470. package/dist/tempo/session/server/index.d.ts.map +0 -1
  471. package/dist/tempo/session/server/index.js.map +0 -1
  472. package/dist/tempo/subscription/KeyAuthorization.d.ts.map +0 -1
  473. package/dist/tempo/subscription/KeyAuthorization.js.map +0 -1
  474. package/dist/tempo/subscription/Receipt.d.ts.map +0 -1
  475. package/dist/tempo/subscription/Receipt.js.map +0 -1
  476. package/dist/tempo/subscription/Store.d.ts.map +0 -1
  477. package/dist/tempo/subscription/Store.js.map +0 -1
  478. package/dist/tempo/subscription/Types.d.ts.map +0 -1
  479. package/dist/tempo/subscription/Types.js.map +0 -1
  480. package/dist/tempo/subscription/index.d.ts.map +0 -1
  481. package/dist/tempo/subscription/index.js.map +0 -1
  482. package/dist/validation/core.d.ts.map +0 -1
  483. package/dist/validation/core.js.map +0 -1
  484. package/dist/validation/index.d.ts.map +0 -1
  485. package/dist/validation/index.js.map +0 -1
  486. package/dist/viem/Account.d.ts.map +0 -1
  487. package/dist/viem/Account.js.map +0 -1
  488. package/dist/viem/Client.d.ts.map +0 -1
  489. package/dist/viem/Client.js.map +0 -1
  490. package/dist/web-bot-auth/Constants.d.ts.map +0 -1
  491. package/dist/web-bot-auth/Constants.js.map +0 -1
  492. package/dist/web-bot-auth/Types.d.ts.map +0 -1
  493. package/dist/web-bot-auth/Types.js.map +0 -1
  494. package/dist/web-bot-auth/client/index.d.ts.map +0 -1
  495. package/dist/web-bot-auth/client/index.js.map +0 -1
  496. package/dist/web-bot-auth/index.d.ts.map +0 -1
  497. package/dist/web-bot-auth/index.js.map +0 -1
  498. package/dist/web-bot-auth/internal/JwkThumbprint.d.ts.map +0 -1
  499. package/dist/web-bot-auth/internal/JwkThumbprint.js.map +0 -1
  500. package/dist/web-bot-auth/internal/SignatureAgent.d.ts.map +0 -1
  501. package/dist/web-bot-auth/internal/SignatureAgent.js.map +0 -1
  502. package/dist/web-bot-auth/server/index.d.ts.map +0 -1
  503. package/dist/web-bot-auth/server/index.js.map +0 -1
  504. package/dist/x402/Assets.d.ts.map +0 -1
  505. package/dist/x402/Assets.js.map +0 -1
  506. package/dist/x402/Header.d.ts.map +0 -1
  507. package/dist/x402/Header.js.map +0 -1
  508. package/dist/x402/Types.d.ts.map +0 -1
  509. package/dist/x402/Types.js.map +0 -1
  510. package/dist/x402/client/Exact.d.ts.map +0 -1
  511. package/dist/x402/client/Exact.js.map +0 -1
  512. package/dist/x402/index.d.ts.map +0 -1
  513. package/dist/x402/index.js.map +0 -1
  514. package/dist/x402/internal/ChallengeBrand.d.ts.map +0 -1
  515. package/dist/x402/internal/ChallengeBrand.js.map +0 -1
  516. package/dist/x402/internal/RouteBinding.d.ts.map +0 -1
  517. package/dist/x402/internal/RouteBinding.js.map +0 -1
  518. package/dist/x402/server/EvmCharge.d.ts.map +0 -1
  519. package/dist/x402/server/EvmCharge.js.map +0 -1
  520. package/dist/x402/server/Facilitator.d.ts.map +0 -1
  521. package/dist/x402/server/Facilitator.js.map +0 -1
  522. package/dist/zod.d.ts.map +0 -1
  523. package/dist/zod.js.map +0 -1
  524. package/src/BodyDigest.test.ts +0 -43
  525. package/src/BodyDigest.ts +0 -55
  526. package/src/Challenge.fuzz.test.ts +0 -154
  527. package/src/Challenge.test-d.ts +0 -82
  528. package/src/Challenge.test.ts +0 -1060
  529. package/src/Challenge.ts +0 -687
  530. package/src/Constants.ts +0 -58
  531. package/src/Credential.fuzz.test.ts +0 -62
  532. package/src/Credential.test.ts +0 -378
  533. package/src/Credential.ts +0 -217
  534. package/src/Errors.test.ts +0 -520
  535. package/src/Errors.ts +0 -448
  536. package/src/Expires.test.ts +0 -112
  537. package/src/Expires.ts +0 -59
  538. package/src/Html.ts +0 -67
  539. package/src/Mcp.ts +0 -85
  540. package/src/Method.test.ts +0 -177
  541. package/src/Method.ts +0 -631
  542. package/src/PaymentRequest.test.ts +0 -147
  543. package/src/PaymentRequest.ts +0 -108
  544. package/src/Receipt.test.ts +0 -151
  545. package/src/Receipt.ts +0 -146
  546. package/src/Store.test-d.ts +0 -211
  547. package/src/Store.test.ts +0 -407
  548. package/src/Store.ts +0 -397
  549. package/src/attestation/Attestation.integration.test.ts +0 -208
  550. package/src/attestation/Client.test.ts +0 -83
  551. package/src/attestation/Client.ts +0 -34
  552. package/src/attestation/Constants.ts +0 -15
  553. package/src/attestation/Server.test.ts +0 -60
  554. package/src/attestation/Server.ts +0 -12
  555. package/src/attestation/Types.test-d.ts +0 -54
  556. package/src/attestation/Types.ts +0 -77
  557. package/src/attestation/index.ts +0 -5
  558. package/src/attestation/internal/HttpMessageSignature.test.ts +0 -101
  559. package/src/attestation/internal/HttpMessageSignature.ts +0 -429
  560. package/src/attestation/internal/SigningContext.ts +0 -13
  561. package/src/bin.js +0 -2
  562. package/src/bin.ts +0 -4
  563. package/src/cli/account.ts +0 -269
  564. package/src/cli/cli.test.ts +0 -2221
  565. package/src/cli/cli.ts +0 -1650
  566. package/src/cli/config.test.ts +0 -89
  567. package/src/cli/config.ts +0 -50
  568. package/src/cli/internal.ts +0 -114
  569. package/src/cli/mcp.test.ts +0 -262
  570. package/src/cli/plugins/evm.ts +0 -55
  571. package/src/cli/plugins/index.ts +0 -4
  572. package/src/cli/plugins/plugin.ts +0 -84
  573. package/src/cli/plugins/stripe.ts +0 -174
  574. package/src/cli/plugins/tempo.ts +0 -1102
  575. package/src/cli/sessions/Manager.test.ts +0 -249
  576. package/src/cli/sessions/Manager.ts +0 -93
  577. package/src/cli/sessions/commands.ts +0 -444
  578. package/src/cli/sessions/request.test.ts +0 -51
  579. package/src/cli/sessions/request.ts +0 -353
  580. package/src/cli/sessions/store.test.ts +0 -581
  581. package/src/cli/sessions/store.ts +0 -940
  582. package/src/cli/utils.test.ts +0 -156
  583. package/src/cli/utils.ts +0 -394
  584. package/src/cli/validate/challenge.ts +0 -565
  585. package/src/cli/validate/discovery.test.ts +0 -435
  586. package/src/cli/validate/discovery.ts +0 -221
  587. package/src/cli/validate/helpers.ts +0 -166
  588. package/src/cli/validate/index.ts +0 -229
  589. package/src/cli/validate/messages.ts +0 -7
  590. package/src/cli/validate/payment.ts +0 -774
  591. package/src/cli/validate.test.ts +0 -843
  592. package/src/client/Methods.ts +0 -8
  593. package/src/client/Mppx.test-d.ts +0 -287
  594. package/src/client/Mppx.test.ts +0 -1065
  595. package/src/client/Mppx.ts +0 -487
  596. package/src/client/Transport.test.ts +0 -586
  597. package/src/client/Transport.ts +0 -170
  598. package/src/client/index.ts +0 -29
  599. package/src/client/internal/Fetch.browser.test.ts +0 -197
  600. package/src/client/internal/Fetch.test-d.ts +0 -109
  601. package/src/client/internal/Fetch.test.ts +0 -2336
  602. package/src/client/internal/Fetch.ts +0 -1075
  603. package/src/client/internal/MethodChallenge.ts +0 -35
  604. package/src/client/internal/MethodResponse.ts +0 -67
  605. package/src/client/internal/protocols/Mcp.test.ts +0 -220
  606. package/src/client/internal/protocols/Mcp.ts +0 -186
  607. package/src/client/internal/protocols/Mpp.ts +0 -21
  608. package/src/client/internal/protocols/Protocol.ts +0 -10
  609. package/src/client/internal/protocols/Shared.ts +0 -25
  610. package/src/client/internal/protocols/X402.ts +0 -46
  611. package/src/client/node.test.ts +0 -115
  612. package/src/client/node.ts +0 -247
  613. package/src/discovery/Discovery.test.ts +0 -214
  614. package/src/discovery/Discovery.ts +0 -105
  615. package/src/discovery/OpenApi.test.ts +0 -623
  616. package/src/discovery/OpenApi.ts +0 -192
  617. package/src/discovery/Validate.test.ts +0 -305
  618. package/src/discovery/Validate.ts +0 -77
  619. package/src/discovery/index.ts +0 -3
  620. package/src/discovery/internal/Metadata.ts +0 -51
  621. package/src/env.d.ts +0 -12
  622. package/src/evm/Assets.ts +0 -1
  623. package/src/evm/Chains.ts +0 -11
  624. package/src/evm/Methods.ts +0 -44
  625. package/src/evm/PublicInterface.test-d.ts +0 -134
  626. package/src/evm/Types.ts +0 -140
  627. package/src/evm/client/Charge.test.ts +0 -347
  628. package/src/evm/client/Charge.ts +0 -187
  629. package/src/evm/client/Methods.ts +0 -19
  630. package/src/evm/client/index.ts +0 -6
  631. package/src/evm/index.ts +0 -16
  632. package/src/evm/server/Charge.test.ts +0 -339
  633. package/src/evm/server/Charge.ts +0 -295
  634. package/src/evm/server/Methods.ts +0 -22
  635. package/src/evm/server/index.ts +0 -6
  636. package/src/index.ts +0 -14
  637. package/src/internal/AcceptPayment.test.ts +0 -347
  638. package/src/internal/AcceptPayment.ts +0 -366
  639. package/src/internal/HeaderCodec.ts +0 -36
  640. package/src/internal/changeset.test.ts +0 -106
  641. package/src/internal/constantTimeEqual.test.ts +0 -47
  642. package/src/internal/constantTimeEqual.ts +0 -10
  643. package/src/internal/env.test.ts +0 -42
  644. package/src/internal/env.ts +0 -49
  645. package/src/internal/types.test-d.ts +0 -21
  646. package/src/internal/types.ts +0 -479
  647. package/src/mcp/client/McpClient.integration.test.ts +0 -639
  648. package/src/mcp/client/McpClient.test-d.ts +0 -144
  649. package/src/mcp/client/McpClient.test.ts +0 -463
  650. package/src/mcp/client/McpClient.ts +0 -307
  651. package/src/mcp/client/McpClient.unit.test.ts +0 -135
  652. package/src/mcp/client/index.ts +0 -2
  653. package/src/mcp/server/Transport.test.ts +0 -191
  654. package/src/mcp/server/Transport.ts +0 -111
  655. package/src/mcp/server/index.ts +0 -1
  656. package/src/middlewares/elysia.test.ts +0 -285
  657. package/src/middlewares/elysia.ts +0 -116
  658. package/src/middlewares/express.test.ts +0 -361
  659. package/src/middlewares/express.ts +0 -140
  660. package/src/middlewares/hono.test.ts +0 -473
  661. package/src/middlewares/hono.ts +0 -153
  662. package/src/middlewares/internal/mppx.test.ts +0 -177
  663. package/src/middlewares/internal/mppx.ts +0 -67
  664. package/src/middlewares/nextjs.test.ts +0 -359
  665. package/src/middlewares/nextjs.ts +0 -107
  666. package/src/proxy/Proxy.test.ts +0 -1038
  667. package/src/proxy/Proxy.ts +0 -483
  668. package/src/proxy/Proxy.upstreamError.test.ts +0 -364
  669. package/src/proxy/Service.test.ts +0 -252
  670. package/src/proxy/Service.ts +0 -280
  671. package/src/proxy/index.ts +0 -6
  672. package/src/proxy/internal/Headers.test.ts +0 -139
  673. package/src/proxy/internal/Headers.ts +0 -66
  674. package/src/proxy/internal/Route.test.ts +0 -217
  675. package/src/proxy/internal/Route.ts +0 -64
  676. package/src/proxy/services/anthropic.test.ts +0 -132
  677. package/src/proxy/services/anthropic.ts +0 -53
  678. package/src/proxy/services/hooks.test-d.ts +0 -14
  679. package/src/proxy/services/hooks.test.ts +0 -44
  680. package/src/proxy/services/openai.test.ts +0 -157
  681. package/src/proxy/services/openai.ts +0 -60
  682. package/src/proxy/services/stripe.test.ts +0 -175
  683. package/src/proxy/services/stripe.ts +0 -59
  684. package/src/server/Methods.test-d.ts +0 -88
  685. package/src/server/Methods.test.ts +0 -69
  686. package/src/server/Methods.ts +0 -3
  687. package/src/server/Mppx.authorize.test.ts +0 -210
  688. package/src/server/Mppx.test-d.ts +0 -494
  689. package/src/server/Mppx.test.ts +0 -6711
  690. package/src/server/Mppx.ts +0 -2919
  691. package/src/server/NodeListener.test.ts +0 -293
  692. package/src/server/NodeListener.ts +0 -45
  693. package/src/server/Request.test.ts +0 -255
  694. package/src/server/Request.ts +0 -155
  695. package/src/server/Response.test.ts +0 -32
  696. package/src/server/Response.ts +0 -45
  697. package/src/server/Transport.test.ts +0 -598
  698. package/src/server/Transport.ts +0 -320
  699. package/src/server/index.ts +0 -9
  700. package/src/server/internal/html/compose.main.gen.ts +0 -2
  701. package/src/server/internal/html/compose.main.ts +0 -88
  702. package/src/server/internal/html/config.ts +0 -672
  703. package/src/server/internal/html/constants.ts +0 -28
  704. package/src/server/internal/html/serviceWorker.client.ts +0 -28
  705. package/src/server/internal/html/serviceWorker.gen.ts +0 -2
  706. package/src/server/internal/html/serviceWorker.ts +0 -27
  707. package/src/server/internal/html/tsconfig.compose.json +0 -8
  708. package/src/server/internal/html/tsconfig.worker.client.json +0 -8
  709. package/src/server/internal/html/tsconfig.worker.json +0 -8
  710. package/src/server/internal/scope.ts +0 -43
  711. package/src/stripe/Charge.integration.test.ts +0 -329
  712. package/src/stripe/Methods.test.ts +0 -62
  713. package/src/stripe/Methods.ts +0 -44
  714. package/src/stripe/client/Charge.test.ts +0 -205
  715. package/src/stripe/client/Charge.ts +0 -132
  716. package/src/stripe/client/Methods.ts +0 -37
  717. package/src/stripe/client/index.ts +0 -2
  718. package/src/stripe/index.ts +0 -1
  719. package/src/stripe/internal/constants.ts +0 -7
  720. package/src/stripe/internal/types.ts +0 -47
  721. package/src/stripe/server/Charge.test-d.ts +0 -81
  722. package/src/stripe/server/Charge.test.ts +0 -700
  723. package/src/stripe/server/Charge.ts +0 -487
  724. package/src/stripe/server/Methods.test-d.ts +0 -157
  725. package/src/stripe/server/Methods.test.ts +0 -403
  726. package/src/stripe/server/Methods.ts +0 -441
  727. package/src/stripe/server/index.ts +0 -2
  728. package/src/stripe/server/internal/deposit-address.ts +0 -57
  729. package/src/stripe/server/internal/html/main.ts +0 -165
  730. package/src/stripe/server/internal/html/node_modules/.bin/mppx +0 -22
  731. package/src/stripe/server/internal/html/node_modules/.bin/mppx.src +0 -22
  732. package/src/stripe/server/internal/html/package.json +0 -9
  733. package/src/stripe/server/internal/html/stripe-js-pure.d.ts +0 -7
  734. package/src/stripe/server/internal/html/tsconfig.json +0 -8
  735. package/src/stripe/server/internal/html/types.ts +0 -5
  736. package/src/stripe/server/internal/html.gen.ts +0 -2
  737. package/src/stripe/server/internal/record-payment.ts +0 -66
  738. package/src/stripe/server/internal/request.ts +0 -49
  739. package/src/tap/Constants.ts +0 -32
  740. package/src/tap/Tap.test.ts +0 -125
  741. package/src/tap/Types.ts +0 -11
  742. package/src/tap/client/index.ts +0 -54
  743. package/src/tap/index.ts +0 -4
  744. package/src/tap/server/index.ts +0 -48
  745. package/src/tempo/AccessKeyAuthorization.test.ts +0 -141
  746. package/src/tempo/Attribution.test.ts +0 -294
  747. package/src/tempo/Attribution.ts +0 -185
  748. package/src/tempo/Methods.test.ts +0 -425
  749. package/src/tempo/Methods.ts +0 -367
  750. package/src/tempo/Proof.conformance.test.ts +0 -146
  751. package/src/tempo/Proof.test-d.ts +0 -32
  752. package/src/tempo/Proof.test.ts +0 -40
  753. package/src/tempo/Proof.ts +0 -69
  754. package/src/tempo/PublicExports.test-d.ts +0 -130
  755. package/src/tempo/Subscription.integration.test.ts +0 -591
  756. package/src/tempo/client/Charge.test.ts +0 -501
  757. package/src/tempo/client/Charge.ts +0 -271
  758. package/src/tempo/client/Methods.ts +0 -45
  759. package/src/tempo/client/ResolveAccount.ts +0 -46
  760. package/src/tempo/client/Subscription.test.ts +0 -180
  761. package/src/tempo/client/Subscription.ts +0 -156
  762. package/src/tempo/client/index.ts +0 -17
  763. package/src/tempo/index.ts +0 -5
  764. package/src/tempo/internal/account.ts +0 -56
  765. package/src/tempo/internal/address.test.ts +0 -42
  766. package/src/tempo/internal/address.ts +0 -6
  767. package/src/tempo/internal/auto-swap.test.ts +0 -198
  768. package/src/tempo/internal/auto-swap.ts +0 -145
  769. package/src/tempo/internal/charge.test.ts +0 -66
  770. package/src/tempo/internal/charge.ts +0 -43
  771. package/src/tempo/internal/defaults.test.ts +0 -95
  772. package/src/tempo/internal/defaults.ts +0 -53
  773. package/src/tempo/internal/fee-payer.test.ts +0 -1177
  774. package/src/tempo/internal/fee-payer.ts +0 -808
  775. package/src/tempo/internal/fee-token.test.ts +0 -165
  776. package/src/tempo/internal/fee-token.ts +0 -72
  777. package/src/tempo/internal/proof.test.ts +0 -97
  778. package/src/tempo/internal/proof.ts +0 -87
  779. package/src/tempo/internal/selectors.ts +0 -10
  780. package/src/tempo/internal/types.ts +0 -19
  781. package/src/tempo/legacy/AccessKeyAuthorization.test.ts +0 -162
  782. package/src/tempo/legacy/README.md +0 -9
  783. package/src/tempo/legacy/client/ChannelOps.test.ts +0 -379
  784. package/src/tempo/legacy/client/ChannelOps.ts +0 -271
  785. package/src/tempo/legacy/client/Session.test.ts +0 -800
  786. package/src/tempo/legacy/client/Session.ts +0 -397
  787. package/src/tempo/legacy/client/SessionManager.test.ts +0 -468
  788. package/src/tempo/legacy/client/SessionManager.ts +0 -909
  789. package/src/tempo/legacy/client/index.ts +0 -6
  790. package/src/tempo/legacy/index.ts +0 -4
  791. package/src/tempo/legacy/session/Chain.test.ts +0 -1349
  792. package/src/tempo/legacy/session/Chain.ts +0 -830
  793. package/src/tempo/legacy/session/Channel.test.ts +0 -109
  794. package/src/tempo/legacy/session/Channel.ts +0 -51
  795. package/src/tempo/legacy/session/Types.ts +0 -91
  796. package/src/tempo/legacy/session/Voucher.test.ts +0 -410
  797. package/src/tempo/legacy/session/Voucher.ts +0 -183
  798. package/src/tempo/legacy/session/escrow.abi.ts +0 -760
  799. package/src/tempo/legacy/session/index.ts +0 -8
  800. package/src/tempo/server/AtomicStore.test-d.ts +0 -63
  801. package/src/tempo/server/Charge.test.ts +0 -6056
  802. package/src/tempo/server/Charge.ts +0 -1379
  803. package/src/tempo/server/Methods.ts +0 -86
  804. package/src/tempo/server/Relay.test.ts +0 -677
  805. package/src/tempo/server/Relay.ts +0 -297
  806. package/src/tempo/server/SponsorBudget.test.ts +0 -154
  807. package/src/tempo/server/SponsorBudget.ts +0 -219
  808. package/src/tempo/server/Sse.test.ts +0 -321
  809. package/src/tempo/server/Subscription.test.ts +0 -1944
  810. package/src/tempo/server/Subscription.ts +0 -1336
  811. package/src/tempo/server/index.ts +0 -12
  812. package/src/tempo/server/internal/html/main.ts +0 -115
  813. package/src/tempo/server/internal/html/node_modules/.bin/mppx +0 -22
  814. package/src/tempo/server/internal/html/node_modules/.bin/mppx.src +0 -22
  815. package/src/tempo/server/internal/html/package.json +0 -10
  816. package/src/tempo/server/internal/html/tsconfig.json +0 -8
  817. package/src/tempo/server/internal/html.gen.ts +0 -2
  818. package/src/tempo/server/internal/request-body.test.ts +0 -210
  819. package/src/tempo/server/internal/request-body.ts +0 -61
  820. package/src/tempo/server/internal/transport.test.ts +0 -922
  821. package/src/tempo/server/internal/transport.ts +0 -322
  822. package/src/tempo/session/README.md +0 -320
  823. package/src/tempo/session/Snapshot.test.ts +0 -41
  824. package/src/tempo/session/Snapshot.ts +0 -95
  825. package/src/tempo/session/client/ChannelOps.test.ts +0 -218
  826. package/src/tempo/session/client/ChannelOps.ts +0 -348
  827. package/src/tempo/session/client/ChannelStore.ts +0 -111
  828. package/src/tempo/session/client/CredentialState.test.ts +0 -789
  829. package/src/tempo/session/client/CredentialState.ts +0 -942
  830. package/src/tempo/session/client/ReceiptCoordinator.ts +0 -95
  831. package/src/tempo/session/client/Runtime.test.ts +0 -1104
  832. package/src/tempo/session/client/Runtime.ts +0 -1008
  833. package/src/tempo/session/client/Session.test.ts +0 -1355
  834. package/src/tempo/session/client/Session.ts +0 -420
  835. package/src/tempo/session/client/SessionManager.test.ts +0 -1899
  836. package/src/tempo/session/client/SessionManager.ts +0 -996
  837. package/src/tempo/session/client/Transports.test.ts +0 -1141
  838. package/src/tempo/session/client/Transports.ts +0 -1534
  839. package/src/tempo/session/client/index.ts +0 -40
  840. package/src/tempo/session/client/internal/SessionManager.ts +0 -36
  841. package/src/tempo/session/index.ts +0 -7
  842. package/src/tempo/session/precompile/Chain.integration.test.ts +0 -339
  843. package/src/tempo/session/precompile/Chain.test.ts +0 -1641
  844. package/src/tempo/session/precompile/Chain.ts +0 -1269
  845. package/src/tempo/session/precompile/Channel.test.ts +0 -147
  846. package/src/tempo/session/precompile/Channel.ts +0 -108
  847. package/src/tempo/session/precompile/Protocol.test.ts +0 -358
  848. package/src/tempo/session/precompile/Protocol.ts +0 -520
  849. package/src/tempo/session/precompile/Voucher.test.ts +0 -354
  850. package/src/tempo/session/precompile/Voucher.ts +0 -162
  851. package/src/tempo/session/precompile/escrow.abi.ts +0 -226
  852. package/src/tempo/session/precompile/index.ts +0 -33
  853. package/src/tempo/session/server/ChannelOps.test.ts +0 -129
  854. package/src/tempo/session/server/ChannelOps.ts +0 -157
  855. package/src/tempo/session/server/ChannelStore.test.ts +0 -1093
  856. package/src/tempo/session/server/ChannelStore.ts +0 -856
  857. package/src/tempo/session/server/CredentialVerification.test.ts +0 -299
  858. package/src/tempo/session/server/CredentialVerification.ts +0 -1087
  859. package/src/tempo/session/server/MeteredStream.ts +0 -99
  860. package/src/tempo/session/server/RequestState.test.ts +0 -574
  861. package/src/tempo/session/server/RequestState.ts +0 -507
  862. package/src/tempo/session/server/Session.integration.test.ts +0 -449
  863. package/src/tempo/session/server/Session.test.ts +0 -4247
  864. package/src/tempo/session/server/Session.ts +0 -669
  865. package/src/tempo/session/server/Settlement.test.ts +0 -345
  866. package/src/tempo/session/server/Settlement.ts +0 -527
  867. package/src/tempo/session/server/Sse.fuzz.test.ts +0 -138
  868. package/src/tempo/session/server/Sse.test.ts +0 -634
  869. package/src/tempo/session/server/Sse.ts +0 -261
  870. package/src/tempo/session/server/Transports.test.ts +0 -346
  871. package/src/tempo/session/server/Transports.ts +0 -256
  872. package/src/tempo/session/server/Ws.test.ts +0 -765
  873. package/src/tempo/session/server/Ws.ts +0 -391
  874. package/src/tempo/session/server/index.ts +0 -12
  875. package/src/tempo/subscription/KeyAuthorization.test.ts +0 -282
  876. package/src/tempo/subscription/KeyAuthorization.ts +0 -396
  877. package/src/tempo/subscription/Receipt.ts +0 -28
  878. package/src/tempo/subscription/Store.test.ts +0 -609
  879. package/src/tempo/subscription/Store.ts +0 -449
  880. package/src/tempo/subscription/Types.ts +0 -68
  881. package/src/tempo/subscription/index.ts +0 -23
  882. package/src/tsconfig.json +0 -10
  883. package/src/validation/core.ts +0 -386
  884. package/src/validation/index.ts +0 -11
  885. package/src/viem/Account.test.ts +0 -72
  886. package/src/viem/Account.ts +0 -30
  887. package/src/viem/Client.test.ts +0 -366
  888. package/src/viem/Client.ts +0 -93
  889. package/src/web-bot-auth/Constants.ts +0 -24
  890. package/src/web-bot-auth/Types.ts +0 -9
  891. package/src/web-bot-auth/WebBotAuth.test.ts +0 -182
  892. package/src/web-bot-auth/client/index.ts +0 -84
  893. package/src/web-bot-auth/index.ts +0 -6
  894. package/src/web-bot-auth/internal/JwkThumbprint.ts +0 -21
  895. package/src/web-bot-auth/internal/SignatureAgent.ts +0 -18
  896. package/src/web-bot-auth/server/index.ts +0 -113
  897. package/src/x402/Assets.test.ts +0 -253
  898. package/src/x402/Assets.ts +0 -221
  899. package/src/x402/Exact.e2e.test.ts +0 -488
  900. package/src/x402/Exact.localnet.test.ts +0 -475
  901. package/src/x402/Header.test.ts +0 -73
  902. package/src/x402/Header.ts +0 -79
  903. package/src/x402/PublicInterface.test-d.ts +0 -39
  904. package/src/x402/Types.ts +0 -248
  905. package/src/x402/client/Exact.test.ts +0 -309
  906. package/src/x402/client/Exact.ts +0 -186
  907. package/src/x402/index.ts +0 -6
  908. package/src/x402/internal/ChallengeBrand.ts +0 -14
  909. package/src/x402/internal/RouteBinding.ts +0 -18
  910. package/src/x402/server/EvmCharge.ts +0 -410
  911. package/src/x402/server/Facilitator.test.ts +0 -111
  912. package/src/x402/server/Facilitator.ts +0 -56
  913. package/src/zod.test.ts +0 -169
  914. 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
- }