mppx 0.6.31 → 0.8.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 (616) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/README.md +20 -11
  3. package/dist/Challenge.d.ts.map +1 -1
  4. package/dist/Challenge.js +27 -13
  5. package/dist/Challenge.js.map +1 -1
  6. package/dist/Constants.d.ts +46 -0
  7. package/dist/Constants.d.ts.map +1 -0
  8. package/dist/Constants.js +46 -0
  9. package/dist/Constants.js.map +1 -0
  10. package/dist/Credential.d.ts.map +1 -1
  11. package/dist/Credential.js +5 -4
  12. package/dist/Credential.js.map +1 -1
  13. package/dist/Mcp.d.ts +3 -0
  14. package/dist/Mcp.d.ts.map +1 -1
  15. package/dist/Mcp.js +2 -0
  16. package/dist/Mcp.js.map +1 -1
  17. package/dist/Method.d.ts +32 -4
  18. package/dist/Method.d.ts.map +1 -1
  19. package/dist/Method.js +5 -2
  20. package/dist/Method.js.map +1 -1
  21. package/dist/PaymentRequest.d.ts +10 -10
  22. package/dist/PaymentRequest.js +8 -8
  23. package/dist/Receipt.d.ts.map +1 -1
  24. package/dist/Receipt.js +3 -2
  25. package/dist/Receipt.js.map +1 -1
  26. package/dist/cli/cli.d.ts.map +1 -1
  27. package/dist/cli/cli.js +19 -11
  28. package/dist/cli/cli.js.map +1 -1
  29. package/dist/cli/plugins/tempo.d.ts.map +1 -1
  30. package/dist/cli/plugins/tempo.js +17 -6
  31. package/dist/cli/plugins/tempo.js.map +1 -1
  32. package/dist/cli/utils.d.ts +5 -0
  33. package/dist/cli/utils.d.ts.map +1 -1
  34. package/dist/cli/utils.js +10 -0
  35. package/dist/cli/utils.js.map +1 -1
  36. package/dist/client/Methods.d.ts +5 -2
  37. package/dist/client/Methods.d.ts.map +1 -1
  38. package/dist/client/Methods.js +5 -2
  39. package/dist/client/Methods.js.map +1 -1
  40. package/dist/client/Mppx.js +2 -2
  41. package/dist/client/Mppx.js.map +1 -1
  42. package/dist/client/Transport.d.ts +11 -16
  43. package/dist/client/Transport.d.ts.map +1 -1
  44. package/dist/client/Transport.js +55 -76
  45. package/dist/client/Transport.js.map +1 -1
  46. package/dist/client/index.d.ts +5 -1
  47. package/dist/client/index.d.ts.map +1 -1
  48. package/dist/client/index.js +3 -1
  49. package/dist/client/index.js.map +1 -1
  50. package/dist/client/internal/Fetch.d.ts.map +1 -1
  51. package/dist/client/internal/Fetch.js +60 -13
  52. package/dist/client/internal/Fetch.js.map +1 -1
  53. package/dist/client/internal/protocols/Mcp.d.ts +7 -0
  54. package/dist/client/internal/protocols/Mcp.d.ts.map +1 -0
  55. package/dist/client/internal/protocols/Mcp.js +159 -0
  56. package/dist/client/internal/protocols/Mcp.js.map +1 -0
  57. package/dist/client/internal/protocols/Mpp.d.ts +4 -0
  58. package/dist/client/internal/protocols/Mpp.d.ts.map +1 -0
  59. package/dist/client/internal/protocols/Mpp.js +18 -0
  60. package/dist/client/internal/protocols/Mpp.js.map +1 -0
  61. package/dist/client/internal/protocols/Protocol.d.ts +10 -0
  62. package/dist/client/internal/protocols/Protocol.d.ts.map +1 -0
  63. package/dist/client/internal/protocols/Protocol.js +2 -0
  64. package/dist/client/internal/protocols/Protocol.js.map +1 -0
  65. package/dist/client/internal/protocols/Shared.d.ts +5 -0
  66. package/dist/client/internal/protocols/Shared.d.ts.map +1 -0
  67. package/dist/client/internal/protocols/Shared.js +20 -0
  68. package/dist/client/internal/protocols/Shared.js.map +1 -0
  69. package/dist/client/internal/protocols/X402.d.ts +8 -0
  70. package/dist/client/internal/protocols/X402.d.ts.map +1 -0
  71. package/dist/client/internal/protocols/X402.js +39 -0
  72. package/dist/client/internal/protocols/X402.js.map +1 -0
  73. package/dist/evm/client/index.d.ts +1 -0
  74. package/dist/evm/client/index.d.ts.map +1 -1
  75. package/dist/evm/client/index.js +1 -0
  76. package/dist/evm/client/index.js.map +1 -1
  77. package/dist/evm/index.d.ts +2 -0
  78. package/dist/evm/index.d.ts.map +1 -1
  79. package/dist/evm/index.js +2 -0
  80. package/dist/evm/index.js.map +1 -1
  81. package/dist/evm/server/Methods.d.ts +1 -1
  82. package/dist/evm/server/Methods.d.ts.map +1 -1
  83. package/dist/evm/server/index.d.ts +1 -0
  84. package/dist/evm/server/index.d.ts.map +1 -1
  85. package/dist/evm/server/index.js +1 -0
  86. package/dist/evm/server/index.js.map +1 -1
  87. package/dist/index.d.ts +1 -0
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +1 -0
  90. package/dist/index.js.map +1 -1
  91. package/dist/internal/AcceptPayment.d.ts +3 -0
  92. package/dist/internal/AcceptPayment.d.ts.map +1 -1
  93. package/dist/internal/AcceptPayment.js +15 -11
  94. package/dist/internal/AcceptPayment.js.map +1 -1
  95. package/dist/mcp/client/McpClient.d.ts +101 -0
  96. package/dist/mcp/client/McpClient.d.ts.map +1 -0
  97. package/dist/mcp/client/McpClient.js +162 -0
  98. package/dist/mcp/client/McpClient.js.map +1 -0
  99. package/dist/mcp/client/index.d.ts.map +1 -0
  100. package/dist/mcp/client/index.js.map +1 -0
  101. package/dist/mcp/server/Transport.d.ts.map +1 -0
  102. package/dist/mcp/server/Transport.js.map +1 -0
  103. package/dist/mcp/server/index.d.ts.map +1 -0
  104. package/dist/mcp/server/index.js.map +1 -0
  105. package/dist/server/Mppx.d.ts +12 -4
  106. package/dist/server/Mppx.d.ts.map +1 -1
  107. package/dist/server/Mppx.js +85 -27
  108. package/dist/server/Mppx.js.map +1 -1
  109. package/dist/server/Response.d.ts.map +1 -1
  110. package/dist/server/Response.js +2 -1
  111. package/dist/server/Response.js.map +1 -1
  112. package/dist/server/Transport.d.ts +1 -1
  113. package/dist/server/Transport.d.ts.map +1 -1
  114. package/dist/server/Transport.js +5 -4
  115. package/dist/server/Transport.js.map +1 -1
  116. package/dist/server/index.d.ts +1 -0
  117. package/dist/server/index.d.ts.map +1 -1
  118. package/dist/server/index.js +1 -0
  119. package/dist/server/index.js.map +1 -1
  120. package/dist/stripe/client/Charge.d.ts +1 -1
  121. package/dist/stripe/client/Charge.d.ts.map +1 -1
  122. package/dist/stripe/client/Charge.js +3 -1
  123. package/dist/stripe/client/Charge.js.map +1 -1
  124. package/dist/stripe/server/Charge.d.ts +1 -1
  125. package/dist/stripe/server/Charge.d.ts.map +1 -1
  126. package/dist/stripe/server/Charge.js +9 -2
  127. package/dist/stripe/server/Charge.js.map +1 -1
  128. package/dist/stripe/server/Methods.d.ts +1 -1
  129. package/dist/stripe/server/Methods.d.ts.map +1 -1
  130. package/dist/stripe/server/internal/html.gen.d.ts +1 -1
  131. package/dist/stripe/server/internal/html.gen.d.ts.map +1 -1
  132. package/dist/stripe/server/internal/html.gen.js +1 -1
  133. package/dist/stripe/server/internal/html.gen.js.map +1 -1
  134. package/dist/tempo/Methods.d.ts +18 -0
  135. package/dist/tempo/Methods.d.ts.map +1 -1
  136. package/dist/tempo/Methods.js +16 -1
  137. package/dist/tempo/Methods.js.map +1 -1
  138. package/dist/tempo/Proof.d.ts +85 -1
  139. package/dist/tempo/Proof.d.ts.map +1 -1
  140. package/dist/tempo/Proof.js +35 -0
  141. package/dist/tempo/Proof.js.map +1 -1
  142. package/dist/tempo/client/Charge.d.ts +19 -1
  143. package/dist/tempo/client/Charge.d.ts.map +1 -1
  144. package/dist/tempo/client/Charge.js +47 -27
  145. package/dist/tempo/client/Charge.js.map +1 -1
  146. package/dist/tempo/client/Methods.d.ts +41 -10
  147. package/dist/tempo/client/Methods.d.ts.map +1 -1
  148. package/dist/tempo/client/Methods.js +16 -7
  149. package/dist/tempo/client/Methods.js.map +1 -1
  150. package/dist/tempo/client/ResolveAccount.d.ts +40 -0
  151. package/dist/tempo/client/ResolveAccount.d.ts.map +1 -0
  152. package/dist/tempo/client/ResolveAccount.js +2 -0
  153. package/dist/tempo/client/ResolveAccount.js.map +1 -0
  154. package/dist/tempo/client/index.d.ts +7 -4
  155. package/dist/tempo/client/index.d.ts.map +1 -1
  156. package/dist/tempo/client/index.js +5 -3
  157. package/dist/tempo/client/index.js.map +1 -1
  158. package/dist/tempo/index.d.ts +1 -0
  159. package/dist/tempo/index.d.ts.map +1 -1
  160. package/dist/tempo/index.js +1 -0
  161. package/dist/tempo/index.js.map +1 -1
  162. package/dist/tempo/internal/fee-payer.d.ts +29 -1
  163. package/dist/tempo/internal/fee-payer.d.ts.map +1 -1
  164. package/dist/tempo/internal/fee-payer.js +138 -4
  165. package/dist/tempo/internal/fee-payer.js.map +1 -1
  166. package/dist/tempo/internal/proof.d.ts +71 -5
  167. package/dist/tempo/internal/proof.d.ts.map +1 -1
  168. package/dist/tempo/internal/proof.js +42 -6
  169. package/dist/tempo/internal/proof.js.map +1 -1
  170. package/dist/tempo/{client → legacy/client}/ChannelOps.d.ts +19 -6
  171. package/dist/tempo/legacy/client/ChannelOps.d.ts.map +1 -0
  172. package/dist/tempo/{client → legacy/client}/ChannelOps.js +9 -3
  173. package/dist/tempo/legacy/client/ChannelOps.js.map +1 -0
  174. package/dist/tempo/{client → legacy/client}/Session.d.ts +23 -4
  175. package/dist/tempo/legacy/client/Session.d.ts.map +1 -0
  176. package/dist/tempo/{client → legacy/client}/Session.js +14 -7
  177. package/dist/tempo/legacy/client/Session.js.map +1 -0
  178. package/dist/tempo/{client → legacy/client}/SessionManager.d.ts +20 -5
  179. package/dist/tempo/legacy/client/SessionManager.d.ts.map +1 -0
  180. package/dist/tempo/{client → legacy/client}/SessionManager.js +30 -19
  181. package/dist/tempo/legacy/client/SessionManager.js.map +1 -0
  182. package/dist/tempo/legacy/client/index.d.ts +7 -0
  183. package/dist/tempo/legacy/client/index.d.ts.map +1 -0
  184. package/dist/tempo/legacy/client/index.js +5 -0
  185. package/dist/tempo/legacy/client/index.js.map +1 -0
  186. package/dist/tempo/legacy/index.d.ts +7 -0
  187. package/dist/tempo/legacy/index.d.ts.map +1 -0
  188. package/dist/tempo/legacy/index.js +7 -0
  189. package/dist/tempo/legacy/index.js.map +1 -0
  190. package/dist/tempo/{server → legacy/server}/Session.d.ts +28 -11
  191. package/dist/tempo/legacy/server/Session.d.ts.map +1 -0
  192. package/dist/tempo/{server → legacy/server}/Session.js +12 -10
  193. package/dist/tempo/legacy/server/Session.js.map +1 -0
  194. package/dist/tempo/legacy/server/index.d.ts +5 -0
  195. package/dist/tempo/legacy/server/index.d.ts.map +1 -0
  196. package/dist/tempo/legacy/server/index.js +5 -0
  197. package/dist/tempo/legacy/server/index.js.map +1 -0
  198. package/dist/tempo/{session → legacy/session}/Chain.d.ts +30 -23
  199. package/dist/tempo/legacy/session/Chain.d.ts.map +1 -0
  200. package/dist/tempo/{session → legacy/session}/Chain.js +12 -11
  201. package/dist/tempo/legacy/session/Chain.js.map +1 -0
  202. package/dist/tempo/{session → legacy/session}/Channel.d.ts +1 -0
  203. package/dist/tempo/legacy/session/Channel.d.ts.map +1 -0
  204. package/dist/tempo/legacy/session/Channel.js.map +1 -0
  205. package/dist/tempo/legacy/session/ChannelStore.d.ts +22 -0
  206. package/dist/tempo/legacy/session/ChannelStore.d.ts.map +1 -0
  207. package/dist/tempo/legacy/session/ChannelStore.js +6 -0
  208. package/dist/tempo/legacy/session/ChannelStore.js.map +1 -0
  209. package/dist/tempo/legacy/session/Types.d.ts +73 -0
  210. package/dist/tempo/legacy/session/Types.d.ts.map +1 -0
  211. package/dist/tempo/legacy/session/Types.js.map +1 -0
  212. package/dist/tempo/{session → legacy/session}/Voucher.d.ts +4 -4
  213. package/dist/tempo/legacy/session/Voucher.d.ts.map +1 -0
  214. package/dist/tempo/{session → legacy/session}/Voucher.js +1 -1
  215. package/dist/tempo/legacy/session/Voucher.js.map +1 -0
  216. package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts +1 -0
  217. package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts.map +1 -1
  218. package/dist/tempo/{session → legacy/session}/escrow.abi.js +1 -0
  219. package/dist/tempo/legacy/session/escrow.abi.js.map +1 -0
  220. package/dist/tempo/legacy/session/index.d.ts +9 -0
  221. package/dist/tempo/legacy/session/index.d.ts.map +1 -0
  222. package/dist/tempo/legacy/session/index.js +9 -0
  223. package/dist/tempo/legacy/session/index.js.map +1 -0
  224. package/dist/tempo/server/Charge.d.ts +1 -1
  225. package/dist/tempo/server/Charge.d.ts.map +1 -1
  226. package/dist/tempo/server/Charge.js +51 -30
  227. package/dist/tempo/server/Charge.js.map +1 -1
  228. package/dist/tempo/server/Methods.d.ts +67 -8
  229. package/dist/tempo/server/Methods.d.ts.map +1 -1
  230. package/dist/tempo/server/Methods.js +40 -10
  231. package/dist/tempo/server/Methods.js.map +1 -1
  232. package/dist/tempo/server/Subscription.d.ts +11 -1
  233. package/dist/tempo/server/Subscription.d.ts.map +1 -1
  234. package/dist/tempo/server/Subscription.js +135 -23
  235. package/dist/tempo/server/Subscription.js.map +1 -1
  236. package/dist/tempo/server/index.d.ts +6 -5
  237. package/dist/tempo/server/index.d.ts.map +1 -1
  238. package/dist/tempo/server/index.js +5 -5
  239. package/dist/tempo/server/index.js.map +1 -1
  240. package/dist/tempo/server/internal/html.gen.d.ts +1 -1
  241. package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
  242. package/dist/tempo/server/internal/html.gen.js +1 -1
  243. package/dist/tempo/server/internal/html.gen.js.map +1 -1
  244. package/dist/tempo/server/internal/request-body.d.ts +7 -2
  245. package/dist/tempo/server/internal/request-body.d.ts.map +1 -1
  246. package/dist/tempo/server/internal/request-body.js +20 -3
  247. package/dist/tempo/server/internal/request-body.js.map +1 -1
  248. package/dist/tempo/server/internal/transport.d.ts +8 -4
  249. package/dist/tempo/server/internal/transport.d.ts.map +1 -1
  250. package/dist/tempo/server/internal/transport.js +8 -7
  251. package/dist/tempo/server/internal/transport.js.map +1 -1
  252. package/dist/tempo/session/Snapshot.d.ts +32 -0
  253. package/dist/tempo/session/Snapshot.d.ts.map +1 -0
  254. package/dist/tempo/session/Snapshot.js +37 -0
  255. package/dist/tempo/session/Snapshot.js.map +1 -0
  256. package/dist/tempo/session/client/ChannelOps.d.ts +81 -0
  257. package/dist/tempo/session/client/ChannelOps.d.ts.map +1 -0
  258. package/dist/tempo/session/client/ChannelOps.js +201 -0
  259. package/dist/tempo/session/client/ChannelOps.js.map +1 -0
  260. package/dist/tempo/session/client/ChannelStore.d.ts +51 -0
  261. package/dist/tempo/session/client/ChannelStore.d.ts.map +1 -0
  262. package/dist/tempo/session/client/ChannelStore.js +63 -0
  263. package/dist/tempo/session/client/ChannelStore.js.map +1 -0
  264. package/dist/tempo/session/client/CredentialState.d.ts +245 -0
  265. package/dist/tempo/session/client/CredentialState.d.ts.map +1 -0
  266. package/dist/tempo/session/client/CredentialState.js +419 -0
  267. package/dist/tempo/session/client/CredentialState.js.map +1 -0
  268. package/dist/tempo/session/client/ReceiptCoordinator.d.ts +26 -0
  269. package/dist/tempo/session/client/ReceiptCoordinator.d.ts.map +1 -0
  270. package/dist/tempo/session/client/ReceiptCoordinator.js +61 -0
  271. package/dist/tempo/session/client/ReceiptCoordinator.js.map +1 -0
  272. package/dist/tempo/session/client/Runtime.d.ts +464 -0
  273. package/dist/tempo/session/client/Runtime.d.ts.map +1 -0
  274. package/dist/tempo/session/client/Runtime.js +499 -0
  275. package/dist/tempo/session/client/Runtime.js.map +1 -0
  276. package/dist/tempo/session/client/Session.d.ts +138 -0
  277. package/dist/tempo/session/client/Session.d.ts.map +1 -0
  278. package/dist/tempo/session/client/Session.js +69 -0
  279. package/dist/tempo/session/client/Session.js.map +1 -0
  280. package/dist/tempo/session/client/SessionManager.d.ts +84 -0
  281. package/dist/tempo/session/client/SessionManager.d.ts.map +1 -0
  282. package/dist/tempo/session/client/SessionManager.js +577 -0
  283. package/dist/tempo/session/client/SessionManager.js.map +1 -0
  284. package/dist/tempo/session/client/Transports.d.ts +449 -0
  285. package/dist/tempo/session/client/Transports.d.ts.map +1 -0
  286. package/dist/tempo/session/client/Transports.js +721 -0
  287. package/dist/tempo/session/client/Transports.js.map +1 -0
  288. package/dist/tempo/session/client/index.d.ts +11 -0
  289. package/dist/tempo/session/client/index.d.ts.map +1 -0
  290. package/dist/tempo/session/client/index.js +6 -0
  291. package/dist/tempo/session/client/index.js.map +1 -0
  292. package/dist/tempo/session/index.d.ts +7 -8
  293. package/dist/tempo/session/index.d.ts.map +1 -1
  294. package/dist/tempo/session/index.js +7 -8
  295. package/dist/tempo/session/index.js.map +1 -1
  296. package/dist/tempo/session/precompile/Chain.d.ts +319 -0
  297. package/dist/tempo/session/precompile/Chain.d.ts.map +1 -0
  298. package/dist/tempo/session/precompile/Chain.js +492 -0
  299. package/dist/tempo/session/precompile/Chain.js.map +1 -0
  300. package/dist/tempo/session/precompile/Channel.d.ts +46 -0
  301. package/dist/tempo/session/precompile/Channel.d.ts.map +1 -0
  302. package/dist/tempo/session/precompile/Channel.js +56 -0
  303. package/dist/tempo/session/precompile/Channel.js.map +1 -0
  304. package/dist/tempo/session/precompile/Protocol.d.ts +308 -0
  305. package/dist/tempo/session/precompile/Protocol.d.ts.map +1 -0
  306. package/dist/tempo/session/precompile/Protocol.js +264 -0
  307. package/dist/tempo/session/precompile/Protocol.js.map +1 -0
  308. package/dist/tempo/session/precompile/Voucher.d.ts +40 -0
  309. package/dist/tempo/session/precompile/Voucher.d.ts.map +1 -0
  310. package/dist/tempo/session/precompile/Voucher.js +125 -0
  311. package/dist/tempo/session/precompile/Voucher.js.map +1 -0
  312. package/dist/tempo/session/precompile/escrow.abi.d.ts +522 -0
  313. package/dist/tempo/session/precompile/escrow.abi.d.ts.map +1 -0
  314. package/dist/tempo/session/precompile/escrow.abi.js +224 -0
  315. package/dist/tempo/session/precompile/escrow.abi.js.map +1 -0
  316. package/dist/tempo/session/precompile/index.d.ts +24 -0
  317. package/dist/tempo/session/precompile/index.d.ts.map +1 -0
  318. package/dist/tempo/session/precompile/index.js +22 -0
  319. package/dist/tempo/session/precompile/index.js.map +1 -0
  320. package/dist/tempo/session/server/ChannelOps.d.ts +56 -0
  321. package/dist/tempo/session/server/ChannelOps.d.ts.map +1 -0
  322. package/dist/tempo/session/server/ChannelOps.js +91 -0
  323. package/dist/tempo/session/server/ChannelOps.js.map +1 -0
  324. package/dist/tempo/session/server/ChannelStore.d.ts +347 -0
  325. package/dist/tempo/session/server/ChannelStore.d.ts.map +1 -0
  326. package/dist/tempo/session/server/ChannelStore.js +404 -0
  327. package/dist/tempo/session/server/ChannelStore.js.map +1 -0
  328. package/dist/tempo/session/server/CredentialVerification.d.ts +85 -0
  329. package/dist/tempo/session/server/CredentialVerification.d.ts.map +1 -0
  330. package/dist/tempo/session/server/CredentialVerification.js +494 -0
  331. package/dist/tempo/session/server/CredentialVerification.js.map +1 -0
  332. package/dist/tempo/session/server/MeteredStream.d.ts +40 -0
  333. package/dist/tempo/session/server/MeteredStream.d.ts.map +1 -0
  334. package/dist/tempo/session/server/MeteredStream.js +42 -0
  335. package/dist/tempo/session/server/MeteredStream.js.map +1 -0
  336. package/dist/tempo/session/server/RequestState.d.ts +208 -0
  337. package/dist/tempo/session/server/RequestState.d.ts.map +1 -0
  338. package/dist/tempo/session/server/RequestState.js +252 -0
  339. package/dist/tempo/session/server/RequestState.js.map +1 -0
  340. package/dist/tempo/session/server/Session.d.ts +169 -0
  341. package/dist/tempo/session/server/Session.d.ts.map +1 -0
  342. package/dist/tempo/session/server/Session.js +351 -0
  343. package/dist/tempo/session/server/Session.js.map +1 -0
  344. package/dist/tempo/session/server/Settlement.d.ts +185 -0
  345. package/dist/tempo/session/server/Settlement.d.ts.map +1 -0
  346. package/dist/tempo/session/server/Settlement.js +252 -0
  347. package/dist/tempo/session/server/Settlement.js.map +1 -0
  348. package/dist/tempo/session/{Sse.d.ts → server/Sse.d.ts} +9 -56
  349. package/dist/tempo/session/server/Sse.d.ts.map +1 -0
  350. package/dist/tempo/session/server/Sse.js +184 -0
  351. package/dist/tempo/session/server/Sse.js.map +1 -0
  352. package/dist/tempo/session/server/Transports.d.ts +89 -0
  353. package/dist/tempo/session/server/Transports.d.ts.map +1 -0
  354. package/dist/tempo/session/server/Transports.js +149 -0
  355. package/dist/tempo/session/server/Transports.js.map +1 -0
  356. package/dist/tempo/session/server/Ws.d.ts +48 -0
  357. package/dist/tempo/session/server/Ws.d.ts.map +1 -0
  358. package/dist/tempo/session/server/Ws.js +244 -0
  359. package/dist/tempo/session/server/Ws.js.map +1 -0
  360. package/dist/tempo/session/server/index.d.ts +4 -0
  361. package/dist/tempo/session/server/index.d.ts.map +1 -0
  362. package/dist/tempo/session/server/index.js +2 -0
  363. package/dist/tempo/session/server/index.js.map +1 -0
  364. package/dist/tempo/subscription/KeyAuthorization.d.ts +712 -1
  365. package/dist/tempo/subscription/KeyAuthorization.d.ts.map +1 -1
  366. package/dist/tempo/subscription/Store.d.ts +2 -0
  367. package/dist/tempo/subscription/Store.d.ts.map +1 -1
  368. package/dist/tempo/subscription/Store.js +16 -1
  369. package/dist/tempo/subscription/Store.js.map +1 -1
  370. package/dist/x402/index.d.ts +1 -0
  371. package/dist/x402/index.d.ts.map +1 -1
  372. package/dist/x402/index.js +1 -0
  373. package/dist/x402/index.js.map +1 -1
  374. package/package.json +25 -9
  375. package/src/Challenge.test.ts +40 -0
  376. package/src/Challenge.ts +28 -13
  377. package/src/Constants.ts +58 -0
  378. package/src/Credential.ts +5 -4
  379. package/src/Mcp.ts +4 -0
  380. package/src/Method.ts +46 -5
  381. package/src/PaymentRequest.ts +10 -10
  382. package/src/Receipt.ts +3 -2
  383. package/src/cli/cli.test.ts +38 -43
  384. package/src/cli/cli.ts +23 -10
  385. package/src/cli/mcp.test.ts +21 -7
  386. package/src/cli/plugins/tempo.ts +21 -8
  387. package/src/cli/utils.test.ts +25 -1
  388. package/src/cli/utils.ts +10 -0
  389. package/src/client/Methods.ts +5 -2
  390. package/src/client/Mppx.test-d.ts +31 -1
  391. package/src/client/Mppx.test.ts +76 -1
  392. package/src/client/Mppx.ts +2 -2
  393. package/src/client/Transport.test.ts +225 -178
  394. package/src/client/Transport.ts +77 -84
  395. package/src/client/index.ts +25 -1
  396. package/src/client/internal/Fetch.test.ts +236 -6
  397. package/src/client/internal/Fetch.ts +69 -11
  398. package/src/client/internal/protocols/Mcp.test.ts +220 -0
  399. package/src/client/internal/protocols/Mcp.ts +162 -0
  400. package/src/client/internal/protocols/Mpp.ts +21 -0
  401. package/src/client/internal/protocols/Protocol.ts +10 -0
  402. package/src/client/internal/protocols/Shared.ts +25 -0
  403. package/src/client/internal/protocols/X402.ts +42 -0
  404. package/src/discovery/OpenApi.test.ts +1 -1
  405. package/src/env.d.ts +1 -1
  406. package/src/evm/PublicInterface.test-d.ts +1 -1
  407. package/src/evm/client/index.ts +1 -0
  408. package/src/evm/index.ts +2 -0
  409. package/src/evm/server/Charge.test.ts +1 -1
  410. package/src/evm/server/index.ts +1 -0
  411. package/src/index.ts +1 -0
  412. package/src/internal/AcceptPayment.test.ts +61 -0
  413. package/src/internal/AcceptPayment.ts +21 -14
  414. package/src/{mcp-sdk → mcp}/client/McpClient.integration.test.ts +18 -11
  415. package/src/{mcp-sdk → mcp}/client/McpClient.test-d.ts +45 -11
  416. package/src/{mcp-sdk → mcp}/client/McpClient.test.ts +211 -5
  417. package/src/mcp/client/McpClient.ts +307 -0
  418. package/src/mcp/client/McpClient.unit.test.ts +135 -0
  419. package/src/middlewares/elysia.test.ts +9 -5
  420. package/src/middlewares/express.test.ts +9 -5
  421. package/src/middlewares/hono.test.ts +5 -5
  422. package/src/middlewares/internal/mppx.test.ts +1 -1
  423. package/src/middlewares/nextjs.test.ts +9 -5
  424. package/src/proxy/Proxy.test.ts +9 -9
  425. package/src/proxy/services/anthropic.test.ts +1 -1
  426. package/src/proxy/services/openai.test.ts +1 -1
  427. package/src/proxy/services/stripe.test.ts +1 -1
  428. package/src/server/Mppx.authorize.test.ts +1 -1
  429. package/src/server/Mppx.test-d.ts +55 -1
  430. package/src/server/Mppx.test.ts +220 -9
  431. package/src/server/Mppx.ts +501 -407
  432. package/src/server/Response.ts +2 -1
  433. package/src/server/Transport.test.ts +6 -6
  434. package/src/server/Transport.ts +5 -4
  435. package/src/server/index.ts +1 -0
  436. package/src/stripe/Charge.integration.test.ts +1 -1
  437. package/src/stripe/client/Charge.test.ts +21 -6
  438. package/src/stripe/client/Charge.ts +6 -2
  439. package/src/stripe/server/Charge.test.ts +115 -2
  440. package/src/stripe/server/Charge.ts +13 -2
  441. package/src/stripe/server/internal/html/package.json +1 -1
  442. package/src/stripe/server/internal/html.gen.ts +1 -1
  443. package/src/tempo/AccessKeyAuthorization.test.ts +4 -94
  444. package/src/tempo/Methods.test.ts +45 -17
  445. package/src/tempo/Methods.ts +22 -0
  446. package/src/tempo/Proof.conformance.test.ts +146 -0
  447. package/src/tempo/Proof.test-d.ts +15 -0
  448. package/src/tempo/Proof.ts +52 -1
  449. package/src/tempo/PublicExports.test-d.ts +105 -0
  450. package/src/tempo/Subscription.integration.test.ts +1 -1
  451. package/src/tempo/client/Charge.test.ts +258 -0
  452. package/src/tempo/client/Charge.ts +84 -38
  453. package/src/tempo/client/Methods.ts +22 -8
  454. package/src/tempo/client/ResolveAccount.ts +46 -0
  455. package/src/tempo/client/index.ts +15 -4
  456. package/src/tempo/index.ts +1 -0
  457. package/src/tempo/internal/fee-payer.test.ts +296 -17
  458. package/src/tempo/internal/fee-payer.ts +186 -4
  459. package/src/tempo/internal/fee-token.test.ts +14 -9
  460. package/src/tempo/internal/proof.test.ts +12 -4
  461. package/src/tempo/internal/proof.ts +55 -6
  462. package/src/tempo/legacy/AccessKeyAuthorization.test.ts +162 -0
  463. package/src/tempo/legacy/README.md +9 -0
  464. package/src/tempo/{client → legacy/client}/ChannelOps.test.ts +6 -7
  465. package/src/tempo/{client → legacy/client}/ChannelOps.ts +22 -9
  466. package/src/tempo/{client → legacy/client}/Session.test.ts +51 -9
  467. package/src/tempo/{client → legacy/client}/Session.ts +25 -11
  468. package/src/tempo/{client → legacy/client}/SessionManager.test.ts +81 -9
  469. package/src/tempo/{client → legacy/client}/SessionManager.ts +52 -23
  470. package/src/tempo/legacy/client/index.ts +6 -0
  471. package/src/tempo/legacy/index.ts +6 -0
  472. package/src/tempo/{server → legacy/server}/Session.test.ts +136 -71
  473. package/src/tempo/{server → legacy/server}/Session.ts +32 -23
  474. package/src/tempo/legacy/server/index.ts +4 -0
  475. package/src/tempo/{session → legacy/session}/Chain.test.ts +3 -4
  476. package/src/tempo/{session → legacy/session}/Chain.ts +94 -63
  477. package/src/tempo/{session → legacy/session}/Channel.ts +1 -0
  478. package/src/tempo/legacy/session/ChannelStore.test.ts +58 -0
  479. package/src/tempo/legacy/session/ChannelStore.ts +39 -0
  480. package/src/tempo/legacy/session/Types.ts +91 -0
  481. package/src/tempo/{session → legacy/session}/Voucher.ts +12 -8
  482. package/src/tempo/{session → legacy/session}/escrow.abi.ts +1 -0
  483. package/src/tempo/legacy/session/index.ts +8 -0
  484. package/src/tempo/server/AtomicStore.test-d.ts +16 -11
  485. package/src/tempo/server/Charge.test.ts +480 -31
  486. package/src/tempo/server/Charge.ts +54 -30
  487. package/src/tempo/server/Methods.ts +58 -10
  488. package/src/tempo/server/Sse.test.ts +2 -2
  489. package/src/tempo/server/Subscription.test.ts +465 -3
  490. package/src/tempo/server/Subscription.ts +174 -19
  491. package/src/tempo/server/index.ts +6 -5
  492. package/src/tempo/server/internal/html/package.json +2 -2
  493. package/src/tempo/server/internal/html.gen.ts +1 -1
  494. package/src/tempo/server/internal/request-body.test.ts +37 -4
  495. package/src/tempo/server/internal/request-body.ts +25 -6
  496. package/src/tempo/server/internal/transport.test.ts +4 -4
  497. package/src/tempo/server/internal/transport.ts +19 -10
  498. package/src/tempo/session/Snapshot.test.ts +41 -0
  499. package/src/tempo/session/Snapshot.ts +74 -0
  500. package/src/tempo/session/client/ChannelOps.test.ts +163 -0
  501. package/src/tempo/session/client/ChannelOps.ts +330 -0
  502. package/src/tempo/session/client/ChannelStore.ts +111 -0
  503. package/src/tempo/session/client/CredentialState.test.ts +789 -0
  504. package/src/tempo/session/client/CredentialState.ts +799 -0
  505. package/src/tempo/session/client/ReceiptCoordinator.ts +95 -0
  506. package/src/tempo/session/client/Runtime.test.ts +1092 -0
  507. package/src/tempo/session/client/Runtime.ts +986 -0
  508. package/src/tempo/session/client/Session.test.ts +774 -0
  509. package/src/tempo/session/client/Session.ts +123 -0
  510. package/src/tempo/session/client/SessionManager.test.ts +1397 -0
  511. package/src/tempo/session/client/SessionManager.ts +751 -0
  512. package/src/tempo/session/client/Transports.test.ts +837 -0
  513. package/src/tempo/session/client/Transports.ts +1292 -0
  514. package/src/tempo/session/client/index.ts +40 -0
  515. package/src/tempo/session/index.ts +7 -8
  516. package/src/tempo/session/precompile/Chain.integration.test.ts +321 -0
  517. package/src/tempo/session/precompile/Chain.test.ts +1258 -0
  518. package/src/tempo/session/precompile/Chain.ts +979 -0
  519. package/src/tempo/session/precompile/Channel.test.ts +138 -0
  520. package/src/tempo/session/precompile/Channel.ts +103 -0
  521. package/src/tempo/session/precompile/Protocol.test.ts +358 -0
  522. package/src/tempo/session/precompile/Protocol.ts +520 -0
  523. package/src/tempo/session/precompile/Voucher.test.ts +354 -0
  524. package/src/tempo/session/precompile/Voucher.ts +162 -0
  525. package/src/tempo/session/precompile/escrow.abi.ts +226 -0
  526. package/src/tempo/session/precompile/index.ts +33 -0
  527. package/src/tempo/session/server/ChannelOps.test.ts +129 -0
  528. package/src/tempo/session/server/ChannelOps.ts +157 -0
  529. package/src/tempo/session/{ChannelStore.test.ts → server/ChannelStore.test.ts} +536 -29
  530. package/src/tempo/session/server/ChannelStore.ts +835 -0
  531. package/src/tempo/session/server/CredentialVerification.test.ts +146 -0
  532. package/src/tempo/session/server/CredentialVerification.ts +710 -0
  533. package/src/tempo/session/server/MeteredStream.ts +88 -0
  534. package/src/tempo/session/server/RequestState.test.ts +531 -0
  535. package/src/tempo/session/server/RequestState.ts +499 -0
  536. package/src/tempo/session/server/Session.integration.test.ts +444 -0
  537. package/src/tempo/session/server/Session.test.ts +3253 -0
  538. package/src/tempo/session/server/Session.ts +543 -0
  539. package/src/tempo/session/server/Settlement.test.ts +329 -0
  540. package/src/tempo/session/server/Settlement.ts +471 -0
  541. package/src/tempo/session/{Sse.test.ts → server/Sse.test.ts} +37 -3
  542. package/src/tempo/session/server/Sse.ts +254 -0
  543. package/src/tempo/session/server/Transports.test.ts +346 -0
  544. package/src/tempo/session/server/Transports.ts +255 -0
  545. package/src/tempo/session/{Ws.test.ts → server/Ws.test.ts} +4 -4
  546. package/src/tempo/session/server/Ws.ts +380 -0
  547. package/src/tempo/session/server/index.ts +8 -0
  548. package/src/tempo/subscription/Store.ts +27 -9
  549. package/src/x402/Exact.e2e.test.ts +1 -1
  550. package/src/x402/PublicInterface.test-d.ts +1 -1
  551. package/src/x402/index.ts +1 -0
  552. package/dist/mcp-sdk/client/McpClient.d.ts +0 -78
  553. package/dist/mcp-sdk/client/McpClient.d.ts.map +0 -1
  554. package/dist/mcp-sdk/client/McpClient.js +0 -105
  555. package/dist/mcp-sdk/client/McpClient.js.map +0 -1
  556. package/dist/mcp-sdk/client/index.d.ts.map +0 -1
  557. package/dist/mcp-sdk/client/index.js.map +0 -1
  558. package/dist/mcp-sdk/server/Transport.d.ts.map +0 -1
  559. package/dist/mcp-sdk/server/Transport.js.map +0 -1
  560. package/dist/mcp-sdk/server/index.d.ts.map +0 -1
  561. package/dist/mcp-sdk/server/index.js.map +0 -1
  562. package/dist/tempo/client/ChannelOps.d.ts.map +0 -1
  563. package/dist/tempo/client/ChannelOps.js.map +0 -1
  564. package/dist/tempo/client/Session.d.ts.map +0 -1
  565. package/dist/tempo/client/Session.js.map +0 -1
  566. package/dist/tempo/client/SessionManager.d.ts.map +0 -1
  567. package/dist/tempo/client/SessionManager.js.map +0 -1
  568. package/dist/tempo/server/Session.d.ts.map +0 -1
  569. package/dist/tempo/server/Session.js.map +0 -1
  570. package/dist/tempo/session/Chain.d.ts.map +0 -1
  571. package/dist/tempo/session/Chain.js.map +0 -1
  572. package/dist/tempo/session/Channel.d.ts.map +0 -1
  573. package/dist/tempo/session/Channel.js.map +0 -1
  574. package/dist/tempo/session/ChannelStore.d.ts +0 -117
  575. package/dist/tempo/session/ChannelStore.d.ts.map +0 -1
  576. package/dist/tempo/session/ChannelStore.js +0 -172
  577. package/dist/tempo/session/ChannelStore.js.map +0 -1
  578. package/dist/tempo/session/Receipt.d.ts +0 -22
  579. package/dist/tempo/session/Receipt.d.ts.map +0 -1
  580. package/dist/tempo/session/Receipt.js +0 -34
  581. package/dist/tempo/session/Receipt.js.map +0 -1
  582. package/dist/tempo/session/Sse.d.ts.map +0 -1
  583. package/dist/tempo/session/Sse.js +0 -363
  584. package/dist/tempo/session/Sse.js.map +0 -1
  585. package/dist/tempo/session/Types.d.ts +0 -78
  586. package/dist/tempo/session/Types.d.ts.map +0 -1
  587. package/dist/tempo/session/Types.js.map +0 -1
  588. package/dist/tempo/session/Voucher.d.ts.map +0 -1
  589. package/dist/tempo/session/Voucher.js.map +0 -1
  590. package/dist/tempo/session/Ws.d.ts +0 -87
  591. package/dist/tempo/session/Ws.d.ts.map +0 -1
  592. package/dist/tempo/session/Ws.js +0 -443
  593. package/dist/tempo/session/Ws.js.map +0 -1
  594. package/dist/tempo/session/escrow.abi.js.map +0 -1
  595. package/src/mcp-sdk/client/McpClient.ts +0 -196
  596. package/src/tempo/session/ChannelStore.ts +0 -308
  597. package/src/tempo/session/Receipt.test.ts +0 -89
  598. package/src/tempo/session/Receipt.ts +0 -46
  599. package/src/tempo/session/Sse.ts +0 -462
  600. package/src/tempo/session/Types.ts +0 -86
  601. package/src/tempo/session/Ws.ts +0 -576
  602. /package/dist/{mcp-sdk → mcp}/client/index.d.ts +0 -0
  603. /package/dist/{mcp-sdk → mcp}/client/index.js +0 -0
  604. /package/dist/{mcp-sdk → mcp}/server/Transport.d.ts +0 -0
  605. /package/dist/{mcp-sdk → mcp}/server/Transport.js +0 -0
  606. /package/dist/{mcp-sdk → mcp}/server/index.d.ts +0 -0
  607. /package/dist/{mcp-sdk → mcp}/server/index.js +0 -0
  608. /package/dist/tempo/{session → legacy/session}/Channel.js +0 -0
  609. /package/dist/tempo/{session → legacy/session}/Types.js +0 -0
  610. /package/src/{mcp-sdk → mcp}/client/index.ts +0 -0
  611. /package/src/{mcp-sdk → mcp}/server/Transport.test.ts +0 -0
  612. /package/src/{mcp-sdk → mcp}/server/Transport.ts +0 -0
  613. /package/src/{mcp-sdk → mcp}/server/index.ts +0 -0
  614. /package/src/tempo/{session → legacy/session}/Channel.test.ts +0 -0
  615. /package/src/tempo/{session → legacy/session}/Voucher.test.ts +0 -0
  616. /package/src/tempo/session/{Sse.fuzz.test.ts → server/Sse.fuzz.test.ts} +0 -0
@@ -0,0 +1,254 @@
1
+ import type { Hex } from 'viem'
2
+
3
+ import * as Constants from '../../../Constants.js'
4
+ import * as Credential from '../../../Credential.js'
5
+ import {
6
+ createSessionReceipt,
7
+ extractData,
8
+ formatMessageEvent,
9
+ formatNeedVoucherEvent,
10
+ formatReceiptEvent,
11
+ readSessionChallengeAmount,
12
+ requireSessionCredentialContext,
13
+ } from '../precompile/Protocol.js'
14
+ import * as ChannelStore from './ChannelStore.js'
15
+ import { meterIterable, type SessionController } from './MeteredStream.js'
16
+
17
+ /**
18
+ * SSE (Server-Sent Events) utilities for metered streaming payments.
19
+ *
20
+ * Provides event formatting/parsing, balance polling, the core
21
+ * `serve()` loop that meters an async iterable into a ReadableStream
22
+ * of SSE events, and helpers (`toResponse`, `fromRequest`) for
23
+ * building HTTP responses from the stream.
24
+ */
25
+
26
+ export {
27
+ extractData,
28
+ formatMessageEvent,
29
+ formatNeedVoucherEvent,
30
+ formatReceiptEvent,
31
+ parseEvent,
32
+ readSessionChallengeAmount,
33
+ requireSessionCredentialContext,
34
+ type SseEvent,
35
+ } from '../precompile/Protocol.js'
36
+
37
+ /** Controller passed to manual-charge SSE generators. */
38
+ export type { SessionController } from './MeteredStream.js'
39
+
40
+ /**
41
+ * Wrap an async iterable with payment metering, producing an SSE stream.
42
+ *
43
+ * `generate` may be either:
44
+ * - An `AsyncIterable<string>` — each yielded value is automatically charged
45
+ * (one `tickCost` per value).
46
+ * - A callback `(stream: SessionController) => AsyncIterable<string>` — the
47
+ * generator controls when charges happen by calling `stream.charge()`.
48
+ *
49
+ * For each emitted value the stream:
50
+ * 1. Reserves `tickCost` from the channel's available voucher headroom
51
+ * (auto or manual).
52
+ * 2. If balance is sufficient, emits `event: message` with the value.
53
+ * 3. If balance is exhausted, emits `event: payment-need-voucher`
54
+ * and polls store until the client tops up the channel.
55
+ * 4. Commits the reserved charge immediately before the chunk is emitted.
56
+ * 5. On generator completion, emits a final `event: payment-receipt`.
57
+ *
58
+ * Returns a `ReadableStream<Uint8Array>` suitable for use as an HTTP response body.
59
+ */
60
+ export function serve(options: serve.Options): ReadableStream<Uint8Array> {
61
+ const {
62
+ store,
63
+ channelId,
64
+ challengeId,
65
+ tickCost,
66
+ generate,
67
+ pollIntervalMs = 100,
68
+ signal,
69
+ } = options
70
+
71
+ const encoder = new TextEncoder()
72
+
73
+ return new ReadableStream<Uint8Array>({
74
+ async start(controller) {
75
+ const aborted = () => signal?.aborted ?? false
76
+ const emit = (event: string) => controller.enqueue(encoder.encode(event))
77
+
78
+ try {
79
+ for await (const value of meterIterable({
80
+ store,
81
+ channelId,
82
+ tickCost,
83
+ generate,
84
+ pollIntervalMs,
85
+ prepaidUnits: options.prepaidUnits,
86
+ signal,
87
+ emitNeedVoucher: emit,
88
+ formatNeedVoucher: formatNeedVoucherEvent,
89
+ })) {
90
+ if (aborted()) break
91
+ controller.enqueue(encoder.encode(formatMessageEvent(value)))
92
+ }
93
+
94
+ if (!aborted()) {
95
+ const channel = await store.getChannel(channelId)
96
+ if (channel) {
97
+ const receipt = createSessionReceipt({
98
+ challengeId,
99
+ channelId,
100
+ acceptedCumulative: channel.highestVoucherAmount,
101
+ spent: channel.spent,
102
+ units: channel.units,
103
+ })
104
+ controller.enqueue(encoder.encode(formatReceiptEvent(receipt)))
105
+ }
106
+ }
107
+ } catch (e) {
108
+ if (!aborted()) controller.error(e)
109
+ } finally {
110
+ controller.close()
111
+ }
112
+ },
113
+ })
114
+ }
115
+
116
+ /** Type helpers for {@link serve}. */
117
+ export declare namespace serve {
118
+ type Options = {
119
+ store: ChannelStore.ChannelStore
120
+ channelId: Hex
121
+ challengeId: string
122
+ tickCost: bigint
123
+ generate: AsyncIterable<string> | ((stream: SessionController) => AsyncIterable<string>)
124
+ pollIntervalMs?: number | undefined
125
+ prepaidUnits?: number | undefined
126
+ signal?: AbortSignal | undefined
127
+ }
128
+ }
129
+
130
+ /**
131
+ * Wrap a `ReadableStream<Uint8Array>` (from {@link serve}) in an HTTP
132
+ * `Response` with the correct SSE headers.
133
+ */
134
+ export function toResponse(body: ReadableStream<Uint8Array>): Response {
135
+ return new Response(body, {
136
+ headers: {
137
+ 'Cache-Control': 'no-cache, no-transform',
138
+ Connection: 'keep-alive',
139
+ 'Content-Type': 'text/event-stream; charset=utf-8',
140
+ },
141
+ })
142
+ }
143
+
144
+ /**
145
+ * Extract `channelId`, `challengeId`, and `tickCost` from a `Request`'s
146
+ * `Authorization: Payment …` header.
147
+ *
148
+ * This is a convenience for callers that receive a raw `Request` and need
149
+ * the parameters required by {@link serve}.
150
+ */
151
+ export function fromRequest(request: Request): fromRequest.Context {
152
+ const header = request.headers.get(Constants.Headers.authorization)
153
+ if (!header) throw new Error('Missing Authorization header.')
154
+
155
+ const payment = Credential.extractPaymentScheme(header)
156
+ if (!payment) throw new Error('Missing Payment credential in Authorization header.')
157
+
158
+ const credential = Credential.deserialize(payment)
159
+ const payload = requireSessionCredentialContext(credential.payload)
160
+ return {
161
+ challengeId: credential.challenge.id,
162
+ channelId: payload.channelId,
163
+ tickCost: readSessionChallengeAmount(credential.challenge),
164
+ }
165
+ }
166
+
167
+ /** Type helpers for {@link fromRequest}. */
168
+ export declare namespace fromRequest {
169
+ type Context = {
170
+ challengeId: string
171
+ channelId: Hex
172
+ tickCost: bigint
173
+ }
174
+ }
175
+
176
+ /**
177
+ * Check whether a `Response` carries an SSE event stream.
178
+ *
179
+ * Returns `true` when the `Content-Type` header starts with
180
+ * `text/event-stream` (case-insensitive, ignoring charset params).
181
+ */
182
+ export function isEventStream(response: Response): boolean {
183
+ const ct = response.headers.get('content-type')
184
+ return ct?.toLowerCase().startsWith('text/event-stream') ?? false
185
+ }
186
+
187
+ /**
188
+ * Parse an SSE `Response` body into an async iterable of `data:` payloads.
189
+ *
190
+ * Yields the raw `data:` field content for each SSE event in the stream.
191
+ * Events whose data matches the `skip` predicate are silently dropped
192
+ * (e.g. `[DONE]` sentinels used by OpenAI-compatible APIs).
193
+ *
194
+ * Each yielded value typically becomes one charge tick when fed to
195
+ * {@link serve} via the SSE transport's auto-charge mode.
196
+ *
197
+ * @example
198
+ * ```ts
199
+ * const upstream = await fetch('https://api.example.com/stream')
200
+ * for await (const data of Sse.iterateData(upstream)) {
201
+ * console.log(data)
202
+ * }
203
+ * ```
204
+ */
205
+ export async function* iterateData(
206
+ response: Response,
207
+ options?: iterateData.Options,
208
+ ): AsyncGenerator<string> {
209
+ const skip = options?.skip
210
+ const body = response.body
211
+ if (!body) return
212
+
213
+ const reader = body.getReader()
214
+ const decoder = new TextDecoder()
215
+ let buffer = ''
216
+
217
+ try {
218
+ while (true) {
219
+ const { value, done } = await reader.read()
220
+ if (done) break
221
+
222
+ buffer += decoder.decode(value, { stream: true })
223
+
224
+ // Split on double-newline SSE event boundaries.
225
+ const events = buffer.split('\n\n')
226
+ // Last element may be incomplete — keep in buffer.
227
+ buffer = events.pop() ?? ''
228
+
229
+ for (const event of events) {
230
+ if (!event.trim()) continue
231
+ const data = extractData(event)
232
+ if (data === null) continue
233
+ if (skip?.(data)) continue
234
+ yield data
235
+ }
236
+ }
237
+
238
+ // Flush remaining buffer.
239
+ if (buffer.trim()) {
240
+ const data = extractData(buffer)
241
+ if (data !== null && !skip?.(data)) yield data
242
+ }
243
+ } finally {
244
+ reader.releaseLock()
245
+ }
246
+ }
247
+
248
+ /** Type helpers for {@link iterateData}. */
249
+ export declare namespace iterateData {
250
+ type Options = {
251
+ /** Predicate to skip specific data payloads (e.g. `d => d === '[DONE]'`). */
252
+ skip?: ((data: string) => boolean) | undefined
253
+ }
254
+ }
@@ -0,0 +1,346 @@
1
+ import type { Address, Hex } from 'viem'
2
+ import { describe, expect, test } from 'vp/test'
3
+
4
+ import { ChannelClosedError } from '../../../Errors.js'
5
+ import type { NeedVoucherEvent } from '../precompile/Protocol.js'
6
+ import * as ChannelStore from './ChannelStore.js'
7
+ import {
8
+ commitReservedCharges,
9
+ reserveChargeOrWait,
10
+ send,
11
+ subscribe,
12
+ toText,
13
+ type SocketEventListener,
14
+ type SocketEventMap,
15
+ } from './Transports.js'
16
+
17
+ describe('MeteredStream', () => {
18
+ const channelId = `0x${'01'.repeat(32)}` as Hex
19
+
20
+ const descriptor = {
21
+ authorizedSigner: '0x0000000000000000000000000000000000000001' as Address,
22
+ expiringNonceHash: `0x${'11'.repeat(32)}` as Hex,
23
+ operator: '0x0000000000000000000000000000000000000000' as Address,
24
+ payee: '0x0000000000000000000000000000000000000002' as Address,
25
+ payer: '0x0000000000000000000000000000000000000001' as Address,
26
+ salt: `0x${'22'.repeat(32)}` as Hex,
27
+ token: '0x20c0000000000000000000000000000000000001' as Address,
28
+ }
29
+
30
+ function channel(overrides: Partial<ChannelStore.State> = {}): ChannelStore.State {
31
+ const base: ChannelStore.State = {
32
+ authorizedSigner: descriptor.authorizedSigner,
33
+ backend: 'precompile',
34
+ chainId: 4217,
35
+ escrowContract: '0x4D50500000000000000000000000000000000000' as Address,
36
+ channelId,
37
+ closeRequestedAt: 0n,
38
+ createdAt: '2026-01-01T00:00:00.000Z',
39
+ deposit: 100n,
40
+ descriptor,
41
+ expiringNonceHash: descriptor.expiringNonceHash,
42
+ finalized: false,
43
+ highestVoucher: null,
44
+ highestVoucherAmount: 50n,
45
+ operator: descriptor.operator,
46
+ payee: descriptor.payee,
47
+ payer: descriptor.payer,
48
+ salt: descriptor.salt,
49
+ settledOnChain: 0n,
50
+ spent: 20n,
51
+ token: descriptor.token,
52
+ units: 2,
53
+ }
54
+ return { ...base, ...overrides }
55
+ }
56
+
57
+ function memoryStore(
58
+ initial: ChannelStore.State,
59
+ options: { waitForUpdate?: boolean } = {},
60
+ ): ChannelStore.ChannelStore {
61
+ let state: ChannelStore.State | null = initial
62
+ const waiters = new Set<() => void>()
63
+ const store: ChannelStore.ChannelStore = {
64
+ async getChannel() {
65
+ return state
66
+ },
67
+ async updateChannel(_channelId, fn) {
68
+ state = fn(state)
69
+ for (const waiter of waiters) waiter()
70
+ waiters.clear()
71
+ return state
72
+ },
73
+ }
74
+ if (options.waitForUpdate) {
75
+ store.waitForUpdate = () => {
76
+ return new Promise<void>((resolve) => {
77
+ waiters.add(resolve)
78
+ })
79
+ }
80
+ }
81
+ return store
82
+ }
83
+
84
+ function formatNeedVoucher(event: NeedVoucherEvent) {
85
+ return JSON.stringify(event)
86
+ }
87
+
88
+ describe('MeteredStream', () => {
89
+ test('reserveChargeOrWait returns immediately when voucher headroom is available', async () => {
90
+ const emitted: string[] = []
91
+ await reserveChargeOrWait({
92
+ amount: 10n,
93
+ channelId,
94
+ emit(message) {
95
+ emitted.push(message)
96
+ },
97
+ formatNeedVoucher,
98
+ pollIntervalMs: 1,
99
+ reservedAmount: 0n,
100
+ store: memoryStore(channel()),
101
+ })
102
+
103
+ expect(emitted).toEqual([])
104
+ })
105
+
106
+ test('reserveChargeOrWait emits need-voucher and waits for accepted headroom', async () => {
107
+ const emitted: string[] = []
108
+ const store = memoryStore(channel({ highestVoucherAmount: 25n, spent: 20n }))
109
+ const reserved = reserveChargeOrWait({
110
+ amount: 10n,
111
+ channelId,
112
+ emit(message) {
113
+ emitted.push(message)
114
+ },
115
+ formatNeedVoucher,
116
+ pollIntervalMs: 1,
117
+ reservedAmount: 0n,
118
+ store,
119
+ })
120
+
121
+ await Promise.resolve()
122
+ expect(emitted.map((item) => JSON.parse(item))).toEqual([
123
+ {
124
+ channelId,
125
+ requiredCumulative: '30',
126
+ acceptedCumulative: '25',
127
+ deposit: '100',
128
+ },
129
+ ])
130
+
131
+ await store.updateChannel(channelId, (current) =>
132
+ current ? { ...current, highestVoucherAmount: 30n } : current,
133
+ )
134
+ await reserved
135
+ })
136
+
137
+ test('reserveChargeOrWait observes updates that happen before wait registration', async () => {
138
+ const emitted: string[] = []
139
+ const store = memoryStore(channel({ highestVoucherAmount: 25n, spent: 20n }), {
140
+ waitForUpdate: true,
141
+ })
142
+
143
+ await reserveChargeOrWait({
144
+ amount: 10n,
145
+ channelId,
146
+ async emit(message) {
147
+ emitted.push(message)
148
+ await store.updateChannel(channelId, (current) =>
149
+ current ? { ...current, highestVoucherAmount: 30n } : current,
150
+ )
151
+ },
152
+ formatNeedVoucher,
153
+ pollIntervalMs: 1,
154
+ reservedAmount: 0n,
155
+ store,
156
+ })
157
+
158
+ expect(emitted).toHaveLength(1)
159
+ })
160
+
161
+ test('commitReservedCharges increments spend and units', async () => {
162
+ const store = memoryStore(channel({ spent: 20n, units: 2, highestVoucherAmount: 50n }))
163
+
164
+ await commitReservedCharges({ amount: 10n, channelId, store, units: 1 })
165
+
166
+ expect(await store.getChannel(channelId)).toMatchObject({ spent: 30n, units: 3 })
167
+ })
168
+
169
+ test('commitReservedCharges rejects when reserved coverage is no longer available', async () => {
170
+ await expect(
171
+ commitReservedCharges({
172
+ amount: 40n,
173
+ channelId,
174
+ store: memoryStore(channel({ spent: 20n, highestVoucherAmount: 50n })),
175
+ units: 1,
176
+ }),
177
+ ).rejects.toThrow('reserved voucher coverage is no longer available')
178
+ })
179
+
180
+ test('commitReservedCharges rejects closed channels', async () => {
181
+ await expect(
182
+ commitReservedCharges({
183
+ amount: 10n,
184
+ channelId,
185
+ store: memoryStore(channel({ finalized: true })),
186
+ units: 1,
187
+ }),
188
+ ).rejects.toThrow(ChannelClosedError)
189
+ })
190
+ })
191
+ })
192
+
193
+ describe('SocketTransport', () => {
194
+ class BrowserSocket {
195
+ sent: string[] = []
196
+ listeners = {
197
+ close: new Set<SocketEventListener<'close'>>(),
198
+ error: new Set<SocketEventListener<'error'>>(),
199
+ message: new Set<SocketEventListener<'message'>>(),
200
+ }
201
+
202
+ addEventListener<type extends keyof SocketEventMap>(
203
+ type: type,
204
+ listener: SocketEventListener<type>,
205
+ ) {
206
+ this.listeners[type].add(listener as never)
207
+ }
208
+
209
+ close() {
210
+ this.emit('close', { type: 'close' })
211
+ }
212
+
213
+ emit<type extends keyof SocketEventMap>(type: type, event: SocketEventMap[type]) {
214
+ for (const listener of this.listeners[type]) {
215
+ if (typeof listener === 'function') listener(event as never)
216
+ else listener.handleEvent(event as never)
217
+ }
218
+ }
219
+
220
+ removeEventListener<type extends keyof SocketEventMap>(
221
+ type: type,
222
+ listener: SocketEventListener<type>,
223
+ ) {
224
+ this.listeners[type].delete(listener as never)
225
+ }
226
+
227
+ send(data: string) {
228
+ this.sent.push(data)
229
+ }
230
+ }
231
+
232
+ class NodeSocket {
233
+ sent: string[] = []
234
+ listeners = {
235
+ close: new Set<(event: SocketEventMap['close']) => void>(),
236
+ error: new Set<(event: SocketEventMap['error']) => void>(),
237
+ message: new Set<(event: SocketEventMap['message']) => void>(),
238
+ }
239
+
240
+ close() {
241
+ this.emit('close', { type: 'close' })
242
+ }
243
+
244
+ emit<type extends keyof SocketEventMap>(type: type, event: SocketEventMap[type]) {
245
+ for (const listener of this.listeners[type]) listener(event as never)
246
+ }
247
+
248
+ off<type extends keyof SocketEventMap>(
249
+ type: type,
250
+ listener: (event: SocketEventMap[type]) => void,
251
+ ) {
252
+ this.listeners[type].delete(listener as never)
253
+ }
254
+
255
+ on<type extends keyof SocketEventMap>(
256
+ type: type,
257
+ listener: (event: SocketEventMap[type]) => void,
258
+ ) {
259
+ this.listeners[type].add(listener as never)
260
+ }
261
+
262
+ send(data: string) {
263
+ this.sent.push(data)
264
+ }
265
+ }
266
+
267
+ describe('SocketTransport', () => {
268
+ test('subscribe handles browser-style socket events', () => {
269
+ const socket = new BrowserSocket()
270
+ const messages: unknown[] = []
271
+ let closed = 0
272
+ let errors = 0
273
+
274
+ const unsubscribe = subscribe(socket, {
275
+ close() {
276
+ closed++
277
+ },
278
+ error() {
279
+ errors++
280
+ },
281
+ message(value) {
282
+ messages.push(value)
283
+ },
284
+ })
285
+
286
+ socket.emit('message', { data: 'hello', type: 'message' })
287
+ socket.emit('error', { type: 'error' })
288
+ socket.emit('close', { type: 'close' })
289
+ unsubscribe()
290
+ socket.emit('message', { data: 'ignored', type: 'message' })
291
+
292
+ expect(messages).toEqual(['hello'])
293
+ expect(errors).toBe(1)
294
+ expect(closed).toBe(1)
295
+ })
296
+
297
+ test('subscribe handles node-style socket events', () => {
298
+ const socket = new NodeSocket()
299
+ const messages: unknown[] = []
300
+
301
+ const unsubscribe = subscribe(socket, {
302
+ close() {},
303
+ error() {},
304
+ message(value) {
305
+ messages.push(value)
306
+ },
307
+ })
308
+
309
+ socket.emit('message', { data: 'hello', type: 'message' })
310
+ unsubscribe()
311
+ socket.emit('message', { data: 'ignored', type: 'message' })
312
+
313
+ expect(messages).toEqual([{ data: 'hello', type: 'message' }])
314
+ })
315
+
316
+ test('subscribe rejects unsupported socket implementations', () => {
317
+ expect(() =>
318
+ subscribe({ close() {}, send() {} }, { close() {}, error() {}, message() {} }),
319
+ ).toThrow('unsupported websocket implementation')
320
+ })
321
+
322
+ test('send supports sync and async socket implementations', async () => {
323
+ const syncSocket = new BrowserSocket()
324
+ const asyncSocket = {
325
+ close() {},
326
+ sent: [] as string[],
327
+ async send(data: string) {
328
+ this.sent.push(data)
329
+ },
330
+ }
331
+
332
+ await send(syncSocket, 'sync')
333
+ await send(asyncSocket, 'async')
334
+
335
+ expect(syncSocket.sent).toEqual(['sync'])
336
+ expect(asyncSocket.sent).toEqual(['async'])
337
+ })
338
+
339
+ test('toText normalizes common message payloads', () => {
340
+ expect(toText('hello')).toBe('hello')
341
+ expect(toText(new TextEncoder().encode('bytes'))).toBe('bytes')
342
+ expect(toText(new TextEncoder().encode('buffer').buffer)).toBe('buffer')
343
+ expect(toText({ data: 'object' })).toBeNull()
344
+ })
345
+ })
346
+ })