mppx 0.0.1 → 0.1.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 (446) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +195 -0
  3. package/dist/BodyDigest.d.ts +42 -0
  4. package/dist/BodyDigest.d.ts.map +1 -0
  5. package/dist/BodyDigest.js +40 -0
  6. package/dist/BodyDigest.js.map +1 -0
  7. package/dist/Challenge.d.ts +271 -0
  8. package/dist/Challenge.d.ts.map +1 -0
  9. package/dist/Challenge.js +291 -0
  10. package/dist/Challenge.js.map +1 -0
  11. package/dist/Credential.d.ts +91 -0
  12. package/dist/Credential.d.ts.map +1 -0
  13. package/dist/Credential.js +122 -0
  14. package/dist/Credential.js.map +1 -0
  15. package/dist/Errors.d.ts +243 -0
  16. package/dist/Errors.d.ts.map +1 -0
  17. package/dist/Errors.js +201 -0
  18. package/dist/Errors.js.map +1 -0
  19. package/dist/Expires.d.ts +15 -0
  20. package/dist/Expires.d.ts.map +1 -0
  21. package/dist/Expires.js +29 -0
  22. package/dist/Expires.js.map +1 -0
  23. package/dist/Intent.d.ts +101 -0
  24. package/dist/Intent.d.ts.map +1 -0
  25. package/dist/Intent.js +83 -0
  26. package/dist/Intent.js.map +1 -0
  27. package/dist/Mcp.d.ts +74 -0
  28. package/dist/Mcp.d.ts.map +1 -0
  29. package/dist/Mcp.js +9 -0
  30. package/dist/Mcp.js.map +1 -0
  31. package/dist/MethodIntent.d.ts +225 -0
  32. package/dist/MethodIntent.d.ts.map +1 -0
  33. package/dist/MethodIntent.js +156 -0
  34. package/dist/MethodIntent.js.map +1 -0
  35. package/dist/PaymentRequest.d.ts +88 -0
  36. package/dist/PaymentRequest.d.ts.map +1 -0
  37. package/dist/PaymentRequest.js +81 -0
  38. package/dist/PaymentRequest.js.map +1 -0
  39. package/dist/Receipt.d.ts +110 -0
  40. package/dist/Receipt.d.ts.map +1 -0
  41. package/dist/Receipt.js +105 -0
  42. package/dist/Receipt.js.map +1 -0
  43. package/dist/Store.d.ts +28 -0
  44. package/dist/Store.d.ts.map +1 -0
  45. package/dist/Store.js +61 -0
  46. package/dist/Store.js.map +1 -0
  47. package/dist/cli.d.ts +3 -0
  48. package/dist/cli.d.ts.map +1 -0
  49. package/dist/cli.js +1219 -0
  50. package/dist/cli.js.map +1 -0
  51. package/dist/client/Methods.d.ts +4 -0
  52. package/dist/client/Methods.d.ts.map +1 -0
  53. package/dist/client/Methods.js +4 -0
  54. package/dist/client/Methods.js.map +1 -0
  55. package/dist/client/Mppx.d.ts +84 -0
  56. package/dist/client/Mppx.d.ts.map +1 -0
  57. package/dist/client/Mppx.js +64 -0
  58. package/dist/client/Mppx.js.map +1 -0
  59. package/dist/client/Transport.d.ts +56 -0
  60. package/dist/client/Transport.d.ts.map +1 -0
  61. package/dist/client/Transport.js +81 -0
  62. package/dist/client/Transport.js.map +1 -0
  63. package/dist/client/index.d.ts +5 -0
  64. package/dist/client/index.d.ts.map +1 -0
  65. package/dist/client/index.js +5 -0
  66. package/dist/client/index.js.map +1 -0
  67. package/dist/client/internal/Fetch.d.ts +85 -0
  68. package/dist/client/internal/Fetch.d.ts.map +1 -0
  69. package/dist/client/internal/Fetch.js +95 -0
  70. package/dist/client/internal/Fetch.js.map +1 -0
  71. package/dist/index.d.ts +13 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +13 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/internal/types.d.ts +302 -0
  76. package/dist/internal/types.d.ts.map +1 -0
  77. package/dist/internal/types.js +2 -0
  78. package/dist/internal/types.js.map +1 -0
  79. package/dist/mcp-sdk/client/McpClient.d.ts +78 -0
  80. package/dist/mcp-sdk/client/McpClient.d.ts.map +1 -0
  81. package/dist/mcp-sdk/client/McpClient.js +98 -0
  82. package/dist/mcp-sdk/client/McpClient.js.map +1 -0
  83. package/dist/mcp-sdk/client/index.d.ts +3 -0
  84. package/dist/mcp-sdk/client/index.d.ts.map +1 -0
  85. package/dist/mcp-sdk/client/index.js +3 -0
  86. package/dist/mcp-sdk/client/index.js.map +1 -0
  87. package/dist/mcp-sdk/server/Transport.d.ts +43 -0
  88. package/dist/mcp-sdk/server/Transport.d.ts.map +1 -0
  89. package/dist/mcp-sdk/server/Transport.js +71 -0
  90. package/dist/mcp-sdk/server/Transport.js.map +1 -0
  91. package/dist/mcp-sdk/server/index.d.ts +2 -0
  92. package/dist/mcp-sdk/server/index.d.ts.map +1 -0
  93. package/dist/mcp-sdk/server/index.js +2 -0
  94. package/dist/mcp-sdk/server/index.js.map +1 -0
  95. package/dist/middlewares/elysia.d.ts +51 -0
  96. package/dist/middlewares/elysia.d.ts.map +1 -0
  97. package/dist/middlewares/elysia.js +59 -0
  98. package/dist/middlewares/elysia.js.map +1 -0
  99. package/dist/middlewares/express.d.ts +46 -0
  100. package/dist/middlewares/express.d.ts.map +1 -0
  101. package/dist/middlewares/express.js +69 -0
  102. package/dist/middlewares/express.js.map +1 -0
  103. package/dist/middlewares/hono.d.ts +46 -0
  104. package/dist/middlewares/hono.d.ts.map +1 -0
  105. package/dist/middlewares/hono.js +57 -0
  106. package/dist/middlewares/hono.js.map +1 -0
  107. package/dist/middlewares/internal/mppx.d.ts +16 -0
  108. package/dist/middlewares/internal/mppx.d.ts.map +1 -0
  109. package/dist/middlewares/internal/mppx.js +16 -0
  110. package/dist/middlewares/internal/mppx.js.map +1 -0
  111. package/dist/middlewares/nextjs.d.ts +45 -0
  112. package/dist/middlewares/nextjs.d.ts.map +1 -0
  113. package/dist/middlewares/nextjs.js +57 -0
  114. package/dist/middlewares/nextjs.js.map +1 -0
  115. package/dist/proxy/Proxy.d.ts +47 -0
  116. package/dist/proxy/Proxy.d.ts.map +1 -0
  117. package/dist/proxy/Proxy.js +126 -0
  118. package/dist/proxy/Proxy.js.map +1 -0
  119. package/dist/proxy/Service.d.ts +100 -0
  120. package/dist/proxy/Service.d.ts.map +1 -0
  121. package/dist/proxy/Service.js +147 -0
  122. package/dist/proxy/Service.js.map +1 -0
  123. package/dist/proxy/index.d.ts +7 -0
  124. package/dist/proxy/index.d.ts.map +1 -0
  125. package/dist/proxy/index.js +7 -0
  126. package/dist/proxy/index.js.map +1 -0
  127. package/dist/proxy/internal/Headers.d.ts +3 -0
  128. package/dist/proxy/internal/Headers.d.ts.map +1 -0
  129. package/dist/proxy/internal/Headers.js +41 -0
  130. package/dist/proxy/internal/Headers.js.map +1 -0
  131. package/dist/proxy/internal/Route.d.ts +14 -0
  132. package/dist/proxy/internal/Route.d.ts.map +1 -0
  133. package/dist/proxy/internal/Route.js +47 -0
  134. package/dist/proxy/internal/Route.js.map +1 -0
  135. package/dist/proxy/services/anthropic.d.ts +29 -0
  136. package/dist/proxy/services/anthropic.d.ts.map +1 -0
  137. package/dist/proxy/services/anthropic.js +30 -0
  138. package/dist/proxy/services/anthropic.js.map +1 -0
  139. package/dist/proxy/services/openai.d.ts +29 -0
  140. package/dist/proxy/services/openai.d.ts.map +1 -0
  141. package/dist/proxy/services/openai.js +30 -0
  142. package/dist/proxy/services/openai.js.map +1 -0
  143. package/dist/proxy/services/stripe.d.ts +29 -0
  144. package/dist/proxy/services/stripe.d.ts.map +1 -0
  145. package/dist/proxy/services/stripe.js +30 -0
  146. package/dist/proxy/services/stripe.js.map +1 -0
  147. package/dist/server/Methods.d.ts +3 -0
  148. package/dist/server/Methods.d.ts.map +1 -0
  149. package/dist/server/Methods.js +3 -0
  150. package/dist/server/Methods.js.map +1 -0
  151. package/dist/server/Mppx.d.ts +116 -0
  152. package/dist/server/Mppx.d.ts.map +1 -0
  153. package/dist/server/Mppx.js +207 -0
  154. package/dist/server/Mppx.js.map +1 -0
  155. package/dist/server/NodeListener.d.ts +3 -0
  156. package/dist/server/NodeListener.d.ts.map +1 -0
  157. package/dist/server/NodeListener.js +3 -0
  158. package/dist/server/NodeListener.js.map +1 -0
  159. package/dist/server/Request.d.ts +24 -0
  160. package/dist/server/Request.d.ts.map +1 -0
  161. package/dist/server/Request.js +26 -0
  162. package/dist/server/Request.js.map +1 -0
  163. package/dist/server/Response.d.ts +10 -0
  164. package/dist/server/Response.d.ts.map +1 -0
  165. package/dist/server/Response.js +15 -0
  166. package/dist/server/Response.js.map +1 -0
  167. package/dist/server/Transport.d.ts +93 -0
  168. package/dist/server/Transport.d.ts.map +1 -0
  169. package/dist/server/Transport.js +132 -0
  170. package/dist/server/Transport.js.map +1 -0
  171. package/dist/server/index.d.ts +9 -0
  172. package/dist/server/index.d.ts.map +1 -0
  173. package/dist/server/index.js +9 -0
  174. package/dist/server/index.js.map +1 -0
  175. package/dist/stripe/Intents.d.ts +54 -0
  176. package/dist/stripe/Intents.d.ts.map +1 -0
  177. package/dist/stripe/Intents.js +27 -0
  178. package/dist/stripe/Intents.js.map +1 -0
  179. package/dist/stripe/client/Charge.d.ts +114 -0
  180. package/dist/stripe/client/Charge.d.ts.map +1 -0
  181. package/dist/stripe/client/Charge.js +77 -0
  182. package/dist/stripe/client/Charge.js.map +1 -0
  183. package/dist/stripe/client/MethodIntents.d.ts +80 -0
  184. package/dist/stripe/client/MethodIntents.d.ts.map +1 -0
  185. package/dist/stripe/client/MethodIntents.js +34 -0
  186. package/dist/stripe/client/MethodIntents.js.map +1 -0
  187. package/dist/stripe/client/index.d.ts +3 -0
  188. package/dist/stripe/client/index.d.ts.map +1 -0
  189. package/dist/stripe/client/index.js +3 -0
  190. package/dist/stripe/client/index.js.map +1 -0
  191. package/dist/stripe/index.d.ts +2 -0
  192. package/dist/stripe/index.d.ts.map +1 -0
  193. package/dist/stripe/index.js +2 -0
  194. package/dist/stripe/index.js.map +1 -0
  195. package/dist/stripe/server/Charge.d.ts +74 -0
  196. package/dist/stripe/server/Charge.d.ts.map +1 -0
  197. package/dist/stripe/server/Charge.js +79 -0
  198. package/dist/stripe/server/Charge.js.map +1 -0
  199. package/dist/stripe/server/MethodIntents.d.ts +65 -0
  200. package/dist/stripe/server/MethodIntents.d.ts.map +1 -0
  201. package/dist/stripe/server/MethodIntents.js +21 -0
  202. package/dist/stripe/server/MethodIntents.js.map +1 -0
  203. package/dist/stripe/server/index.d.ts +3 -0
  204. package/dist/stripe/server/index.d.ts.map +1 -0
  205. package/dist/stripe/server/index.js +3 -0
  206. package/dist/stripe/server/index.js.map +1 -0
  207. package/dist/tempo/Attribution.d.ts +101 -0
  208. package/dist/tempo/Attribution.d.ts.map +1 -0
  209. package/dist/tempo/Attribution.js +124 -0
  210. package/dist/tempo/Attribution.js.map +1 -0
  211. package/dist/tempo/Intents.d.ts +132 -0
  212. package/dist/tempo/Intents.d.ts.map +1 -0
  213. package/dist/tempo/Intents.js +81 -0
  214. package/dist/tempo/Intents.js.map +1 -0
  215. package/dist/tempo/client/ChannelOps.d.ts +54 -0
  216. package/dist/tempo/client/ChannelOps.d.ts.map +1 -0
  217. package/dist/tempo/client/ChannelOps.js +138 -0
  218. package/dist/tempo/client/ChannelOps.js.map +1 -0
  219. package/dist/tempo/client/Charge.d.ts +76 -0
  220. package/dist/tempo/client/Charge.d.ts.map +1 -0
  221. package/dist/tempo/client/Charge.js +69 -0
  222. package/dist/tempo/client/Charge.js.map +1 -0
  223. package/dist/tempo/client/MethodIntents.d.ts +157 -0
  224. package/dist/tempo/client/MethodIntents.d.ts.map +1 -0
  225. package/dist/tempo/client/MethodIntents.js +25 -0
  226. package/dist/tempo/client/MethodIntents.js.map +1 -0
  227. package/dist/tempo/client/Session.d.ts +159 -0
  228. package/dist/tempo/client/Session.d.ts.map +1 -0
  229. package/dist/tempo/client/Session.js +263 -0
  230. package/dist/tempo/client/Session.js.map +1 -0
  231. package/dist/tempo/client/SessionManager.d.ts +62 -0
  232. package/dist/tempo/client/SessionManager.d.ts.map +1 -0
  233. package/dist/tempo/client/SessionManager.js +196 -0
  234. package/dist/tempo/client/SessionManager.js.map +1 -0
  235. package/dist/tempo/client/index.d.ts +6 -0
  236. package/dist/tempo/client/index.d.ts.map +1 -0
  237. package/dist/tempo/client/index.js +5 -0
  238. package/dist/tempo/client/index.js.map +1 -0
  239. package/dist/tempo/index.d.ts +3 -0
  240. package/dist/tempo/index.d.ts.map +1 -0
  241. package/dist/tempo/index.js +3 -0
  242. package/dist/tempo/index.js.map +1 -0
  243. package/dist/tempo/internal/account.d.ts +32 -0
  244. package/dist/tempo/internal/account.d.ts.map +1 -0
  245. package/dist/tempo/internal/account.js +33 -0
  246. package/dist/tempo/internal/account.js.map +1 -0
  247. package/dist/tempo/internal/defaults.d.ts +18 -0
  248. package/dist/tempo/internal/defaults.d.ts.map +1 -0
  249. package/dist/tempo/internal/defaults.js +18 -0
  250. package/dist/tempo/internal/defaults.js.map +1 -0
  251. package/dist/tempo/internal/types.d.ts +11 -0
  252. package/dist/tempo/internal/types.d.ts.map +1 -0
  253. package/dist/tempo/internal/types.js +2 -0
  254. package/dist/tempo/internal/types.js.map +1 -0
  255. package/dist/tempo/server/Charge.d.ts +77 -0
  256. package/dist/tempo/server/Charge.d.ts.map +1 -0
  257. package/dist/tempo/server/Charge.js +228 -0
  258. package/dist/tempo/server/Charge.js.map +1 -0
  259. package/dist/tempo/server/MethodIntents.d.ts +140 -0
  260. package/dist/tempo/server/MethodIntents.d.ts.map +1 -0
  261. package/dist/tempo/server/MethodIntents.js +26 -0
  262. package/dist/tempo/server/MethodIntents.js.map +1 -0
  263. package/dist/tempo/server/Session.d.ts +148 -0
  264. package/dist/tempo/server/Session.d.ts.map +1 -0
  265. package/dist/tempo/server/Session.js +529 -0
  266. package/dist/tempo/server/Session.js.map +1 -0
  267. package/dist/tempo/server/internal/transport.d.ts +47 -0
  268. package/dist/tempo/server/internal/transport.d.ts.map +1 -0
  269. package/dist/tempo/server/internal/transport.js +118 -0
  270. package/dist/tempo/server/internal/transport.js.map +1 -0
  271. package/dist/tempo/stream/Chain.d.ts +52 -0
  272. package/dist/tempo/stream/Chain.d.ts.map +1 -0
  273. package/dist/tempo/stream/Chain.js +215 -0
  274. package/dist/tempo/stream/Chain.js.map +1 -0
  275. package/dist/tempo/stream/Channel.d.ts +26 -0
  276. package/dist/tempo/stream/Channel.d.ts.map +1 -0
  277. package/dist/tempo/stream/Channel.js +27 -0
  278. package/dist/tempo/stream/Channel.js.map +1 -0
  279. package/dist/tempo/stream/ChannelStore.d.ts +103 -0
  280. package/dist/tempo/stream/ChannelStore.d.ts.map +1 -0
  281. package/dist/tempo/stream/ChannelStore.js +100 -0
  282. package/dist/tempo/stream/ChannelStore.js.map +1 -0
  283. package/dist/tempo/stream/Receipt.d.ts +22 -0
  284. package/dist/tempo/stream/Receipt.d.ts.map +1 -0
  285. package/dist/tempo/stream/Receipt.js +34 -0
  286. package/dist/tempo/stream/Receipt.js.map +1 -0
  287. package/dist/tempo/stream/Sse.d.ts +134 -0
  288. package/dist/tempo/stream/Sse.d.ts.map +1 -0
  289. package/dist/tempo/stream/Sse.js +288 -0
  290. package/dist/tempo/stream/Sse.js.map +1 -0
  291. package/dist/tempo/stream/Types.d.ts +78 -0
  292. package/dist/tempo/stream/Types.d.ts.map +1 -0
  293. package/dist/tempo/stream/Types.js +2 -0
  294. package/dist/tempo/stream/Types.js.map +1 -0
  295. package/dist/tempo/stream/Voucher.d.ts +20 -0
  296. package/dist/tempo/stream/Voucher.d.ts.map +1 -0
  297. package/dist/tempo/stream/Voucher.js +98 -0
  298. package/dist/tempo/stream/Voucher.js.map +1 -0
  299. package/dist/tempo/stream/escrow.abi.d.ts +598 -0
  300. package/dist/tempo/stream/escrow.abi.d.ts.map +1 -0
  301. package/dist/tempo/stream/escrow.abi.js +760 -0
  302. package/dist/tempo/stream/escrow.abi.js.map +1 -0
  303. package/dist/tempo/stream/index.d.ts +8 -0
  304. package/dist/tempo/stream/index.d.ts.map +1 -0
  305. package/dist/tempo/stream/index.js +8 -0
  306. package/dist/tempo/stream/index.js.map +1 -0
  307. package/dist/viem/Account.d.ts +12 -0
  308. package/dist/viem/Account.d.ts.map +1 -0
  309. package/dist/viem/Account.js +14 -0
  310. package/dist/viem/Account.js.map +1 -0
  311. package/dist/viem/Client.d.ts +21 -0
  312. package/dist/viem/Client.d.ts.map +1 -0
  313. package/dist/viem/Client.js +19 -0
  314. package/dist/viem/Client.js.map +1 -0
  315. package/dist/zod.d.ts +17 -0
  316. package/dist/zod.d.ts.map +1 -0
  317. package/dist/zod.js +35 -0
  318. package/dist/zod.js.map +1 -0
  319. package/package.json +117 -4
  320. package/src/BodyDigest.test.ts +43 -0
  321. package/src/BodyDigest.ts +53 -0
  322. package/src/Challenge.test-d.ts +81 -0
  323. package/src/Challenge.test.ts +414 -0
  324. package/src/Challenge.ts +429 -0
  325. package/src/Credential.test.ts +227 -0
  326. package/src/Credential.ts +154 -0
  327. package/src/Errors.test.ts +402 -0
  328. package/src/Errors.ts +348 -0
  329. package/src/Expires.ts +34 -0
  330. package/src/Intent.test.ts +180 -0
  331. package/src/Intent.ts +109 -0
  332. package/src/Mcp.ts +81 -0
  333. package/src/MethodIntent.test.ts +303 -0
  334. package/src/MethodIntent.ts +388 -0
  335. package/src/PaymentRequest.test.ts +152 -0
  336. package/src/PaymentRequest.ts +107 -0
  337. package/src/Receipt.test.ts +98 -0
  338. package/src/Receipt.ts +129 -0
  339. package/src/Store.ts +84 -0
  340. package/src/cli.test.ts +542 -0
  341. package/src/cli.ts +1319 -0
  342. package/src/client/Methods.ts +3 -0
  343. package/src/client/Mppx.test-d.ts +90 -0
  344. package/src/client/Mppx.test.ts +468 -0
  345. package/src/client/Mppx.ts +149 -0
  346. package/src/client/Transport.test.ts +283 -0
  347. package/src/client/Transport.ts +115 -0
  348. package/src/client/index.ts +4 -0
  349. package/src/client/internal/Fetch.test-d.ts +57 -0
  350. package/src/client/internal/Fetch.test.ts +281 -0
  351. package/src/client/internal/Fetch.ts +157 -0
  352. package/src/env.d.ts +11 -0
  353. package/src/index.ts +12 -0
  354. package/src/internal/types.ts +403 -0
  355. package/src/mcp-sdk/client/McpClient.test-d.ts +109 -0
  356. package/src/mcp-sdk/client/McpClient.test.ts +219 -0
  357. package/src/mcp-sdk/client/McpClient.ts +187 -0
  358. package/src/mcp-sdk/client/index.ts +2 -0
  359. package/src/mcp-sdk/server/Transport.ts +94 -0
  360. package/src/mcp-sdk/server/index.ts +1 -0
  361. package/src/middlewares/elysia.ts +66 -0
  362. package/src/middlewares/express.test.ts +155 -0
  363. package/src/middlewares/express.ts +82 -0
  364. package/src/middlewares/hono.test.ts +148 -0
  365. package/src/middlewares/hono.ts +62 -0
  366. package/src/middlewares/internal/mppx.ts +30 -0
  367. package/src/middlewares/nextjs.test.ts +164 -0
  368. package/src/middlewares/nextjs.ts +66 -0
  369. package/src/proxy/Proxy.test.ts +472 -0
  370. package/src/proxy/Proxy.ts +175 -0
  371. package/src/proxy/Service.test.ts +125 -0
  372. package/src/proxy/Service.ts +227 -0
  373. package/src/proxy/index.ts +6 -0
  374. package/src/proxy/internal/Headers.test.ts +100 -0
  375. package/src/proxy/internal/Headers.ts +40 -0
  376. package/src/proxy/internal/Route.test.ts +143 -0
  377. package/src/proxy/internal/Route.ts +54 -0
  378. package/src/proxy/services/anthropic.ts +45 -0
  379. package/src/proxy/services/openai.test.ts +97 -0
  380. package/src/proxy/services/openai.ts +48 -0
  381. package/src/proxy/services/stripe.ts +49 -0
  382. package/src/server/Methods.ts +2 -0
  383. package/src/server/Mppx.test-d.ts +343 -0
  384. package/src/server/Mppx.test.ts +342 -0
  385. package/src/server/Mppx.ts +378 -0
  386. package/src/server/NodeListener.test.ts +188 -0
  387. package/src/server/NodeListener.ts +3 -0
  388. package/src/server/Request.test.ts +102 -0
  389. package/src/server/Request.ts +33 -0
  390. package/src/server/Response.test.ts +31 -0
  391. package/src/server/Response.ts +27 -0
  392. package/src/server/Transport.test.ts +294 -0
  393. package/src/server/Transport.ts +222 -0
  394. package/src/server/index.ts +8 -0
  395. package/src/stripe/Charge.integration.test.ts +326 -0
  396. package/src/stripe/Intents.test.ts +52 -0
  397. package/src/stripe/Intents.ts +27 -0
  398. package/src/stripe/client/Charge.ts +119 -0
  399. package/src/stripe/client/MethodIntents.ts +37 -0
  400. package/src/stripe/client/index.ts +2 -0
  401. package/src/stripe/index.ts +1 -0
  402. package/src/stripe/server/Charge.ts +121 -0
  403. package/src/stripe/server/MethodIntents.ts +24 -0
  404. package/src/stripe/server/index.ts +2 -0
  405. package/src/tempo/Attribution.test.ts +187 -0
  406. package/src/tempo/Attribution.ts +156 -0
  407. package/src/tempo/Intents.test.ts +84 -0
  408. package/src/tempo/Intents.ts +93 -0
  409. package/src/tempo/client/ChannelOps.ts +233 -0
  410. package/src/tempo/client/Charge.ts +84 -0
  411. package/src/tempo/client/MethodIntents.ts +28 -0
  412. package/src/tempo/client/Session.ts +369 -0
  413. package/src/tempo/client/SessionManager.test.ts +223 -0
  414. package/src/tempo/client/SessionManager.ts +270 -0
  415. package/src/tempo/client/index.ts +5 -0
  416. package/src/tempo/index.ts +2 -0
  417. package/src/tempo/internal/account.ts +47 -0
  418. package/src/tempo/internal/defaults.ts +20 -0
  419. package/src/tempo/internal/types.ts +8 -0
  420. package/src/tempo/server/Charge.test.ts +847 -0
  421. package/src/tempo/server/Charge.ts +309 -0
  422. package/src/tempo/server/MethodIntents.ts +29 -0
  423. package/src/tempo/server/Session.test.ts +1349 -0
  424. package/src/tempo/server/Session.ts +773 -0
  425. package/src/tempo/server/Sse.test.ts +289 -0
  426. package/src/tempo/server/index.ts +5 -0
  427. package/src/tempo/server/internal/transport.ts +153 -0
  428. package/src/tempo/stream/Chain.ts +333 -0
  429. package/src/tempo/stream/Channel.ts +50 -0
  430. package/src/tempo/stream/ChannelStore.test.ts +473 -0
  431. package/src/tempo/stream/ChannelStore.ts +202 -0
  432. package/src/tempo/stream/Receipt.test.ts +84 -0
  433. package/src/tempo/stream/Receipt.ts +45 -0
  434. package/src/tempo/stream/Sse.test.ts +401 -0
  435. package/src/tempo/stream/Sse.ts +375 -0
  436. package/src/tempo/stream/Types.ts +86 -0
  437. package/src/tempo/stream/Voucher.test.ts +134 -0
  438. package/src/tempo/stream/Voucher.ts +123 -0
  439. package/src/tempo/stream/escrow.abi.ts +759 -0
  440. package/src/tempo/stream/index.ts +7 -0
  441. package/src/tsconfig.json +10 -0
  442. package/src/viem/Account.test.ts +71 -0
  443. package/src/viem/Account.ts +30 -0
  444. package/src/viem/Client.test.ts +58 -0
  445. package/src/viem/Client.ts +33 -0
  446. package/src/zod.ts +47 -0
@@ -0,0 +1,30 @@
1
+ import * as Service from '../Service.js';
2
+ /**
3
+ * Creates an Anthropic service definition.
4
+ *
5
+ * Injects `x-api-key` header for upstream authentication.
6
+ * Per-endpoint `apiKey` overrides are supported via `options`.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * anthropic({
11
+ * apiKey: 'sk-ant-...',
12
+ * routes: {
13
+ * 'POST /v1/messages': mppx.charge({ amount: '0.03' }),
14
+ * 'POST /v1/complete': mppx.charge({ amount: '0.02' }),
15
+ * },
16
+ * })
17
+ * ```
18
+ */
19
+ export function anthropic(config) {
20
+ return Service.from('anthropic', {
21
+ baseUrl: config.baseUrl ?? 'https://api.anthropic.com',
22
+ rewriteRequest(request, ctx) {
23
+ const apiKey = ctx.apiKey ?? config.apiKey;
24
+ request.headers.set('x-api-key', apiKey);
25
+ return request;
26
+ },
27
+ routes: config.routes,
28
+ });
29
+ }
30
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../src/proxy/services/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AAExC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,SAAS,CAAC,MAAwB;IAChD,OAAO,OAAO,CAAC,IAAI,CAAmB,WAAW,EAAE;QACjD,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,2BAA2B;QACtD,cAAc,CAAC,OAAO,EAAE,GAAG;YACzB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAA;YAC1C,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;YACxC,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,29 @@
1
+ import * as Service from '../Service.js';
2
+ /**
3
+ * Creates an OpenAI service definition.
4
+ *
5
+ * Injects `Authorization: Bearer` header for upstream authentication.
6
+ * Per-endpoint `apiKey` overrides are supported via `options`.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * openai({
11
+ * apiKey: 'sk-...',
12
+ * routes: {
13
+ * 'POST /v1/chat/completions': mppx.charge({ amount: '0.05' }),
14
+ * 'GET /v1/models': true,
15
+ * },
16
+ * })
17
+ * ```
18
+ */
19
+ export declare function openai(config: openai.Config): Service.Service;
20
+ export declare namespace openai {
21
+ type Config = Service.From<{
22
+ /** OpenAI API key. Used as `Authorization: Bearer` header. */
23
+ apiKey: string;
24
+ /** Base URL override. Defaults to `'https://api.openai.com'`. */
25
+ baseUrl?: string | undefined;
26
+ routes: 'POST /v1/chat/completions' | 'POST /v1/completions' | 'POST /v1/embeddings' | 'POST /v1/images/generations' | 'POST /v1/images/edits' | 'POST /v1/images/variations' | 'POST /v1/audio/transcriptions' | 'POST /v1/audio/translations';
27
+ }>;
28
+ }
29
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/proxy/services/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AAExC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,mBAU3C;AAED,MAAM,CAAC,OAAO,WAAW,MAAM,CAAC;IAC9B,KAAY,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;QAChC,8DAA8D;QAC9D,MAAM,EAAE,MAAM,CAAA;QACd,iEAAiE;QACjE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC5B,MAAM,EACF,2BAA2B,GAC3B,sBAAsB,GACtB,qBAAqB,GACrB,6BAA6B,GAC7B,uBAAuB,GACvB,4BAA4B,GAC5B,+BAA+B,GAC/B,6BAA6B,CAAA;KAClC,CAAC,CAAA;CACH"}
@@ -0,0 +1,30 @@
1
+ import * as Service from '../Service.js';
2
+ /**
3
+ * Creates an OpenAI service definition.
4
+ *
5
+ * Injects `Authorization: Bearer` header for upstream authentication.
6
+ * Per-endpoint `apiKey` overrides are supported via `options`.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * openai({
11
+ * apiKey: 'sk-...',
12
+ * routes: {
13
+ * 'POST /v1/chat/completions': mppx.charge({ amount: '0.05' }),
14
+ * 'GET /v1/models': true,
15
+ * },
16
+ * })
17
+ * ```
18
+ */
19
+ export function openai(config) {
20
+ return Service.from('openai', {
21
+ baseUrl: config.baseUrl ?? 'https://api.openai.com',
22
+ rewriteRequest(request, ctx) {
23
+ const apiKey = ctx.apiKey ?? config.apiKey;
24
+ request.headers.set('Authorization', `Bearer ${apiKey}`);
25
+ return request;
26
+ },
27
+ routes: config.routes,
28
+ });
29
+ }
30
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/proxy/services/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AAExC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,MAAM,CAAC,MAAqB;IAC1C,OAAO,OAAO,CAAC,IAAI,CAAgB,QAAQ,EAAE;QAC3C,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,wBAAwB;QACnD,cAAc,CAAC,OAAO,EAAE,GAAG;YACzB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAA;YAC1C,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,MAAM,EAAE,CAAC,CAAA;YACxD,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,29 @@
1
+ import * as Service from '../Service.js';
2
+ /**
3
+ * Creates a Stripe service definition.
4
+ *
5
+ * Injects `Authorization: Basic` header (API key as username) for upstream authentication.
6
+ * Per-endpoint `apiKey` overrides are supported via `options`.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * stripe({
11
+ * apiKey: 'sk-...',
12
+ * routes: {
13
+ * 'POST /v1/charges': mppx.charge({ amount: '1' }),
14
+ * 'GET /v1/customers/:id': true,
15
+ * },
16
+ * })
17
+ * ```
18
+ */
19
+ export declare function stripe(config: stripe.Config): Service.Service;
20
+ export declare namespace stripe {
21
+ type Config = Service.From<{
22
+ /** Stripe API key. Used as Basic auth username. */
23
+ apiKey: string;
24
+ /** Base URL override. Defaults to `'https://api.stripe.com'`. */
25
+ baseUrl?: string | undefined;
26
+ routes: 'POST /v1/charges' | 'POST /v1/customers' | 'GET /v1/customers/:id' | 'POST /v1/payment_intents' | 'GET /v1/payment_intents/:id' | 'POST /v1/subscriptions' | 'GET /v1/subscriptions/:id' | 'POST /v1/invoices' | 'GET /v1/invoices/:id';
27
+ }>;
28
+ }
29
+ //# sourceMappingURL=stripe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripe.d.ts","sourceRoot":"","sources":["../../../src/proxy/services/stripe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AAExC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,mBAU3C;AAED,MAAM,CAAC,OAAO,WAAW,MAAM,CAAC;IAC9B,KAAY,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;QAChC,mDAAmD;QACnD,MAAM,EAAE,MAAM,CAAA;QACd,iEAAiE;QACjE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC5B,MAAM,EACF,kBAAkB,GAClB,oBAAoB,GACpB,uBAAuB,GACvB,0BAA0B,GAC1B,6BAA6B,GAC7B,wBAAwB,GACxB,2BAA2B,GAC3B,mBAAmB,GACnB,sBAAsB,CAAA;KAC3B,CAAC,CAAA;CACH"}
@@ -0,0 +1,30 @@
1
+ import * as Service from '../Service.js';
2
+ /**
3
+ * Creates a Stripe service definition.
4
+ *
5
+ * Injects `Authorization: Basic` header (API key as username) for upstream authentication.
6
+ * Per-endpoint `apiKey` overrides are supported via `options`.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * stripe({
11
+ * apiKey: 'sk-...',
12
+ * routes: {
13
+ * 'POST /v1/charges': mppx.charge({ amount: '1' }),
14
+ * 'GET /v1/customers/:id': true,
15
+ * },
16
+ * })
17
+ * ```
18
+ */
19
+ export function stripe(config) {
20
+ return Service.from('stripe', {
21
+ baseUrl: config.baseUrl ?? 'https://api.stripe.com',
22
+ rewriteRequest(request, ctx) {
23
+ const apiKey = ctx.apiKey ?? config.apiKey;
24
+ request.headers.set('Authorization', `Basic ${btoa(`${apiKey}:`)}`);
25
+ return request;
26
+ },
27
+ routes: config.routes,
28
+ });
29
+ }
30
+ //# sourceMappingURL=stripe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripe.js","sourceRoot":"","sources":["../../../src/proxy/services/stripe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AAExC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,MAAM,CAAC,MAAqB;IAC1C,OAAO,OAAO,CAAC,IAAI,CAAgB,QAAQ,EAAE;QAC3C,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,wBAAwB;QACnD,cAAc,CAAC,OAAO,EAAE,GAAG;YACzB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAA;YAC1C,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,SAAS,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,CAAA;YACnE,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { stripe } from '../stripe/server/MethodIntents.js';
2
+ export { tempo } from '../tempo/server/MethodIntents.js';
3
+ //# sourceMappingURL=Methods.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Methods.d.ts","sourceRoot":"","sources":["../../src/server/Methods.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAA;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { stripe } from '../stripe/server/MethodIntents.js';
2
+ export { tempo } from '../tempo/server/MethodIntents.js';
3
+ //# sourceMappingURL=Methods.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Methods.js","sourceRoot":"","sources":["../../src/server/Methods.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAA;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAA"}
@@ -0,0 +1,116 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ import type * as MethodIntent from '../MethodIntent.js';
3
+ import type * as z from '../zod.js';
4
+ import * as Transport from './Transport.js';
5
+ export type Methods = readonly (MethodIntent.AnyServer | readonly MethodIntent.AnyServer[])[];
6
+ /**
7
+ * Payment handler.
8
+ */
9
+ export type Mppx<methods extends Methods = Methods, transport extends Transport.AnyTransport = Transport.Http> = {
10
+ /** Methods to configure. */
11
+ methods: FlattenMethods<methods>;
12
+ /** Server realm (e.g., hostname). */
13
+ realm: string;
14
+ /** The transport used. */
15
+ transport: transport;
16
+ } & Handlers<FlattenMethods<methods>, transport>;
17
+ /** Extracts the transport override from a method intent, if any. */
18
+ type TransportOverrideOf<mi> = mi extends {
19
+ transport?: infer transport;
20
+ } ? Exclude<transport, undefined> extends Transport.AnyTransport ? Exclude<transport, undefined> : never : never;
21
+ /** Resolves the effective transport for an intent: override if present, else global default. */
22
+ type EffectiveTransportOf<mi, defaultTransport extends Transport.AnyTransport> = [
23
+ TransportOverrideOf<mi>
24
+ ] extends [never] ? defaultTransport : TransportOverrideOf<mi>;
25
+ type Handlers<methods extends readonly MethodIntent.AnyServer[], transport extends Transport.AnyTransport> = {
26
+ [intent in methods[number]['name']]: IntentFn<Extract<methods[number], {
27
+ name: intent;
28
+ }>, EffectiveTransportOf<Extract<methods[number], {
29
+ name: intent;
30
+ }>, transport>, NonNullable<Extract<methods[number], {
31
+ name: intent;
32
+ }>['defaults']>>;
33
+ };
34
+ /**
35
+ * Creates a server-side payment handler from method intents.
36
+ *
37
+ * It is highly recommended to set a `secretKey` to bind challenges to their contents,
38
+ * and allow the server to verify that incoming credentials match challenges it issued.
39
+ *
40
+ * @example
41
+ * ```ts
42
+ * import { Mppx, tempo } from 'mppx/server'
43
+ *
44
+ * const payment = Mppx.create({
45
+ * methods: [tempo()],
46
+ * secretKey: process.env.PAYMENT_SECRET_KEY,
47
+ * })
48
+ * ```
49
+ */
50
+ export declare function create<const methods extends Methods, const transport extends Transport.AnyTransport = Transport.Http>(config: create.Config<methods, transport>): Mppx<methods, transport>;
51
+ export declare namespace create {
52
+ type Config<methods extends Methods = Methods, transport extends Transport.AnyTransport = Transport.Http> = {
53
+ /** Array of configured methods. @example [tempo()] */
54
+ methods: methods;
55
+ /** Server realm (e.g., hostname). @default "MPP Payment". */
56
+ realm?: string | undefined;
57
+ /** Secret key for HMAC-bound challenge IDs for stateless verification. */
58
+ secretKey?: string | undefined;
59
+ /** Transport to use. @default Transport.http() */
60
+ transport?: transport | undefined;
61
+ };
62
+ }
63
+ export type IntentFn<intent extends MethodIntent.MethodIntent, transport extends Transport.AnyTransport, defaults extends Record<string, unknown>> = (options: IntentFn.Options<intent, defaults>) => (input: Transport.InputOf<transport>) => Promise<IntentFn.Response<transport>>;
64
+ /** @internal */
65
+ export type AnyIntentFn = (options: any) => (input: any) => Promise<any>;
66
+ /** @internal */
67
+ declare namespace IntentFn {
68
+ type Options<intent extends MethodIntent.MethodIntent, defaults extends Record<string, unknown> = Record<string, unknown>> = {
69
+ /** Optional human-readable description of the payment. */
70
+ description?: string | undefined;
71
+ /** Optional challenge expiration timestamp (ISO 8601). */
72
+ expires?: string | undefined;
73
+ } & MethodIntent.WithDefaults<z.input<intent['schema']['request']>, defaults>;
74
+ type Response<transport extends Transport.AnyTransport = Transport.Http> = {
75
+ challenge: Transport.ChallengeOutputOf<transport>;
76
+ status: 402;
77
+ } | {
78
+ status: 200;
79
+ withReceipt: Transport.WithReceipt<transport>;
80
+ };
81
+ }
82
+ /**
83
+ * Wraps a payment handler to create a Node.js HTTP listener.
84
+ *
85
+ * On 402: writes the challenge response and ends the connection.
86
+ * On 200: sets the Payment-Receipt header; caller should write response body.
87
+ *
88
+ * @example
89
+ * ```ts
90
+ * import * as http from 'node:http'
91
+ * import { Mppx } from 'mppx/server'
92
+ *
93
+ * const payment = Mppx.create({ ... })
94
+ *
95
+ * http.createServer(async (req, res) => {
96
+ * const result = await Mppx.toNodeListener(
97
+ * payment.charge({
98
+ * amount: '1', currency: '...', recipient: '0x...',
99
+ * }),
100
+ * )(req, res)
101
+ * if (result.status === 402) return
102
+ * res.end('OK')
103
+ * })
104
+ * ```
105
+ */
106
+ export declare function toNodeListener(handler: (input: globalThis.Request) => Promise<IntentFn.Response<Transport.Http>>): (req: IncomingMessage, res: ServerResponse) => Promise<IntentFn.Response<Transport.Http>>;
107
+ /**
108
+ * Flattens a methods config tuple, preserving positional types.
109
+ * @internal
110
+ */
111
+ type FlattenMethods<methods extends Methods> = methods extends readonly [
112
+ infer head,
113
+ ...infer tail extends Methods
114
+ ] ? head extends readonly MethodIntent.AnyServer[] ? readonly [...head, ...FlattenMethods<tail>] : head extends MethodIntent.AnyServer ? readonly [head, ...FlattenMethods<tail>] : never : readonly [];
115
+ export {};
116
+ //# sourceMappingURL=Mppx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Mppx.d.ts","sourceRoot":"","sources":["../../src/server/Mppx.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAIhE,OAAO,KAAK,KAAK,YAAY,MAAM,oBAAoB,CAAA;AAEvD,OAAO,KAAK,KAAK,CAAC,MAAM,WAAW,CAAA;AAGnC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C,MAAM,MAAM,OAAO,GAAG,SAAS,CAAC,YAAY,CAAC,SAAS,GAAG,SAAS,YAAY,CAAC,SAAS,EAAE,CAAC,EAAE,CAAA;AAE7F;;GAEG;AACH,MAAM,MAAM,IAAI,CACd,OAAO,SAAS,OAAO,GAAG,OAAO,EACjC,SAAS,SAAS,SAAS,CAAC,YAAY,GAAG,SAAS,CAAC,IAAI,IACvD;IACF,4BAA4B;IAC5B,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,CAAA;IAChC,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAA;IACb,0BAA0B;IAC1B,SAAS,EAAE,SAAS,CAAA;CACrB,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAA;AAEhD,oEAAoE;AACpE,KAAK,mBAAmB,CAAC,EAAE,IAAI,EAAE,SAAS;IAAE,SAAS,CAAC,EAAE,MAAM,SAAS,CAAA;CAAE,GACrE,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,SAAS,SAAS,CAAC,YAAY,GAC1D,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,GAC7B,KAAK,GACP,KAAK,CAAA;AAET,gGAAgG;AAChG,KAAK,oBAAoB,CAAC,EAAE,EAAE,gBAAgB,SAAS,SAAS,CAAC,YAAY,IAAI;IAC/E,mBAAmB,CAAC,EAAE,CAAC;CACxB,SAAS,CAAC,KAAK,CAAC,GACb,gBAAgB,GAChB,mBAAmB,CAAC,EAAE,CAAC,CAAA;AAE3B,KAAK,QAAQ,CACX,OAAO,SAAS,SAAS,YAAY,CAAC,SAAS,EAAE,EACjD,SAAS,SAAS,SAAS,CAAC,YAAY,IACtC;KACD,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,QAAQ,CAC3C,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,EAC1C,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,SAAS,CAAC,EAC3E,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CACpE;CACF,CAAA;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,MAAM,CACpB,KAAK,CAAC,OAAO,SAAS,OAAO,EAC7B,KAAK,CAAC,SAAS,SAAS,SAAS,CAAC,YAAY,GAAG,SAAS,CAAC,IAAI,EAC/D,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAyBrE;AAED,MAAM,CAAC,OAAO,WAAW,MAAM,CAAC;IAC9B,KAAK,MAAM,CACT,OAAO,SAAS,OAAO,GAAG,OAAO,EACjC,SAAS,SAAS,SAAS,CAAC,YAAY,GAAG,SAAS,CAAC,IAAI,IACvD;QACF,sDAAsD;QACtD,OAAO,EAAE,OAAO,CAAA;QAChB,6DAA6D;QAC7D,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC1B,0EAA0E;QAC1E,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC9B,kDAAkD;QAClD,SAAS,CAAC,EAAE,SAAS,GAAG,SAAS,CAAA;KAClC,CAAA;CACF;AAiLD,MAAM,MAAM,QAAQ,CAClB,MAAM,SAAS,YAAY,CAAC,YAAY,EACxC,SAAS,SAAS,SAAS,CAAC,YAAY,EACxC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IACtC,CACF,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,KACxC,CAAC,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAA;AACnF,gBAAgB;AAChB,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAA;AAExE,gBAAgB;AAChB,OAAO,WAAW,QAAQ,CAAC;IACzB,KAAY,OAAO,CACjB,MAAM,SAAS,YAAY,CAAC,YAAY,EACxC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAChE;QACF,0DAA0D;QAC1D,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAChC,0DAA0D;QAC1D,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC7B,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IAE7E,KAAY,QAAQ,CAAC,SAAS,SAAS,SAAS,CAAC,YAAY,GAAG,SAAS,CAAC,IAAI,IAC1E;QACE,SAAS,EAAE,SAAS,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;QACjD,MAAM,EAAE,GAAG,CAAA;KACZ,GACD;QACE,MAAM,EAAE,GAAG,CAAA;QACX,WAAW,EAAE,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;KAC9C,CAAA;CACN;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GACjF,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAa3F;AAED;;;GAGG;AACH,KAAK,cAAc,CAAC,OAAO,SAAS,OAAO,IAAI,OAAO,SAAS,SAAS;IACtE,MAAM,IAAI;IACV,GAAG,MAAM,IAAI,SAAS,OAAO;CAC9B,GACG,IAAI,SAAS,SAAS,YAAY,CAAC,SAAS,EAAE,GAC5C,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,GAC3C,IAAI,SAAS,YAAY,CAAC,SAAS,GACjC,SAAS,CAAC,IAAI,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,GACxC,KAAK,GACT,SAAS,EAAE,CAAA"}
@@ -0,0 +1,207 @@
1
+ import * as Challenge from '../Challenge.js';
2
+ import * as Errors from '../Errors.js';
3
+ import * as NodeListener from './NodeListener.js';
4
+ import * as Request from './Request.js';
5
+ import * as Transport from './Transport.js';
6
+ /**
7
+ * Creates a server-side payment handler from method intents.
8
+ *
9
+ * It is highly recommended to set a `secretKey` to bind challenges to their contents,
10
+ * and allow the server to verify that incoming credentials match challenges it issued.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * import { Mppx, tempo } from 'mppx/server'
15
+ *
16
+ * const payment = Mppx.create({
17
+ * methods: [tempo()],
18
+ * secretKey: process.env.PAYMENT_SECRET_KEY,
19
+ * })
20
+ * ```
21
+ */
22
+ export function create(config) {
23
+ const { realm = 'MPP Payment', secretKey = 'tmp', transport = Transport.http(), } = config;
24
+ const methods = config.methods.flat();
25
+ const handlers = {};
26
+ for (const mi of methods) {
27
+ handlers[mi.name] = createIntentFn({
28
+ defaults: mi.defaults,
29
+ intent: mi,
30
+ realm,
31
+ request: mi.request,
32
+ respond: mi.respond,
33
+ secretKey,
34
+ transport: (mi.transport ?? transport),
35
+ verify: mi.verify,
36
+ });
37
+ }
38
+ return { methods, realm: realm, transport, ...handlers };
39
+ }
40
+ // biome-ignore lint/correctness/noUnusedVariables: _
41
+ function createIntentFn(parameters) {
42
+ const { defaults, intent, realm, respond, secretKey, transport, verify } = parameters;
43
+ return (options) => {
44
+ const meta = {
45
+ ...intent,
46
+ ...defaults,
47
+ ...options,
48
+ };
49
+ return Object.assign(async (input) => {
50
+ const { description, ...rest } = options;
51
+ const expires = 'expires' in options ? options.expires : undefined;
52
+ // Merge defaults with per-request options
53
+ const merged = { ...defaults, ...rest };
54
+ // Extract credential once — getCredential may have side effects (e.g. SSE transports).
55
+ const [credential, credentialError] = (() => {
56
+ try {
57
+ return [
58
+ transport.getCredential(input),
59
+ undefined,
60
+ ];
61
+ }
62
+ catch (e) {
63
+ return [null, e];
64
+ }
65
+ })();
66
+ // Transform request if method provides a `request` function.
67
+ const request = (parameters.request
68
+ ? await parameters.request({ credential, request: merged })
69
+ : merged);
70
+ // Recompute challenge from options. The HMAC-bound ID means we don't need to
71
+ // store challenges server-side—if the client echoes back a credential with
72
+ // a matching ID, we know it was issued by us with these exact parameters.
73
+ const challenge = Challenge.fromIntent(intent, {
74
+ description,
75
+ expires,
76
+ realm,
77
+ request,
78
+ secretKey,
79
+ });
80
+ // Credential was provided but malformed
81
+ if (credentialError) {
82
+ const response = await transport.respondChallenge({
83
+ challenge,
84
+ input,
85
+ error: new Errors.MalformedCredentialError({ reason: credentialError.message }),
86
+ });
87
+ return { challenge: response, status: 402 };
88
+ }
89
+ // No credential provided—issue challenge
90
+ if (!credential) {
91
+ const response = await transport.respondChallenge({
92
+ challenge,
93
+ input,
94
+ error: new Errors.PaymentRequiredError({ realm, description }),
95
+ });
96
+ return { challenge: response, status: 402 };
97
+ }
98
+ // Verify the echoed challenge was issued by us by recomputing its HMAC.
99
+ // This is stateless—no database lookup needed.
100
+ if (!Challenge.verify(credential.challenge, { secretKey })) {
101
+ const response = await transport.respondChallenge({
102
+ challenge,
103
+ input,
104
+ error: new Errors.InvalidChallengeError({
105
+ id: credential.challenge.id,
106
+ reason: 'challenge was not issued by this server',
107
+ }),
108
+ });
109
+ return { challenge: response, status: 402 };
110
+ }
111
+ // Validate payload structure against intent schema
112
+ try {
113
+ intent.schema.credential.payload.parse(credential.payload);
114
+ }
115
+ catch (e) {
116
+ const response = await transport.respondChallenge({
117
+ challenge,
118
+ input,
119
+ error: new Errors.InvalidPayloadError({ reason: e.message }),
120
+ });
121
+ return { challenge: response, status: 402 };
122
+ }
123
+ // User-provided verification (e.g., check signature, submit tx, verify payment).
124
+ // If verification fails, re-issue the challenge so the client can retry.
125
+ let receiptData;
126
+ try {
127
+ receiptData = await verify({ credential, request });
128
+ }
129
+ catch (e) {
130
+ const error = e instanceof Errors.PaymentError
131
+ ? e
132
+ : new Errors.VerificationFailedError({ reason: e.message });
133
+ const response = await transport.respondChallenge({
134
+ challenge,
135
+ input,
136
+ error,
137
+ });
138
+ return { challenge: response, status: 402 };
139
+ }
140
+ // If the method's `respond` hook returns a Response, it means this
141
+ // request is a management action (e.g. channel open, voucher POST)
142
+ // and the user's route handler should NOT run. `withReceipt()` will
143
+ // return the management response directly. If undefined, `withReceipt()`
144
+ // expects the caller to pass the user handler's response instead.
145
+ const managementResponse = respond
146
+ ? await respond({ credential, input, receipt: receiptData, request })
147
+ : undefined;
148
+ return {
149
+ status: 200,
150
+ withReceipt(response) {
151
+ if (managementResponse) {
152
+ return transport.respondReceipt({
153
+ receipt: receiptData,
154
+ response: managementResponse,
155
+ challengeId: credential.challenge.id,
156
+ });
157
+ }
158
+ if (!response)
159
+ throw new Error('withReceipt() requires a response argument');
160
+ return transport.respondReceipt({
161
+ receipt: receiptData,
162
+ response: response,
163
+ challengeId: credential.challenge.id,
164
+ });
165
+ },
166
+ };
167
+ }, { _internal: meta });
168
+ };
169
+ }
170
+ /**
171
+ * Wraps a payment handler to create a Node.js HTTP listener.
172
+ *
173
+ * On 402: writes the challenge response and ends the connection.
174
+ * On 200: sets the Payment-Receipt header; caller should write response body.
175
+ *
176
+ * @example
177
+ * ```ts
178
+ * import * as http from 'node:http'
179
+ * import { Mppx } from 'mppx/server'
180
+ *
181
+ * const payment = Mppx.create({ ... })
182
+ *
183
+ * http.createServer(async (req, res) => {
184
+ * const result = await Mppx.toNodeListener(
185
+ * payment.charge({
186
+ * amount: '1', currency: '...', recipient: '0x...',
187
+ * }),
188
+ * )(req, res)
189
+ * if (result.status === 402) return
190
+ * res.end('OK')
191
+ * })
192
+ * ```
193
+ */
194
+ export function toNodeListener(handler) {
195
+ return async (req, res) => {
196
+ const result = await handler(Request.fromNodeListener(req, res));
197
+ if (result.status === 402) {
198
+ await NodeListener.sendResponse(res, result.challenge);
199
+ }
200
+ else {
201
+ const wrapped = result.withReceipt(new globalThis.Response());
202
+ res.setHeader('Payment-Receipt', wrapped.headers.get('Payment-Receipt'));
203
+ }
204
+ return result;
205
+ };
206
+ }
207
+ //# sourceMappingURL=Mppx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Mppx.js","sourceRoot":"","sources":["../../src/server/Mppx.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import * as FetchServer from '@remix-run/node-fetch-server';
2
+ export declare const sendResponse: typeof FetchServer.sendResponse;
3
+ //# sourceMappingURL=NodeListener.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeListener.d.ts","sourceRoot":"","sources":["../../src/server/NodeListener.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,8BAA8B,CAAA;AAE3D,eAAO,MAAM,YAAY,iCAA2B,CAAA"}
@@ -0,0 +1,3 @@
1
+ import * as FetchServer from '@remix-run/node-fetch-server';
2
+ export const sendResponse = FetchServer.sendResponse;
3
+ //# sourceMappingURL=NodeListener.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeListener.js","sourceRoot":"","sources":["../../src/server/NodeListener.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,8BAA8B,CAAA;AAE3D,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CAAC,YAAY,CAAA"}
@@ -0,0 +1,24 @@
1
+ import type { IncomingMessage, RequestListener, ServerResponse } from 'node:http';
2
+ import * as FetchServer from '@remix-run/node-fetch-server';
3
+ export type FetchHandler = (request: Request) => Promise<Response> | Response;
4
+ /**
5
+ * Converts a Fetch API handler into a Node.js HTTP request listener.
6
+ *
7
+ * Uses [`@remix-run/node-fetch-server`](https://github.com/remix-run/remix/blob/main/packages/node-fetch-server/src/lib/request-listener.ts).
8
+ *
9
+ * @param handler - A Fetch API handler: `(request: Request) => Response`.
10
+ * @param options - Optional error handler.
11
+ * @returns A Node.js `(req, res)` listener.
12
+ */
13
+ export declare function toNodeListener(handler: FetchHandler, options?: FetchServer.RequestListenerOptions | undefined): RequestListener;
14
+ /**
15
+ * Converts a Node.js `IncomingMessage`/`ServerResponse` pair to a Fetch API `Request`.
16
+ *
17
+ * Uses [`@remix-run/node-fetch-server`](https://github.com/remix-run/remix/blob/main/packages/node-fetch-server/src/lib/request-listener.ts).
18
+ *
19
+ * @param req - The Node.js IncomingMessage.
20
+ * @param res - The Node.js ServerResponse (used for abort signal lifecycle).
21
+ * @returns A Fetch API Request.
22
+ */
23
+ export declare function fromNodeListener(req: IncomingMessage, res: ServerResponse): Request;
24
+ //# sourceMappingURL=Request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Request.d.ts","sourceRoot":"","sources":["../../src/server/Request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AACjF,OAAO,KAAK,WAAW,MAAM,8BAA8B,CAAA;AAE3D,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAA;AAE7E;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE,WAAW,CAAC,sBAAsB,GAAG,SAAS,GACvD,eAAe,CAEjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAEnF"}
@@ -0,0 +1,26 @@
1
+ import * as FetchServer from '@remix-run/node-fetch-server';
2
+ /**
3
+ * Converts a Fetch API handler into a Node.js HTTP request listener.
4
+ *
5
+ * Uses [`@remix-run/node-fetch-server`](https://github.com/remix-run/remix/blob/main/packages/node-fetch-server/src/lib/request-listener.ts).
6
+ *
7
+ * @param handler - A Fetch API handler: `(request: Request) => Response`.
8
+ * @param options - Optional error handler.
9
+ * @returns A Node.js `(req, res)` listener.
10
+ */
11
+ export function toNodeListener(handler, options) {
12
+ return FetchServer.createRequestListener(handler, options);
13
+ }
14
+ /**
15
+ * Converts a Node.js `IncomingMessage`/`ServerResponse` pair to a Fetch API `Request`.
16
+ *
17
+ * Uses [`@remix-run/node-fetch-server`](https://github.com/remix-run/remix/blob/main/packages/node-fetch-server/src/lib/request-listener.ts).
18
+ *
19
+ * @param req - The Node.js IncomingMessage.
20
+ * @param res - The Node.js ServerResponse (used for abort signal lifecycle).
21
+ * @returns A Fetch API Request.
22
+ */
23
+ export function fromNodeListener(req, res) {
24
+ return FetchServer.createRequest(req, res);
25
+ }
26
+ //# sourceMappingURL=Request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Request.js","sourceRoot":"","sources":["../../src/server/Request.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,WAAW,MAAM,8BAA8B,CAAA;AAI3D;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAqB,EACrB,OAAwD;IAExD,OAAO,WAAW,CAAC,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAU,CAAA;AACrE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAoB,EAAE,GAAmB;IACxE,OAAO,WAAW,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;AAC5C,CAAC"}
@@ -0,0 +1,10 @@
1
+ import * as Challenge from '../Challenge.js';
2
+ import type * as Errors from '../Errors.js';
3
+ export declare function requirePayment(parameters: requirePayment.Parameters): Response;
4
+ export declare namespace requirePayment {
5
+ type Parameters = {
6
+ challenge: Challenge.Challenge;
7
+ error?: Errors.PaymentError | undefined;
8
+ };
9
+ }
10
+ //# sourceMappingURL=Response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Response.d.ts","sourceRoot":"","sources":["../../src/server/Response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAA;AAC5C,OAAO,KAAK,KAAK,MAAM,MAAM,cAAc,CAAA;AAE3C,wBAAgB,cAAc,CAAC,UAAU,EAAE,cAAc,CAAC,UAAU,GAAG,QAAQ,CAgB9E;AAED,MAAM,CAAC,OAAO,WAAW,cAAc,CAAC;IACtC,KAAK,UAAU,GAAG;QAChB,SAAS,EAAE,SAAS,CAAC,SAAS,CAAA;QAC9B,KAAK,CAAC,EAAE,MAAM,CAAC,YAAY,GAAG,SAAS,CAAA;KACxC,CAAA;CACF"}
@@ -0,0 +1,15 @@
1
+ import * as Challenge from '../Challenge.js';
2
+ export function requirePayment(parameters) {
3
+ const { challenge, error } = parameters;
4
+ const headers = {
5
+ 'WWW-Authenticate': Challenge.serialize(challenge),
6
+ 'Cache-Control': 'no-store',
7
+ };
8
+ let body = null;
9
+ if (error) {
10
+ headers['Content-Type'] = 'application/problem+json';
11
+ body = JSON.stringify(error.toProblemDetails(challenge.id));
12
+ }
13
+ return new Response(body, { status: 402, headers });
14
+ }
15
+ //# sourceMappingURL=Response.js.map