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
@@ -0,0 +1,162 @@
1
+ import { type Address, createClient, custom, type Hex } from 'viem'
2
+ import {
3
+ Account as TempoAccount,
4
+ KeyAuthorizationManager,
5
+ Secp256k1,
6
+ Transaction,
7
+ } from 'viem/tempo'
8
+ import { beforeAll, describe, expect, test } from 'vp/test'
9
+ import { tempoNetwork } from '~test/config.js'
10
+ import { deployEscrow, openChannel } from '~test/tempo/legacy/session.js'
11
+ import { asset as currency, chain, http } from '~test/tempo/viem.js'
12
+
13
+ import { createOpenPayload } from './client/ChannelOps.js'
14
+ import { closeOnChain, settleOnChain } from './session/Chain.js'
15
+ import { signVoucher } from './session/Voucher.js'
16
+
17
+ const rootAccount = TempoAccount.fromSecp256k1(
18
+ '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',
19
+ )
20
+ const recipient = '0x2222222222222222222222222222222222222222' as Address
21
+ const isLocalnet = tempoNetwork === 'localnet'
22
+
23
+ async function createAccessKeyClient() {
24
+ const keyAuthorizationManager = KeyAuthorizationManager.memory()
25
+ const accessKey = TempoAccount.fromSecp256k1(Secp256k1.randomPrivateKey(), {
26
+ access: rootAccount,
27
+ keyAuthorizationManager,
28
+ })
29
+ const keyAuthorization = await rootAccount.signKeyAuthorization(
30
+ {
31
+ accessKeyAddress: accessKey.accessKeyAddress,
32
+ keyType: accessKey.keyType,
33
+ },
34
+ {
35
+ chainId: BigInt(chain.id),
36
+ },
37
+ )
38
+ await keyAuthorizationManager.set(
39
+ {
40
+ accessKey: accessKey.accessKeyAddress,
41
+ address: rootAccount.address,
42
+ chainId: chain.id,
43
+ },
44
+ keyAuthorization,
45
+ )
46
+
47
+ const signedTransactions: Transaction.TransactionSerializedTempo[] = []
48
+ const rpcClient = createClient({ chain, transport: http() })
49
+
50
+ const client = createClient({
51
+ account: accessKey,
52
+ chain,
53
+ transport: custom({
54
+ async request({ method, params }: { method: string; params?: readonly unknown[] }) {
55
+ if (method === 'eth_sendRawTransaction' || method === 'eth_sendRawTransactionSync')
56
+ signedTransactions.push(params?.[0] as Transaction.TransactionSerializedTempo)
57
+ return rpcClient.request({ method, params } as never)
58
+ },
59
+ }),
60
+ })
61
+
62
+ return { accessKey, client, keyAuthorization, signedTransactions }
63
+ }
64
+
65
+ function expectTransactionKeyAuthorization(
66
+ serializedTransaction: Hex,
67
+ keyAuthorization: Awaited<ReturnType<typeof rootAccount.signKeyAuthorization>>,
68
+ ) {
69
+ const transaction = Transaction.deserialize(
70
+ serializedTransaction as Transaction.TransactionSerializedTempo,
71
+ )
72
+ expect(transaction.keyAuthorization).toEqual(keyAuthorization)
73
+ }
74
+
75
+ async function createChannelForPayee(payee: Address, escrowContract: Address) {
76
+ const payer = rootAccount
77
+ const { channelId } = await openChannel({
78
+ deposit: 10_000_000n,
79
+ escrow: escrowContract,
80
+ payee,
81
+ payer,
82
+ salt: Secp256k1.randomPrivateKey(),
83
+ token: currency,
84
+ })
85
+ const cumulativeAmount = 1_000_000n
86
+ const signature = await signVoucher(
87
+ createClient({ account: payer, chain, transport: http() }),
88
+ payer,
89
+ { channelId, cumulativeAmount },
90
+ escrowContract,
91
+ chain.id,
92
+ )
93
+
94
+ return { channelId, cumulativeAmount, escrowContract, signature }
95
+ }
96
+
97
+ describe.runIf(isLocalnet)('legacy Tempo session access-key authorization attachment', () => {
98
+ let escrowContract: Address
99
+
100
+ beforeAll(async () => {
101
+ escrowContract = await deployEscrow()
102
+ })
103
+
104
+ test('open signs a prepared transaction with keyAuthorization', async () => {
105
+ const { accessKey, client, keyAuthorization } = await createAccessKeyClient()
106
+
107
+ const { payload } = await createOpenPayload(client, accessKey, {
108
+ chainId: chain.id,
109
+ currency,
110
+ deposit: 5_000_000n,
111
+ escrowContract,
112
+ initialAmount: 1_000_000n,
113
+ payee: recipient,
114
+ })
115
+
116
+ expect(payload.action).toBe('open')
117
+ if (payload.action !== 'open') throw new Error('unexpected payload action')
118
+ expectTransactionKeyAuthorization(payload.transaction, keyAuthorization)
119
+ })
120
+
121
+ test('settle sends a prepared transaction with keyAuthorization', async () => {
122
+ const { accessKey, client, keyAuthorization, signedTransactions } =
123
+ await createAccessKeyClient()
124
+ const channel = await createChannelForPayee(rootAccount.address, escrowContract)
125
+
126
+ const hash = await settleOnChain(
127
+ client,
128
+ channel.escrowContract,
129
+ {
130
+ channelId: channel.channelId,
131
+ cumulativeAmount: channel.cumulativeAmount,
132
+ signature: channel.signature,
133
+ },
134
+ { account: accessKey },
135
+ )
136
+
137
+ expect(hash).toMatch(/^0x[0-9a-f]{64}$/)
138
+ expect(signedTransactions).toHaveLength(1)
139
+ expectTransactionKeyAuthorization(signedTransactions[0]!, keyAuthorization)
140
+ })
141
+
142
+ test('close sends a prepared transaction with keyAuthorization', async () => {
143
+ const { accessKey, client, keyAuthorization, signedTransactions } =
144
+ await createAccessKeyClient()
145
+ const channel = await createChannelForPayee(rootAccount.address, escrowContract)
146
+
147
+ const hash = await closeOnChain(
148
+ client,
149
+ channel.escrowContract,
150
+ {
151
+ channelId: channel.channelId,
152
+ cumulativeAmount: channel.cumulativeAmount,
153
+ signature: channel.signature,
154
+ },
155
+ { account: accessKey },
156
+ )
157
+
158
+ expect(hash).toMatch(/^0x[0-9a-f]{64}$/)
159
+ expect(signedTransactions).toHaveLength(1)
160
+ expectTransactionKeyAuthorization(signedTransactions[0]!, keyAuthorization)
161
+ })
162
+ })
@@ -0,0 +1,9 @@
1
+ # Tempo Legacy Session
2
+
3
+ This directory contains the legacy smart-contract-backed `tempo/session`
4
+ implementation.
5
+
6
+ The default `tempo.session` implementation is TIP-1034 precompile-backed and
7
+ lives under `src/tempo/session/precompile`. Legacy code may import shared transport and
8
+ accounting helpers from `src/tempo/session`, but legacy chain, channel, voucher,
9
+ client, and server implementations should stay inside this directory.
@@ -4,18 +4,16 @@ import { type Address, createClient, decodeFunctionData } from 'viem'
4
4
  import { privateKeyToAccount } from 'viem/accounts'
5
5
  import { Account as TempoAccount, Addresses, Transaction } from 'viem/tempo'
6
6
  import { beforeAll, describe, expect, test } from 'vp/test'
7
- import { nodeEnv } from '~test/config.js'
8
- import { deployEscrow, openChannel } from '~test/tempo/session.js'
7
+ import { tempoNetwork } from '~test/config.js'
8
+ import { deployEscrow, openChannel } from '~test/tempo/legacy/session.js'
9
9
  import { accounts, asset, chain, client, fundAccount, http } from '~test/tempo/viem.js'
10
10
 
11
- const isLocalnet = nodeEnv === 'localnet'
12
-
13
- import type { Challenge } from '../../Challenge.js'
14
- import * as Credential from '../../Credential.js'
11
+ import type { Challenge } from '../../../Challenge.js'
12
+ import * as Credential from '../../../Credential.js'
15
13
  import {
16
14
  chainId as chainIdDefaults,
17
15
  escrowContract as escrowContractDefaults,
18
- } from '../internal/defaults.js'
16
+ } from '../../internal/defaults.js'
19
17
  import { escrowAbi } from '../session/Chain.js'
20
18
  import { verifyVoucher } from '../session/Voucher.js'
21
19
  import {
@@ -40,6 +38,7 @@ const localClient = createClient({
40
38
  const channelId = '0x0000000000000000000000000000000000000000000000000000000000000001' as Hex.Hex
41
39
  const escrowContract = '0x1234567890abcdef1234567890abcdef12345678' as Address
42
40
  const chainId = 42431
41
+ const isLocalnet = tempoNetwork === 'localnet'
43
42
 
44
43
  function makeChallenge(overrides?: Partial<Challenge>): Challenge {
45
44
  return {
@@ -16,21 +16,28 @@ import {
16
16
  import { prepareTransactionRequest, signTransaction } from 'viem/actions'
17
17
  import { Abis } from 'viem/tempo'
18
18
 
19
- import type { Challenge } from '../../Challenge.js'
20
- import * as Credential from '../../Credential.js'
21
- import { getAccountSignerAddress } from '../internal/account.js'
22
- import * as defaults from '../internal/defaults.js'
19
+ import type { Challenge } from '../../../Challenge.js'
20
+ import * as Credential from '../../../Credential.js'
21
+ import { getAccountSignerAddress } from '../../internal/account.js'
22
+ import * as defaults from '../../internal/defaults.js'
23
23
  import { escrowAbi, getOnChainChannel } from '../session/Chain.js'
24
24
  import * as Channel from '../session/Channel.js'
25
- import type { SessionCredentialPayload } from '../session/Types.js'
25
+ import type { LegacySessionCredentialPayload } from '../session/Types.js'
26
26
  import { signVoucher } from '../session/Voucher.js'
27
27
 
28
+ /** Cached channel metadata used by the legacy auto-driving session client. */
28
29
  export type ChannelEntry = {
30
+ /** Legacy contract-backed channel ID. */
29
31
  channelId: Hex.Hex
32
+ /** Salt used to derive the channel ID. */
30
33
  salt: Hex.Hex
34
+ /** Highest cumulative voucher amount locally authorized. */
31
35
  cumulativeAmount: bigint
36
+ /** Escrow contract backing this channel. */
32
37
  escrowContract: Address
38
+ /** Chain ID used for channel ID and voucher domain separation. */
33
39
  chainId: number
40
+ /** Whether the client considers the channel reusable. */
34
41
  opened: boolean
35
42
  }
36
43
 
@@ -41,11 +48,13 @@ function resolveVoucherSigner(
41
48
  return voucherSigner ?? account
42
49
  }
43
50
 
51
+ /** Resolves the chain ID embedded in a legacy session challenge. */
44
52
  export function resolveChainId(challenge: Challenge): number {
45
53
  const md = challenge.request.methodDetails as { chainId?: number } | undefined
46
54
  return md?.chainId ?? 0
47
55
  }
48
56
 
57
+ /** Resolves the legacy escrow contract from local override, challenge hint, or defaults. */
49
58
  export function resolveEscrow(
50
59
  challenge: { request: { methodDetails?: unknown } },
51
60
  chainId: number,
@@ -64,9 +73,10 @@ export function resolveEscrow(
64
73
  return escrow
65
74
  }
66
75
 
76
+ /** Serializes a legacy session credential with a payer DID source. */
67
77
  export function serializeCredential(
68
78
  challenge: Challenge,
69
- payload: SessionCredentialPayload,
79
+ payload: LegacySessionCredentialPayload,
70
80
  chainId: number,
71
81
  account: viem_Account,
72
82
  ): string {
@@ -77,6 +87,7 @@ export function serializeCredential(
77
87
  })
78
88
  }
79
89
 
90
+ /** Creates a legacy cumulative voucher credential payload. */
80
91
  export async function createVoucherPayload(
81
92
  client: viem_Client,
82
93
  account: viem_Account,
@@ -85,7 +96,7 @@ export async function createVoucherPayload(
85
96
  escrowContract: Address,
86
97
  chainId: number,
87
98
  voucherSigner?: viem_Account | undefined,
88
- ): Promise<SessionCredentialPayload> {
99
+ ): Promise<LegacySessionCredentialPayload> {
89
100
  const signer = resolveVoucherSigner(account, voucherSigner)
90
101
  const signature = await signVoucher(
91
102
  client,
@@ -103,6 +114,7 @@ export async function createVoucherPayload(
103
114
  }
104
115
  }
105
116
 
117
+ /** Creates a legacy cooperative close credential payload. */
106
118
  export async function createClosePayload(
107
119
  client: viem_Client,
108
120
  account: viem_Account,
@@ -111,7 +123,7 @@ export async function createClosePayload(
111
123
  escrowContract: Address,
112
124
  chainId: number,
113
125
  voucherSigner?: viem_Account | undefined,
114
- ): Promise<SessionCredentialPayload> {
126
+ ): Promise<LegacySessionCredentialPayload> {
115
127
  const signer = resolveVoucherSigner(account, voucherSigner)
116
128
  const signature = await signVoucher(
117
129
  client,
@@ -129,6 +141,7 @@ export async function createClosePayload(
129
141
  }
130
142
  }
131
143
 
144
+ /** Creates a legacy open transaction credential payload and local channel entry. */
132
145
  export async function createOpenPayload(
133
146
  client: viem_Client,
134
147
  account: viem_Account,
@@ -142,7 +155,7 @@ export async function createOpenPayload(
142
155
  chainId: number
143
156
  feePayer?: boolean | undefined
144
157
  },
145
- ): Promise<{ entry: ChannelEntry; payload: SessionCredentialPayload }> {
158
+ ): Promise<{ entry: ChannelEntry; payload: LegacySessionCredentialPayload }> {
146
159
  const { escrowContract, payee, currency, deposit, initialAmount, chainId, feePayer } = options
147
160
  const voucherSigner = resolveVoucherSigner(account, options.voucherSigner)
148
161
  const authorizedSigner = getAccountSignerAddress(voucherSigner)
@@ -3,22 +3,21 @@ import { type Address, createClient, decodeFunctionData, erc20Abi, type Hex, htt
3
3
  import { privateKeyToAccount } from 'viem/accounts'
4
4
  import { Account as TempoAccount, Addresses, Transaction, WebCryptoP256 } from 'viem/tempo'
5
5
  import { beforeAll, describe, expect, test } from 'vp/test'
6
- import { nodeEnv } from '~test/config.js'
7
- import { deployEscrow, openChannel } from '~test/tempo/session.js'
6
+ import { tempoNetwork } from '~test/config.js'
7
+ import { deployEscrow, openChannel } from '~test/tempo/legacy/session.js'
8
8
  import { accounts, asset, chain, client, fundAccount } from '~test/tempo/viem.js'
9
9
 
10
- const isLocalnet = nodeEnv === 'localnet'
11
-
12
- import * as Challenge from '../../Challenge.js'
13
- import * as Credential from '../../Credential.js'
14
- import { chainId, escrowContract as escrowContractDefaults } from '../internal/defaults.js'
10
+ import * as Challenge from '../../../Challenge.js'
11
+ import * as Constants from '../../../Constants.js'
12
+ import * as Credential from '../../../Credential.js'
13
+ import { chainId, escrowContract as escrowContractDefaults } from '../../internal/defaults.js'
15
14
  import { escrowAbi } from '../session/Chain.js'
16
- import type { SessionCredentialPayload } from '../session/Types.js'
15
+ import type { LegacySessionCredentialPayload } from '../session/Types.js'
17
16
  import { verifyVoucher } from '../session/Voucher.js'
18
17
  import { session } from './Session.js'
19
18
 
20
19
  function deserializePayload(result: string) {
21
- const cred = Credential.deserialize<SessionCredentialPayload>(result)
20
+ const cred = Credential.deserialize<LegacySessionCredentialPayload>(result)
22
21
  return cred
23
22
  }
24
23
 
@@ -33,6 +32,7 @@ const pureClient = createClient({
33
32
  const escrowAddress = escrowContractDefaults[chainId.testnet] as Address
34
33
  const recipient = '0x2222222222222222222222222222222222222222' as Address
35
34
  const currency = '0x3333333333333333333333333333333333333333' as Address
35
+ const isLocalnet = tempoNetwork === 'localnet'
36
36
 
37
37
  function makeChallenge(overrides?: Record<string, unknown>) {
38
38
  return Challenge.from({
@@ -55,6 +55,48 @@ function makeChallenge(overrides?: Record<string, unknown>) {
55
55
  }
56
56
 
57
57
  describe('session (pure)', () => {
58
+ test('handles legacy and unmarked session challenges', () => {
59
+ const method = session({
60
+ getClient: () => pureClient,
61
+ account: pureAccount,
62
+ })
63
+
64
+ expect(method.canHandleChallenge?.({ challenge: makeChallenge() })).toBe(true)
65
+ expect(
66
+ method.canHandleChallenge?.({
67
+ challenge: makeChallenge({
68
+ methodDetails: {
69
+ chainId: 42431,
70
+ escrowContract: escrowAddress,
71
+ sessionProtocol: Constants.SessionProtocols.v1,
72
+ },
73
+ }),
74
+ }),
75
+ ).toBe(true)
76
+ expect(
77
+ method.canHandleChallenge?.({
78
+ challenge: makeChallenge({
79
+ methodDetails: {
80
+ chainId: 42431,
81
+ escrowContract: escrowAddress,
82
+ sessionProtocol: Constants.SessionProtocols.v2,
83
+ },
84
+ }),
85
+ }),
86
+ ).toBe(false)
87
+ expect(
88
+ method.canHandleChallenge?.({
89
+ challenge: makeChallenge({
90
+ methodDetails: {
91
+ chainId: 42431,
92
+ escrowContract: escrowAddress,
93
+ sessionProtocol: 'future' as never,
94
+ },
95
+ }),
96
+ }),
97
+ ).toBe(false)
98
+ })
99
+
58
100
  describe('error: no action and no deposit/maxDeposit', () => {
59
101
  test('throws when neither configured', async () => {
60
102
  const method = session({
@@ -2,15 +2,16 @@ import type { Hex } from 'ox'
2
2
  import { type Address, parseUnits, type Account as viem_Account } from 'viem'
3
3
  import { tempo as tempo_chain } from 'viem/tempo/chains'
4
4
 
5
- import type * as Challenge from '../../Challenge.js'
6
- import * as Method from '../../Method.js'
7
- import * as Account from '../../viem/Account.js'
8
- import * as Client from '../../viem/Client.js'
9
- import * as z from '../../zod.js'
10
- import { getAccountSignerAddress } from '../internal/account.js'
11
- import * as defaults from '../internal/defaults.js'
12
- import * as Methods from '../Methods.js'
13
- import type { SessionCredentialPayload } from '../session/Types.js'
5
+ import type * as Challenge from '../../../Challenge.js'
6
+ import * as Constants from '../../../Constants.js'
7
+ import * as Method from '../../../Method.js'
8
+ import * as Account from '../../../viem/Account.js'
9
+ import * as Client from '../../../viem/Client.js'
10
+ import * as z from '../../../zod.js'
11
+ import { getAccountSignerAddress } from '../../internal/account.js'
12
+ import * as defaults from '../../internal/defaults.js'
13
+ import * as Methods from '../../Methods.js'
14
+ import type { LegacySessionCredentialPayload } from '../session/Types.js'
14
15
  import { signVoucher } from '../session/Voucher.js'
15
16
  import {
16
17
  type ChannelEntry,
@@ -21,6 +22,7 @@ import {
21
22
  tryRecoverChannel,
22
23
  } from './ChannelOps.js'
23
24
 
25
+ /** Runtime schema for legacy low-level session credential context. */
24
26
  export const sessionContextSchema = z.object({
25
27
  account: z.optional(z.custom<Account.getResolver.Parameters['account']>()),
26
28
  action: z.optional(z.enum(['open', 'topUp', 'voucher', 'close'])),
@@ -33,6 +35,7 @@ export const sessionContextSchema = z.object({
33
35
  depositRaw: z.optional(z.string()),
34
36
  })
35
37
 
38
+ /** Context accepted by the legacy low-level session client method. */
36
39
  export type SessionContext = z.infer<typeof sessionContextSchema>
37
40
 
38
41
  /**
@@ -172,7 +175,7 @@ export function session(parameters: session.Parameters = {}) {
172
175
  }
173
176
  }
174
177
 
175
- let payload: SessionCredentialPayload
178
+ let payload: LegacySessionCredentialPayload
176
179
 
177
180
  if (entry?.opened) {
178
181
  entry.cumulativeAmount += amount
@@ -236,7 +239,7 @@ export function session(parameters: session.Parameters = {}) {
236
239
  const escrowContract = resolveEscrowCached(challenge, chainId, channelId)
237
240
  escrowContractMap.set(channelId, escrowContract)
238
241
 
239
- let payload: SessionCredentialPayload
242
+ let payload: LegacySessionCredentialPayload
240
243
 
241
244
  switch (action) {
242
245
  case 'open': {
@@ -335,6 +338,16 @@ export function session(parameters: session.Parameters = {}) {
335
338
  }
336
339
 
337
340
  return Method.toClient(Methods.session, {
341
+ canHandleChallenge({ challenge }) {
342
+ const sessionProtocolMarker = Constants.getMethodDetail(
343
+ challenge.request.methodDetails,
344
+ Constants.MethodDetailKeys.sessionProtocol,
345
+ )
346
+ return (
347
+ sessionProtocolMarker === undefined ||
348
+ sessionProtocolMarker === Constants.SessionProtocols.v1
349
+ )
350
+ },
338
351
  context: sessionContextSchema,
339
352
 
340
353
  async createCredential({ challenge, context }) {
@@ -354,6 +367,7 @@ export function session(parameters: session.Parameters = {}) {
354
367
  })
355
368
  }
356
369
 
370
+ /** Type helpers for the legacy low-level session client method. */
357
371
  export declare namespace session {
358
372
  type Parameters = Account.getResolver.Parameters &
359
373
  Client.getResolver.Parameters & {
@@ -3,14 +3,11 @@ import { privateKeyToAccount } from 'viem/accounts'
3
3
  import { Account as TempoAccount } from 'viem/tempo'
4
4
  import { describe, expect, test, vi } from 'vp/test'
5
5
 
6
- import * as Challenge from '../../Challenge.js'
7
- import * as PaymentCredential from '../../Credential.js'
8
- import { formatNeedVoucherEvent, parseEvent } from '../session/Sse.js'
9
- import type {
10
- NeedVoucherEvent,
11
- SessionCredentialPayload,
12
- SessionReceipt,
13
- } from '../session/Types.js'
6
+ import * as Challenge from '../../../Challenge.js'
7
+ import * as PaymentCredential from '../../../Credential.js'
8
+ import type { NeedVoucherEvent, SessionReceipt } from '../../session/precompile/Protocol.js'
9
+ import { formatNeedVoucherEvent, parseEvent } from '../../session/precompile/Protocol.js'
10
+ import type { LegacySessionCredentialPayload } from '../session/Types.js'
14
11
  import { sessionManager } from './SessionManager.js'
15
12
 
16
13
  const channelId = '0x0000000000000000000000000000000000000000000000000000000000000001' as Hex
@@ -140,7 +137,8 @@ describe('Session', () => {
140
137
  expect(response.status).toBe(200)
141
138
  expect(authorization).toBeDefined()
142
139
  if (!authorization) throw new Error('missing authorization header')
143
- const credential = PaymentCredential.deserialize<SessionCredentialPayload>(authorization)
140
+ const credential =
141
+ PaymentCredential.deserialize<LegacySessionCredentialPayload>(authorization)
144
142
  expect(credential.payload.action).toBe('open')
145
143
  if (credential.payload.action !== 'open') throw new Error('unexpected action')
146
144
  expect(credential.payload.authorizedSigner).toBe(voucherSigner.accessKeyAddress)
@@ -273,6 +271,80 @@ describe('Session', () => {
273
271
  })
274
272
 
275
273
  describe('.sse() event parsing', () => {
274
+ test('sends SSE Accept header on voucher POST updates', async () => {
275
+ vi.resetModules()
276
+ vi.doMock('viem/actions', () => ({
277
+ prepareTransactionRequest: vi.fn(async () => ({})),
278
+ sendCallsSync: vi.fn(),
279
+ signTransaction: vi.fn(async () => '0xdeadbeef'),
280
+ signTypedData: vi.fn(),
281
+ }))
282
+
283
+ try {
284
+ const { sessionManager: sessionManagerWithMocks } = await import('./SessionManager.js')
285
+ const account = privateKeyToAccount(
286
+ '0x0000000000000000000000000000000000000000000000000000000000000001',
287
+ )
288
+ const voucherSigner = TempoAccount.fromSecp256k1(
289
+ '0x0000000000000000000000000000000000000000000000000000000000000002',
290
+ { access: account },
291
+ )
292
+ const client = createClient({
293
+ account,
294
+ transport: http('http://127.0.0.1'),
295
+ })
296
+ const challenge = makeChallenge({
297
+ recipient: '0x742d35cc6634c0532925a3b844bc9e7595f8fe00',
298
+ methodDetails: {
299
+ escrowContract: '0x9d136eea063ede5418a6bc7beaff009bbb6cfa70',
300
+ chainId: 4217,
301
+ },
302
+ })
303
+ const needVoucher: NeedVoucherEvent = {
304
+ channelId,
305
+ requiredCumulative: '2000000',
306
+ acceptedCumulative: '1000000',
307
+ deposit: '10000000',
308
+ }
309
+ const mockFetch = vi
310
+ .fn()
311
+ .mockResolvedValueOnce(make402Response(challenge))
312
+ .mockResolvedValueOnce(
313
+ makeSseResponse([
314
+ formatNeedVoucherEvent(needVoucher),
315
+ 'event: message\ndata: chunk\n\n',
316
+ ]),
317
+ )
318
+ .mockResolvedValueOnce(makeOkResponse())
319
+
320
+ const s = sessionManagerWithMocks({
321
+ account,
322
+ client,
323
+ fetch: mockFetch as typeof globalThis.fetch,
324
+ maxDeposit: '10',
325
+ voucherSigner,
326
+ })
327
+
328
+ const iterable = await s.sse('https://api.example.com/stream')
329
+
330
+ const messages: string[] = []
331
+ for await (const msg of iterable) {
332
+ messages.push(msg)
333
+ }
334
+
335
+ const voucherRequest = mockFetch.mock.calls[2]![1] as RequestInit
336
+ const voucherHeaders = new Headers(voucherRequest.headers)
337
+
338
+ expect(messages).toEqual(['chunk'])
339
+ expect(voucherRequest.method).toBe('POST')
340
+ expect(voucherHeaders.get('accept')).toBe('text/event-stream')
341
+ expect(voucherHeaders.get('authorization')).toBeTruthy()
342
+ } finally {
343
+ vi.doUnmock('viem/actions')
344
+ vi.resetModules()
345
+ }
346
+ })
347
+
276
348
  test('yields only message data from SSE stream', async () => {
277
349
  const events = [
278
350
  'event: message\ndata: chunk1\n\n',