mppx 0.6.30 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (483) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/Challenge.d.ts.map +1 -1
  3. package/dist/Challenge.js +9 -7
  4. package/dist/Challenge.js.map +1 -1
  5. package/dist/Constants.d.ts +46 -0
  6. package/dist/Constants.d.ts.map +1 -0
  7. package/dist/Constants.js +46 -0
  8. package/dist/Constants.js.map +1 -0
  9. package/dist/Credential.d.ts.map +1 -1
  10. package/dist/Credential.js +5 -4
  11. package/dist/Credential.js.map +1 -1
  12. package/dist/Method.d.ts +32 -4
  13. package/dist/Method.d.ts.map +1 -1
  14. package/dist/Method.js +5 -2
  15. package/dist/Method.js.map +1 -1
  16. package/dist/Receipt.d.ts.map +1 -1
  17. package/dist/Receipt.js +3 -2
  18. package/dist/Receipt.js.map +1 -1
  19. package/dist/cli/cli.d.ts.map +1 -1
  20. package/dist/cli/cli.js +19 -11
  21. package/dist/cli/cli.js.map +1 -1
  22. package/dist/cli/plugins/tempo.d.ts.map +1 -1
  23. package/dist/cli/plugins/tempo.js +17 -6
  24. package/dist/cli/plugins/tempo.js.map +1 -1
  25. package/dist/cli/utils.d.ts +5 -0
  26. package/dist/cli/utils.d.ts.map +1 -1
  27. package/dist/cli/utils.js +10 -0
  28. package/dist/cli/utils.js.map +1 -1
  29. package/dist/client/Methods.d.ts +5 -2
  30. package/dist/client/Methods.d.ts.map +1 -1
  31. package/dist/client/Methods.js +5 -2
  32. package/dist/client/Methods.js.map +1 -1
  33. package/dist/client/Transport.d.ts.map +1 -1
  34. package/dist/client/Transport.js +4 -5
  35. package/dist/client/Transport.js.map +1 -1
  36. package/dist/client/index.d.ts +2 -1
  37. package/dist/client/index.d.ts.map +1 -1
  38. package/dist/client/index.js +2 -1
  39. package/dist/client/index.js.map +1 -1
  40. package/dist/client/internal/Fetch.d.ts.map +1 -1
  41. package/dist/client/internal/Fetch.js +14 -6
  42. package/dist/client/internal/Fetch.js.map +1 -1
  43. package/dist/evm/server/Methods.d.ts +1 -1
  44. package/dist/evm/server/Methods.d.ts.map +1 -1
  45. package/dist/index.d.ts +1 -0
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +1 -0
  48. package/dist/index.js.map +1 -1
  49. package/dist/internal/AcceptPayment.d.ts +3 -0
  50. package/dist/internal/AcceptPayment.d.ts.map +1 -1
  51. package/dist/internal/AcceptPayment.js +15 -11
  52. package/dist/internal/AcceptPayment.js.map +1 -1
  53. package/dist/mcp-sdk/client/McpClient.d.ts +12 -5
  54. package/dist/mcp-sdk/client/McpClient.d.ts.map +1 -1
  55. package/dist/mcp-sdk/client/McpClient.js +55 -42
  56. package/dist/mcp-sdk/client/McpClient.js.map +1 -1
  57. package/dist/server/Mppx.d.ts +11 -3
  58. package/dist/server/Mppx.d.ts.map +1 -1
  59. package/dist/server/Mppx.js +76 -27
  60. package/dist/server/Mppx.js.map +1 -1
  61. package/dist/server/Request.js +24 -10
  62. package/dist/server/Request.js.map +1 -1
  63. package/dist/server/Response.d.ts.map +1 -1
  64. package/dist/server/Response.js +2 -1
  65. package/dist/server/Response.js.map +1 -1
  66. package/dist/server/Transport.d.ts.map +1 -1
  67. package/dist/server/Transport.js +4 -3
  68. package/dist/server/Transport.js.map +1 -1
  69. package/dist/server/index.d.ts +1 -0
  70. package/dist/server/index.d.ts.map +1 -1
  71. package/dist/server/index.js +1 -0
  72. package/dist/server/index.js.map +1 -1
  73. package/dist/stripe/client/Charge.d.ts +1 -1
  74. package/dist/stripe/client/Charge.d.ts.map +1 -1
  75. package/dist/stripe/client/Charge.js +3 -1
  76. package/dist/stripe/client/Charge.js.map +1 -1
  77. package/dist/stripe/server/Charge.d.ts +1 -1
  78. package/dist/stripe/server/Charge.d.ts.map +1 -1
  79. package/dist/stripe/server/Charge.js +9 -2
  80. package/dist/stripe/server/Charge.js.map +1 -1
  81. package/dist/stripe/server/Methods.d.ts +1 -1
  82. package/dist/stripe/server/Methods.d.ts.map +1 -1
  83. package/dist/stripe/server/internal/html.gen.d.ts +1 -1
  84. package/dist/stripe/server/internal/html.gen.d.ts.map +1 -1
  85. package/dist/stripe/server/internal/html.gen.js +1 -1
  86. package/dist/stripe/server/internal/html.gen.js.map +1 -1
  87. package/dist/tempo/Methods.d.ts +18 -0
  88. package/dist/tempo/Methods.d.ts.map +1 -1
  89. package/dist/tempo/Methods.js +16 -1
  90. package/dist/tempo/Methods.js.map +1 -1
  91. package/dist/tempo/client/Charge.d.ts +6 -0
  92. package/dist/tempo/client/Charge.d.ts.map +1 -1
  93. package/dist/tempo/client/Charge.js +9 -2
  94. package/dist/tempo/client/Charge.js.map +1 -1
  95. package/dist/tempo/client/Methods.d.ts +36 -7
  96. package/dist/tempo/client/Methods.d.ts.map +1 -1
  97. package/dist/tempo/client/Methods.js +12 -5
  98. package/dist/tempo/client/Methods.js.map +1 -1
  99. package/dist/tempo/client/index.d.ts +7 -4
  100. package/dist/tempo/client/index.d.ts.map +1 -1
  101. package/dist/tempo/client/index.js +5 -3
  102. package/dist/tempo/client/index.js.map +1 -1
  103. package/dist/tempo/index.d.ts +1 -0
  104. package/dist/tempo/index.d.ts.map +1 -1
  105. package/dist/tempo/index.js +1 -0
  106. package/dist/tempo/index.js.map +1 -1
  107. package/dist/tempo/internal/fee-payer.d.ts +21 -1
  108. package/dist/tempo/internal/fee-payer.d.ts.map +1 -1
  109. package/dist/tempo/internal/fee-payer.js +109 -4
  110. package/dist/tempo/internal/fee-payer.js.map +1 -1
  111. package/dist/tempo/{client → legacy/client}/ChannelOps.d.ts +19 -6
  112. package/dist/tempo/legacy/client/ChannelOps.d.ts.map +1 -0
  113. package/dist/tempo/{client → legacy/client}/ChannelOps.js +9 -3
  114. package/dist/tempo/legacy/client/ChannelOps.js.map +1 -0
  115. package/dist/tempo/{client → legacy/client}/Session.d.ts +23 -4
  116. package/dist/tempo/legacy/client/Session.d.ts.map +1 -0
  117. package/dist/tempo/{client → legacy/client}/Session.js +14 -7
  118. package/dist/tempo/legacy/client/Session.js.map +1 -0
  119. package/dist/tempo/{client → legacy/client}/SessionManager.d.ts +20 -5
  120. package/dist/tempo/legacy/client/SessionManager.d.ts.map +1 -0
  121. package/dist/tempo/{client → legacy/client}/SessionManager.js +20 -16
  122. package/dist/tempo/legacy/client/SessionManager.js.map +1 -0
  123. package/dist/tempo/legacy/client/index.d.ts +7 -0
  124. package/dist/tempo/legacy/client/index.d.ts.map +1 -0
  125. package/dist/tempo/legacy/client/index.js +5 -0
  126. package/dist/tempo/legacy/client/index.js.map +1 -0
  127. package/dist/tempo/legacy/index.d.ts +7 -0
  128. package/dist/tempo/legacy/index.d.ts.map +1 -0
  129. package/dist/tempo/legacy/index.js +7 -0
  130. package/dist/tempo/legacy/index.js.map +1 -0
  131. package/dist/tempo/{server → legacy/server}/Session.d.ts +28 -11
  132. package/dist/tempo/legacy/server/Session.d.ts.map +1 -0
  133. package/dist/tempo/{server → legacy/server}/Session.js +28 -23
  134. package/dist/tempo/legacy/server/Session.js.map +1 -0
  135. package/dist/tempo/legacy/server/index.d.ts +5 -0
  136. package/dist/tempo/legacy/server/index.d.ts.map +1 -0
  137. package/dist/tempo/legacy/server/index.js +5 -0
  138. package/dist/tempo/legacy/server/index.js.map +1 -0
  139. package/dist/tempo/{session → legacy/session}/Chain.d.ts +30 -23
  140. package/dist/tempo/legacy/session/Chain.d.ts.map +1 -0
  141. package/dist/tempo/{session → legacy/session}/Chain.js +12 -11
  142. package/dist/tempo/legacy/session/Chain.js.map +1 -0
  143. package/dist/tempo/{session → legacy/session}/Channel.d.ts +1 -0
  144. package/dist/tempo/legacy/session/Channel.d.ts.map +1 -0
  145. package/dist/tempo/legacy/session/Channel.js.map +1 -0
  146. package/dist/tempo/legacy/session/ChannelStore.d.ts +22 -0
  147. package/dist/tempo/legacy/session/ChannelStore.d.ts.map +1 -0
  148. package/dist/tempo/legacy/session/ChannelStore.js +6 -0
  149. package/dist/tempo/legacy/session/ChannelStore.js.map +1 -0
  150. package/dist/tempo/legacy/session/Types.d.ts +73 -0
  151. package/dist/tempo/legacy/session/Types.d.ts.map +1 -0
  152. package/dist/tempo/legacy/session/Types.js.map +1 -0
  153. package/dist/tempo/{session → legacy/session}/Voucher.d.ts +4 -4
  154. package/dist/tempo/legacy/session/Voucher.d.ts.map +1 -0
  155. package/dist/tempo/{session → legacy/session}/Voucher.js +1 -1
  156. package/dist/tempo/legacy/session/Voucher.js.map +1 -0
  157. package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts +1 -0
  158. package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts.map +1 -1
  159. package/dist/tempo/{session → legacy/session}/escrow.abi.js +1 -0
  160. package/dist/tempo/legacy/session/escrow.abi.js.map +1 -0
  161. package/dist/tempo/legacy/session/index.d.ts +9 -0
  162. package/dist/tempo/legacy/session/index.d.ts.map +1 -0
  163. package/dist/tempo/legacy/session/index.js +9 -0
  164. package/dist/tempo/legacy/session/index.js.map +1 -0
  165. package/dist/tempo/server/Charge.d.ts +1 -1
  166. package/dist/tempo/server/Charge.d.ts.map +1 -1
  167. package/dist/tempo/server/Charge.js +13 -16
  168. package/dist/tempo/server/Charge.js.map +1 -1
  169. package/dist/tempo/server/Methods.d.ts +63 -6
  170. package/dist/tempo/server/Methods.d.ts.map +1 -1
  171. package/dist/tempo/server/Methods.js +36 -8
  172. package/dist/tempo/server/Methods.js.map +1 -1
  173. package/dist/tempo/server/Subscription.d.ts +1 -1
  174. package/dist/tempo/server/Subscription.d.ts.map +1 -1
  175. package/dist/tempo/server/index.d.ts +6 -5
  176. package/dist/tempo/server/index.d.ts.map +1 -1
  177. package/dist/tempo/server/index.js +5 -5
  178. package/dist/tempo/server/index.js.map +1 -1
  179. package/dist/tempo/server/internal/html.gen.d.ts +1 -1
  180. package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
  181. package/dist/tempo/server/internal/html.gen.js +1 -1
  182. package/dist/tempo/server/internal/html.gen.js.map +1 -1
  183. package/dist/tempo/server/internal/request-body.d.ts +7 -2
  184. package/dist/tempo/server/internal/request-body.d.ts.map +1 -1
  185. package/dist/tempo/server/internal/request-body.js +20 -3
  186. package/dist/tempo/server/internal/request-body.js.map +1 -1
  187. package/dist/tempo/server/internal/transport.d.ts +8 -4
  188. package/dist/tempo/server/internal/transport.d.ts.map +1 -1
  189. package/dist/tempo/server/internal/transport.js +8 -7
  190. package/dist/tempo/server/internal/transport.js.map +1 -1
  191. package/dist/tempo/session/Snapshot.d.ts +32 -0
  192. package/dist/tempo/session/Snapshot.d.ts.map +1 -0
  193. package/dist/tempo/session/Snapshot.js +37 -0
  194. package/dist/tempo/session/Snapshot.js.map +1 -0
  195. package/dist/tempo/session/client/ChannelOps.d.ts +82 -0
  196. package/dist/tempo/session/client/ChannelOps.d.ts.map +1 -0
  197. package/dist/tempo/session/client/ChannelOps.js +204 -0
  198. package/dist/tempo/session/client/ChannelOps.js.map +1 -0
  199. package/dist/tempo/session/client/CredentialState.d.ts +262 -0
  200. package/dist/tempo/session/client/CredentialState.d.ts.map +1 -0
  201. package/dist/tempo/session/client/CredentialState.js +417 -0
  202. package/dist/tempo/session/client/CredentialState.js.map +1 -0
  203. package/dist/tempo/session/client/ReceiptCoordinator.d.ts +26 -0
  204. package/dist/tempo/session/client/ReceiptCoordinator.d.ts.map +1 -0
  205. package/dist/tempo/session/client/ReceiptCoordinator.js +61 -0
  206. package/dist/tempo/session/client/ReceiptCoordinator.js.map +1 -0
  207. package/dist/tempo/session/client/Runtime.d.ts +464 -0
  208. package/dist/tempo/session/client/Runtime.d.ts.map +1 -0
  209. package/dist/tempo/session/client/Runtime.js +499 -0
  210. package/dist/tempo/session/client/Runtime.js.map +1 -0
  211. package/dist/tempo/session/client/Session.d.ts +132 -0
  212. package/dist/tempo/session/client/Session.d.ts.map +1 -0
  213. package/dist/tempo/session/client/Session.js +55 -0
  214. package/dist/tempo/session/client/Session.js.map +1 -0
  215. package/dist/tempo/session/client/SessionManager.d.ts +120 -0
  216. package/dist/tempo/session/client/SessionManager.d.ts.map +1 -0
  217. package/dist/tempo/session/client/SessionManager.js +627 -0
  218. package/dist/tempo/session/client/SessionManager.js.map +1 -0
  219. package/dist/tempo/session/client/Transports.d.ts +449 -0
  220. package/dist/tempo/session/client/Transports.d.ts.map +1 -0
  221. package/dist/tempo/session/client/Transports.js +721 -0
  222. package/dist/tempo/session/client/Transports.js.map +1 -0
  223. package/dist/tempo/session/client/index.d.ts +12 -0
  224. package/dist/tempo/session/client/index.d.ts.map +1 -0
  225. package/dist/tempo/session/client/index.js +5 -0
  226. package/dist/tempo/session/client/index.js.map +1 -0
  227. package/dist/tempo/session/index.d.ts +7 -8
  228. package/dist/tempo/session/index.d.ts.map +1 -1
  229. package/dist/tempo/session/index.js +7 -8
  230. package/dist/tempo/session/index.js.map +1 -1
  231. package/dist/tempo/session/precompile/Chain.d.ts +319 -0
  232. package/dist/tempo/session/precompile/Chain.d.ts.map +1 -0
  233. package/dist/tempo/session/precompile/Chain.js +492 -0
  234. package/dist/tempo/session/precompile/Chain.js.map +1 -0
  235. package/dist/tempo/session/precompile/Channel.d.ts +46 -0
  236. package/dist/tempo/session/precompile/Channel.d.ts.map +1 -0
  237. package/dist/tempo/session/precompile/Channel.js +56 -0
  238. package/dist/tempo/session/precompile/Channel.js.map +1 -0
  239. package/dist/tempo/session/precompile/Protocol.d.ts +308 -0
  240. package/dist/tempo/session/precompile/Protocol.d.ts.map +1 -0
  241. package/dist/tempo/session/precompile/Protocol.js +264 -0
  242. package/dist/tempo/session/precompile/Protocol.js.map +1 -0
  243. package/dist/tempo/session/precompile/Voucher.d.ts +40 -0
  244. package/dist/tempo/session/precompile/Voucher.d.ts.map +1 -0
  245. package/dist/tempo/session/precompile/Voucher.js +126 -0
  246. package/dist/tempo/session/precompile/Voucher.js.map +1 -0
  247. package/dist/tempo/session/precompile/escrow.abi.d.ts +522 -0
  248. package/dist/tempo/session/precompile/escrow.abi.d.ts.map +1 -0
  249. package/dist/tempo/session/precompile/escrow.abi.js +224 -0
  250. package/dist/tempo/session/precompile/escrow.abi.js.map +1 -0
  251. package/dist/tempo/session/precompile/index.d.ts +24 -0
  252. package/dist/tempo/session/precompile/index.d.ts.map +1 -0
  253. package/dist/tempo/session/precompile/index.js +22 -0
  254. package/dist/tempo/session/precompile/index.js.map +1 -0
  255. package/dist/tempo/session/server/ChannelOps.d.ts +56 -0
  256. package/dist/tempo/session/server/ChannelOps.d.ts.map +1 -0
  257. package/dist/tempo/session/server/ChannelOps.js +91 -0
  258. package/dist/tempo/session/server/ChannelOps.js.map +1 -0
  259. package/dist/tempo/session/server/ChannelStore.d.ts +347 -0
  260. package/dist/tempo/session/server/ChannelStore.d.ts.map +1 -0
  261. package/dist/tempo/session/server/ChannelStore.js +404 -0
  262. package/dist/tempo/session/server/ChannelStore.js.map +1 -0
  263. package/dist/tempo/session/server/CredentialVerification.d.ts +85 -0
  264. package/dist/tempo/session/server/CredentialVerification.d.ts.map +1 -0
  265. package/dist/tempo/session/server/CredentialVerification.js +494 -0
  266. package/dist/tempo/session/server/CredentialVerification.js.map +1 -0
  267. package/dist/tempo/session/server/MeteredStream.d.ts +40 -0
  268. package/dist/tempo/session/server/MeteredStream.d.ts.map +1 -0
  269. package/dist/tempo/session/server/MeteredStream.js +42 -0
  270. package/dist/tempo/session/server/MeteredStream.js.map +1 -0
  271. package/dist/tempo/session/server/RequestState.d.ts +208 -0
  272. package/dist/tempo/session/server/RequestState.d.ts.map +1 -0
  273. package/dist/tempo/session/server/RequestState.js +252 -0
  274. package/dist/tempo/session/server/RequestState.js.map +1 -0
  275. package/dist/tempo/session/server/Session.d.ts +169 -0
  276. package/dist/tempo/session/server/Session.d.ts.map +1 -0
  277. package/dist/tempo/session/server/Session.js +351 -0
  278. package/dist/tempo/session/server/Session.js.map +1 -0
  279. package/dist/tempo/session/server/Settlement.d.ts +185 -0
  280. package/dist/tempo/session/server/Settlement.d.ts.map +1 -0
  281. package/dist/tempo/session/server/Settlement.js +250 -0
  282. package/dist/tempo/session/server/Settlement.js.map +1 -0
  283. package/dist/tempo/session/{Sse.d.ts → server/Sse.d.ts} +9 -56
  284. package/dist/tempo/session/server/Sse.d.ts.map +1 -0
  285. package/dist/tempo/session/server/Sse.js +184 -0
  286. package/dist/tempo/session/server/Sse.js.map +1 -0
  287. package/dist/tempo/session/server/Transports.d.ts +89 -0
  288. package/dist/tempo/session/server/Transports.d.ts.map +1 -0
  289. package/dist/tempo/session/server/Transports.js +149 -0
  290. package/dist/tempo/session/server/Transports.js.map +1 -0
  291. package/dist/tempo/session/server/Ws.d.ts +48 -0
  292. package/dist/tempo/session/server/Ws.d.ts.map +1 -0
  293. package/dist/tempo/session/server/Ws.js +244 -0
  294. package/dist/tempo/session/server/Ws.js.map +1 -0
  295. package/dist/tempo/session/server/index.d.ts +4 -0
  296. package/dist/tempo/session/server/index.d.ts.map +1 -0
  297. package/dist/tempo/session/server/index.js +2 -0
  298. package/dist/tempo/session/server/index.js.map +1 -0
  299. package/package.json +8 -3
  300. package/src/Challenge.ts +9 -7
  301. package/src/Constants.ts +58 -0
  302. package/src/Credential.ts +5 -4
  303. package/src/Method.ts +46 -5
  304. package/src/Receipt.ts +3 -2
  305. package/src/cli/cli.test.ts +23 -28
  306. package/src/cli/cli.ts +23 -10
  307. package/src/cli/mcp.test.ts +21 -7
  308. package/src/cli/plugins/tempo.ts +21 -8
  309. package/src/cli/utils.test.ts +25 -1
  310. package/src/cli/utils.ts +10 -0
  311. package/src/client/Methods.ts +5 -2
  312. package/src/client/Mppx.test-d.ts +10 -0
  313. package/src/client/Mppx.test.ts +75 -0
  314. package/src/client/Transport.ts +4 -5
  315. package/src/client/index.ts +11 -1
  316. package/src/client/internal/Fetch.test.ts +29 -4
  317. package/src/client/internal/Fetch.ts +17 -5
  318. package/src/env.d.ts +1 -1
  319. package/src/index.ts +1 -0
  320. package/src/internal/AcceptPayment.test.ts +61 -0
  321. package/src/internal/AcceptPayment.ts +21 -14
  322. package/src/mcp-sdk/client/McpClient.integration.test.ts +8 -7
  323. package/src/mcp-sdk/client/McpClient.test-d.ts +7 -0
  324. package/src/mcp-sdk/client/McpClient.ts +99 -67
  325. package/src/mcp-sdk/client/McpClient.unit.test.ts +131 -0
  326. package/src/middlewares/elysia.test.ts +8 -4
  327. package/src/middlewares/express.test.ts +8 -4
  328. package/src/middlewares/hono.test.ts +4 -4
  329. package/src/middlewares/nextjs.test.ts +8 -4
  330. package/src/proxy/Proxy.test.ts +8 -8
  331. package/src/server/Mppx.test-d.ts +54 -0
  332. package/src/server/Mppx.test.ts +274 -7
  333. package/src/server/Mppx.ts +487 -406
  334. package/src/server/Request.test.ts +81 -0
  335. package/src/server/Request.ts +23 -9
  336. package/src/server/Response.ts +2 -1
  337. package/src/server/Transport.ts +4 -3
  338. package/src/server/index.ts +1 -0
  339. package/src/stripe/client/Charge.test.ts +20 -5
  340. package/src/stripe/client/Charge.ts +6 -2
  341. package/src/stripe/server/Charge.test.ts +114 -1
  342. package/src/stripe/server/Charge.ts +13 -2
  343. package/src/stripe/server/internal/html/package.json +1 -1
  344. package/src/stripe/server/internal/html.gen.ts +1 -1
  345. package/src/tempo/AccessKeyAuthorization.test.ts +4 -94
  346. package/src/tempo/Methods.test.ts +45 -17
  347. package/src/tempo/Methods.ts +22 -0
  348. package/src/tempo/PublicExports.test-d.ts +105 -0
  349. package/src/tempo/client/Charge.test.ts +85 -0
  350. package/src/tempo/client/Charge.ts +19 -2
  351. package/src/tempo/client/Methods.ts +18 -6
  352. package/src/tempo/client/index.ts +15 -4
  353. package/src/tempo/index.ts +1 -0
  354. package/src/tempo/internal/fee-payer.test.ts +241 -17
  355. package/src/tempo/internal/fee-payer.ts +150 -4
  356. package/src/tempo/internal/fee-token.test.ts +14 -9
  357. package/src/tempo/legacy/AccessKeyAuthorization.test.ts +162 -0
  358. package/src/tempo/legacy/README.md +9 -0
  359. package/src/tempo/{client → legacy/client}/ChannelOps.test.ts +6 -7
  360. package/src/tempo/{client → legacy/client}/ChannelOps.ts +22 -9
  361. package/src/tempo/{client → legacy/client}/Session.test.ts +51 -9
  362. package/src/tempo/{client → legacy/client}/Session.ts +25 -11
  363. package/src/tempo/{client → legacy/client}/SessionManager.test.ts +81 -9
  364. package/src/tempo/{client → legacy/client}/SessionManager.ts +41 -20
  365. package/src/tempo/legacy/client/index.ts +6 -0
  366. package/src/tempo/legacy/index.ts +6 -0
  367. package/src/tempo/{server → legacy/server}/Session.test.ts +162 -63
  368. package/src/tempo/{server → legacy/server}/Session.ts +49 -37
  369. package/src/tempo/legacy/server/index.ts +4 -0
  370. package/src/tempo/{session → legacy/session}/Chain.test.ts +3 -4
  371. package/src/tempo/{session → legacy/session}/Chain.ts +94 -63
  372. package/src/tempo/{session → legacy/session}/Channel.ts +1 -0
  373. package/src/tempo/legacy/session/ChannelStore.test.ts +58 -0
  374. package/src/tempo/legacy/session/ChannelStore.ts +39 -0
  375. package/src/tempo/legacy/session/Types.ts +91 -0
  376. package/src/tempo/{session → legacy/session}/Voucher.ts +12 -8
  377. package/src/tempo/{session → legacy/session}/escrow.abi.ts +1 -0
  378. package/src/tempo/legacy/session/index.ts +8 -0
  379. package/src/tempo/server/AtomicStore.test-d.ts +16 -11
  380. package/src/tempo/server/Charge.test.ts +92 -14
  381. package/src/tempo/server/Charge.ts +18 -16
  382. package/src/tempo/server/Methods.ts +54 -8
  383. package/src/tempo/server/Sse.test.ts +2 -2
  384. package/src/tempo/server/index.ts +6 -5
  385. package/src/tempo/server/internal/html/package.json +1 -1
  386. package/src/tempo/server/internal/html.gen.ts +1 -1
  387. package/src/tempo/server/internal/request-body.test.ts +37 -4
  388. package/src/tempo/server/internal/request-body.ts +25 -6
  389. package/src/tempo/server/internal/transport.test.ts +4 -4
  390. package/src/tempo/server/internal/transport.ts +19 -10
  391. package/src/tempo/session/Snapshot.test.ts +41 -0
  392. package/src/tempo/session/Snapshot.ts +74 -0
  393. package/src/tempo/session/client/ChannelOps.test.ts +163 -0
  394. package/src/tempo/session/client/ChannelOps.ts +344 -0
  395. package/src/tempo/session/client/CredentialState.test.ts +645 -0
  396. package/src/tempo/session/client/CredentialState.ts +814 -0
  397. package/src/tempo/session/client/ReceiptCoordinator.ts +95 -0
  398. package/src/tempo/session/client/Runtime.test.ts +1092 -0
  399. package/src/tempo/session/client/Runtime.ts +986 -0
  400. package/src/tempo/session/client/Session.test.ts +734 -0
  401. package/src/tempo/session/client/Session.ts +97 -0
  402. package/src/tempo/session/client/SessionManager.test.ts +1308 -0
  403. package/src/tempo/session/client/SessionManager.ts +845 -0
  404. package/src/tempo/session/client/Transports.test.ts +837 -0
  405. package/src/tempo/session/client/Transports.ts +1292 -0
  406. package/src/tempo/session/client/index.ts +37 -0
  407. package/src/tempo/session/index.ts +7 -8
  408. package/src/tempo/session/precompile/Chain.integration.test.ts +321 -0
  409. package/src/tempo/session/precompile/Chain.test.ts +1258 -0
  410. package/src/tempo/session/precompile/Chain.ts +979 -0
  411. package/src/tempo/session/precompile/Channel.test.ts +138 -0
  412. package/src/tempo/session/precompile/Channel.ts +103 -0
  413. package/src/tempo/session/precompile/Protocol.test.ts +358 -0
  414. package/src/tempo/session/precompile/Protocol.ts +520 -0
  415. package/src/tempo/session/precompile/Voucher.test.ts +316 -0
  416. package/src/tempo/session/precompile/Voucher.ts +160 -0
  417. package/src/tempo/session/precompile/escrow.abi.ts +226 -0
  418. package/src/tempo/session/precompile/index.ts +33 -0
  419. package/src/tempo/session/server/ChannelOps.test.ts +129 -0
  420. package/src/tempo/session/server/ChannelOps.ts +157 -0
  421. package/src/tempo/session/{ChannelStore.test.ts → server/ChannelStore.test.ts} +536 -29
  422. package/src/tempo/session/server/ChannelStore.ts +835 -0
  423. package/src/tempo/session/server/CredentialVerification.test.ts +146 -0
  424. package/src/tempo/session/server/CredentialVerification.ts +710 -0
  425. package/src/tempo/session/server/MeteredStream.ts +88 -0
  426. package/src/tempo/session/server/RequestState.test.ts +531 -0
  427. package/src/tempo/session/server/RequestState.ts +499 -0
  428. package/src/tempo/session/server/Session.integration.test.ts +444 -0
  429. package/src/tempo/session/server/Session.test.ts +3253 -0
  430. package/src/tempo/session/server/Session.ts +543 -0
  431. package/src/tempo/session/server/Settlement.test.ts +242 -0
  432. package/src/tempo/session/server/Settlement.ts +470 -0
  433. package/src/tempo/session/{Sse.test.ts → server/Sse.test.ts} +37 -3
  434. package/src/tempo/session/server/Sse.ts +256 -0
  435. package/src/tempo/session/server/Transports.test.ts +346 -0
  436. package/src/tempo/session/server/Transports.ts +255 -0
  437. package/src/tempo/session/{Ws.test.ts → server/Ws.test.ts} +4 -4
  438. package/src/tempo/session/server/Ws.ts +384 -0
  439. package/src/tempo/session/server/index.ts +8 -0
  440. package/dist/tempo/client/ChannelOps.d.ts.map +0 -1
  441. package/dist/tempo/client/ChannelOps.js.map +0 -1
  442. package/dist/tempo/client/Session.d.ts.map +0 -1
  443. package/dist/tempo/client/Session.js.map +0 -1
  444. package/dist/tempo/client/SessionManager.d.ts.map +0 -1
  445. package/dist/tempo/client/SessionManager.js.map +0 -1
  446. package/dist/tempo/server/Session.d.ts.map +0 -1
  447. package/dist/tempo/server/Session.js.map +0 -1
  448. package/dist/tempo/session/Chain.d.ts.map +0 -1
  449. package/dist/tempo/session/Chain.js.map +0 -1
  450. package/dist/tempo/session/Channel.d.ts.map +0 -1
  451. package/dist/tempo/session/Channel.js.map +0 -1
  452. package/dist/tempo/session/ChannelStore.d.ts +0 -117
  453. package/dist/tempo/session/ChannelStore.d.ts.map +0 -1
  454. package/dist/tempo/session/ChannelStore.js +0 -172
  455. package/dist/tempo/session/ChannelStore.js.map +0 -1
  456. package/dist/tempo/session/Receipt.d.ts +0 -22
  457. package/dist/tempo/session/Receipt.d.ts.map +0 -1
  458. package/dist/tempo/session/Receipt.js +0 -34
  459. package/dist/tempo/session/Receipt.js.map +0 -1
  460. package/dist/tempo/session/Sse.d.ts.map +0 -1
  461. package/dist/tempo/session/Sse.js +0 -363
  462. package/dist/tempo/session/Sse.js.map +0 -1
  463. package/dist/tempo/session/Types.d.ts +0 -78
  464. package/dist/tempo/session/Types.d.ts.map +0 -1
  465. package/dist/tempo/session/Types.js.map +0 -1
  466. package/dist/tempo/session/Voucher.d.ts.map +0 -1
  467. package/dist/tempo/session/Voucher.js.map +0 -1
  468. package/dist/tempo/session/Ws.d.ts +0 -87
  469. package/dist/tempo/session/Ws.d.ts.map +0 -1
  470. package/dist/tempo/session/Ws.js +0 -443
  471. package/dist/tempo/session/Ws.js.map +0 -1
  472. package/dist/tempo/session/escrow.abi.js.map +0 -1
  473. package/src/tempo/session/ChannelStore.ts +0 -308
  474. package/src/tempo/session/Receipt.test.ts +0 -89
  475. package/src/tempo/session/Receipt.ts +0 -46
  476. package/src/tempo/session/Sse.ts +0 -462
  477. package/src/tempo/session/Types.ts +0 -86
  478. package/src/tempo/session/Ws.ts +0 -576
  479. /package/dist/tempo/{session → legacy/session}/Channel.js +0 -0
  480. /package/dist/tempo/{session → legacy/session}/Types.js +0 -0
  481. /package/src/tempo/{session → legacy/session}/Channel.test.ts +0 -0
  482. /package/src/tempo/{session → legacy/session}/Voucher.test.ts +0 -0
  483. /package/src/tempo/session/{Sse.fuzz.test.ts → server/Sse.fuzz.test.ts} +0 -0
@@ -0,0 +1,244 @@
1
+ import * as Constants from '../../../Constants.js';
2
+ import * as Credential from '../../../Credential.js';
3
+ import { createSessionReceipt, deserializeSessionReceipt, formatApplicationMessage, formatCloseReadyMessage, formatErrorMessage, formatNeedVoucherMessage, formatReceiptMessage, parseMessage, readSessionChallengeAmount, requireSessionCredentialContext, } from '../precompile/Protocol.js';
4
+ import * as ChannelStore from './ChannelStore.js';
5
+ import { meterIterable } from './MeteredStream.js';
6
+ import { send, subscribe, toText } from './Transports.js';
7
+ /** Public WebSocket payment frame helpers. */
8
+ export { formatApplicationMessage, formatAuthorizationMessage, formatCloseReadyMessage, formatCloseRequestMessage, formatErrorMessage, formatNeedVoucherMessage, formatReceiptMessage, parseMessage, } from '../precompile/Protocol.js';
9
+ /**
10
+ * Bridge a WebSocket connection to a Tempo session payment flow.
11
+ *
12
+ * Credential verification is performed by routing each in-band authorization
13
+ * frame through `route` as a **synthetic `POST` request** that carries only
14
+ * the `Authorization` header. The synthetic request does not include cookies,
15
+ * bodies, query parameters, or other headers from the original WebSocket
16
+ * upgrade request. Do not wrap `route` with middleware that depends on
17
+ * HTTP-specific context beyond the `Authorization` header.
18
+ */
19
+ export async function serve(options) {
20
+ const { amount: expectedAmount, generate, pollIntervalMs = 100, route, socket, store: rawStore, url, } = options;
21
+ const store = 'getChannel' in rawStore ? rawStore : ChannelStore.fromStore(rawStore);
22
+ const requestUrl = normalizeHttpUrl(url);
23
+ const maxQueuedPaymentMessages = 32;
24
+ const abortController = new AbortController();
25
+ const runtime = {
26
+ closed: false,
27
+ closeReadySent: false,
28
+ closeRequestHandled: false,
29
+ closeRequested: false,
30
+ streamStarted: false,
31
+ streamTask: null,
32
+ streamContext: null,
33
+ action: Promise.resolve(),
34
+ queuedActions: 0,
35
+ };
36
+ const close = async (code = 1000, reason) => {
37
+ if (runtime.closed)
38
+ return;
39
+ runtime.closed = true;
40
+ abortController.abort();
41
+ unsubscribe();
42
+ await Promise.resolve(socket.close(code, reason));
43
+ };
44
+ const sendCloseReady = async () => {
45
+ if (runtime.closeReadySent || !runtime.streamContext || runtime.closed)
46
+ return;
47
+ runtime.closeReadySent = true;
48
+ const channel = await store.getChannel(runtime.streamContext.channelId);
49
+ if (!channel)
50
+ throw new Error('channel not found');
51
+ const receipt = createSessionReceipt({
52
+ challengeId: runtime.streamContext.challengeId,
53
+ channelId: runtime.streamContext.channelId,
54
+ acceptedCumulative: channel.highestVoucherAmount,
55
+ spent: channel.spent,
56
+ units: channel.units,
57
+ });
58
+ await send(socket, formatCloseReadyMessage(receipt));
59
+ };
60
+ const runStream = async (context) => {
61
+ try {
62
+ for await (const value of meterIterable({
63
+ store,
64
+ channelId: context.channelId,
65
+ tickCost: context.tickCost,
66
+ generate,
67
+ pollIntervalMs,
68
+ signal: abortController.signal,
69
+ emitNeedVoucher: (message) => send(socket, message),
70
+ formatNeedVoucher: formatNeedVoucherMessage,
71
+ })) {
72
+ if (abortController.signal.aborted)
73
+ break;
74
+ await send(socket, formatApplicationMessage(value));
75
+ }
76
+ if (!abortController.signal.aborted)
77
+ await sendCloseReady();
78
+ }
79
+ catch (error) {
80
+ if (!abortController.signal.aborted) {
81
+ await send(socket, formatErrorMessage({
82
+ message: error instanceof Error ? error.message : 'websocket session failed',
83
+ status: 500,
84
+ }));
85
+ await close(1011, 'websocket session failed');
86
+ }
87
+ }
88
+ finally {
89
+ runtime.streamTask = null;
90
+ }
91
+ };
92
+ const requestClose = async () => {
93
+ if (runtime.closed)
94
+ return;
95
+ if (runtime.closeRequestHandled)
96
+ return;
97
+ runtime.closeRequestHandled = true;
98
+ runtime.closeRequested = true;
99
+ abortController.abort();
100
+ await runtime.streamTask?.catch(() => { });
101
+ await sendCloseReady();
102
+ };
103
+ const processAuthorization = async (authorization) => {
104
+ if (runtime.closed)
105
+ return;
106
+ const credential = Credential.deserialize(authorization);
107
+ const payload = requireSessionCredentialContext(credential.payload);
108
+ if (payload.action === 'close')
109
+ runtime.closeRequested = true;
110
+ if (expectedAmount && credential.challenge.request.amount !== expectedAmount) {
111
+ await send(socket, formatErrorMessage({
112
+ message: 'credential amount does not match this endpoint',
113
+ status: 402,
114
+ }));
115
+ await close(1008, 'credential amount does not match this endpoint');
116
+ return;
117
+ }
118
+ const authorizationResult = await authorizePaymentFrame({ authorization, requestUrl, route });
119
+ if (authorizationResult.status === 'rejected') {
120
+ await send(socket, formatErrorMessage({
121
+ message: authorizationResult.message,
122
+ status: authorizationResult.responseStatus,
123
+ }));
124
+ await close(1008, authorizationResult.message);
125
+ return;
126
+ }
127
+ const { receipt } = authorizationResult;
128
+ await send(socket, formatReceiptMessage(receipt));
129
+ if (payload.action === 'close') {
130
+ await close(1000, 'payment session closed');
131
+ return;
132
+ }
133
+ if (payload.action === 'topUp')
134
+ return;
135
+ if (runtime.streamStarted || runtime.closeRequested)
136
+ return;
137
+ runtime.streamStarted = true;
138
+ runtime.streamContext = {
139
+ challengeId: credential.challenge.id,
140
+ channelId: payload.channelId,
141
+ tickCost: readSessionChallengeAmount(credential.challenge),
142
+ };
143
+ // Defer the first application frame until after the client receives the
144
+ // auth receipt and has a chance to install its own message listeners.
145
+ setTimeout(() => {
146
+ if (runtime.closeRequested || runtime.closed || !runtime.streamContext)
147
+ return;
148
+ runtime.streamTask = runStream(runtime.streamContext);
149
+ }, 0);
150
+ };
151
+ const onMessage = (payload) => {
152
+ if (runtime.closed)
153
+ return;
154
+ const raw = toText(payload);
155
+ if (!raw)
156
+ return;
157
+ const message = parseMessage(raw);
158
+ if (!message)
159
+ return;
160
+ if (message.mpp === 'payment-close-request') {
161
+ runtime.closeRequested = true;
162
+ abortController.abort();
163
+ }
164
+ const work = message.mpp === 'authorization'
165
+ ? () => processAuthorization(message.authorization)
166
+ : message.mpp === 'payment-close-request'
167
+ ? () => requestClose()
168
+ : null;
169
+ if (!work)
170
+ return;
171
+ if (runtime.queuedActions >= maxQueuedPaymentMessages) {
172
+ void send(socket, formatErrorMessage({
173
+ message: 'too many queued payment messages',
174
+ status: 429,
175
+ })).catch(() => { });
176
+ void close(1008, 'too many queued payment messages');
177
+ return;
178
+ }
179
+ runtime.queuedActions++;
180
+ runtime.action = runtime.action
181
+ .then(async () => {
182
+ try {
183
+ if (runtime.closed)
184
+ return;
185
+ await work();
186
+ }
187
+ finally {
188
+ runtime.queuedActions--;
189
+ }
190
+ })
191
+ .catch(async (error) => {
192
+ if (!runtime.closed) {
193
+ await send(socket, formatErrorMessage({
194
+ message: error instanceof Error ? error.message : 'invalid payment message',
195
+ status: 400,
196
+ }));
197
+ await close(1008, 'invalid payment message');
198
+ }
199
+ });
200
+ };
201
+ const onClose = () => {
202
+ if (runtime.closed)
203
+ return;
204
+ runtime.closed = true;
205
+ abortController.abort();
206
+ unsubscribe();
207
+ };
208
+ const unsubscribe = subscribe(socket, {
209
+ close: onClose,
210
+ error: onClose,
211
+ message: onMessage,
212
+ });
213
+ }
214
+ function normalizeHttpUrl(value) {
215
+ const url = new URL(value.toString());
216
+ if (url.protocol === 'ws:')
217
+ url.protocol = 'http:';
218
+ if (url.protocol === 'wss:')
219
+ url.protocol = 'https:';
220
+ return url.toString();
221
+ }
222
+ /** Verifies a WebSocket authorization frame and returns either a receipt or a payment error. */
223
+ async function authorizePaymentFrame(parameters) {
224
+ const result = await parameters.route(new Request(parameters.requestUrl, {
225
+ method: 'POST',
226
+ headers: { [Constants.Headers.authorization]: parameters.authorization },
227
+ }));
228
+ if (result.status === 402) {
229
+ const response = result.challenge;
230
+ return {
231
+ status: 'rejected',
232
+ message: (await response.text().catch(() => '')) ||
233
+ response.statusText ||
234
+ 'payment verification failed',
235
+ responseStatus: response.status,
236
+ };
237
+ }
238
+ const response = result.withReceipt(new Response(null, { status: 204 }));
239
+ const receiptHeader = response.headers.get(Constants.Headers.paymentReceipt);
240
+ if (!receiptHeader)
241
+ throw new Error('management response missing Payment-Receipt header');
242
+ return { status: 'accepted', receipt: deserializeSessionReceipt(receiptHeader) };
243
+ }
244
+ //# sourceMappingURL=Ws.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Ws.js","sourceRoot":"","sources":["../../../../src/tempo/session/server/Ws.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { charge, session, settle, settleBatch } from './Session.js';
2
+ /** Server-side automatic settlement schedule. */
3
+ export type { ResolveSessionChannelId, ResolveSessionChannelIdParameters, SessionChannelIdRequest, SettlementSchedule, } from './Session.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tempo/session/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AACnE,iDAAiD;AACjD,YAAY,EACV,uBAAuB,EACvB,iCAAiC,EACjC,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,cAAc,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { charge, session, settle, settleBatch } from './Session.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/tempo/session/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA"}
package/package.json CHANGED
@@ -1,9 +1,13 @@
1
1
  {
2
2
  "name": "mppx",
3
3
  "type": "module",
4
- "version": "0.6.30",
4
+ "version": "0.7.0",
5
5
  "main": "./dist/index.js",
6
6
  "license": "MIT",
7
+ "homepage": "https://github.com/wevm/mppx#readme",
8
+ "bugs": {
9
+ "url": "https://github.com/wevm/mppx/issues"
10
+ },
7
11
  "files": [
8
12
  "CHANGELOG.md",
9
13
  "dist",
@@ -143,8 +147,9 @@
143
147
  }
144
148
  },
145
149
  "dependencies": {
146
- "incur": "^0.4.5",
147
- "ox": "0.14.24",
150
+ "@stripe/stripe-js": "9.7.0",
151
+ "incur": "^0.4.8",
152
+ "ox": "0.14.27",
148
153
  "zod": "^4.4.3"
149
154
  },
150
155
  "repository": {
package/src/Challenge.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { Base64, Bytes, Hash } from 'ox'
2
2
 
3
+ import * as Constants from './Constants.js'
3
4
  import { constantTimeEqual } from './internal/constantTimeEqual.js'
4
5
  import type { OneOf } from './internal/types.js'
5
6
  import type * as Method from './Method.js'
@@ -309,7 +310,7 @@ export function serialize(challenge: Challenge): string {
309
310
  else if (challenge.meta !== undefined)
310
311
  parts.push(authParam('opaque', PaymentRequest.serialize(challenge.meta)))
311
312
 
312
- return `Payment ${parts.join(', ')}`
313
+ return `${Constants.Schemes.payment} ${parts.join(', ')}`
313
314
  }
314
315
 
315
316
  /** @internal */
@@ -361,7 +362,7 @@ export function deserialize<const methods extends readonly Method.Method[] | und
361
362
 
362
363
  /** @internal Extracts the `Payment` scheme from a WWW-Authenticate value that may contain multiple schemes. */
363
364
  function extractPaymentAuthParams(header: string): string | null {
364
- const token = 'Payment'
365
+ const token = Constants.Schemes.payment
365
366
  let inQuotes = false
366
367
  let escaped = false
367
368
 
@@ -493,8 +494,8 @@ export function fromHeaders<const methods extends readonly Method.Method[] | und
493
494
  headers: Headers,
494
495
  options?: from.Options<methods>,
495
496
  ): from.ReturnType<from.Parameters, methods> {
496
- const header = headers.get('WWW-Authenticate')
497
- if (!header) throw new Error('Missing WWW-Authenticate header.')
497
+ const header = headers.get(Constants.Headers.wwwAuthenticate)
498
+ if (!header) throw new Error(`Missing ${Constants.Headers.wwwAuthenticate} header.`)
498
499
  return deserialize(header, options)
499
500
  }
500
501
 
@@ -564,8 +565,8 @@ export function fromResponseList<
564
565
  export function fromHeadersList<
565
566
  const methods extends readonly Method.Method[] | undefined = undefined,
566
567
  >(headers: Headers, options?: from.Options<methods>): from.ReturnType<from.Parameters, methods>[] {
567
- const header = headers.get('WWW-Authenticate')
568
- if (!header) throw new Error('Missing WWW-Authenticate header.')
568
+ const header = headers.get(Constants.Headers.wwwAuthenticate)
569
+ if (!header) throw new Error(`Missing ${Constants.Headers.wwwAuthenticate} header.`)
569
570
  return deserializeList(header, options)
570
571
  }
571
572
 
@@ -582,7 +583,8 @@ export function deserializeList<
582
583
  >(value: string, options?: from.Options<methods>): from.ReturnType<from.Parameters, methods>[] {
583
584
  // Find the start index of each `Payment ` scheme prefix.
584
585
  const starts: number[] = []
585
- for (const match of value.matchAll(/Payment\s+/gi)) {
586
+ const schemePattern = new RegExp(`${Constants.Schemes.payment}\\s+`, 'gi')
587
+ for (const match of value.matchAll(schemePattern)) {
586
588
  starts.push(match.index!)
587
589
  }
588
590
  if (starts.length === 0) throw new Error('No Payment schemes found.')
@@ -0,0 +1,58 @@
1
+ /** HTTP header names used by the Payment authentication scheme. */
2
+ export const Headers = {
3
+ acceptPayment: 'Accept-Payment',
4
+ authorization: 'Authorization',
5
+ paymentReceipt: 'Payment-Receipt',
6
+ paymentSession: 'Payment-Session',
7
+ paymentSessionSnapshot: 'Payment-Session-Snapshot',
8
+ wwwAuthenticate: 'WWW-Authenticate',
9
+ } as const
10
+
11
+ /** Authentication scheme names used by mppx transports. */
12
+ export const Schemes = {
13
+ payment: 'Payment',
14
+ } as const
15
+
16
+ /** Payment method names used by built-in mppx methods. */
17
+ export const Methods = {
18
+ evm: 'evm',
19
+ stripe: 'stripe',
20
+ tempo: 'tempo',
21
+ } as const
22
+
23
+ /** Payment intent names used by built-in mppx methods. */
24
+ export const Intents = {
25
+ charge: 'charge',
26
+ session: 'session',
27
+ subscription: 'subscription',
28
+ } as const
29
+
30
+ /** Method detail object keys used by built-in methods. */
31
+ export const MethodDetailKeys = {
32
+ sessionProtocol: 'sessionProtocol',
33
+ sessionSnapshot: 'sessionSnapshot',
34
+ } as const
35
+
36
+ /** Tempo session protocol versions advertised under `request.methodDetails`. */
37
+ export const SessionProtocols = {
38
+ /** Legacy contract-backed Tempo session protocol. */
39
+ v1: 'v1',
40
+ /** TIP-1034 precompile-backed Tempo session protocol. */
41
+ v2: 'v2',
42
+ } as const
43
+
44
+ /** Known Tempo session protocol version markers. */
45
+ export type SessionProtocol = (typeof SessionProtocols)[keyof typeof SessionProtocols]
46
+
47
+ type MethodDetailKey = (typeof MethodDetailKeys)[keyof typeof MethodDetailKeys]
48
+
49
+ /**
50
+ * Reads a typed method detail value from a challenge request.
51
+ */
52
+ export function getMethodDetail<Value>(
53
+ methodDetails: unknown,
54
+ key: MethodDetailKey,
55
+ ): Value | undefined {
56
+ if (!methodDetails || typeof methodDetails !== 'object') return undefined
57
+ return (methodDetails as Record<string, Value | undefined>)[key]
58
+ }
package/src/Credential.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { Base64 } from 'ox'
2
2
 
3
3
  import * as Challenge from './Challenge.js'
4
+ import * as Constants from './Constants.js'
4
5
  import * as PaymentRequest from './PaymentRequest.js'
5
6
 
6
7
  /**
@@ -58,7 +59,7 @@ export class InvalidCredentialEncodingError extends Error {
58
59
  * ```
59
60
  */
60
61
  export function deserialize<payload = unknown>(value: string): Credential<payload> {
61
- const prefixMatch = value.match(/^Payment\s+(.+)$/i)
62
+ const prefixMatch = value.match(new RegExp(`^${Constants.Schemes.payment}\\s+(.+)$`, 'i'))
62
63
  if (!prefixMatch?.[1]) throw new MissingPaymentSchemeError()
63
64
  try {
64
65
  const json = Base64.toString(prefixMatch[1])
@@ -163,7 +164,7 @@ export declare namespace from {
163
164
  * ```
164
165
  */
165
166
  export function fromRequest<payload = unknown>(request: Request): Credential<payload> {
166
- const header = request.headers.get('Authorization')
167
+ const header = request.headers.get(Constants.Headers.authorization)
167
168
  if (!header) throw new MissingAuthorizationHeaderError()
168
169
  const payment = extractPaymentScheme(header)
169
170
  if (!payment) throw new MissingPaymentSchemeError()
@@ -200,7 +201,7 @@ export function serialize(credential: Credential): string {
200
201
  }
201
202
  const json = JSON.stringify(wire)
202
203
  const encoded = Base64.fromString(json, { pad: false, url: true })
203
- return `Payment ${encoded}`
204
+ return `${Constants.Schemes.payment} ${encoded}`
204
205
  }
205
206
 
206
207
  /**
@@ -212,5 +213,5 @@ export function serialize(credential: Credential): string {
212
213
  */
213
214
  export function extractPaymentScheme(header: string): string | null {
214
215
  const schemes = header.split(',').map((s) => s.trim())
215
- return schemes.find((s) => /^Payment\s+/i.test(s)) ?? null
216
+ return schemes.find((s) => new RegExp(`^${Constants.Schemes.payment}\\s+`, 'i').test(s)) ?? null
216
217
  }
package/src/Method.ts CHANGED
@@ -59,6 +59,7 @@ export type Client<
59
59
  method extends Method = Method,
60
60
  context extends z.ZodMiniType | undefined = z.ZodMiniType | undefined,
61
61
  > = method & {
62
+ canHandleChallenge?: CanHandleChallengeFn | undefined
62
63
  context?: context
63
64
  createCredential: CreateCredentialFn<
64
65
  method,
@@ -130,18 +131,21 @@ export type Server<
130
131
  defaults extends ExactPartial<z.input<method['schema']['request']>> = {},
131
132
  transportOverride = undefined,
132
133
  extensions extends object = {},
134
+ alias extends string | undefined = string | undefined,
133
135
  > = method & {
136
+ alias?: alias | undefined
134
137
  authorize?: AuthorizeFn<method> | undefined
135
138
  defaults?: defaults | undefined
136
139
  extensions?: extensions | undefined
137
140
  html?: Html.Options | undefined
141
+ preflight?: PreflightFn<method> | undefined
138
142
  request?: RequestFn<method> | undefined
139
143
  respond?: RespondFn<method> | undefined
140
144
  stableBinding?: StableBindingFn<method> | undefined
141
145
  transport?: transportOverride | undefined
142
146
  verify: VerifyFn<method>
143
147
  }
144
- export type AnyServer = Server<any, any, any, any>
148
+ export type AnyServer = Server<any, any, any, any, any>
145
149
 
146
150
  /** Credential creation function for a single method. */
147
151
  export type CreateCredentialFn<method extends Method, context = unknown> = (
@@ -154,6 +158,9 @@ export type CreateCredentialFn<method extends Method, context = unknown> = (
154
158
  } & ([keyof context] extends [never] ? unknown : { context: context }),
155
159
  ) => Promise<string>
156
160
 
161
+ /** Predicate used when multiple client implementations share a wire method/intent. */
162
+ export type CanHandleChallengeFn = (parameters: { challenge: Challenge.Challenge }) => boolean
163
+
157
164
  /** Request transform function for a single method. */
158
165
  export type RequestFn<method extends Method> = (
159
166
  options: RequestContext<method>,
@@ -188,6 +195,22 @@ export type AuthorizeResult = {
188
195
  response?: globalThis.Response | undefined
189
196
  }
190
197
 
198
+ /**
199
+ * Optional HTTP preflight hook for method-specific management requests.
200
+ *
201
+ * Called before the normal challenge/verification path. Returning a response
202
+ * fully handles the request.
203
+ */
204
+ export type PreflightFn<method extends Method> = (parameters: {
205
+ capturedRequest?: CapturedRequest | undefined
206
+ credential: Credential.Credential | null
207
+ expires?: string | undefined
208
+ input: globalThis.Request
209
+ options: z.input<method['schema']['request']>
210
+ realm: string
211
+ secretKey: string
212
+ }) => MaybePromise<globalThis.Response | undefined>
213
+
191
214
  /**
192
215
  * Produces the stable request fields used to bind credentials to a route.
193
216
  *
@@ -252,9 +275,10 @@ export function toClient<
252
275
  const method extends Method,
253
276
  const context extends z.ZodMiniType | undefined = undefined,
254
277
  >(method: method, options: toClient.Options<method, context>): Client<method, context> {
255
- const { context, createCredential } = options
278
+ const { canHandleChallenge, context, createCredential } = options
256
279
  return {
257
280
  ...method,
281
+ canHandleChallenge,
258
282
  context,
259
283
  createCredential,
260
284
  } as Client<method, context>
@@ -262,6 +286,7 @@ export function toClient<
262
286
 
263
287
  export declare namespace toClient {
264
288
  type Options<method extends Method, context extends z.ZodMiniType | undefined = undefined> = {
289
+ canHandleChallenge?: CanHandleChallengeFn | undefined
265
290
  context?: context
266
291
  createCredential: CreateCredentialFn<
267
292
  method,
@@ -291,15 +316,24 @@ export function toServer<
291
316
  const defaults extends RequestDefaults<method> = {},
292
317
  const transportOverride extends Transport.AnyTransport | undefined = undefined,
293
318
  const extensions extends object = {},
319
+ const options extends toServer.Options<
320
+ method,
321
+ defaults,
322
+ transportOverride,
323
+ extensions,
324
+ string | undefined
325
+ > = toServer.Options<method, defaults, transportOverride, extensions, string | undefined>,
294
326
  >(
295
327
  method: method,
296
- options: toServer.Options<method, defaults, transportOverride, extensions>,
297
- ): Server<method, defaults, transportOverride, extensions> {
328
+ options: options,
329
+ ): Server<method, defaults, transportOverride, extensions, toServer.Alias<options>> {
298
330
  const {
331
+ alias,
299
332
  authorize,
300
333
  defaults,
301
334
  extensions,
302
335
  html,
336
+ preflight,
303
337
  request,
304
338
  respond,
305
339
  stableBinding,
@@ -308,29 +342,36 @@ export function toServer<
308
342
  } = options
309
343
  return {
310
344
  ...method,
345
+ alias,
311
346
  authorize,
312
347
  defaults,
313
348
  extensions,
314
349
  html,
350
+ preflight,
315
351
  request,
316
352
  respond,
317
353
  stableBinding,
318
354
  transport,
319
355
  verify,
320
- } as Server<method, defaults, transportOverride, extensions>
356
+ } as Server<method, defaults, transportOverride, extensions, toServer.Alias<options>>
321
357
  }
322
358
 
323
359
  export declare namespace toServer {
360
+ type Alias<options> = options extends { alias: infer alias extends string } ? alias : undefined
361
+
324
362
  type Options<
325
363
  method extends Method,
326
364
  defaults extends RequestDefaults<method> = {},
327
365
  transportOverride extends Transport.AnyTransport | undefined = undefined,
328
366
  extensions extends object = {},
367
+ alias extends string | undefined = undefined,
329
368
  > = {
369
+ alias?: alias | undefined
330
370
  authorize?: AuthorizeFn<method> | undefined
331
371
  defaults?: defaults | undefined
332
372
  extensions?: extensions | undefined
333
373
  html?: Html.Options | undefined
374
+ preflight?: PreflightFn<method> | undefined
334
375
  request?: RequestFn<method> | undefined
335
376
  respond?: RespondFn<method> | undefined
336
377
  stableBinding?: StableBindingFn<method> | undefined
package/src/Receipt.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { Base64 } from 'ox'
2
2
 
3
+ import * as Constants from './Constants.js'
3
4
  import * as z from './zod.js'
4
5
 
5
6
  /**
@@ -126,7 +127,7 @@ export function serialize(receipt: Receipt): string {
126
127
  * ```
127
128
  */
128
129
  export function fromResponse(response: Response): Receipt {
129
- const header = response.headers.get('Payment-Receipt')
130
- if (!header) throw new Error('Missing Payment-Receipt header.')
130
+ const header = response.headers.get(Constants.Headers.paymentReceipt)
131
+ if (!header) throw new Error(`Missing ${Constants.Headers.paymentReceipt} header.`)
131
132
  return deserialize(header)
132
133
  }