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
@@ -1,462 +0,0 @@
1
- /**
2
- * SSE (Server-Sent Events) utilities for metered streaming payments.
3
- *
4
- * Provides event formatting/parsing, balance polling, the core
5
- * `serve()` loop that meters an async iterable into a ReadableStream
6
- * of SSE events, and helpers (`toResponse`, `fromRequest`) for
7
- * building HTTP responses from the stream.
8
- */
9
- import type { Hex } from 'viem'
10
-
11
- import * as Credential from '../../Credential.js'
12
- import { ChannelClosedError } from '../../Errors.js'
13
- import * as ChannelStore from './ChannelStore.js'
14
- import { createSessionReceipt } from './Receipt.js'
15
- import type { NeedVoucherEvent, SessionCredentialPayload, SessionReceipt } from './Types.js'
16
-
17
- /**
18
- * Format a session receipt as a Server-Sent Event.
19
- *
20
- * Produces a valid SSE event string with `event: payment-receipt`
21
- * and the receipt JSON as the `data` field.
22
- */
23
- export function formatReceiptEvent(receipt: SessionReceipt): string {
24
- return `event: payment-receipt\ndata: ${JSON.stringify(receipt)}\n\n`
25
- }
26
-
27
- /**
28
- * Format a need-voucher event as a Server-Sent Event.
29
- *
30
- * Emitted when the channel balance is exhausted mid-stream.
31
- * The client responds by sending a new voucher credential to
32
- * any mppx-protected endpoint.
33
- */
34
- export function formatNeedVoucherEvent(params: NeedVoucherEvent): string {
35
- return `event: payment-need-voucher\ndata: ${JSON.stringify(params)}\n\n`
36
- }
37
-
38
- /**
39
- * Format an application message as SSE, preserving embedded newlines.
40
- *
41
- * SSE requires multi-line payloads to be emitted as separate `data:` fields.
42
- */
43
- export function formatMessageEvent(value: string): string {
44
- const data = String(value)
45
- .split('\n')
46
- .map((line) => `data: ${line}`)
47
- .join('\n')
48
- return `event: message\n${data}\n\n`
49
- }
50
-
51
- /**
52
- * Parsed SSE event (discriminated union by `type`).
53
- */
54
- export type SseEvent =
55
- | { type: 'message'; data: string }
56
- | { type: 'payment-need-voucher'; data: NeedVoucherEvent }
57
- | { type: 'payment-receipt'; data: SessionReceipt }
58
-
59
- /**
60
- * Parse a raw SSE event string into a typed event.
61
- *
62
- * Handles the three event types used by mppx streaming:
63
- * - `message` (default / no event field) — application data
64
- * - `payment-need-voucher` — balance exhausted, client should send voucher
65
- * - `payment-receipt` — final receipt
66
- */
67
- export function parseEvent(raw: string): SseEvent | null {
68
- let eventType = 'message'
69
- const dataLines: string[] = []
70
-
71
- for (const line of raw.split('\n')) {
72
- if (line.startsWith('event: ')) {
73
- eventType = line.slice(7).trim()
74
- } else if (line.startsWith('data: ')) {
75
- dataLines.push(line.slice(6))
76
- } else if (line === 'data:') {
77
- dataLines.push('')
78
- }
79
- }
80
-
81
- if (dataLines.length === 0) return null
82
- const data = dataLines.join('\n')
83
-
84
- switch (eventType) {
85
- case 'message':
86
- return { type: 'message', data }
87
- case 'payment-need-voucher':
88
- return { type: 'payment-need-voucher', data: JSON.parse(data) as NeedVoucherEvent }
89
- case 'payment-receipt':
90
- return { type: 'payment-receipt', data: JSON.parse(data) as SessionReceipt }
91
- default:
92
- return { type: 'message', data }
93
- }
94
- }
95
-
96
- export type SessionController = {
97
- /**
98
- * Reserve voucher coverage for the next emitted chunk.
99
- *
100
- * The reservation blocks until sufficient voucher headroom exists, but the
101
- * charge is only committed once a chunk is actually emitted. If the stream
102
- * ends or aborts before that emission, the reservation is dropped.
103
- */
104
- charge(): Promise<void>
105
- }
106
-
107
- /**
108
- * Wrap an async iterable with payment metering, producing an SSE stream.
109
- *
110
- * `generate` may be either:
111
- * - An `AsyncIterable<string>` — each yielded value is automatically charged
112
- * (one `tickCost` per value).
113
- * - A callback `(stream: SessionController) => AsyncIterable<string>` — the
114
- * generator controls when charges happen by calling `stream.charge()`.
115
- *
116
- * For each emitted value the stream:
117
- * 1. Reserves `tickCost` from the channel's available voucher headroom
118
- * (auto or manual).
119
- * 2. If balance is sufficient, emits `event: message` with the value.
120
- * 3. If balance is exhausted, emits `event: payment-need-voucher`
121
- * and polls store until the client tops up the channel.
122
- * 4. Commits the reserved charge immediately before the chunk is emitted.
123
- * 5. On generator completion, emits a final `event: payment-receipt`.
124
- *
125
- * Returns a `ReadableStream<Uint8Array>` suitable for use as an HTTP response body.
126
- */
127
- export function serve(options: serve.Options): ReadableStream<Uint8Array> {
128
- const {
129
- store,
130
- channelId,
131
- challengeId,
132
- tickCost,
133
- generate,
134
- pollIntervalMs = 100,
135
- signal,
136
- } = options
137
-
138
- const encoder = new TextEncoder()
139
-
140
- return new ReadableStream<Uint8Array>({
141
- async start(controller) {
142
- const aborted = () => signal?.aborted ?? false
143
- const emit = (event: string) => controller.enqueue(encoder.encode(event))
144
- let prepaidUnits = options.prepaidUnits ?? 0
145
- let reservedAmount = 0n
146
- let reservedUnits = 0
147
-
148
- const charge = () => {
149
- if (prepaidUnits > 0) {
150
- prepaidUnits -= 1
151
- return Promise.resolve()
152
- }
153
- return reserveChargeOrWait({
154
- store,
155
- channelId,
156
- amount: tickCost,
157
- reservedAmount,
158
- emit,
159
- pollIntervalMs,
160
- signal,
161
- }).then(() => {
162
- reservedAmount += tickCost
163
- reservedUnits += 1
164
- })
165
- }
166
-
167
- const iterable: AsyncIterable<string> =
168
- typeof generate === 'function' ? generate({ charge }) : generate
169
-
170
- try {
171
- for await (const value of iterable) {
172
- if (aborted()) break
173
-
174
- if (typeof generate !== 'function') await charge()
175
- await commitReservedCharges({
176
- store,
177
- channelId,
178
- amount: reservedAmount,
179
- units: reservedUnits,
180
- })
181
- reservedAmount = 0n
182
- reservedUnits = 0
183
- controller.enqueue(encoder.encode(formatMessageEvent(value)))
184
- }
185
-
186
- if (!aborted()) {
187
- const channel = await store.getChannel(channelId)
188
- if (channel) {
189
- const receipt = createSessionReceipt({
190
- challengeId,
191
- channelId,
192
- acceptedCumulative: channel.highestVoucherAmount,
193
- spent: channel.spent,
194
- units: channel.units,
195
- })
196
- controller.enqueue(encoder.encode(formatReceiptEvent(receipt)))
197
- }
198
- }
199
- } catch (e) {
200
- if (!aborted()) controller.error(e)
201
- } finally {
202
- controller.close()
203
- }
204
- },
205
- })
206
- }
207
-
208
- export declare namespace serve {
209
- type Options = {
210
- store: ChannelStore.ChannelStore
211
- channelId: Hex
212
- challengeId: string
213
- tickCost: bigint
214
- generate: AsyncIterable<string> | ((stream: SessionController) => AsyncIterable<string>)
215
- pollIntervalMs?: number | undefined
216
- prepaidUnits?: number | undefined
217
- signal?: AbortSignal | undefined
218
- }
219
- }
220
-
221
- /**
222
- * Wrap a `ReadableStream<Uint8Array>` (from {@link serve}) in an HTTP
223
- * `Response` with the correct SSE headers.
224
- */
225
- export function toResponse(body: ReadableStream<Uint8Array>): Response {
226
- return new Response(body, {
227
- headers: {
228
- 'Cache-Control': 'no-cache, no-transform',
229
- Connection: 'keep-alive',
230
- 'Content-Type': 'text/event-stream; charset=utf-8',
231
- },
232
- })
233
- }
234
-
235
- /**
236
- * Extract `channelId`, `challengeId`, and `tickCost` from a `Request`'s
237
- * `Authorization: Payment …` header.
238
- *
239
- * This is a convenience for callers that receive a raw `Request` and need
240
- * the parameters required by {@link serve}.
241
- */
242
- export function fromRequest(request: Request): fromRequest.Context {
243
- const header = request.headers.get('Authorization')
244
- if (!header) throw new Error('Missing Authorization header.')
245
-
246
- const payment = Credential.extractPaymentScheme(header)
247
- if (!payment) throw new Error('Missing Payment credential in Authorization header.')
248
-
249
- const credential = Credential.deserialize(payment)
250
- const payload = credential.payload as SessionCredentialPayload
251
- return {
252
- challengeId: credential.challenge.id,
253
- channelId: payload.channelId,
254
- tickCost: BigInt(credential.challenge.request.amount as string),
255
- }
256
- }
257
-
258
- export declare namespace fromRequest {
259
- type Context = {
260
- challengeId: string
261
- channelId: Hex
262
- tickCost: bigint
263
- }
264
- }
265
-
266
- /**
267
- * Reserve `amount` of voucher headroom for a future emission, retrying when
268
- * balance is insufficient. Uses `store.waitForUpdate()` when available for
269
- * event-driven wakeups, falling back to polling otherwise. Emits
270
- * `payment-need-voucher` events via `emit` while waiting.
271
- */
272
- async function reserveChargeOrWait(options: {
273
- store: ChannelStore.ChannelStore
274
- channelId: Hex
275
- amount: bigint
276
- reservedAmount: bigint
277
- emit: (event: string) => void | Promise<void>
278
- pollIntervalMs: number
279
- signal?: AbortSignal | undefined
280
- }): Promise<void> {
281
- const { store, channelId, amount, emit, pollIntervalMs, reservedAmount, signal } = options
282
-
283
- let channel = await store.getChannel(channelId)
284
- if (!channel) throw new Error('channel not found')
285
- throwIfChannelClosed(channel)
286
-
287
- const hasHeadroom = (state: ChannelStore.State) =>
288
- state.highestVoucherAmount - state.spent - reservedAmount >= amount
289
-
290
- if (hasHeadroom(channel)) return
291
-
292
- // Emit a single need-voucher event, then wait until the accepted voucher
293
- // headroom covers both already-reserved units and the next requested unit.
294
- await Promise.resolve(
295
- emit(
296
- formatNeedVoucherEvent({
297
- channelId,
298
- requiredCumulative: (channel.spent + reservedAmount + amount).toString(),
299
- acceptedCumulative: channel.highestVoucherAmount.toString(),
300
- deposit: channel.deposit.toString(),
301
- }),
302
- ),
303
- )
304
-
305
- while (!hasHeadroom(channel)) {
306
- await waitForUpdate(store, channelId, pollIntervalMs, signal)
307
- channel = await store.getChannel(channelId)
308
- if (!channel) throw new Error('channel not found')
309
- throwIfChannelClosed(channel)
310
- }
311
- }
312
-
313
- async function commitReservedCharges(options: {
314
- store: ChannelStore.ChannelStore
315
- channelId: Hex
316
- amount: bigint
317
- units: number
318
- }): Promise<void> {
319
- const { store, channelId, amount, units } = options
320
- if (amount === 0n || units === 0) return
321
-
322
- let committed = false
323
- const channel = await store.updateChannel(channelId, (current) => {
324
- if (!current) return null
325
- if (current.finalized) return current
326
- if (current.closeRequestedAt !== 0n) return current
327
- if (current.highestVoucherAmount - current.spent < amount) return current
328
- committed = true
329
- return {
330
- ...current,
331
- spent: current.spent + amount,
332
- units: current.units + units,
333
- }
334
- })
335
-
336
- if (!channel) throw new Error('channel not found')
337
- if (channel.finalized) throw new ChannelClosedError({ reason: 'channel is finalized' })
338
- if (channel.closeRequestedAt !== 0n)
339
- throw new ChannelClosedError({ reason: 'channel has a pending close request' })
340
- if (!committed) throw new Error('reserved voucher coverage is no longer available')
341
- }
342
-
343
- function throwIfChannelClosed(channel: ChannelStore.State): void {
344
- if (channel.finalized) throw new ChannelClosedError({ reason: 'channel is finalized' })
345
- if (channel.closeRequestedAt !== 0n)
346
- throw new ChannelClosedError({ reason: 'channel has a pending close request' })
347
- }
348
-
349
- async function waitForUpdate(
350
- store: ChannelStore.ChannelStore,
351
- channelId: Hex,
352
- pollIntervalMs: number,
353
- signal?: AbortSignal,
354
- ): Promise<void> {
355
- if (signal?.aborted) throw new Error('Aborted while waiting for voucher')
356
- if (store.waitForUpdate) {
357
- await Promise.race([store.waitForUpdate(channelId), ...(signal ? [abortPromise(signal)] : [])])
358
- } else {
359
- await sleep(pollIntervalMs)
360
- }
361
- if (signal?.aborted) throw new Error('Aborted while waiting for voucher')
362
- }
363
-
364
- function abortPromise(signal: AbortSignal): Promise<void> {
365
- return new Promise((resolve) => {
366
- if (signal.aborted) return resolve()
367
- signal.addEventListener('abort', () => resolve(), { once: true })
368
- })
369
- }
370
-
371
- function sleep(ms: number): Promise<void> {
372
- return new Promise((resolve) => setTimeout(resolve, ms))
373
- }
374
-
375
- /**
376
- * Check whether a `Response` carries an SSE event stream.
377
- *
378
- * Returns `true` when the `Content-Type` header starts with
379
- * `text/event-stream` (case-insensitive, ignoring charset params).
380
- */
381
- export function isEventStream(response: Response): boolean {
382
- const ct = response.headers.get('content-type')
383
- return ct?.toLowerCase().startsWith('text/event-stream') ?? false
384
- }
385
-
386
- /**
387
- * Parse an SSE `Response` body into an async iterable of `data:` payloads.
388
- *
389
- * Yields the raw `data:` field content for each SSE event in the stream.
390
- * Events whose data matches the `skip` predicate are silently dropped
391
- * (e.g. `[DONE]` sentinels used by OpenAI-compatible APIs).
392
- *
393
- * Each yielded value typically becomes one charge tick when fed to
394
- * {@link serve} via the SSE transport's auto-charge mode.
395
- *
396
- * @example
397
- * ```ts
398
- * const upstream = await fetch('https://api.example.com/stream')
399
- * for await (const data of Sse.iterateData(upstream)) {
400
- * console.log(data)
401
- * }
402
- * ```
403
- */
404
- export async function* iterateData(
405
- response: Response,
406
- options?: iterateData.Options,
407
- ): AsyncGenerator<string> {
408
- const skip = options?.skip
409
- const body = response.body
410
- if (!body) return
411
-
412
- const reader = body.getReader()
413
- const decoder = new TextDecoder()
414
- let buffer = ''
415
-
416
- try {
417
- while (true) {
418
- const { value, done } = await reader.read()
419
- if (done) break
420
-
421
- buffer += decoder.decode(value, { stream: true })
422
-
423
- // Split on double-newline SSE event boundaries.
424
- const events = buffer.split('\n\n')
425
- // Last element may be incomplete — keep in buffer.
426
- buffer = events.pop() ?? ''
427
-
428
- for (const event of events) {
429
- if (!event.trim()) continue
430
- const data = extractData(event)
431
- if (data === null) continue
432
- if (skip?.(data)) continue
433
- yield data
434
- }
435
- }
436
-
437
- // Flush remaining buffer.
438
- if (buffer.trim()) {
439
- const data = extractData(buffer)
440
- if (data !== null && !skip?.(data)) yield data
441
- }
442
- } finally {
443
- reader.releaseLock()
444
- }
445
- }
446
-
447
- export declare namespace iterateData {
448
- type Options = {
449
- /** Predicate to skip specific data payloads (e.g. `d => d === '[DONE]'`). */
450
- skip?: ((data: string) => boolean) | undefined
451
- }
452
- }
453
-
454
- /** Extract the `data:` field value from a single SSE event block. */
455
- function extractData(event: string): string | null {
456
- const dataLines: string[] = []
457
- for (const line of event.split('\n')) {
458
- if (line.startsWith('data: ')) dataLines.push(line.slice(6))
459
- else if (line === 'data:') dataLines.push('')
460
- }
461
- return dataLines.length > 0 ? dataLines.join('\n') : null
462
- }
@@ -1,86 +0,0 @@
1
- import type { Address, Hex } from 'viem'
2
-
3
- /**
4
- * Voucher for cumulative payment.
5
- * Cumulative monotonicity prevents replay attacks.
6
- */
7
- export interface Voucher {
8
- channelId: Hex
9
- cumulativeAmount: bigint
10
- }
11
-
12
- /**
13
- * Signed voucher with EIP-712 signature.
14
- */
15
- export interface SignedVoucher extends Voucher {
16
- signature: Hex
17
- }
18
-
19
- /**
20
- * Session credential payload (discriminated union).
21
- */
22
- export type SessionCredentialPayload =
23
- | {
24
- action: 'open'
25
- type: 'transaction'
26
- channelId: Hex
27
- transaction: Hex
28
- signature: Hex
29
- authorizedSigner?: Address | undefined
30
- cumulativeAmount: string
31
- }
32
- | {
33
- action: 'topUp'
34
- type: 'transaction'
35
- channelId: Hex
36
- transaction: Hex
37
- additionalDeposit: string
38
- }
39
- | {
40
- action: 'voucher'
41
- channelId: Hex
42
- cumulativeAmount: string
43
- signature: Hex
44
- }
45
- | {
46
- action: 'close'
47
- channelId: Hex
48
- cumulativeAmount: string
49
- signature: Hex
50
- }
51
-
52
- /**
53
- * SSE event emitted when session balance is exhausted mid-stream.
54
- * The client responds by sending a new voucher credential.
55
- *
56
- * Per spec §11.6, the event data contains:
57
- * - `channelId` — channel identifier
58
- * - `requiredCumulative` — minimum cumulative amount the next voucher must authorize
59
- * - `acceptedCumulative` — current highest accepted voucher amount
60
- * - `deposit` — current on-chain deposit ceiling; when `requiredCumulative > deposit`
61
- * the client must top up the channel before sending a new voucher
62
- */
63
- export interface NeedVoucherEvent {
64
- channelId: Hex
65
- requiredCumulative: string
66
- acceptedCumulative: string
67
- deposit: string
68
- }
69
-
70
- /**
71
- * Session receipt returned in Payment-Receipt header.
72
- */
73
- export interface SessionReceipt {
74
- method: 'tempo'
75
- intent: 'session'
76
- status: 'success'
77
- timestamp: string
78
- /** Payment reference (channelId). Satisfies Receipt.Receipt contract. */
79
- reference: string
80
- challengeId: string
81
- channelId: Hex
82
- acceptedCumulative: string
83
- spent: string
84
- units?: number | undefined
85
- txHash?: Hex | undefined
86
- }