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,255 @@
1
+ import type { Hex } from 'viem'
2
+
3
+ import { ChannelClosedError } from '../../../Errors.js'
4
+ import type { NeedVoucherEvent } from '../precompile/Protocol.js'
5
+ import * as ChannelStore from './ChannelStore.js'
6
+
7
+ /** Parameters for reserving voucher headroom before emitting a stream item. */
8
+ export type ReserveChargeParameters = {
9
+ /** Amount required for the next stream item. */
10
+ amount: bigint
11
+ /** Channel being metered. */
12
+ channelId: Hex
13
+ /** Emits the transport-specific need-voucher frame. */
14
+ emit: (message: string) => void | Promise<void>
15
+ /** Formats a transport-specific need-voucher frame. */
16
+ formatNeedVoucher(parameters: NeedVoucherEvent): string
17
+ /** Store polling interval when `waitForUpdate` is unavailable. */
18
+ pollIntervalMs: number
19
+ /** Amount already reserved but not yet committed by this stream loop. */
20
+ reservedAmount: bigint
21
+ /** Optional abort signal for long waits. */
22
+ signal?: AbortSignal | undefined
23
+ /** Channel store used for state reads and waits. */
24
+ store: ChannelStore.ChannelStore
25
+ }
26
+
27
+ /** Parameters for committing previously reserved stream charges. */
28
+ export type CommitReservedChargesParameters = {
29
+ /** Reserved amount to commit. */
30
+ amount: bigint
31
+ /** Channel being metered. */
32
+ channelId: Hex
33
+ /** Channel store used for atomic updates. */
34
+ store: ChannelStore.ChannelStore
35
+ /** Number of charge units to add. */
36
+ units: number
37
+ }
38
+
39
+ /**
40
+ * Reserves voucher headroom for a future stream emission.
41
+ *
42
+ * If the channel lacks headroom, emits one need-voucher frame, then waits for
43
+ * a store update or polling interval until the accepted voucher covers both
44
+ * already-reserved charges and the next requested amount.
45
+ */
46
+ export async function reserveChargeOrWait(options: ReserveChargeParameters): Promise<void> {
47
+ const {
48
+ amount,
49
+ channelId,
50
+ emit,
51
+ formatNeedVoucher,
52
+ pollIntervalMs,
53
+ reservedAmount,
54
+ signal,
55
+ store,
56
+ } = options
57
+
58
+ let channel = await store.getChannel(channelId)
59
+ if (!channel) throw new Error('channel not found')
60
+ throwIfChannelClosed(channel)
61
+
62
+ const hasHeadroom = (state: ChannelStore.State) =>
63
+ state.highestVoucherAmount - state.spent - reservedAmount >= amount
64
+
65
+ if (hasHeadroom(channel)) return
66
+
67
+ await Promise.resolve(
68
+ emit(
69
+ formatNeedVoucher({
70
+ channelId,
71
+ requiredCumulative: (channel.spent + reservedAmount + amount).toString(),
72
+ acceptedCumulative: channel.highestVoucherAmount.toString(),
73
+ deposit: channel.deposit.toString(),
74
+ }),
75
+ ),
76
+ )
77
+
78
+ while (!hasHeadroom(channel)) {
79
+ await waitForUpdate(store, channelId, pollIntervalMs, signal)
80
+ channel = await store.getChannel(channelId)
81
+ if (!channel) throw new Error('channel not found')
82
+ throwIfChannelClosed(channel)
83
+ }
84
+ }
85
+
86
+ /** Atomically commits previously reserved stream charges to channel spend and unit counters. */
87
+ export async function commitReservedCharges(
88
+ options: CommitReservedChargesParameters,
89
+ ): Promise<void> {
90
+ const { amount, channelId, store, units } = options
91
+ if (amount === 0n || units === 0) return
92
+
93
+ let committed = false
94
+ const channel = await store.updateChannel(channelId, (current) => {
95
+ if (!current) return null
96
+ if (current.finalized) return current
97
+ if (current.closeRequestedAt !== 0n) return current
98
+ if (current.highestVoucherAmount - current.spent < amount) return current
99
+ committed = true
100
+ return {
101
+ ...current,
102
+ spent: current.spent + amount,
103
+ units: current.units + units,
104
+ }
105
+ })
106
+
107
+ if (!channel) throw new Error('channel not found')
108
+ throwIfChannelClosed(channel)
109
+ if (!committed) throw new Error('reserved voucher coverage is no longer available')
110
+ }
111
+
112
+ /** Throws when a channel can no longer be used for streaming charges. */
113
+ export function throwIfChannelClosed(channel: ChannelStore.State): void {
114
+ if (channel.finalized) throw new ChannelClosedError({ reason: 'channel is finalized' })
115
+ if (channel.closeRequestedAt !== 0n)
116
+ throw new ChannelClosedError({ reason: 'channel has a pending close request' })
117
+ }
118
+
119
+ async function waitForUpdate(
120
+ store: ChannelStore.ChannelStore,
121
+ channelId: Hex,
122
+ pollIntervalMs: number,
123
+ signal?: AbortSignal,
124
+ ): Promise<void> {
125
+ throwIfAborted(signal)
126
+
127
+ if (store.waitForUpdate) {
128
+ await Promise.race([
129
+ store.waitForUpdate(channelId),
130
+ sleep(pollIntervalMs, signal),
131
+ ...(signal ? [onceAborted(signal)] : []),
132
+ ])
133
+ } else {
134
+ await sleep(pollIntervalMs, signal)
135
+ }
136
+
137
+ throwIfAborted(signal)
138
+ }
139
+
140
+ function sleep(ms: number, signal?: AbortSignal) {
141
+ return new Promise<void>((resolve, reject) => {
142
+ const timeout = setTimeout(() => {
143
+ signal?.removeEventListener('abort', onAbort)
144
+ resolve()
145
+ }, ms)
146
+ const onAbort = () => {
147
+ clearTimeout(timeout)
148
+ reject(signal?.reason ?? new Error('aborted'))
149
+ }
150
+ signal?.addEventListener('abort', onAbort, { once: true })
151
+ })
152
+ }
153
+
154
+ function onceAborted(signal: AbortSignal) {
155
+ return new Promise<never>((_, reject) => {
156
+ if (signal.aborted) {
157
+ reject(signal.reason ?? new Error('aborted'))
158
+ return
159
+ }
160
+ signal.addEventListener('abort', () => reject(signal.reason ?? new Error('aborted')), {
161
+ once: true,
162
+ })
163
+ })
164
+ }
165
+
166
+ function throwIfAborted(signal?: AbortSignal) {
167
+ if (signal?.aborted) throw signal.reason ?? new Error('aborted')
168
+ }
169
+
170
+ /** Minimal socket event map supported by browser and Node-style WebSocket runtimes. */
171
+ export type SocketEventMap = {
172
+ close: Event | { code?: number | undefined; reason?: string | undefined; type?: string }
173
+ error: Event | { type?: string }
174
+ message: Event | { data: unknown; type?: string }
175
+ }
176
+
177
+ /** Socket event listener accepted by browser and Node-style runtimes. */
178
+ export type SocketEventListener<type extends keyof SocketEventMap> =
179
+ | ((event: SocketEventMap[type]) => void)
180
+ | { handleEvent(event: SocketEventMap[type]): void }
181
+
182
+ /** Minimal socket shape required by the session WebSocket adapter. */
183
+ export type Socket = {
184
+ close(code?: number, reason?: string): unknown
185
+ send(data: string): unknown
186
+ addEventListener?: <type extends keyof SocketEventMap>(
187
+ type: type,
188
+ listener: SocketEventListener<type>,
189
+ ) => unknown
190
+ removeEventListener?: <type extends keyof SocketEventMap>(
191
+ type: type,
192
+ listener: SocketEventListener<type>,
193
+ ) => unknown
194
+ on?: <type extends keyof SocketEventMap>(
195
+ type: type,
196
+ listener: (event: SocketEventMap[type]) => void,
197
+ ) => unknown
198
+ off?: <type extends keyof SocketEventMap>(
199
+ type: type,
200
+ listener: (event: SocketEventMap[type]) => void,
201
+ ) => unknown
202
+ }
203
+
204
+ /** Handlers for socket lifecycle and message events. */
205
+ export type SocketHandlers = {
206
+ /** Called when the socket closes. */
207
+ close(): void
208
+ /** Called when the socket reports an error. */
209
+ error(): void
210
+ /** Called with raw message payloads. */
211
+ message(payload: unknown): void
212
+ }
213
+
214
+ /** Subscribes to browser or Node-style socket events and returns an unsubscribe callback. */
215
+ export function subscribe(socket: Socket, handlers: SocketHandlers) {
216
+ if (socket.addEventListener && socket.removeEventListener) {
217
+ const onMessage = (event: SocketEventMap['message']) =>
218
+ handlers.message('data' in event ? event.data : undefined)
219
+ socket.addEventListener('message', onMessage)
220
+ socket.addEventListener('close', handlers.close)
221
+ socket.addEventListener('error', handlers.error)
222
+ return () => {
223
+ socket.removeEventListener?.('message', onMessage)
224
+ socket.removeEventListener?.('close', handlers.close)
225
+ socket.removeEventListener?.('error', handlers.error)
226
+ }
227
+ }
228
+
229
+ if (socket.on && socket.off) {
230
+ const onMessage = (data: unknown) => handlers.message(data)
231
+ socket.on('message', onMessage)
232
+ socket.on('close', handlers.close)
233
+ socket.on('error', handlers.error)
234
+ return () => {
235
+ socket.off?.('message', onMessage)
236
+ socket.off?.('close', handlers.close)
237
+ socket.off?.('error', handlers.error)
238
+ }
239
+ }
240
+
241
+ throw new Error('unsupported websocket implementation')
242
+ }
243
+
244
+ /** Sends a text frame through sync or async socket implementations. */
245
+ export async function send(socket: Socket, data: string) {
246
+ await Promise.resolve(socket.send(data))
247
+ }
248
+
249
+ /** Converts socket message payloads into text frames when possible. */
250
+ export function toText(value: unknown): string | null {
251
+ if (typeof value === 'string') return value
252
+ if (value instanceof ArrayBuffer) return new TextDecoder().decode(value)
253
+ if (ArrayBuffer.isView(value)) return new TextDecoder().decode(value)
254
+ return null
255
+ }
@@ -1,11 +1,11 @@
1
1
  import type { Address } from 'viem'
2
2
  import { describe, expect, test } from 'vp/test'
3
3
 
4
- import * as Challenge from '../../Challenge.js'
5
- import * as Credential from '../../Credential.js'
6
- import * as Store from '../../Store.js'
4
+ import * as Challenge from '../../../Challenge.js'
5
+ import * as Credential from '../../../Credential.js'
6
+ import * as Store from '../../../Store.js'
7
+ import { createSessionReceipt, serializeSessionReceipt } from '../precompile/Protocol.js'
7
8
  import * as ChannelStore from './ChannelStore.js'
8
- import { createSessionReceipt, serializeSessionReceipt } from './Receipt.js'
9
9
  import * as Ws from './Ws.js'
10
10
 
11
11
  const challenge = Challenge.from({
@@ -0,0 +1,380 @@
1
+ import * as Constants from '../../../Constants.js'
2
+ import * as Credential from '../../../Credential.js'
3
+ import {
4
+ createSessionReceipt,
5
+ deserializeSessionReceipt,
6
+ formatApplicationMessage,
7
+ formatCloseReadyMessage,
8
+ formatErrorMessage,
9
+ formatNeedVoucherMessage,
10
+ formatReceiptMessage,
11
+ parseMessage,
12
+ readSessionChallengeAmount,
13
+ requireSessionCredentialContext,
14
+ type SessionCredentialContext,
15
+ type SessionReceipt,
16
+ } from '../precompile/Protocol.js'
17
+ import * as ChannelStore from './ChannelStore.js'
18
+ import type { SessionController } from './MeteredStream.js'
19
+ export type { SessionController } from './MeteredStream.js'
20
+ export type { Socket } from './Transports.js'
21
+ import { meterIterable } from './MeteredStream.js'
22
+ import { send, subscribe, toText, type Socket } from './Transports.js'
23
+
24
+ /** Public WebSocket payment frame helpers. */
25
+ export {
26
+ formatApplicationMessage,
27
+ formatAuthorizationMessage,
28
+ formatCloseReadyMessage,
29
+ formatCloseRequestMessage,
30
+ formatErrorMessage,
31
+ formatNeedVoucherMessage,
32
+ formatReceiptMessage,
33
+ parseMessage,
34
+ type ErrorMessageParameters,
35
+ type Message,
36
+ } from '../precompile/Protocol.js'
37
+
38
+ /** Result returned by an HTTP route before upgrading or authorizing a WebSocket session. */
39
+ export type SessionRouteResult =
40
+ | { status: 402; challenge: Response }
41
+ | { status: 200; withReceipt(response?: Response): Response }
42
+
43
+ /** HTTP route used to perform a WebSocket payment probe. */
44
+ export type SessionRoute = (request: Request) => Promise<SessionRouteResult>
45
+
46
+ type StreamContext = {
47
+ challengeId: string
48
+ channelId: SessionCredentialContext['channelId']
49
+ tickCost: bigint
50
+ }
51
+
52
+ /** Result of verifying one in-band authorization frame through the HTTP payment route. */
53
+ type AuthorizationResult =
54
+ | {
55
+ status: 'accepted'
56
+ receipt: SessionReceipt
57
+ }
58
+ | {
59
+ status: 'rejected'
60
+ message: string
61
+ responseStatus: number
62
+ }
63
+
64
+ /** Mutable server-side runtime state for one paid WebSocket connection. */
65
+ type ServeRuntime = {
66
+ /** Whether the socket has been closed or externally disconnected. */
67
+ closed: boolean
68
+ /** Whether a final close-ready receipt has already been sent. */
69
+ closeReadySent: boolean
70
+ /** Whether an in-band close request has already been processed. */
71
+ closeRequestHandled: boolean
72
+ /** Whether the client has requested close and no new stream should start. */
73
+ closeRequested: boolean
74
+ /** Whether application streaming has started for this connection. */
75
+ streamStarted: boolean
76
+ /** Active stream task, when application generation is in progress. */
77
+ streamTask: Promise<void> | null
78
+ /** Active payment context for the stream. */
79
+ streamContext: StreamContext | null
80
+ /** Serialized payment-management action queue. */
81
+ action: Promise<void>
82
+ /** Number of queued payment-management messages waiting behind `action`. */
83
+ queuedActions: number
84
+ }
85
+
86
+ /**
87
+ * Bridge a WebSocket connection to a Tempo session payment flow.
88
+ *
89
+ * Credential verification is performed by routing each in-band authorization
90
+ * frame through `route` as a **synthetic `POST` request** that carries only
91
+ * the `Authorization` header. The synthetic request does not include cookies,
92
+ * bodies, query parameters, or other headers from the original WebSocket
93
+ * upgrade request. Do not wrap `route` with middleware that depends on
94
+ * HTTP-specific context beyond the `Authorization` header.
95
+ */
96
+ export async function serve(options: serve.Options): Promise<void> {
97
+ const {
98
+ amount: expectedAmount,
99
+ generate,
100
+ pollIntervalMs = 100,
101
+ route,
102
+ socket,
103
+ store: rawStore,
104
+ url,
105
+ } = options
106
+ const store = 'getChannel' in rawStore ? rawStore : ChannelStore.fromStore(rawStore)
107
+ const requestUrl = normalizeHttpUrl(url)
108
+ const maxQueuedPaymentMessages = 32
109
+
110
+ const abortController = new AbortController()
111
+ const runtime: ServeRuntime = {
112
+ closed: false,
113
+ closeReadySent: false,
114
+ closeRequestHandled: false,
115
+ closeRequested: false,
116
+ streamStarted: false,
117
+ streamTask: null,
118
+ streamContext: null,
119
+ action: Promise.resolve(),
120
+ queuedActions: 0,
121
+ }
122
+
123
+ const close = async (code = 1000, reason?: string) => {
124
+ if (runtime.closed) return
125
+ runtime.closed = true
126
+ abortController.abort()
127
+ unsubscribe()
128
+ await Promise.resolve(socket.close(code, reason))
129
+ }
130
+
131
+ const sendCloseReady = async () => {
132
+ if (runtime.closeReadySent || !runtime.streamContext || runtime.closed) return
133
+ runtime.closeReadySent = true
134
+
135
+ const channel = await store.getChannel(runtime.streamContext.channelId)
136
+ if (!channel) throw new Error('channel not found')
137
+
138
+ const receipt = createSessionReceipt({
139
+ challengeId: runtime.streamContext.challengeId,
140
+ channelId: runtime.streamContext.channelId,
141
+ acceptedCumulative: channel.highestVoucherAmount,
142
+ spent: channel.spent,
143
+ units: channel.units,
144
+ })
145
+ await send(socket, formatCloseReadyMessage(receipt))
146
+ }
147
+
148
+ const runStream = async (context: StreamContext) => {
149
+ try {
150
+ for await (const value of meterIterable({
151
+ store,
152
+ channelId: context.channelId,
153
+ tickCost: context.tickCost,
154
+ generate,
155
+ pollIntervalMs,
156
+ signal: abortController.signal,
157
+ emitNeedVoucher: (message) => send(socket, message),
158
+ formatNeedVoucher: formatNeedVoucherMessage,
159
+ })) {
160
+ if (abortController.signal.aborted) break
161
+ await send(socket, formatApplicationMessage(value))
162
+ }
163
+
164
+ if (!abortController.signal.aborted) await sendCloseReady()
165
+ } catch (error) {
166
+ if (!abortController.signal.aborted) {
167
+ await send(
168
+ socket,
169
+ formatErrorMessage({
170
+ message: error instanceof Error ? error.message : 'websocket session failed',
171
+ status: 500,
172
+ }),
173
+ )
174
+ await close(1011, 'websocket session failed')
175
+ }
176
+ } finally {
177
+ runtime.streamTask = null
178
+ }
179
+ }
180
+
181
+ const requestClose = async () => {
182
+ if (runtime.closed) return
183
+ if (runtime.closeRequestHandled) return
184
+ runtime.closeRequestHandled = true
185
+ runtime.closeRequested = true
186
+ abortController.abort()
187
+ await runtime.streamTask?.catch(() => {})
188
+ await sendCloseReady()
189
+ }
190
+
191
+ const processAuthorization = async (authorization: string) => {
192
+ if (runtime.closed) return
193
+ const credential = Credential.deserialize(authorization)
194
+ const payload = requireSessionCredentialContext(credential.payload)
195
+ if (payload.action === 'close') runtime.closeRequested = true
196
+
197
+ if (expectedAmount && credential.challenge.request.amount !== expectedAmount) {
198
+ await send(
199
+ socket,
200
+ formatErrorMessage({
201
+ message: 'credential amount does not match this endpoint',
202
+ status: 402,
203
+ }),
204
+ )
205
+ await close(1008, 'credential amount does not match this endpoint')
206
+ return
207
+ }
208
+
209
+ const authorizationResult = await authorizePaymentFrame({ authorization, requestUrl, route })
210
+ if (authorizationResult.status === 'rejected') {
211
+ await send(
212
+ socket,
213
+ formatErrorMessage({
214
+ message: authorizationResult.message,
215
+ status: authorizationResult.responseStatus,
216
+ }),
217
+ )
218
+ await close(1008, authorizationResult.message)
219
+ return
220
+ }
221
+
222
+ const { receipt } = authorizationResult
223
+ await send(socket, formatReceiptMessage(receipt))
224
+
225
+ if (payload.action === 'close') {
226
+ await close(1000, 'payment session closed')
227
+ return
228
+ }
229
+
230
+ if (payload.action === 'topUp') return
231
+ if (runtime.streamStarted || runtime.closeRequested) return
232
+ runtime.streamStarted = true
233
+ runtime.streamContext = {
234
+ challengeId: credential.challenge.id,
235
+ channelId: payload.channelId,
236
+ tickCost: readSessionChallengeAmount(credential.challenge),
237
+ }
238
+ // Defer the first application frame until after the client receives the
239
+ // auth receipt and has a chance to install its own message listeners.
240
+ setTimeout(() => {
241
+ if (runtime.closeRequested || runtime.closed || !runtime.streamContext) return
242
+ runtime.streamTask = runStream(runtime.streamContext)
243
+ }, 0)
244
+ }
245
+
246
+ const onMessage = (payload: unknown) => {
247
+ if (runtime.closed) return
248
+ const raw = toText(payload)
249
+ if (!raw) return
250
+ const message = parseMessage(raw)
251
+ if (!message) return
252
+
253
+ if (message.mpp === 'payment-close-request') {
254
+ runtime.closeRequested = true
255
+ abortController.abort()
256
+ }
257
+
258
+ const work =
259
+ message.mpp === 'authorization'
260
+ ? () => processAuthorization(message.authorization)
261
+ : message.mpp === 'payment-close-request'
262
+ ? () => requestClose()
263
+ : null
264
+
265
+ if (!work) return
266
+ if (runtime.queuedActions >= maxQueuedPaymentMessages) {
267
+ void send(
268
+ socket,
269
+ formatErrorMessage({
270
+ message: 'too many queued payment messages',
271
+ status: 429,
272
+ }),
273
+ ).catch(() => {})
274
+ void close(1008, 'too many queued payment messages')
275
+ return
276
+ }
277
+
278
+ runtime.queuedActions++
279
+ runtime.action = runtime.action
280
+ .then(async () => {
281
+ try {
282
+ if (runtime.closed) return
283
+ await work()
284
+ } finally {
285
+ runtime.queuedActions--
286
+ }
287
+ })
288
+ .catch(async (error) => {
289
+ if (!runtime.closed) {
290
+ await send(
291
+ socket,
292
+ formatErrorMessage({
293
+ message: error instanceof Error ? error.message : 'invalid payment message',
294
+ status: 400,
295
+ }),
296
+ )
297
+ await close(1008, 'invalid payment message')
298
+ }
299
+ })
300
+ }
301
+
302
+ const onClose = () => {
303
+ if (runtime.closed) return
304
+ runtime.closed = true
305
+ abortController.abort()
306
+ unsubscribe()
307
+ }
308
+
309
+ const unsubscribe = subscribe(socket, {
310
+ close: onClose,
311
+ error: onClose,
312
+ message: onMessage,
313
+ })
314
+ }
315
+
316
+ /** Type helpers for {@link serve}. */
317
+ export declare namespace serve {
318
+ type Options = {
319
+ /** Expected per-tick amount in raw units. When set, credentials whose
320
+ * challenge `request.amount` does not match are rejected. Use this to
321
+ * pin the price when the route is backed by `Mppx.compose()` with
322
+ * multiple offers — otherwise a client can select the cheapest offer
323
+ * and still receive the same stream. */
324
+ amount?: string | undefined
325
+ generate: AsyncIterable<string> | ((stream: SessionController) => AsyncIterable<string>)
326
+ pollIntervalMs?: number | undefined
327
+ /** Payment route handler. Receives synthetic `POST` requests with only
328
+ * the `Authorization` header — no cookies, bodies, or upgrade headers. */
329
+ route: SessionRoute
330
+ socket: Socket
331
+ store: ChannelStore.ChannelStore | import('../../../Store.js').Store
332
+ url: string | URL
333
+ }
334
+ }
335
+
336
+ function normalizeHttpUrl(value: string | URL): string {
337
+ const url = new URL(value.toString())
338
+ if (url.protocol === 'ws:') url.protocol = 'http:'
339
+ if (url.protocol === 'wss:') url.protocol = 'https:'
340
+ return url.toString()
341
+ }
342
+
343
+ /** Inputs used to verify a WebSocket authorization frame through the HTTP route. */
344
+ type AuthorizePaymentFrameParameters = {
345
+ /** Serialized `Payment` credential from the WebSocket authorization frame. */
346
+ authorization: string
347
+ /** Normalized HTTP URL used for the synthetic management request. */
348
+ requestUrl: string
349
+ /** HTTP payment route used to verify management credentials. */
350
+ route: SessionRoute
351
+ }
352
+
353
+ /** Verifies a WebSocket authorization frame and returns either a receipt or a payment error. */
354
+ async function authorizePaymentFrame(
355
+ parameters: AuthorizePaymentFrameParameters,
356
+ ): Promise<AuthorizationResult> {
357
+ const result = await parameters.route(
358
+ new Request(parameters.requestUrl, {
359
+ method: 'POST',
360
+ headers: { [Constants.Headers.authorization]: parameters.authorization },
361
+ }),
362
+ )
363
+
364
+ if (result.status === 402) {
365
+ const response = result.challenge
366
+ return {
367
+ status: 'rejected',
368
+ message:
369
+ (await response.text().catch(() => '')) ||
370
+ response.statusText ||
371
+ 'payment verification failed',
372
+ responseStatus: response.status,
373
+ }
374
+ }
375
+
376
+ const response = result.withReceipt(new Response(null, { status: 204 }))
377
+ const receiptHeader = response.headers.get(Constants.Headers.paymentReceipt)
378
+ if (!receiptHeader) throw new Error('management response missing Payment-Receipt header')
379
+ return { status: 'accepted', receipt: deserializeSessionReceipt(receiptHeader) }
380
+ }
@@ -0,0 +1,8 @@
1
+ export { charge, session, settle, settleBatch } from './Session.js'
2
+ /** Server-side automatic settlement schedule. */
3
+ export type {
4
+ ResolveSessionChannelId,
5
+ ResolveSessionChannelIdParameters,
6
+ SessionChannelIdRequest,
7
+ SettlementSchedule,
8
+ } from './Session.js'