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
@@ -2,14 +2,18 @@ import * as http from 'node:http'
2
2
 
3
3
  import { Elysia } from 'elysia'
4
4
  import { Receipt } from 'mppx'
5
- import { Mppx as Mppx_client, session as sessionIntent, tempo as tempo_client } from 'mppx/client'
5
+ import {
6
+ Mppx as Mppx_client,
7
+ sessionLegacy as sessionIntent,
8
+ tempo as tempo_client,
9
+ } from 'mppx/client'
6
10
  import { Mppx, discovery, payment } from 'mppx/elysia'
7
11
  import { tempo as tempo_server } from 'mppx/server'
8
12
  import type { Address } from 'viem'
9
13
  import { Addresses } from 'viem/tempo'
10
14
  import { beforeAll, describe, expect, test } from 'vp/test'
11
15
  import * as TestHttp from '~test/Http.js'
12
- import { deployEscrow } from '~test/tempo/session.js'
16
+ import { deployEscrow } from '~test/tempo/legacy/session.js'
13
17
  import { accounts, asset, client, fundAccount } from '~test/tempo/viem.js'
14
18
 
15
19
  function createServer(app: Elysia<any, any, any, any, any, any, any>) {
@@ -202,7 +206,7 @@ describe('session', () => {
202
206
  function createSessionHarness(feePayer: boolean) {
203
207
  const mppx = Mppx.create({
204
208
  methods: [
205
- tempo_server.session({
209
+ tempo_server.sessionLegacy({
206
210
  getClient: () => client,
207
211
  account: accounts[0],
208
212
  currency: asset,
@@ -218,7 +222,7 @@ describe('session', () => {
218
222
  methods: [
219
223
  sessionIntent({
220
224
  account: accounts[2],
221
- deposit: '10',
225
+ maxDeposit: '10',
222
226
  getClient: () => client,
223
227
  }),
224
228
  ],
@@ -1,13 +1,17 @@
1
1
  import express from 'express'
2
2
  import { Receipt } from 'mppx'
3
- import { Mppx as Mppx_client, session as sessionIntent, tempo as tempo_client } from 'mppx/client'
3
+ import {
4
+ Mppx as Mppx_client,
5
+ sessionLegacy as sessionIntent,
6
+ tempo as tempo_client,
7
+ } from 'mppx/client'
4
8
  import { Mppx, discovery, payment } from 'mppx/express'
5
9
  import { Mppx as Mppx_server, tempo as tempo_server } from 'mppx/server'
6
10
  import type { Address } from 'viem'
7
11
  import { Addresses } from 'viem/tempo'
8
12
  import { beforeAll, describe, expect, test } from 'vp/test'
9
13
  import * as Http from '~test/Http.js'
10
- import { deployEscrow } from '~test/tempo/session.js'
14
+ import { deployEscrow } from '~test/tempo/legacy/session.js'
11
15
  import { accounts, asset, client, fundAccount } from '~test/tempo/viem.js'
12
16
 
13
17
  function createServer(app: express.Express) {
@@ -196,7 +200,7 @@ describe('session', () => {
196
200
  function createSessionHarness(feePayer: boolean) {
197
201
  const mppx = Mppx.create({
198
202
  methods: [
199
- tempo_server.session({
203
+ tempo_server.sessionLegacy({
200
204
  getClient: () => client,
201
205
  account: accounts[0],
202
206
  currency: asset,
@@ -212,7 +216,7 @@ describe('session', () => {
212
216
  methods: [
213
217
  sessionIntent({
214
218
  account: accounts[2],
215
- deposit: '10',
219
+ maxDeposit: '10',
216
220
  getClient: () => client,
217
221
  }),
218
222
  ],
@@ -4,7 +4,7 @@ import { Challenge, Credential, Method, Receipt, z } from 'mppx'
4
4
  import {
5
5
  evm as evm_client,
6
6
  Mppx as Mppx_client,
7
- session as sessionIntent,
7
+ sessionLegacy as sessionIntent,
8
8
  tempo as tempo_client,
9
9
  } from 'mppx/client'
10
10
  import { Mppx, discovery, payment } from 'mppx/hono'
@@ -19,7 +19,7 @@ import type { Address } from 'viem'
19
19
  import { Addresses } from 'viem/tempo'
20
20
  import { beforeAll, describe, expect, test } from 'vp/test'
21
21
  import * as Http from '~test/Http.js'
22
- import { deployEscrow } from '~test/tempo/session.js'
22
+ import { deployEscrow } from '~test/tempo/legacy/session.js'
23
23
  import { accounts, asset, client, fundAccount } from '~test/tempo/viem.js'
24
24
 
25
25
  function createServer(app: Hono) {
@@ -391,7 +391,7 @@ describe('session', () => {
391
391
  function createSessionHarness(feePayer: boolean) {
392
392
  const mppx = Mppx.create({
393
393
  methods: [
394
- tempo_server.session({
394
+ tempo_server.sessionLegacy({
395
395
  getClient: () => client,
396
396
  account: accounts[0],
397
397
  currency: asset,
@@ -407,7 +407,7 @@ describe('session', () => {
407
407
  methods: [
408
408
  sessionIntent({
409
409
  account: accounts[2],
410
- deposit: '10',
410
+ maxDeposit: '10',
411
411
  getClient: () => client,
412
412
  }),
413
413
  ],
@@ -1,14 +1,18 @@
1
1
  import * as http from 'node:http'
2
2
 
3
3
  import { Challenge, Credential, Receipt } from 'mppx'
4
- import { Mppx as Mppx_client, session as sessionIntent, tempo as tempo_client } from 'mppx/client'
4
+ import {
5
+ Mppx as Mppx_client,
6
+ sessionLegacy as sessionIntent,
7
+ tempo as tempo_client,
8
+ } from 'mppx/client'
5
9
  import { Mppx, discovery, payment } from 'mppx/nextjs'
6
10
  import { tempo as tempo_server } from 'mppx/server'
7
11
  import type { Address } from 'viem'
8
12
  import { Addresses } from 'viem/tempo'
9
13
  import { beforeAll, describe, expect, test } from 'vp/test'
10
14
  import * as TestHttp from '~test/Http.js'
11
- import { deployEscrow } from '~test/tempo/session.js'
15
+ import { deployEscrow } from '~test/tempo/legacy/session.js'
12
16
  import { accounts, asset, chain, client, fundAccount } from '~test/tempo/viem.js'
13
17
 
14
18
  function createServer(handler: (request: Request) => Promise<Response> | Response) {
@@ -279,7 +283,7 @@ describe('session', () => {
279
283
  function createSessionHarness(feePayer: boolean) {
280
284
  const mppx = Mppx.create({
281
285
  methods: [
282
- tempo_server.session({
286
+ tempo_server.sessionLegacy({
283
287
  getClient: () => client,
284
288
  account: accounts[0],
285
289
  currency: asset,
@@ -295,7 +299,7 @@ describe('session', () => {
295
299
  methods: [
296
300
  sessionIntent({
297
301
  account: accounts[2],
298
- deposit: '10',
302
+ maxDeposit: '10',
299
303
  getClient: () => client,
300
304
  }),
301
305
  ],
@@ -3,20 +3,20 @@ import { Mppx as Mppx_client, tempo as tempo_client } from 'mppx/client'
3
3
  import { Mppx as Mppx_server, tempo as tempo_server } from 'mppx/server'
4
4
  import type { Address } from 'viem'
5
5
  import { afterEach, beforeAll, describe, expect, test } from 'vp/test'
6
- import { nodeEnv } from '~test/config.js'
6
+ import { tempoNetwork } from '~test/config.js'
7
7
  import * as Http from '~test/Http.js'
8
- import { deployEscrow } from '~test/tempo/session.js'
8
+ import { deployEscrow } from '~test/tempo/legacy/session.js'
9
9
  import { accounts, asset, client } from '~test/tempo/viem.js'
10
10
 
11
- import { sessionManager } from '../tempo/client/SessionManager.js'
12
- import { deserializeSessionReceipt } from '../tempo/session/Receipt.js'
11
+ import { sessionManager } from '../tempo/legacy/client/index.js'
12
+ import { deserializeSessionReceipt } from '../tempo/session/precompile/Protocol.js'
13
13
  import * as ApiProxy from './Proxy.js'
14
14
  import * as Service from './Service.js'
15
15
  import { anthropic } from './services/anthropic.js'
16
16
  import { openai } from './services/openai.js'
17
17
 
18
18
  const secretKey = 'test-secret-key'
19
- const isLocalnet = nodeEnv === 'localnet'
19
+ const isLocalnet = tempoNetwork === 'localnet'
20
20
 
21
21
  const mppx_server = Mppx_server.create({
22
22
  methods: [
@@ -907,7 +907,7 @@ describe.runIf(isLocalnet)('plain HTTP session proxy', () => {
907
907
 
908
908
  const sessionHandler = Mppx_server.create({
909
909
  methods: [
910
- tempo_server.session({
910
+ tempo_server.sessionLegacy({
911
911
  account: accounts[0],
912
912
  currency: asset,
913
913
  escrowContract: sessionEscrow,
@@ -967,7 +967,7 @@ describe.runIf(isLocalnet)('plain HTTP session proxy', () => {
967
967
 
968
968
  const sessionHandler = Mppx_server.create({
969
969
  methods: [
970
- tempo_server.session({
970
+ tempo_server.sessionLegacy({
971
971
  account: accounts[0],
972
972
  currency: asset,
973
973
  escrowContract: sessionEscrow,
@@ -997,7 +997,7 @@ describe.runIf(isLocalnet)('plain HTTP session proxy', () => {
997
997
  const sessionClient = Mppx_client.create({
998
998
  polyfill: false,
999
999
  methods: [
1000
- tempo_client({
1000
+ tempo_client.sessionLegacy.method({
1001
1001
  account: accounts[1],
1002
1002
  getClient: () => client,
1003
1003
  maxDeposit: '2',
@@ -34,6 +34,22 @@ const mockChargeB = Method.from({
34
34
  },
35
35
  })
36
36
 
37
+ const mockSession = Method.from({
38
+ name: 'tempo',
39
+ intent: 'session',
40
+ schema: {
41
+ credential: {
42
+ payload: z.object({ token: z.string() }),
43
+ },
44
+ request: z.object({
45
+ amount: z.string(),
46
+ currency: z.string(),
47
+ methodDetails: z.object({ sessionProtocol: z.string() }),
48
+ unitType: z.string(),
49
+ }),
50
+ },
51
+ })
52
+
37
53
  const alphaMethod = Method.toServer(mockChargeA, {
38
54
  async verify() {
39
55
  return {
@@ -56,6 +72,29 @@ const betaMethod = Method.toServer(mockChargeB, {
56
72
  },
57
73
  })
58
74
 
75
+ const tip1034SessionMethod = Method.toServer(mockSession, {
76
+ async verify() {
77
+ return {
78
+ method: 'tempo',
79
+ reference: 'tx',
80
+ status: 'success' as const,
81
+ timestamp: new Date().toISOString(),
82
+ }
83
+ },
84
+ })
85
+
86
+ const legacySessionMethod = Method.toServer(mockSession, {
87
+ alias: 'sessionLegacy',
88
+ async verify() {
89
+ return {
90
+ method: 'tempo',
91
+ reference: 'tx',
92
+ status: 'success' as const,
93
+ timestamp: new Date().toISOString(),
94
+ }
95
+ },
96
+ })
97
+
59
98
  const secretKey = 'test-secret'
60
99
  const realm = 'api.example.com'
61
100
 
@@ -105,6 +144,21 @@ describe('Mppx type tests', () => {
105
144
  expectTypeOf(mppx.beta.charge).toBeFunction()
106
145
  })
107
146
 
147
+ test('aliased duplicate handlers are accessible by nested and slash keys', () => {
148
+ const mppx = Mppx.create({
149
+ methods: [tip1034SessionMethod, legacySessionMethod],
150
+ realm,
151
+ secretKey,
152
+ })
153
+
154
+ expectTypeOf(mppx.tempo.session).toBeFunction()
155
+ expectTypeOf(mppx.tempo.sessionLegacy).toBeFunction()
156
+ expectTypeOf(mppx['tempo/session']).toBeFunction()
157
+ expectTypeOf(mppx['tempo/sessionLegacy']).toBeFunction()
158
+ expectTypeOf(mppx.challenge.tempo.session).toBeFunction()
159
+ expectTypeOf(mppx.challenge.tempo.sessionLegacy).toBeFunction()
160
+ })
161
+
108
162
  test('slash key handlers are accessible', () => {
109
163
  const mppx = Mppx.create({ methods: [alphaMethod, betaMethod], realm, secretKey })
110
164
 
@@ -3,7 +3,7 @@ import * as http from 'node:http'
3
3
  import { Challenge, Credential, Errors, Method, Receipt, z } from 'mppx'
4
4
  import {
5
5
  Mppx as Mppx_client,
6
- session as tempo_session_client,
6
+ sessionLegacy as tempo_session_client,
7
7
  tempo as tempo_client,
8
8
  } from 'mppx/client'
9
9
  import { Types as evm_Types } from 'mppx/evm'
@@ -12,10 +12,10 @@ import { Header as x402_Header, Types as x402_Types, type PaymentPayload } from
12
12
  import { getTransactionReceipt } from 'viem/actions'
13
13
  import { describe, expect, test } from 'vp/test'
14
14
  import * as Http from '~test/Http.js'
15
- import { deployEscrow } from '~test/tempo/session.js'
15
+ import { deployEscrow } from '~test/tempo/legacy/session.js'
16
16
  import { accounts, asset, client } from '~test/tempo/viem.js'
17
17
 
18
- import type { SessionReceipt } from '../tempo/session/Types.js'
18
+ import type { SessionReceipt } from '../tempo/session/precompile/Protocol.js'
19
19
  import * as x402_RouteBinding from '../x402/internal/RouteBinding.js'
20
20
 
21
21
  const realm = 'api.example.com'
@@ -1837,6 +1837,22 @@ describe('compose', () => {
1837
1837
  },
1838
1838
  })
1839
1839
 
1840
+ const mockSession = Method.from({
1841
+ name: 'tempo',
1842
+ intent: 'session',
1843
+ schema: {
1844
+ credential: {
1845
+ payload: z.object({ token: z.string() }),
1846
+ },
1847
+ request: z.object({
1848
+ amount: z.string(),
1849
+ currency: z.string(),
1850
+ methodDetails: z.object({ sessionProtocol: z.optional(z.string()) }),
1851
+ unitType: z.string(),
1852
+ }),
1853
+ },
1854
+ })
1855
+
1840
1856
  function mockReceipt(name: string) {
1841
1857
  return {
1842
1858
  method: name,
@@ -1858,6 +1874,19 @@ describe('compose', () => {
1858
1874
  },
1859
1875
  })
1860
1876
 
1877
+ const tip1034SessionMethod = Method.toServer(mockSession, {
1878
+ async verify() {
1879
+ return mockReceipt('v2')
1880
+ },
1881
+ })
1882
+
1883
+ const legacySessionMethod = Method.toServer(mockSession, {
1884
+ alias: 'sessionLegacy',
1885
+ async verify() {
1886
+ return mockReceipt('v1')
1887
+ },
1888
+ })
1889
+
1861
1890
  const x402Method = evm.charge({
1862
1891
  currency: evm.assets.baseSepolia.USDC,
1863
1892
  recipient: accounts[0].address,
@@ -1889,6 +1918,19 @@ describe('compose', () => {
1889
1918
  recipient: '0x0000000000000000000000000000000000000002',
1890
1919
  }
1891
1920
 
1921
+ const sessionChallengeOpts = {
1922
+ amount: '100',
1923
+ currency: asset,
1924
+ expires: new Date(Date.now() + 60_000),
1925
+ methodDetails: { sessionProtocol: 'v2' },
1926
+ unitType: 'request',
1927
+ }
1928
+
1929
+ const legacySessionChallengeOpts = {
1930
+ ...sessionChallengeOpts,
1931
+ methodDetails: { sessionProtocol: 'v1' },
1932
+ }
1933
+
1892
1934
  test('returns 402 with multiple WWW-Authenticate headers when no credential', async () => {
1893
1935
  const mppx = Mppx.create({ methods: [alphaMethod, betaMethod], realm, secretKey })
1894
1936
 
@@ -1905,6 +1947,157 @@ describe('compose', () => {
1905
1947
  expect(wwwAuth).toContain('method="beta"')
1906
1948
  })
1907
1949
 
1950
+ test('broadcasts duplicate tempo/session variants in compose order', async () => {
1951
+ const mppx = Mppx.create({
1952
+ methods: [tip1034SessionMethod, legacySessionMethod],
1953
+ realm,
1954
+ secretKey,
1955
+ })
1956
+
1957
+ const result = await mppx.compose(
1958
+ [mppx.tempo.session, sessionChallengeOpts],
1959
+ [mppx.tempo.sessionLegacy, legacySessionChallengeOpts],
1960
+ )(new Request('https://example.com/resource'))
1961
+
1962
+ expect(result.status).toBe(402)
1963
+ if (result.status !== 402) throw new Error()
1964
+
1965
+ const challenges = Challenge.fromResponseList(result.challenge)
1966
+ expect(challenges.map((challenge) => challenge.request.methodDetails)).toEqual([
1967
+ { sessionProtocol: 'v2' },
1968
+ { sessionProtocol: 'v1' },
1969
+ ])
1970
+ })
1971
+
1972
+ test('keeps duplicate tempo/session variants when Accept-Payment allows tempo/session', async () => {
1973
+ const mppx = Mppx.create({
1974
+ methods: [tip1034SessionMethod, legacySessionMethod],
1975
+ realm,
1976
+ secretKey,
1977
+ })
1978
+
1979
+ const result = await mppx.compose(
1980
+ [mppx.tempo.session, sessionChallengeOpts],
1981
+ [mppx.tempo.sessionLegacy, legacySessionChallengeOpts],
1982
+ )(
1983
+ new Request('https://example.com/resource', {
1984
+ headers: { 'Accept-Payment': 'tempo/session' },
1985
+ }),
1986
+ )
1987
+
1988
+ expect(result.status).toBe(402)
1989
+ if (result.status !== 402) throw new Error()
1990
+
1991
+ expect(Challenge.fromResponseList(result.challenge)).toHaveLength(2)
1992
+ })
1993
+
1994
+ test('uses TIP-1034 as the bare tempo/session handler regardless of registration order', async () => {
1995
+ const mppx = Mppx.create({
1996
+ methods: [legacySessionMethod, tip1034SessionMethod],
1997
+ realm,
1998
+ secretKey,
1999
+ })
2000
+
2001
+ const result = await mppx.compose([mppx.tempo.session, sessionChallengeOpts])(
2002
+ new Request('https://example.com/resource'),
2003
+ )
2004
+
2005
+ expect(result.status).toBe(402)
2006
+ if (result.status !== 402) throw new Error()
2007
+ expect(Challenge.fromResponse(result.challenge).request.methodDetails).toEqual({
2008
+ sessionProtocol: 'v2',
2009
+ })
2010
+ })
2011
+
2012
+ test('rejects cross-protocol tempo/session credential replay', async () => {
2013
+ const mppx = Mppx.create({
2014
+ methods: [tip1034SessionMethod, legacySessionMethod],
2015
+ realm,
2016
+ secretKey,
2017
+ })
2018
+ const tip1034ChallengeResponse = await mppx.compose([mppx.tempo.session, sessionChallengeOpts])(
2019
+ new Request('https://example.com/resource'),
2020
+ )
2021
+ expect(tip1034ChallengeResponse.status).toBe(402)
2022
+ if (tip1034ChallengeResponse.status !== 402) throw new Error()
2023
+ const tip1034Challenge = Challenge.fromResponse(tip1034ChallengeResponse.challenge)
2024
+
2025
+ const credential = Credential.serialize({
2026
+ challenge: tip1034Challenge,
2027
+ payload: { token: 'valid' },
2028
+ })
2029
+ const legacyResult = await mppx.compose([mppx.tempo.sessionLegacy, legacySessionChallengeOpts])(
2030
+ new Request('https://example.com/resource', {
2031
+ headers: { Authorization: credential },
2032
+ }),
2033
+ )
2034
+
2035
+ expect(legacyResult.status).toBe(402)
2036
+ })
2037
+
2038
+ test('verifyCredential dispatches duplicate tempo/session variants by sessionProtocol', async () => {
2039
+ const mppx = Mppx.create({
2040
+ methods: [tip1034SessionMethod, legacySessionMethod],
2041
+ realm,
2042
+ secretKey,
2043
+ })
2044
+ const tip1034Challenge = await mppx.challenge.tempo.session(sessionChallengeOpts)
2045
+ const legacyChallenge = await mppx.challenge.tempo.sessionLegacy(legacySessionChallengeOpts)
2046
+
2047
+ const tip1034Receipt = await mppx.verifyCredential(
2048
+ Credential.serialize({
2049
+ challenge: tip1034Challenge,
2050
+ payload: { token: 'valid' },
2051
+ }),
2052
+ )
2053
+ const legacyReceipt = await mppx.verifyCredential(
2054
+ Credential.serialize({
2055
+ challenge: legacyChallenge,
2056
+ payload: { token: 'valid' },
2057
+ }),
2058
+ )
2059
+
2060
+ expect(tip1034Receipt.reference).toBe('tx-v2')
2061
+ expect(legacyReceipt.reference).toBe('tx-v1')
2062
+ })
2063
+
2064
+ test('verifyCredential routes unmarked tempo/session challenges to legacy v1', async () => {
2065
+ const mppx = Mppx.create({
2066
+ methods: [legacySessionMethod, tip1034SessionMethod],
2067
+ realm,
2068
+ secretKey,
2069
+ })
2070
+ const unmarkedLegacyChallenge = await mppx.challenge.tempo.sessionLegacy({
2071
+ ...legacySessionChallengeOpts,
2072
+ methodDetails: {},
2073
+ })
2074
+
2075
+ await expect(
2076
+ mppx.verifyCredential(
2077
+ Credential.serialize({
2078
+ challenge: unmarkedLegacyChallenge,
2079
+ payload: { token: 'valid' },
2080
+ }),
2081
+ ),
2082
+ ).resolves.toMatchObject({ reference: 'tx-v1' })
2083
+ })
2084
+
2085
+ test('verifyCredential rejects unknown tempo/session protocol markers', async () => {
2086
+ const mppx = Mppx.create({
2087
+ methods: [legacySessionMethod, tip1034SessionMethod],
2088
+ realm,
2089
+ secretKey,
2090
+ })
2091
+ const challenge = await mppx.challenge.tempo.session({
2092
+ ...sessionChallengeOpts,
2093
+ methodDetails: { sessionProtocol: 'future' },
2094
+ })
2095
+
2096
+ await expect(
2097
+ mppx.verifyCredential(Credential.serialize({ challenge, payload: { token: 'valid' } })),
2098
+ ).rejects.toThrow('no registered method for tempo/session')
2099
+ })
2100
+
1908
2101
  test('returns composed x402 challenge headers when no credential', async () => {
1909
2102
  const mppx = Mppx.create({ methods: [x402Method], realm, secretKey })
1910
2103
 
@@ -3983,6 +4176,80 @@ describe('realm auto-detection', () => {
3983
4176
  }
3984
4177
  })
3985
4178
 
4179
+ // A raw request line can carry a protocol-relative or embedded-authority
4180
+ // target that WHATWG URL would resolve into a foreign host, which would then
4181
+ // be auto-detected as the challenge realm. The realm must stay bound to the
4182
+ // Host header.
4183
+ test.each([
4184
+ { name: 'protocol-relative', path: '//evil.com/resource' },
4185
+ { name: 'embedded authority', path: '//first.example//evil.com/resource' },
4186
+ ])('ignores $name request targets when deriving realm in node listeners', async ({ path }) => {
4187
+ const handler = Mppx.create({ methods: [mockMethod], secretKey })
4188
+ const server = await Http.createServer(async (req, res) => {
4189
+ const result = await Mppx.toNodeListener(
4190
+ handler.charge({
4191
+ amount: '100',
4192
+ currency: '0x0000000000000000000000000000000000000001',
4193
+ recipient: '0x0000000000000000000000000000000000000002',
4194
+ }),
4195
+ )(req, res)
4196
+
4197
+ if (result.status !== 402) res.end('OK')
4198
+ })
4199
+
4200
+ try {
4201
+ const rawResponse = await new Promise<{
4202
+ body: string
4203
+ headers: http.IncomingHttpHeaders
4204
+ statusCode: number
4205
+ }>((resolve, reject) => {
4206
+ const request = http.request(
4207
+ {
4208
+ host: '127.0.0.1',
4209
+ port: server.port,
4210
+ method: 'GET',
4211
+ path,
4212
+ headers: { Host: `localhost:${server.port}` },
4213
+ },
4214
+ (response) => {
4215
+ const chunks: Buffer[] = []
4216
+ response.on('data', (chunk) => chunks.push(Buffer.from(chunk)))
4217
+ response.on('end', () => {
4218
+ resolve({
4219
+ body: Buffer.concat(chunks).toString('utf8'),
4220
+ headers: response.headers,
4221
+ statusCode: response.statusCode ?? 0,
4222
+ })
4223
+ })
4224
+ },
4225
+ )
4226
+
4227
+ request.on('error', reject)
4228
+ request.end()
4229
+ })
4230
+
4231
+ const headers = new Headers()
4232
+ for (const [name, value] of Object.entries(rawResponse.headers)) {
4233
+ if (Array.isArray(value)) {
4234
+ for (const item of value) headers.append(name, item)
4235
+ } else if (value !== undefined) {
4236
+ headers.append(name, value)
4237
+ }
4238
+ }
4239
+
4240
+ const challenge = Challenge.fromResponse(
4241
+ new Response(rawResponse.body, {
4242
+ status: rawResponse.statusCode,
4243
+ headers,
4244
+ }),
4245
+ )
4246
+
4247
+ expect(challenge.realm).toBe('localhost')
4248
+ } finally {
4249
+ server.close()
4250
+ }
4251
+ })
4252
+
3986
4253
  test('credential verifies across different casing of same host', async () => {
3987
4254
  const handler = Mppx.create({ methods: [mockMethod], secretKey })
3988
4255
 
@@ -5104,7 +5371,7 @@ describe('verifyCredential', () => {
5104
5371
  const escrowContract = await deployEscrow()
5105
5372
  const server = Mppx.create({
5106
5373
  methods: [
5107
- tempo.session({
5374
+ tempo.sessionLegacy({
5108
5375
  store: Store.memory(),
5109
5376
  getClient: () => client,
5110
5377
  account: accounts[0],
@@ -5121,7 +5388,7 @@ describe('verifyCredential', () => {
5121
5388
  methods: [
5122
5389
  tempo_session_client({
5123
5390
  account: accounts[1],
5124
- deposit: '10',
5391
+ maxDeposit: '10',
5125
5392
  getClient: () => client,
5126
5393
  }),
5127
5394
  ],
@@ -5167,7 +5434,7 @@ describe('verifyCredential', () => {
5167
5434
  const escrowContract = await deployEscrow()
5168
5435
  const server = Mppx.create({
5169
5436
  methods: [
5170
- tempo.session({
5437
+ tempo.sessionLegacy({
5171
5438
  store: Store.memory(),
5172
5439
  getClient: () => client,
5173
5440
  account: accounts[0],
@@ -5185,7 +5452,7 @@ describe('verifyCredential', () => {
5185
5452
  methods: [
5186
5453
  tempo_session_client({
5187
5454
  account: accounts[1],
5188
- deposit: '10',
5455
+ maxDeposit: '10',
5189
5456
  getClient: () => client,
5190
5457
  }),
5191
5458
  ],