mppx 0.6.31 → 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 (477) hide show
  1. package/CHANGELOG.md +17 -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/Response.d.ts.map +1 -1
  62. package/dist/server/Response.js +2 -1
  63. package/dist/server/Response.js.map +1 -1
  64. package/dist/server/Transport.d.ts.map +1 -1
  65. package/dist/server/Transport.js +4 -3
  66. package/dist/server/Transport.js.map +1 -1
  67. package/dist/server/index.d.ts +1 -0
  68. package/dist/server/index.d.ts.map +1 -1
  69. package/dist/server/index.js +1 -0
  70. package/dist/server/index.js.map +1 -1
  71. package/dist/stripe/client/Charge.d.ts +1 -1
  72. package/dist/stripe/client/Charge.d.ts.map +1 -1
  73. package/dist/stripe/client/Charge.js +3 -1
  74. package/dist/stripe/client/Charge.js.map +1 -1
  75. package/dist/stripe/server/Charge.d.ts +1 -1
  76. package/dist/stripe/server/Charge.d.ts.map +1 -1
  77. package/dist/stripe/server/Charge.js +9 -2
  78. package/dist/stripe/server/Charge.js.map +1 -1
  79. package/dist/stripe/server/Methods.d.ts +1 -1
  80. package/dist/stripe/server/Methods.d.ts.map +1 -1
  81. package/dist/stripe/server/internal/html.gen.d.ts +1 -1
  82. package/dist/stripe/server/internal/html.gen.d.ts.map +1 -1
  83. package/dist/stripe/server/internal/html.gen.js +1 -1
  84. package/dist/stripe/server/internal/html.gen.js.map +1 -1
  85. package/dist/tempo/Methods.d.ts +18 -0
  86. package/dist/tempo/Methods.d.ts.map +1 -1
  87. package/dist/tempo/Methods.js +16 -1
  88. package/dist/tempo/Methods.js.map +1 -1
  89. package/dist/tempo/client/Charge.d.ts +6 -0
  90. package/dist/tempo/client/Charge.d.ts.map +1 -1
  91. package/dist/tempo/client/Charge.js +9 -2
  92. package/dist/tempo/client/Charge.js.map +1 -1
  93. package/dist/tempo/client/Methods.d.ts +36 -7
  94. package/dist/tempo/client/Methods.d.ts.map +1 -1
  95. package/dist/tempo/client/Methods.js +12 -5
  96. package/dist/tempo/client/Methods.js.map +1 -1
  97. package/dist/tempo/client/index.d.ts +7 -4
  98. package/dist/tempo/client/index.d.ts.map +1 -1
  99. package/dist/tempo/client/index.js +5 -3
  100. package/dist/tempo/client/index.js.map +1 -1
  101. package/dist/tempo/index.d.ts +1 -0
  102. package/dist/tempo/index.d.ts.map +1 -1
  103. package/dist/tempo/index.js +1 -0
  104. package/dist/tempo/index.js.map +1 -1
  105. package/dist/tempo/internal/fee-payer.d.ts +21 -1
  106. package/dist/tempo/internal/fee-payer.d.ts.map +1 -1
  107. package/dist/tempo/internal/fee-payer.js +109 -4
  108. package/dist/tempo/internal/fee-payer.js.map +1 -1
  109. package/dist/tempo/{client → legacy/client}/ChannelOps.d.ts +19 -6
  110. package/dist/tempo/legacy/client/ChannelOps.d.ts.map +1 -0
  111. package/dist/tempo/{client → legacy/client}/ChannelOps.js +9 -3
  112. package/dist/tempo/legacy/client/ChannelOps.js.map +1 -0
  113. package/dist/tempo/{client → legacy/client}/Session.d.ts +23 -4
  114. package/dist/tempo/legacy/client/Session.d.ts.map +1 -0
  115. package/dist/tempo/{client → legacy/client}/Session.js +14 -7
  116. package/dist/tempo/legacy/client/Session.js.map +1 -0
  117. package/dist/tempo/{client → legacy/client}/SessionManager.d.ts +20 -5
  118. package/dist/tempo/legacy/client/SessionManager.d.ts.map +1 -0
  119. package/dist/tempo/{client → legacy/client}/SessionManager.js +20 -16
  120. package/dist/tempo/legacy/client/SessionManager.js.map +1 -0
  121. package/dist/tempo/legacy/client/index.d.ts +7 -0
  122. package/dist/tempo/legacy/client/index.d.ts.map +1 -0
  123. package/dist/tempo/legacy/client/index.js +5 -0
  124. package/dist/tempo/legacy/client/index.js.map +1 -0
  125. package/dist/tempo/legacy/index.d.ts +7 -0
  126. package/dist/tempo/legacy/index.d.ts.map +1 -0
  127. package/dist/tempo/legacy/index.js +7 -0
  128. package/dist/tempo/legacy/index.js.map +1 -0
  129. package/dist/tempo/{server → legacy/server}/Session.d.ts +28 -11
  130. package/dist/tempo/legacy/server/Session.d.ts.map +1 -0
  131. package/dist/tempo/{server → legacy/server}/Session.js +12 -10
  132. package/dist/tempo/legacy/server/Session.js.map +1 -0
  133. package/dist/tempo/legacy/server/index.d.ts +5 -0
  134. package/dist/tempo/legacy/server/index.d.ts.map +1 -0
  135. package/dist/tempo/legacy/server/index.js +5 -0
  136. package/dist/tempo/legacy/server/index.js.map +1 -0
  137. package/dist/tempo/{session → legacy/session}/Chain.d.ts +30 -23
  138. package/dist/tempo/legacy/session/Chain.d.ts.map +1 -0
  139. package/dist/tempo/{session → legacy/session}/Chain.js +12 -11
  140. package/dist/tempo/legacy/session/Chain.js.map +1 -0
  141. package/dist/tempo/{session → legacy/session}/Channel.d.ts +1 -0
  142. package/dist/tempo/legacy/session/Channel.d.ts.map +1 -0
  143. package/dist/tempo/legacy/session/Channel.js.map +1 -0
  144. package/dist/tempo/legacy/session/ChannelStore.d.ts +22 -0
  145. package/dist/tempo/legacy/session/ChannelStore.d.ts.map +1 -0
  146. package/dist/tempo/legacy/session/ChannelStore.js +6 -0
  147. package/dist/tempo/legacy/session/ChannelStore.js.map +1 -0
  148. package/dist/tempo/legacy/session/Types.d.ts +73 -0
  149. package/dist/tempo/legacy/session/Types.d.ts.map +1 -0
  150. package/dist/tempo/legacy/session/Types.js.map +1 -0
  151. package/dist/tempo/{session → legacy/session}/Voucher.d.ts +4 -4
  152. package/dist/tempo/legacy/session/Voucher.d.ts.map +1 -0
  153. package/dist/tempo/{session → legacy/session}/Voucher.js +1 -1
  154. package/dist/tempo/legacy/session/Voucher.js.map +1 -0
  155. package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts +1 -0
  156. package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts.map +1 -1
  157. package/dist/tempo/{session → legacy/session}/escrow.abi.js +1 -0
  158. package/dist/tempo/legacy/session/escrow.abi.js.map +1 -0
  159. package/dist/tempo/legacy/session/index.d.ts +9 -0
  160. package/dist/tempo/legacy/session/index.d.ts.map +1 -0
  161. package/dist/tempo/legacy/session/index.js +9 -0
  162. package/dist/tempo/legacy/session/index.js.map +1 -0
  163. package/dist/tempo/server/Charge.d.ts +1 -1
  164. package/dist/tempo/server/Charge.d.ts.map +1 -1
  165. package/dist/tempo/server/Charge.js +13 -16
  166. package/dist/tempo/server/Charge.js.map +1 -1
  167. package/dist/tempo/server/Methods.d.ts +63 -6
  168. package/dist/tempo/server/Methods.d.ts.map +1 -1
  169. package/dist/tempo/server/Methods.js +36 -8
  170. package/dist/tempo/server/Methods.js.map +1 -1
  171. package/dist/tempo/server/Subscription.d.ts +1 -1
  172. package/dist/tempo/server/Subscription.d.ts.map +1 -1
  173. package/dist/tempo/server/index.d.ts +6 -5
  174. package/dist/tempo/server/index.d.ts.map +1 -1
  175. package/dist/tempo/server/index.js +5 -5
  176. package/dist/tempo/server/index.js.map +1 -1
  177. package/dist/tempo/server/internal/html.gen.d.ts +1 -1
  178. package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
  179. package/dist/tempo/server/internal/html.gen.js +1 -1
  180. package/dist/tempo/server/internal/html.gen.js.map +1 -1
  181. package/dist/tempo/server/internal/request-body.d.ts +7 -2
  182. package/dist/tempo/server/internal/request-body.d.ts.map +1 -1
  183. package/dist/tempo/server/internal/request-body.js +20 -3
  184. package/dist/tempo/server/internal/request-body.js.map +1 -1
  185. package/dist/tempo/server/internal/transport.d.ts +8 -4
  186. package/dist/tempo/server/internal/transport.d.ts.map +1 -1
  187. package/dist/tempo/server/internal/transport.js +8 -7
  188. package/dist/tempo/server/internal/transport.js.map +1 -1
  189. package/dist/tempo/session/Snapshot.d.ts +32 -0
  190. package/dist/tempo/session/Snapshot.d.ts.map +1 -0
  191. package/dist/tempo/session/Snapshot.js +37 -0
  192. package/dist/tempo/session/Snapshot.js.map +1 -0
  193. package/dist/tempo/session/client/ChannelOps.d.ts +82 -0
  194. package/dist/tempo/session/client/ChannelOps.d.ts.map +1 -0
  195. package/dist/tempo/session/client/ChannelOps.js +204 -0
  196. package/dist/tempo/session/client/ChannelOps.js.map +1 -0
  197. package/dist/tempo/session/client/CredentialState.d.ts +262 -0
  198. package/dist/tempo/session/client/CredentialState.d.ts.map +1 -0
  199. package/dist/tempo/session/client/CredentialState.js +417 -0
  200. package/dist/tempo/session/client/CredentialState.js.map +1 -0
  201. package/dist/tempo/session/client/ReceiptCoordinator.d.ts +26 -0
  202. package/dist/tempo/session/client/ReceiptCoordinator.d.ts.map +1 -0
  203. package/dist/tempo/session/client/ReceiptCoordinator.js +61 -0
  204. package/dist/tempo/session/client/ReceiptCoordinator.js.map +1 -0
  205. package/dist/tempo/session/client/Runtime.d.ts +464 -0
  206. package/dist/tempo/session/client/Runtime.d.ts.map +1 -0
  207. package/dist/tempo/session/client/Runtime.js +499 -0
  208. package/dist/tempo/session/client/Runtime.js.map +1 -0
  209. package/dist/tempo/session/client/Session.d.ts +132 -0
  210. package/dist/tempo/session/client/Session.d.ts.map +1 -0
  211. package/dist/tempo/session/client/Session.js +55 -0
  212. package/dist/tempo/session/client/Session.js.map +1 -0
  213. package/dist/tempo/session/client/SessionManager.d.ts +120 -0
  214. package/dist/tempo/session/client/SessionManager.d.ts.map +1 -0
  215. package/dist/tempo/session/client/SessionManager.js +627 -0
  216. package/dist/tempo/session/client/SessionManager.js.map +1 -0
  217. package/dist/tempo/session/client/Transports.d.ts +449 -0
  218. package/dist/tempo/session/client/Transports.d.ts.map +1 -0
  219. package/dist/tempo/session/client/Transports.js +721 -0
  220. package/dist/tempo/session/client/Transports.js.map +1 -0
  221. package/dist/tempo/session/client/index.d.ts +12 -0
  222. package/dist/tempo/session/client/index.d.ts.map +1 -0
  223. package/dist/tempo/session/client/index.js +5 -0
  224. package/dist/tempo/session/client/index.js.map +1 -0
  225. package/dist/tempo/session/index.d.ts +7 -8
  226. package/dist/tempo/session/index.d.ts.map +1 -1
  227. package/dist/tempo/session/index.js +7 -8
  228. package/dist/tempo/session/index.js.map +1 -1
  229. package/dist/tempo/session/precompile/Chain.d.ts +319 -0
  230. package/dist/tempo/session/precompile/Chain.d.ts.map +1 -0
  231. package/dist/tempo/session/precompile/Chain.js +492 -0
  232. package/dist/tempo/session/precompile/Chain.js.map +1 -0
  233. package/dist/tempo/session/precompile/Channel.d.ts +46 -0
  234. package/dist/tempo/session/precompile/Channel.d.ts.map +1 -0
  235. package/dist/tempo/session/precompile/Channel.js +56 -0
  236. package/dist/tempo/session/precompile/Channel.js.map +1 -0
  237. package/dist/tempo/session/precompile/Protocol.d.ts +308 -0
  238. package/dist/tempo/session/precompile/Protocol.d.ts.map +1 -0
  239. package/dist/tempo/session/precompile/Protocol.js +264 -0
  240. package/dist/tempo/session/precompile/Protocol.js.map +1 -0
  241. package/dist/tempo/session/precompile/Voucher.d.ts +40 -0
  242. package/dist/tempo/session/precompile/Voucher.d.ts.map +1 -0
  243. package/dist/tempo/session/precompile/Voucher.js +126 -0
  244. package/dist/tempo/session/precompile/Voucher.js.map +1 -0
  245. package/dist/tempo/session/precompile/escrow.abi.d.ts +522 -0
  246. package/dist/tempo/session/precompile/escrow.abi.d.ts.map +1 -0
  247. package/dist/tempo/session/precompile/escrow.abi.js +224 -0
  248. package/dist/tempo/session/precompile/escrow.abi.js.map +1 -0
  249. package/dist/tempo/session/precompile/index.d.ts +24 -0
  250. package/dist/tempo/session/precompile/index.d.ts.map +1 -0
  251. package/dist/tempo/session/precompile/index.js +22 -0
  252. package/dist/tempo/session/precompile/index.js.map +1 -0
  253. package/dist/tempo/session/server/ChannelOps.d.ts +56 -0
  254. package/dist/tempo/session/server/ChannelOps.d.ts.map +1 -0
  255. package/dist/tempo/session/server/ChannelOps.js +91 -0
  256. package/dist/tempo/session/server/ChannelOps.js.map +1 -0
  257. package/dist/tempo/session/server/ChannelStore.d.ts +347 -0
  258. package/dist/tempo/session/server/ChannelStore.d.ts.map +1 -0
  259. package/dist/tempo/session/server/ChannelStore.js +404 -0
  260. package/dist/tempo/session/server/ChannelStore.js.map +1 -0
  261. package/dist/tempo/session/server/CredentialVerification.d.ts +85 -0
  262. package/dist/tempo/session/server/CredentialVerification.d.ts.map +1 -0
  263. package/dist/tempo/session/server/CredentialVerification.js +494 -0
  264. package/dist/tempo/session/server/CredentialVerification.js.map +1 -0
  265. package/dist/tempo/session/server/MeteredStream.d.ts +40 -0
  266. package/dist/tempo/session/server/MeteredStream.d.ts.map +1 -0
  267. package/dist/tempo/session/server/MeteredStream.js +42 -0
  268. package/dist/tempo/session/server/MeteredStream.js.map +1 -0
  269. package/dist/tempo/session/server/RequestState.d.ts +208 -0
  270. package/dist/tempo/session/server/RequestState.d.ts.map +1 -0
  271. package/dist/tempo/session/server/RequestState.js +252 -0
  272. package/dist/tempo/session/server/RequestState.js.map +1 -0
  273. package/dist/tempo/session/server/Session.d.ts +169 -0
  274. package/dist/tempo/session/server/Session.d.ts.map +1 -0
  275. package/dist/tempo/session/server/Session.js +351 -0
  276. package/dist/tempo/session/server/Session.js.map +1 -0
  277. package/dist/tempo/session/server/Settlement.d.ts +185 -0
  278. package/dist/tempo/session/server/Settlement.d.ts.map +1 -0
  279. package/dist/tempo/session/server/Settlement.js +250 -0
  280. package/dist/tempo/session/server/Settlement.js.map +1 -0
  281. package/dist/tempo/session/{Sse.d.ts → server/Sse.d.ts} +9 -56
  282. package/dist/tempo/session/server/Sse.d.ts.map +1 -0
  283. package/dist/tempo/session/server/Sse.js +184 -0
  284. package/dist/tempo/session/server/Sse.js.map +1 -0
  285. package/dist/tempo/session/server/Transports.d.ts +89 -0
  286. package/dist/tempo/session/server/Transports.d.ts.map +1 -0
  287. package/dist/tempo/session/server/Transports.js +149 -0
  288. package/dist/tempo/session/server/Transports.js.map +1 -0
  289. package/dist/tempo/session/server/Ws.d.ts +48 -0
  290. package/dist/tempo/session/server/Ws.d.ts.map +1 -0
  291. package/dist/tempo/session/server/Ws.js +244 -0
  292. package/dist/tempo/session/server/Ws.js.map +1 -0
  293. package/dist/tempo/session/server/index.d.ts +4 -0
  294. package/dist/tempo/session/server/index.d.ts.map +1 -0
  295. package/dist/tempo/session/server/index.js +2 -0
  296. package/dist/tempo/session/server/index.js.map +1 -0
  297. package/package.json +6 -1
  298. package/src/Challenge.ts +9 -7
  299. package/src/Constants.ts +58 -0
  300. package/src/Credential.ts +5 -4
  301. package/src/Method.ts +46 -5
  302. package/src/Receipt.ts +3 -2
  303. package/src/cli/cli.test.ts +23 -28
  304. package/src/cli/cli.ts +23 -10
  305. package/src/cli/mcp.test.ts +21 -7
  306. package/src/cli/plugins/tempo.ts +21 -8
  307. package/src/cli/utils.test.ts +25 -1
  308. package/src/cli/utils.ts +10 -0
  309. package/src/client/Methods.ts +5 -2
  310. package/src/client/Mppx.test-d.ts +10 -0
  311. package/src/client/Mppx.test.ts +75 -0
  312. package/src/client/Transport.ts +4 -5
  313. package/src/client/index.ts +11 -1
  314. package/src/client/internal/Fetch.test.ts +29 -4
  315. package/src/client/internal/Fetch.ts +17 -5
  316. package/src/env.d.ts +1 -1
  317. package/src/index.ts +1 -0
  318. package/src/internal/AcceptPayment.test.ts +61 -0
  319. package/src/internal/AcceptPayment.ts +21 -14
  320. package/src/mcp-sdk/client/McpClient.integration.test.ts +8 -7
  321. package/src/mcp-sdk/client/McpClient.test-d.ts +7 -0
  322. package/src/mcp-sdk/client/McpClient.ts +99 -67
  323. package/src/mcp-sdk/client/McpClient.unit.test.ts +131 -0
  324. package/src/middlewares/elysia.test.ts +8 -4
  325. package/src/middlewares/express.test.ts +8 -4
  326. package/src/middlewares/hono.test.ts +4 -4
  327. package/src/middlewares/nextjs.test.ts +8 -4
  328. package/src/proxy/Proxy.test.ts +8 -8
  329. package/src/server/Mppx.test-d.ts +54 -0
  330. package/src/server/Mppx.test.ts +200 -7
  331. package/src/server/Mppx.ts +487 -406
  332. package/src/server/Response.ts +2 -1
  333. package/src/server/Transport.ts +4 -3
  334. package/src/server/index.ts +1 -0
  335. package/src/stripe/client/Charge.test.ts +20 -5
  336. package/src/stripe/client/Charge.ts +6 -2
  337. package/src/stripe/server/Charge.test.ts +114 -1
  338. package/src/stripe/server/Charge.ts +13 -2
  339. package/src/stripe/server/internal/html.gen.ts +1 -1
  340. package/src/tempo/AccessKeyAuthorization.test.ts +4 -94
  341. package/src/tempo/Methods.test.ts +45 -17
  342. package/src/tempo/Methods.ts +22 -0
  343. package/src/tempo/PublicExports.test-d.ts +105 -0
  344. package/src/tempo/client/Charge.test.ts +85 -0
  345. package/src/tempo/client/Charge.ts +19 -2
  346. package/src/tempo/client/Methods.ts +18 -6
  347. package/src/tempo/client/index.ts +15 -4
  348. package/src/tempo/index.ts +1 -0
  349. package/src/tempo/internal/fee-payer.test.ts +241 -17
  350. package/src/tempo/internal/fee-payer.ts +150 -4
  351. package/src/tempo/internal/fee-token.test.ts +14 -9
  352. package/src/tempo/legacy/AccessKeyAuthorization.test.ts +162 -0
  353. package/src/tempo/legacy/README.md +9 -0
  354. package/src/tempo/{client → legacy/client}/ChannelOps.test.ts +6 -7
  355. package/src/tempo/{client → legacy/client}/ChannelOps.ts +22 -9
  356. package/src/tempo/{client → legacy/client}/Session.test.ts +51 -9
  357. package/src/tempo/{client → legacy/client}/Session.ts +25 -11
  358. package/src/tempo/{client → legacy/client}/SessionManager.test.ts +81 -9
  359. package/src/tempo/{client → legacy/client}/SessionManager.ts +41 -20
  360. package/src/tempo/legacy/client/index.ts +6 -0
  361. package/src/tempo/legacy/index.ts +6 -0
  362. package/src/tempo/{server → legacy/server}/Session.test.ts +45 -45
  363. package/src/tempo/{server → legacy/server}/Session.ts +32 -23
  364. package/src/tempo/legacy/server/index.ts +4 -0
  365. package/src/tempo/{session → legacy/session}/Chain.test.ts +3 -4
  366. package/src/tempo/{session → legacy/session}/Chain.ts +94 -63
  367. package/src/tempo/{session → legacy/session}/Channel.ts +1 -0
  368. package/src/tempo/legacy/session/ChannelStore.test.ts +58 -0
  369. package/src/tempo/legacy/session/ChannelStore.ts +39 -0
  370. package/src/tempo/legacy/session/Types.ts +91 -0
  371. package/src/tempo/{session → legacy/session}/Voucher.ts +12 -8
  372. package/src/tempo/{session → legacy/session}/escrow.abi.ts +1 -0
  373. package/src/tempo/legacy/session/index.ts +8 -0
  374. package/src/tempo/server/AtomicStore.test-d.ts +16 -11
  375. package/src/tempo/server/Charge.test.ts +92 -14
  376. package/src/tempo/server/Charge.ts +18 -16
  377. package/src/tempo/server/Methods.ts +54 -8
  378. package/src/tempo/server/Sse.test.ts +2 -2
  379. package/src/tempo/server/index.ts +6 -5
  380. package/src/tempo/server/internal/html.gen.ts +1 -1
  381. package/src/tempo/server/internal/request-body.test.ts +37 -4
  382. package/src/tempo/server/internal/request-body.ts +25 -6
  383. package/src/tempo/server/internal/transport.test.ts +4 -4
  384. package/src/tempo/server/internal/transport.ts +19 -10
  385. package/src/tempo/session/Snapshot.test.ts +41 -0
  386. package/src/tempo/session/Snapshot.ts +74 -0
  387. package/src/tempo/session/client/ChannelOps.test.ts +163 -0
  388. package/src/tempo/session/client/ChannelOps.ts +344 -0
  389. package/src/tempo/session/client/CredentialState.test.ts +645 -0
  390. package/src/tempo/session/client/CredentialState.ts +814 -0
  391. package/src/tempo/session/client/ReceiptCoordinator.ts +95 -0
  392. package/src/tempo/session/client/Runtime.test.ts +1092 -0
  393. package/src/tempo/session/client/Runtime.ts +986 -0
  394. package/src/tempo/session/client/Session.test.ts +734 -0
  395. package/src/tempo/session/client/Session.ts +97 -0
  396. package/src/tempo/session/client/SessionManager.test.ts +1308 -0
  397. package/src/tempo/session/client/SessionManager.ts +845 -0
  398. package/src/tempo/session/client/Transports.test.ts +837 -0
  399. package/src/tempo/session/client/Transports.ts +1292 -0
  400. package/src/tempo/session/client/index.ts +37 -0
  401. package/src/tempo/session/index.ts +7 -8
  402. package/src/tempo/session/precompile/Chain.integration.test.ts +321 -0
  403. package/src/tempo/session/precompile/Chain.test.ts +1258 -0
  404. package/src/tempo/session/precompile/Chain.ts +979 -0
  405. package/src/tempo/session/precompile/Channel.test.ts +138 -0
  406. package/src/tempo/session/precompile/Channel.ts +103 -0
  407. package/src/tempo/session/precompile/Protocol.test.ts +358 -0
  408. package/src/tempo/session/precompile/Protocol.ts +520 -0
  409. package/src/tempo/session/precompile/Voucher.test.ts +316 -0
  410. package/src/tempo/session/precompile/Voucher.ts +160 -0
  411. package/src/tempo/session/precompile/escrow.abi.ts +226 -0
  412. package/src/tempo/session/precompile/index.ts +33 -0
  413. package/src/tempo/session/server/ChannelOps.test.ts +129 -0
  414. package/src/tempo/session/server/ChannelOps.ts +157 -0
  415. package/src/tempo/session/{ChannelStore.test.ts → server/ChannelStore.test.ts} +536 -29
  416. package/src/tempo/session/server/ChannelStore.ts +835 -0
  417. package/src/tempo/session/server/CredentialVerification.test.ts +146 -0
  418. package/src/tempo/session/server/CredentialVerification.ts +710 -0
  419. package/src/tempo/session/server/MeteredStream.ts +88 -0
  420. package/src/tempo/session/server/RequestState.test.ts +531 -0
  421. package/src/tempo/session/server/RequestState.ts +499 -0
  422. package/src/tempo/session/server/Session.integration.test.ts +444 -0
  423. package/src/tempo/session/server/Session.test.ts +3253 -0
  424. package/src/tempo/session/server/Session.ts +543 -0
  425. package/src/tempo/session/server/Settlement.test.ts +242 -0
  426. package/src/tempo/session/server/Settlement.ts +470 -0
  427. package/src/tempo/session/{Sse.test.ts → server/Sse.test.ts} +37 -3
  428. package/src/tempo/session/server/Sse.ts +256 -0
  429. package/src/tempo/session/server/Transports.test.ts +346 -0
  430. package/src/tempo/session/server/Transports.ts +255 -0
  431. package/src/tempo/session/{Ws.test.ts → server/Ws.test.ts} +4 -4
  432. package/src/tempo/session/server/Ws.ts +384 -0
  433. package/src/tempo/session/server/index.ts +8 -0
  434. package/dist/tempo/client/ChannelOps.d.ts.map +0 -1
  435. package/dist/tempo/client/ChannelOps.js.map +0 -1
  436. package/dist/tempo/client/Session.d.ts.map +0 -1
  437. package/dist/tempo/client/Session.js.map +0 -1
  438. package/dist/tempo/client/SessionManager.d.ts.map +0 -1
  439. package/dist/tempo/client/SessionManager.js.map +0 -1
  440. package/dist/tempo/server/Session.d.ts.map +0 -1
  441. package/dist/tempo/server/Session.js.map +0 -1
  442. package/dist/tempo/session/Chain.d.ts.map +0 -1
  443. package/dist/tempo/session/Chain.js.map +0 -1
  444. package/dist/tempo/session/Channel.d.ts.map +0 -1
  445. package/dist/tempo/session/Channel.js.map +0 -1
  446. package/dist/tempo/session/ChannelStore.d.ts +0 -117
  447. package/dist/tempo/session/ChannelStore.d.ts.map +0 -1
  448. package/dist/tempo/session/ChannelStore.js +0 -172
  449. package/dist/tempo/session/ChannelStore.js.map +0 -1
  450. package/dist/tempo/session/Receipt.d.ts +0 -22
  451. package/dist/tempo/session/Receipt.d.ts.map +0 -1
  452. package/dist/tempo/session/Receipt.js +0 -34
  453. package/dist/tempo/session/Receipt.js.map +0 -1
  454. package/dist/tempo/session/Sse.d.ts.map +0 -1
  455. package/dist/tempo/session/Sse.js +0 -363
  456. package/dist/tempo/session/Sse.js.map +0 -1
  457. package/dist/tempo/session/Types.d.ts +0 -78
  458. package/dist/tempo/session/Types.d.ts.map +0 -1
  459. package/dist/tempo/session/Types.js.map +0 -1
  460. package/dist/tempo/session/Voucher.d.ts.map +0 -1
  461. package/dist/tempo/session/Voucher.js.map +0 -1
  462. package/dist/tempo/session/Ws.d.ts +0 -87
  463. package/dist/tempo/session/Ws.d.ts.map +0 -1
  464. package/dist/tempo/session/Ws.js +0 -443
  465. package/dist/tempo/session/Ws.js.map +0 -1
  466. package/dist/tempo/session/escrow.abi.js.map +0 -1
  467. package/src/tempo/session/ChannelStore.ts +0 -308
  468. package/src/tempo/session/Receipt.test.ts +0 -89
  469. package/src/tempo/session/Receipt.ts +0 -46
  470. package/src/tempo/session/Sse.ts +0 -462
  471. package/src/tempo/session/Types.ts +0 -86
  472. package/src/tempo/session/Ws.ts +0 -576
  473. /package/dist/tempo/{session → legacy/session}/Channel.js +0 -0
  474. /package/dist/tempo/{session → legacy/session}/Types.js +0 -0
  475. /package/src/tempo/{session → legacy/session}/Channel.test.ts +0 -0
  476. /package/src/tempo/{session → legacy/session}/Voucher.test.ts +0 -0
  477. /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
 
@@ -5178,7 +5371,7 @@ describe('verifyCredential', () => {
5178
5371
  const escrowContract = await deployEscrow()
5179
5372
  const server = Mppx.create({
5180
5373
  methods: [
5181
- tempo.session({
5374
+ tempo.sessionLegacy({
5182
5375
  store: Store.memory(),
5183
5376
  getClient: () => client,
5184
5377
  account: accounts[0],
@@ -5195,7 +5388,7 @@ describe('verifyCredential', () => {
5195
5388
  methods: [
5196
5389
  tempo_session_client({
5197
5390
  account: accounts[1],
5198
- deposit: '10',
5391
+ maxDeposit: '10',
5199
5392
  getClient: () => client,
5200
5393
  }),
5201
5394
  ],
@@ -5241,7 +5434,7 @@ describe('verifyCredential', () => {
5241
5434
  const escrowContract = await deployEscrow()
5242
5435
  const server = Mppx.create({
5243
5436
  methods: [
5244
- tempo.session({
5437
+ tempo.sessionLegacy({
5245
5438
  store: Store.memory(),
5246
5439
  getClient: () => client,
5247
5440
  account: accounts[0],
@@ -5259,7 +5452,7 @@ describe('verifyCredential', () => {
5259
5452
  methods: [
5260
5453
  tempo_session_client({
5261
5454
  account: accounts[1],
5262
- deposit: '10',
5455
+ maxDeposit: '10',
5263
5456
  getClient: () => client,
5264
5457
  }),
5265
5458
  ],