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,499 @@
1
+ import {
2
+ isAddress,
3
+ isAddressEqual,
4
+ parseUnits,
5
+ type Account as viem_Account,
6
+ type Address,
7
+ type Hex,
8
+ } from 'viem'
9
+
10
+ import * as Constants from '../../../Constants.js'
11
+ import type * as Credential from '../../../Credential.js'
12
+ import { VerificationFailedError } from '../../../Errors.js'
13
+ import type { Challenge } from '../../../index.js'
14
+ import type * as z from '../../../zod.js'
15
+ import * as Methods from '../../Methods.js'
16
+ import {
17
+ captureRequestBodyProbe,
18
+ isSessionContentRequest,
19
+ type RequestBodyProbe,
20
+ } from '../../server/internal/request-body.js'
21
+ import type * as PrecompileChain from '../precompile/Chain.js'
22
+ import { tip20ChannelEscrow, type SessionCredentialPayload } from '../precompile/Protocol.js'
23
+ import type { SessionSnapshot } from '../Snapshot.js'
24
+ import * as ChannelStore from './ChannelStore.js'
25
+ import { requireSessionCredentialAction } from './CredentialVerification.js'
26
+ import {
27
+ resolveCredentialFeePayer,
28
+ resolveRequestFeePayer,
29
+ type ParameterFeePayer,
30
+ } from './Settlement.js'
31
+
32
+ /** Inputs used to build server bootstrap hints for a reusable session channel. */
33
+ export type ResolveSessionSnapshotParameters = {
34
+ /** Raw request amount that must be covered by the next voucher. */
35
+ amount: bigint
36
+ /** Channel ID from credential or challenge request, when available. */
37
+ channelId: Hex | undefined
38
+ /** Payment fields the reusable channel must match before it is advertised. */
39
+ expected?: SessionSnapshotPaymentFields | undefined
40
+ /** Server channel store. */
41
+ store: ChannelStore.ChannelStore
42
+ }
43
+
44
+ /** Payment fields used to bind a reusable channel hint to the current challenge. */
45
+ export type SessionSnapshotPaymentFields = {
46
+ /** Tempo chain ID expected by the challenge. */
47
+ chainId: number
48
+ /** Token address expected by the challenge. */
49
+ currency: Address
50
+ /** Escrow precompile address expected by the challenge. */
51
+ escrowContract: Address
52
+ /** Payee address expected by the challenge. */
53
+ recipient: Address
54
+ }
55
+
56
+ /** Request metadata available to `resolveChannelId` without exposing a mutable `Request`. */
57
+ export type SessionChannelIdRequest = {
58
+ /** Request headers, useful for cookies or auth/session headers. */
59
+ readonly headers: Headers
60
+ /** Whether the original request had a body, when known. */
61
+ readonly hasBody?: boolean | undefined
62
+ /** HTTP method for the protected request. */
63
+ readonly method: string
64
+ /** Request URL, when the transport captured it. */
65
+ readonly url?: URL | undefined
66
+ }
67
+
68
+ /** Inputs for resolving a reusable channel when the request did not include a channel ID. */
69
+ export type ResolveSessionChannelIdParameters = {
70
+ /** Captured HTTP request metadata, when the transport provides it. */
71
+ request?: SessionChannelIdRequest | undefined
72
+ /** Credential submitted with the request, when present. */
73
+ credential: Credential.Credential | null | undefined
74
+ /** Cryptographic payer identity from a verified zero-amount bootstrap proof. */
75
+ source?: string | undefined
76
+ /** Session payment request being challenged. */
77
+ paymentRequest: SessionPaymentRequestInput
78
+ /** Channel store backing this session method. */
79
+ store: ChannelStore.ChannelStore
80
+ }
81
+
82
+ /** Application hook for mapping request identity to an existing session channel. */
83
+ export type ResolveSessionChannelId = (
84
+ parameters: ResolveSessionChannelIdParameters,
85
+ ) => Promise<string | null | undefined> | string | null | undefined
86
+
87
+ /** Normalizes a session channel ID hint when one is present. */
88
+ export function normalizeSessionChannelId(value: unknown): Hex | undefined {
89
+ if (typeof value !== 'string') return undefined
90
+ try {
91
+ return ChannelStore.normalizeChannelId(value)
92
+ } catch {
93
+ return undefined
94
+ }
95
+ }
96
+
97
+ /** Extracts and normalizes a credential channel ID after credential verification. */
98
+ export function getCredentialChannelId(credential: Credential.Credential | null | undefined) {
99
+ if (!isObject(credential?.payload)) return undefined
100
+ return normalizeSessionChannelId(credential.payload.channelId)
101
+ }
102
+
103
+ function normalizeResolvedSessionChannelId(value: string | null | undefined): Hex | undefined {
104
+ if (value === null || value === undefined) return undefined
105
+ return ChannelStore.normalizeChannelId(value)
106
+ }
107
+
108
+ /** Resolves the channel ID used to build server-side session bootstrap hints. */
109
+ export async function resolveSessionChannelId(parameters: {
110
+ capturedRequest?: RequestBodyProbe | undefined
111
+ credential: Credential.Credential | null | undefined
112
+ request: SessionPaymentRequestInput
113
+ resolveChannelId?: ResolveSessionChannelId | undefined
114
+ source?: string | undefined
115
+ store: ChannelStore.ChannelStore
116
+ }): Promise<Hex | undefined> {
117
+ const { capturedRequest, credential, request, resolveChannelId, source, store } = parameters
118
+ const explicitChannelId = normalizeSessionChannelId(request.channelId)
119
+ if (explicitChannelId) return explicitChannelId
120
+ if (!resolveChannelId) return undefined
121
+ return normalizeResolvedSessionChannelId(
122
+ await resolveChannelId({
123
+ request: capturedRequest,
124
+ credential: source ? credential : null,
125
+ source,
126
+ paymentRequest: request,
127
+ store,
128
+ }),
129
+ )
130
+ }
131
+
132
+ /** Builds server bootstrap hints for a reusable precompile session channel. */
133
+ export async function resolveSessionSnapshot(
134
+ parameters: ResolveSessionSnapshotParameters,
135
+ ): Promise<SessionSnapshot | undefined> {
136
+ const { amount, channelId, expected, store } = parameters
137
+ if (!channelId) return undefined
138
+ const channel = await store.getChannel(ChannelStore.normalizeChannelId(channelId))
139
+ if (!channel || !ChannelStore.isPrecompileState(channel)) return undefined
140
+ if (channel.finalized) return undefined
141
+ if (expected && !matchesSnapshotPaymentFields(channel, expected)) return undefined
142
+ const requiredCumulative = channel.spent + amount
143
+ const acceptedCumulative =
144
+ channel.highestVoucherAmount > requiredCumulative
145
+ ? channel.highestVoucherAmount
146
+ : requiredCumulative
147
+ return {
148
+ acceptedCumulative: acceptedCumulative.toString(),
149
+ chainId: channel.chainId,
150
+ channelId: channel.channelId,
151
+ closeRequestedAt:
152
+ channel.closeRequestedAt === 0n ? undefined : channel.closeRequestedAt.toString(),
153
+ deposit: channel.deposit.toString(),
154
+ descriptor: channel.descriptor,
155
+ escrow: channel.escrowContract,
156
+ requiredCumulative: requiredCumulative.toString(),
157
+ settled: channel.settledOnChain.toString(),
158
+ spent: channel.spent.toString(),
159
+ units: channel.units,
160
+ }
161
+ }
162
+
163
+ function matchesSnapshotPaymentFields(
164
+ channel: ChannelStore.StoredPrecompileChannel,
165
+ expected: SessionSnapshotPaymentFields,
166
+ ) {
167
+ return (
168
+ channel.chainId === expected.chainId &&
169
+ isAddressEqual(channel.escrowContract, expected.escrowContract) &&
170
+ isAddressEqual(channel.payee, expected.recipient) &&
171
+ isAddressEqual(channel.token, expected.currency)
172
+ )
173
+ }
174
+
175
+ /** Inputs for deciding whether a verified session credential should serve content. */
176
+ export type SessionResponseGateParameters = {
177
+ /** Captured request metadata from the verification envelope, when available. */
178
+ capturedRequest?: Parameters<typeof isSessionContentRequest>[0] | undefined
179
+ /** Raw HTTP request used as a fallback when no captured metadata exists. */
180
+ input: Request
181
+ /** Credential payload or minimal action-bearing payload. */
182
+ payload: SessionCredentialPayload | { action?: unknown }
183
+ }
184
+
185
+ /**
186
+ * Returns a management response for non-content session actions.
187
+ *
188
+ * `close` and `topUp` are always management-only. `open` and `voucher` serve
189
+ * content only when the request classifier says the request is billable.
190
+ */
191
+ export function respondToSessionCredential(
192
+ parameters: SessionResponseGateParameters,
193
+ ): Response | undefined {
194
+ const action = requireSessionCredentialAction(parameters.payload)
195
+
196
+ if (action === 'close') return new Response(null, { status: 204 })
197
+ if (action === 'topUp') return new Response(null, { status: 204 })
198
+
199
+ const request = parameters.capturedRequest ?? captureRequestBodyProbe(parameters.input)
200
+ if (isSessionContentRequest(request)) return undefined
201
+ return new Response(null, { status: 204 })
202
+ }
203
+
204
+ type ChainIdClient = {
205
+ chain?: { id?: number | undefined } | undefined
206
+ }
207
+
208
+ /** Public request input accepted by the tempo session method before schema normalization. */
209
+ export type SessionPaymentRequestInput = z.input<typeof Methods.session.schema.request>
210
+
211
+ /** Canonical request shape embedded in signed `tempo/session` challenges. */
212
+ export type CanonicalSessionPaymentRequest = z.output<typeof Methods.session.schema.request>
213
+
214
+ /** Canonical challenge request after required TIP-1034 method details have been proven present. */
215
+ export type VerifiedSessionPaymentRequest = CanonicalSessionPaymentRequest & {
216
+ /** Required TIP-1034 method details for credential verification. */
217
+ methodDetails: SessionMethodDetails
218
+ }
219
+
220
+ /** Session request input after server-side chain, escrow, fee-payer, and snapshot defaults are added. */
221
+ export type ResolvedSessionPaymentRequest = SessionPaymentRequestInput & {
222
+ chainId: number
223
+ escrowContract: Address
224
+ feePayer?: boolean | viem_Account | undefined
225
+ operator?: Address | undefined
226
+ sessionSnapshot?: SessionSnapshot | undefined
227
+ }
228
+
229
+ /** TIP-1034 session details embedded in a payment challenge request. */
230
+ export type SessionMethodDetails = {
231
+ /** Tempo chain ID used for voucher domain and channel ID checks. */
232
+ chainId: number
233
+ /** TIP20EscrowChannel precompile address for this challenge. */
234
+ escrowContract: Address
235
+ /** Whether this challenge allows fee-sponsored management transactions. */
236
+ feePayer?: boolean | undefined
237
+ /** Minimum raw-unit increase required for voucher credentials. */
238
+ minVoucherDelta?: string | undefined
239
+ /** Channel operator address the client should encode in new open transactions. */
240
+ operator?: Address | undefined
241
+ /** Tempo session protocol version for this challenge. */
242
+ sessionProtocol?: Constants.SessionProtocol | undefined
243
+ }
244
+
245
+ /** Inputs used to resolve the chain ID for a session challenge. */
246
+ export type ResolveRequestChainIdParameters = {
247
+ getClient(parameters: { chainId?: number | undefined }): ChainIdClient | Promise<ChainIdClient>
248
+ parameterChainId?: number | undefined
249
+ requestChainId?: number | undefined
250
+ }
251
+
252
+ /** Inputs used to enrich a server session payment request before challenge creation. */
253
+ export type ResolveSessionPaymentRequestParameters = {
254
+ capturedRequest?: RequestBodyProbe | undefined
255
+ credential: Credential.Credential | null | undefined
256
+ decimals: number
257
+ defaultFeePayer?: viem_Account | undefined
258
+ getClient: ResolveRequestChainIdParameters['getClient']
259
+ parameterChainId?: number | undefined
260
+ parameterEscrowContract?: Address | undefined
261
+ parameterFeePayer?: ParameterFeePayer
262
+ request: SessionPaymentRequestInput
263
+ resolveChannelId?: ResolveSessionChannelId | undefined
264
+ source?: string | undefined
265
+ store: ChannelStore.ChannelStore
266
+ }
267
+
268
+ /** Inputs used to resolve shared context for credential verification. */
269
+ export type ResolveCredentialVerificationContextParameters = {
270
+ /** Default configured fee-payer account, when enabled. */
271
+ feePayer?: viem_Account | undefined
272
+ /** Resolves a viem client for the challenge chain ID. */
273
+ getClient(parameters: {
274
+ chainId: number
275
+ }): PrecompileChain.TransactionClient | Promise<PrecompileChain.TransactionClient>
276
+ /** Default human-readable minimum voucher delta configured on `session()`. */
277
+ minVoucherDelta?: string | undefined
278
+ /** Token decimals used to parse default minimum voucher delta. */
279
+ decimals: number
280
+ /** Canonical or schema-input request being verified. */
281
+ request: unknown
282
+ }
283
+
284
+ /** Shared context derived from the HMAC-bound challenge request for credential verification. */
285
+ export type CredentialVerificationContext = {
286
+ /** Canonical session request shape. */
287
+ request: VerifiedSessionPaymentRequest
288
+ /** Required TIP-1034 method details embedded in the challenge request. */
289
+ methodDetails: SessionMethodDetails
290
+ /** Challenge chain ID. */
291
+ chainId: number
292
+ /** Challenge escrow precompile address. */
293
+ escrow: Address
294
+ /** Client for precompile reads and transaction broadcasts. */
295
+ client: PrecompileChain.TransactionClient
296
+ /** Fee payer authorized for this credential, when allowed. */
297
+ feePayer?: viem_Account | undefined
298
+ /** Minimum allowed voucher delta in raw token units. */
299
+ minVoucherDelta: bigint
300
+ }
301
+
302
+ /** Payment fields extracted from the credential challenge request. */
303
+ export type ChallengePaymentFields = {
304
+ /** Raw request amount in token units. */
305
+ amount: bigint
306
+ /** Token address expected by the server. */
307
+ currency: Address
308
+ /** Payee address expected by the server. */
309
+ recipient: Address
310
+ }
311
+
312
+ function isObject(value: unknown): value is Record<string, unknown> {
313
+ return typeof value === 'object' && value !== null
314
+ }
315
+
316
+ function isCanonicalSessionMethodDetails(value: unknown): value is SessionMethodDetails {
317
+ return (
318
+ isObject(value) &&
319
+ typeof value.chainId === 'number' &&
320
+ typeof value.escrowContract === 'string' &&
321
+ isAddress(value.escrowContract, { strict: false }) &&
322
+ (value.feePayer === undefined || typeof value.feePayer === 'boolean') &&
323
+ (value.minVoucherDelta === undefined || typeof value.minVoucherDelta === 'string') &&
324
+ (value.operator === undefined ||
325
+ (typeof value.operator === 'string' && isAddress(value.operator, { strict: false }))) &&
326
+ (value.sessionProtocol === undefined || value.sessionProtocol === Constants.SessionProtocols.v2)
327
+ )
328
+ }
329
+
330
+ function isVerifiedSessionPaymentRequest(
331
+ request: unknown,
332
+ ): request is VerifiedSessionPaymentRequest {
333
+ return (
334
+ isObject(request) &&
335
+ typeof request.amount === 'string' &&
336
+ typeof request.currency === 'string' &&
337
+ typeof request.unitType === 'string' &&
338
+ isCanonicalSessionMethodDetails(request.methodDetails)
339
+ )
340
+ }
341
+
342
+ function readChallengeAddress(value: unknown, label: string): Address {
343
+ if (typeof value === 'string' && isAddress(value, { strict: false })) return value
344
+ throw new VerificationFailedError({ reason: `missing challenge ${label}` })
345
+ }
346
+
347
+ function readChallengeAmount(value: unknown): bigint {
348
+ if (typeof value === 'string') return BigInt(value)
349
+ throw new VerificationFailedError({ reason: 'missing challenge amount' })
350
+ }
351
+
352
+ /** Reads the destination, token, and raw amount from a session challenge request. */
353
+ export function getChallengePaymentFields(challenge: Challenge.Challenge): ChallengePaymentFields {
354
+ return {
355
+ amount: readChallengeAmount(challenge.request.amount),
356
+ currency: readChallengeAddress(challenge.request.currency, 'currency'),
357
+ recipient: readChallengeAddress(challenge.request.recipient, 'recipient'),
358
+ }
359
+ }
360
+
361
+ /** Resolves the chain ID from request override, method parameters, or client config. */
362
+ export async function resolveRequestChainId(parameters: ResolveRequestChainIdParameters) {
363
+ const { getClient, parameterChainId, requestChainId } = parameters
364
+ if (requestChainId) return requestChainId
365
+ if (parameterChainId) return parameterChainId
366
+ return (await getClient({})).chain?.id
367
+ }
368
+
369
+ /** Resolves request-time TIP-1034 details and server bootstrap hints for a challenge. */
370
+ export async function resolveSessionPaymentRequest(
371
+ parameters: ResolveSessionPaymentRequestParameters,
372
+ ): Promise<ResolvedSessionPaymentRequest> {
373
+ const {
374
+ capturedRequest,
375
+ credential,
376
+ decimals,
377
+ defaultFeePayer,
378
+ getClient,
379
+ parameterChainId,
380
+ parameterEscrowContract,
381
+ parameterFeePayer,
382
+ request,
383
+ resolveChannelId,
384
+ source,
385
+ store,
386
+ } = parameters
387
+
388
+ const chainId = await resolveRequestChainId({
389
+ getClient,
390
+ parameterChainId,
391
+ requestChainId: request.chainId,
392
+ })
393
+ if (!chainId) throw new Error('No chainId configured for tempo.session().')
394
+
395
+ const client = await getClient({ chainId })
396
+ if (client.chain?.id !== chainId)
397
+ throw new Error(`Client not configured with chainId ${chainId}.`)
398
+
399
+ const escrowContract = resolveRequestEscrowContract(
400
+ request.escrowContract,
401
+ parameterEscrowContract,
402
+ )
403
+ const operator = resolveRequestOperator(request.operator)
404
+ const requestAmount = parseUnits(request.amount, decimals)
405
+ const channelId = await resolveSessionChannelId({
406
+ capturedRequest,
407
+ credential,
408
+ request,
409
+ resolveChannelId,
410
+ source,
411
+ store,
412
+ })
413
+ const sessionSnapshot = await resolveSessionSnapshot({
414
+ amount: capturedRequest && !isSessionContentRequest(capturedRequest) ? 0n : requestAmount,
415
+ channelId,
416
+ expected: {
417
+ chainId,
418
+ currency: readChallengeAddress(request.currency, 'currency'),
419
+ escrowContract,
420
+ recipient: readChallengeAddress(request.recipient, 'recipient'),
421
+ },
422
+ store,
423
+ })
424
+ const { operator: _operator, ...requestWithoutOperator } = request
425
+
426
+ return {
427
+ ...requestWithoutOperator,
428
+ chainId,
429
+ escrowContract,
430
+ feePayer: resolveRequestFeePayer({
431
+ credential,
432
+ defaultFeePayer,
433
+ parameterFeePayer,
434
+ requestFeePayer: request.feePayer,
435
+ }),
436
+ ...(operator ? { operator } : {}),
437
+ ...(sessionSnapshot ? { sessionSnapshot } : {}),
438
+ }
439
+ }
440
+
441
+ function resolveRequestEscrowContract(
442
+ requestEscrowContract: unknown,
443
+ parameterEscrowContract: Address | undefined,
444
+ ): Address {
445
+ if (typeof requestEscrowContract === 'string') {
446
+ if (!isAddress(requestEscrowContract, { strict: false }))
447
+ throw new Error('Invalid escrowContract configured for tempo.session().')
448
+ return requestEscrowContract
449
+ }
450
+ return parameterEscrowContract ?? tip20ChannelEscrow
451
+ }
452
+
453
+ function resolveRequestOperator(requestOperator: unknown): Address | undefined {
454
+ if (requestOperator === undefined) return undefined
455
+ if (typeof requestOperator === 'string' && isAddress(requestOperator, { strict: false }))
456
+ return requestOperator as Address
457
+ throw new Error('Invalid operator configured for tempo.session().')
458
+ }
459
+
460
+ /** Parses the canonical session request shape used during credential verification. */
461
+ export function resolveVerificationRequest(request: unknown): VerifiedSessionPaymentRequest {
462
+ const parsed = Methods.session.schema.request.safeParse(request)
463
+ if (parsed.success && isVerifiedSessionPaymentRequest(parsed.data)) return parsed.data
464
+ // verifyCredential() passes the HMAC-bound challenge request, which is
465
+ // already in canonical output form and should not be transformed again.
466
+ if (isVerifiedSessionPaymentRequest(request)) return request
467
+ throw new VerificationFailedError({ reason: 'invalid session request' })
468
+ }
469
+
470
+ /** Returns required TIP-1034 method details from a canonical session request. */
471
+ export function requireMethodDetails(request: VerifiedSessionPaymentRequest): SessionMethodDetails {
472
+ return request.methodDetails
473
+ }
474
+
475
+ /** Resolves all non-payload verification context from a session challenge request. */
476
+ export async function resolveCredentialVerificationContext(
477
+ parameters: ResolveCredentialVerificationContextParameters,
478
+ ): Promise<CredentialVerificationContext> {
479
+ const { decimals, feePayer, getClient, minVoucherDelta, request } = parameters
480
+ const resolvedRequest = resolveVerificationRequest(request)
481
+ const methodDetails = requireMethodDetails(resolvedRequest)
482
+ const chainId = methodDetails.chainId
483
+ const client = await getClient({ chainId })
484
+ return {
485
+ request: resolvedRequest,
486
+ methodDetails,
487
+ chainId,
488
+ escrow: methodDetails.escrowContract,
489
+ client,
490
+ feePayer: resolveCredentialFeePayer({
491
+ feePayer,
492
+ methodDetails,
493
+ request: resolvedRequest,
494
+ }),
495
+ minVoucherDelta: methodDetails.minVoucherDelta
496
+ ? BigInt(methodDetails.minVoucherDelta)
497
+ : parseUnits(minVoucherDelta ?? '0', decimals),
498
+ }
499
+ }