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
@@ -248,6 +248,51 @@ describe('session', () => {
248
248
  expect(request.amount).toBe('1000000')
249
249
  expect(request.methodDetails?.minVoucherDelta).toBe('100000')
250
250
  })
251
+
252
+ test('schema: preserves precompile session snapshots in method details', () => {
253
+ const sessionSnapshot = {
254
+ acceptedCumulative: '2',
255
+ channelId: `0x${'11'.repeat(32)}` as const,
256
+ deposit: '5',
257
+ descriptor: {
258
+ authorizedSigner: '0x0000000000000000000000000000000000000006',
259
+ expiringNonceHash: `0x${'22'.repeat(32)}` as const,
260
+ operator: '0x0000000000000000000000000000000000000000',
261
+ payee: '0x0000000000000000000000000000000000000002',
262
+ payer: '0x0000000000000000000000000000000000000001',
263
+ salt: `0x${'33'.repeat(32)}` as const,
264
+ token: '0x0000000000000000000000000000000000000003',
265
+ },
266
+ requiredCumulative: '3',
267
+ settled: '0',
268
+ spent: '2',
269
+ units: 2,
270
+ }
271
+ const request = Methods.session.schema.request.parse({
272
+ amount: '1',
273
+ currency: '0x20c0000000000000000000000000000000000001',
274
+ decimals: 6,
275
+ recipient: '0x1234567890abcdef1234567890abcdef12345678',
276
+ sessionSnapshot,
277
+ unitType: 'token',
278
+ })
279
+
280
+ expect(request.methodDetails?.sessionSnapshot).toEqual(sessionSnapshot)
281
+ })
282
+
283
+ test('schema: advertises precompile session operator in method details', () => {
284
+ const operator = '0x0000000000000000000000000000000000000006'
285
+ const request = Methods.session.schema.request.parse({
286
+ amount: '1',
287
+ currency: '0x20c0000000000000000000000000000000000001',
288
+ decimals: 6,
289
+ operator,
290
+ recipient: '0x1234567890abcdef1234567890abcdef12345678',
291
+ unitType: 'token',
292
+ })
293
+
294
+ expect(request.methodDetails?.operator).toBe(operator)
295
+ })
251
296
  })
252
297
 
253
298
  describe('subscription', () => {
@@ -313,23 +358,6 @@ describe('subscription', () => {
313
358
  expect(request.periodCount).toBe(expected)
314
359
  })
315
360
 
316
- test.each(['dev_second'] as const)(
317
- 'schema: accepts %s subscription periods for development and tests',
318
- (periodUnit) => {
319
- const request = Methods.subscription.schema.request.parse({
320
- amount: '10',
321
- currency: '0x20c0000000000000000000000000000000000001',
322
- decimals: 6,
323
- periodCount: '5',
324
- periodUnit,
325
- recipient: '0x1234567890abcdef1234567890abcdef12345678',
326
- subscriptionExpires: '2026-01-01T00:00:00Z',
327
- })
328
-
329
- expect(request.periodUnit).toBe(periodUnit)
330
- },
331
- )
332
-
333
361
  test('schema: rejects non-numeric periodCount', () => {
334
362
  const result = Methods.subscription.schema.request.safeParse({
335
363
  amount: '10',
@@ -1,8 +1,11 @@
1
1
  import type { Account, Address } from 'viem'
2
2
  import { parseUnits } from 'viem'
3
3
 
4
+ import * as Constants from '../Constants.js'
4
5
  import * as Method from '../Method.js'
5
6
  import * as z from '../zod.js'
7
+ import type { SessionSnapshot } from './session/client/Runtime.js'
8
+ import type * as PrecompileChannel from './session/precompile/Channel.js'
6
9
  import type { SubscriptionPeriodUnit } from './subscription/Types.js'
7
10
 
8
11
  export const chargeModes = ['push', 'pull'] as const
@@ -196,6 +199,7 @@ export const session = Method.from({
196
199
  authorizedSigner: z.optional(z.string()),
197
200
  channelId: z.hash(),
198
201
  cumulativeAmount: z.amount(),
202
+ descriptor: z.optional(z.custom<PrecompileChannel.ChannelDescriptor>()),
199
203
  signature: z.signature(),
200
204
  transaction: z.signature(),
201
205
  type: z.literal('transaction'),
@@ -204,6 +208,7 @@ export const session = Method.from({
204
208
  action: z.literal('topUp'),
205
209
  additionalDeposit: z.amount(),
206
210
  channelId: z.hash(),
211
+ descriptor: z.optional(z.custom<PrecompileChannel.ChannelDescriptor>()),
207
212
  transaction: z.signature(),
208
213
  type: z.literal('transaction'),
209
214
  }),
@@ -211,12 +216,14 @@ export const session = Method.from({
211
216
  action: z.literal('voucher'),
212
217
  channelId: z.hash(),
213
218
  cumulativeAmount: z.amount(),
219
+ descriptor: z.optional(z.custom<PrecompileChannel.ChannelDescriptor>()),
214
220
  signature: z.signature(),
215
221
  }),
216
222
  z.object({
217
223
  action: z.literal('close'),
218
224
  channelId: z.hash(),
219
225
  cumulativeAmount: z.amount(),
226
+ descriptor: z.optional(z.custom<PrecompileChannel.ChannelDescriptor>()),
220
227
  signature: z.signature(),
221
228
  }),
222
229
  ]),
@@ -237,7 +244,12 @@ export const session = Method.from({
237
244
  ),
238
245
  ),
239
246
  minVoucherDelta: z.optional(z.amount()),
247
+ operator: z.optional(z.address()),
240
248
  recipient: z.optional(z.string()),
249
+ sessionProtocol: z.optional(
250
+ z.enum([Constants.SessionProtocols.v2, Constants.SessionProtocols.v1]),
251
+ ),
252
+ sessionSnapshot: z.optional(z.custom<SessionSnapshot>()),
241
253
  suggestedDeposit: z.optional(z.amount()),
242
254
  unitType: z.string(),
243
255
  })
@@ -256,6 +268,9 @@ export const session = Method.from({
256
268
  escrowContract,
257
269
  feePayer,
258
270
  minVoucherDelta,
271
+ operator,
272
+ sessionProtocol,
273
+ sessionSnapshot,
259
274
  suggestedDeposit,
260
275
  ...rest
261
276
  }) => ({
@@ -274,6 +289,13 @@ export const session = Method.from({
274
289
  }),
275
290
  ...(chainId !== undefined && { chainId }),
276
291
  ...(feePayer !== undefined && { feePayer }),
292
+ ...(operator !== undefined && { operator }),
293
+ ...(sessionProtocol !== undefined && {
294
+ [Constants.MethodDetailKeys.sessionProtocol]: sessionProtocol,
295
+ }),
296
+ ...(sessionSnapshot !== undefined && {
297
+ [Constants.MethodDetailKeys.sessionSnapshot]: sessionSnapshot,
298
+ }),
277
299
  },
278
300
  }),
279
301
  ),
@@ -0,0 +1,105 @@
1
+ import { expectTypeOf, test } from 'vp/test'
2
+
3
+ import type {
4
+ PaymentResponse as ClientPaymentResponse,
5
+ SessionManager as ClientSessionManager,
6
+ SessionManagerSseOptions as ClientSessionManagerSseOptions,
7
+ SessionManagerWebSocketOptions as ClientSessionManagerWebSocketOptions,
8
+ } from './client/index.js'
9
+ import * as Tempo from './index.js'
10
+ import type { SettlementSchedule as ServerSettlementSchedule } from './server/index.js'
11
+ import type {
12
+ ActiveSessionState,
13
+ ClosedSessionState,
14
+ PaymentResponse as SessionPaymentResponse,
15
+ SessionManager,
16
+ SessionManagerSseOptions,
17
+ SessionManagerWebSocketOptions,
18
+ SessionTransition,
19
+ VoucherNeededSessionState,
20
+ } from './session/client/index.js'
21
+ import type { SessionTransition as MachineSessionTransition } from './session/client/index.js'
22
+ import type { ChannelTransactionOptions } from './session/precompile/Chain.js'
23
+ import type { RawAmountString } from './session/precompile/index.js'
24
+ import type { SettlementSchedule as SessionSettlementSchedule } from './session/server/index.js'
25
+
26
+ test('tempo session public barrels expose manager and schedule interfaces', () => {
27
+ expectTypeOf(Tempo.Session).toBeObject()
28
+ expectTypeOf(Tempo.Session.Client).toBeObject()
29
+ expectTypeOf(Tempo.Session.Precompile).toBeObject()
30
+ expectTypeOf(Tempo.Session.Server).toBeObject()
31
+ expectTypeOf<typeof Tempo>().not.toHaveProperty('Precompile')
32
+
33
+ expectTypeOf<ClientPaymentResponse>().toEqualTypeOf<SessionPaymentResponse>()
34
+ expectTypeOf<ClientSessionManager>().toEqualTypeOf<SessionManager>()
35
+ expectTypeOf<ClientSessionManagerSseOptions>().toEqualTypeOf<SessionManagerSseOptions>()
36
+ expectTypeOf<ClientSessionManagerWebSocketOptions>().toEqualTypeOf<SessionManagerWebSocketOptions>()
37
+
38
+ expectTypeOf<ServerSettlementSchedule>().toEqualTypeOf<SessionSettlementSchedule>()
39
+ expectTypeOf<MachineSessionTransition>().toEqualTypeOf<SessionTransition>()
40
+ expectTypeOf<ServerSettlementSchedule>().toEqualTypeOf<{
41
+ amount?: string | bigint | undefined
42
+ intervalMs?: number | undefined
43
+ units?: number | undefined
44
+ }>()
45
+ expectTypeOf<RawAmountString>().toEqualTypeOf<string>()
46
+ expectTypeOf<ActiveSessionState['status']>().toEqualTypeOf<'active'>()
47
+ expectTypeOf<VoucherNeededSessionState['status']>().toEqualTypeOf<'voucherNeeded'>()
48
+ expectTypeOf<ClosedSessionState['status']>().toEqualTypeOf<'closed'>()
49
+ })
50
+
51
+ test('tempo session chain exports canonical transaction options', () => {
52
+ expectTypeOf<ChannelTransactionOptions>().toEqualTypeOf<{
53
+ account?: import('viem').Account | undefined
54
+ candidateFeeTokens?: readonly import('viem').Address[] | undefined
55
+ feePayer?: import('viem').Account | undefined
56
+ feePayerPolicy?: Partial<import('./internal/fee-payer.js').Policy> | undefined
57
+ feeToken?: import('viem').Address | undefined
58
+ }>()
59
+ })
60
+
61
+ test('tempo session public barrel hides internal session drivers', () => {
62
+ type SessionNamespacePublic = typeof import('./session/index.js')
63
+ type SessionPublic = typeof import('./session/precompile/index.js')
64
+ type SessionClientPublic = typeof import('./session/client/index.js')
65
+ type SessionServerPublic = typeof import('./session/server/index.js')
66
+
67
+ expectTypeOf<SessionNamespacePublic>().toHaveProperty('Precompile')
68
+ expectTypeOf<SessionNamespacePublic>().toHaveProperty('Client')
69
+ expectTypeOf<SessionNamespacePublic>().toHaveProperty('Server')
70
+ expectTypeOf<SessionNamespacePublic>().not.toHaveProperty('ChannelStore')
71
+ expectTypeOf<SessionNamespacePublic>().not.toHaveProperty('Receipt')
72
+ expectTypeOf<SessionNamespacePublic>().not.toHaveProperty('Sse')
73
+ expectTypeOf<SessionNamespacePublic>().not.toHaveProperty('Types')
74
+ expectTypeOf<SessionNamespacePublic>().not.toHaveProperty('Ws')
75
+ expectTypeOf<SessionNamespacePublic>().not.toHaveProperty('session')
76
+ expectTypeOf<SessionNamespacePublic>().not.toHaveProperty('sessionManager')
77
+ expectTypeOf<SessionPublic>().not.toHaveProperty('openSseSession')
78
+ expectTypeOf<SessionPublic>().not.toHaveProperty('openWebSocketSession')
79
+ expectTypeOf<SessionPublic>().not.toHaveProperty('Client')
80
+ expectTypeOf<SessionPublic>().not.toHaveProperty('Server')
81
+ expectTypeOf<SessionPublic>().not.toHaveProperty('session')
82
+ expectTypeOf<SessionPublic>().not.toHaveProperty('sessionManager')
83
+ expectTypeOf<SessionPublic>().not.toHaveProperty('settle')
84
+ expectTypeOf<SessionClientPublic>().not.toHaveProperty('ChannelOps')
85
+ expectTypeOf<SessionClientPublic>().not.toHaveProperty('Chain')
86
+ expectTypeOf<SessionServerPublic>().not.toHaveProperty('ChannelOps')
87
+ expectTypeOf<SessionServerPublic>().not.toHaveProperty('Chain')
88
+ })
89
+
90
+ test('tempo legacy namespace keeps client, server, and channel primitives isolated', () => {
91
+ type LegacySessionPublic = typeof import('./legacy/session/index.js')
92
+
93
+ expectTypeOf(Tempo.SessionLegacy.Client.session).toBeFunction()
94
+ expectTypeOf(Tempo.SessionLegacy.Client.sessionManager).toBeFunction()
95
+ expectTypeOf(Tempo.SessionLegacy.Server.session).toBeFunction()
96
+ expectTypeOf(Tempo.SessionLegacy.Server.settle).toBeFunction()
97
+ expectTypeOf(Tempo.SessionLegacy.Session.Chain).toBeObject()
98
+ expectTypeOf(Tempo.SessionLegacy.Session.Channel).toBeObject()
99
+ expectTypeOf(Tempo.SessionLegacy.Session.Voucher).toBeObject()
100
+
101
+ expectTypeOf<LegacySessionPublic>().not.toHaveProperty('ChannelStore')
102
+ expectTypeOf<LegacySessionPublic>().not.toHaveProperty('Receipt')
103
+ expectTypeOf<LegacySessionPublic>().not.toHaveProperty('Sse')
104
+ expectTypeOf<LegacySessionPublic>().not.toHaveProperty('Ws')
105
+ })
@@ -123,4 +123,89 @@ describe('tempo.charge client', () => {
123
123
  vi.resetModules()
124
124
  }
125
125
  })
126
+
127
+ describe('chain pinning', () => {
128
+ const client = createClient({
129
+ account,
130
+ chain: tempoLocalnet,
131
+ transport: http('http://127.0.0.1'),
132
+ })
133
+
134
+ test('rejects a challenge whose chainId conflicts with the pin', async () => {
135
+ const getClient = vi.fn(() => client)
136
+ const method = charge({
137
+ account,
138
+ expectedChainId: 42431,
139
+ getClient,
140
+ })
141
+
142
+ await expect(
143
+ method.createCredential({
144
+ challenge: createChallenge({ chainId: 1 }),
145
+ context: {},
146
+ }),
147
+ ).rejects.toThrow('Chain ID mismatch: expected 42431, got 1.')
148
+
149
+ // The mismatch is rejected before resolving a client or signing.
150
+ expect(getClient).not.toHaveBeenCalled()
151
+ })
152
+
153
+ test('accepts a challenge whose chainId matches the pin', async () => {
154
+ const chainId = 42431
155
+ const method = charge({
156
+ account,
157
+ expectedChainId: chainId,
158
+ getClient: () => client,
159
+ })
160
+
161
+ const credential = Credential.deserialize(
162
+ await method.createCredential({
163
+ challenge: createChallenge({ chainId }),
164
+ context: {},
165
+ }),
166
+ )
167
+
168
+ expect(credential.source).toBe(`did:pkh:eip155:${chainId}:${account.address}`)
169
+ })
170
+
171
+ test('signs on the pin when the challenge omits chainId', async () => {
172
+ let requestedChainId: number | undefined
173
+ const chainId = 42431
174
+ const method = charge({
175
+ account,
176
+ expectedChainId: chainId,
177
+ getClient: (parameters) => {
178
+ requestedChainId = parameters.chainId
179
+ return client
180
+ },
181
+ })
182
+
183
+ const credential = Credential.deserialize(
184
+ await method.createCredential({
185
+ challenge: createChallenge(),
186
+ context: {},
187
+ }),
188
+ )
189
+
190
+ expect(requestedChainId).toBe(chainId)
191
+ expect(credential.source).toBe(`did:pkh:eip155:${chainId}:${account.address}`)
192
+ })
193
+
194
+ test('unpinned client accepts any challenge chainId', async () => {
195
+ const chainId = 1
196
+ const method = charge({
197
+ account,
198
+ getClient: () => client,
199
+ })
200
+
201
+ const credential = Credential.deserialize(
202
+ await method.createCredential({
203
+ challenge: createChallenge({ chainId }),
204
+ context: {},
205
+ }),
206
+ )
207
+
208
+ expect(credential.source).toBe(`did:pkh:eip155:${chainId}:${account.address}`)
209
+ })
210
+ })
126
211
  })
@@ -51,9 +51,20 @@ export function charge(parameters: charge.Parameters = {}) {
51
51
  }),
52
52
 
53
53
  async createCredential({ challenge, context }) {
54
+ // Chain pinning: reject a challenge whose chain ID conflicts with the
55
+ // pinned one, and sign on the pin when the challenge omits a chain ID.
54
56
  const challengeChainId = challenge.request.methodDetails?.chainId
55
- const client = await getClient({ chainId: challengeChainId })
56
- const chainId = challengeChainId ?? client.chain?.id
57
+ if (
58
+ parameters.expectedChainId !== undefined &&
59
+ challengeChainId !== undefined &&
60
+ challengeChainId !== parameters.expectedChainId
61
+ )
62
+ throw new Error(
63
+ `Chain ID mismatch: expected ${parameters.expectedChainId}, got ${challengeChainId}.`,
64
+ )
65
+ const resolvedChainId = challengeChainId ?? parameters.expectedChainId
66
+ const client = await getClient({ chainId: resolvedChainId })
67
+ const chainId = resolvedChainId ?? client.chain?.id
57
68
  if (chainId === undefined)
58
69
  throw new Error('No `chainId` provided. Pass a chain ID in the challenge or client.')
59
70
 
@@ -198,6 +209,12 @@ export declare namespace charge {
198
209
  autoSwap?: AutoSwap | undefined
199
210
  /** Client identifier used to derive the client fingerprint in attribution memos. */
200
211
  clientId?: string | undefined
212
+ /**
213
+ * Chain ID this client is willing to pay on. When set, the client rejects
214
+ * any challenge whose `methodDetails.chainId` differs, and signs on this
215
+ * chain when the challenge omits a chain ID.
216
+ */
217
+ expectedChainId?: number | undefined
201
218
  /**
202
219
  * Allowlist of expected split recipient addresses. When set, the client
203
220
  * rejects any challenge whose split recipients are not in this list.
@@ -1,8 +1,18 @@
1
+ import {
2
+ session as sessionLegacyIntent_,
3
+ sessionManager as sessionLegacy_,
4
+ } from '../legacy/client/index.js'
5
+ import { session as sessionMethod_ } from '../session/client/Session.js'
6
+ import { sessionManager as session_ } from '../session/client/SessionManager.js'
1
7
  import { charge as charge_ } from './Charge.js'
2
- import { session as sessionIntent_ } from './Session.js'
3
- import { sessionManager as session_ } from './SessionManager.js'
4
8
  import { subscription as subscription_ } from './Subscription.js'
5
9
 
10
+ const sessionClient = Object.assign(sessionMethod_, { manager: session_ })
11
+ const sessionLegacyClient = Object.assign(sessionLegacy_, { method: sessionLegacyIntent_ })
12
+
13
+ /** Creates a TIP-1034 client method, with explicit managed lifecycle helpers attached. */
14
+ export { sessionClient as session }
15
+
6
16
  /**
7
17
  * Creates both Tempo `charge` and `session` client methods from shared parameters.
8
18
  *
@@ -16,16 +26,18 @@ import { subscription as subscription_ } from './Subscription.js'
16
26
  * ```
17
27
  */
18
28
  export function tempo(parameters: tempo.Parameters = {}) {
19
- return [charge_(parameters), sessionIntent_(parameters)] as const
29
+ return [charge_(parameters), sessionClient(parameters)] as const
20
30
  }
21
31
 
22
32
  export namespace tempo {
23
- export type Parameters = charge_.Parameters & sessionIntent_.Parameters
33
+ export type Parameters = charge_.Parameters & sessionMethod_.Parameters
24
34
 
25
35
  /** Creates a Tempo `charge` client method for one-time TIP-20 token transfers. */
26
36
  export const charge = charge_
27
- /** Creates a client-side streaming session for managing payment channels. */
28
- export const session = session_
37
+ /** Creates a TIP-1034 client method for Mppx registration. Use `tempo.session.manager()` for direct lifecycle control. */
38
+ export const session = sessionClient
39
+ /** @deprecated Use `tempo.session()` for the TIP-1034 session client method. */
40
+ export const sessionLegacy = sessionLegacyClient
29
41
  /** Creates a Tempo `subscription` client method for recurring TIP-20 payments. */
30
42
  export const subscription = subscription_
31
43
  }
@@ -1,6 +1,17 @@
1
1
  export { charge } from './Charge.js'
2
- export { tempo } from './Methods.js'
3
- export { session } from './Session.js'
2
+ export { session, tempo } from './Methods.js'
3
+ export { session as sessionLegacy } from '../legacy/client/index.js'
4
4
  export { subscription } from './Subscription.js'
5
- export type { PaymentResponse, SessionManager } from './SessionManager.js'
6
- export { sessionManager } from './SessionManager.js'
5
+ export type {
6
+ PaymentResponse as SessionLegacyPaymentResponse,
7
+ SessionManager as SessionLegacyManager,
8
+ } from '../legacy/client/index.js'
9
+ export { sessionManager as sessionLegacyManager } from '../legacy/client/index.js'
10
+ export { session as sessionMethod } from '../session/client/Session.js'
11
+ export type {
12
+ PaymentResponse,
13
+ SessionManager,
14
+ SessionManagerSseOptions,
15
+ SessionManagerWebSocketOptions,
16
+ } from '../session/client/SessionManager.js'
17
+ export { sessionManager } from '../session/client/SessionManager.js'
@@ -1,4 +1,5 @@
1
1
  export * as Proof from './Proof.js'
2
2
  export * as Methods from './Methods.js'
3
3
  export * as Session from './session/index.js'
4
+ export * as SessionLegacy from './legacy/index.js'
4
5
  export * as Subscription from './subscription/index.js'