mppx 0.0.1 → 0.1.1

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 +89 -0
  56. package/dist/client/Mppx.d.ts.map +1 -0
  57. package/dist/client/Mppx.js +69 -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 +87 -0
  68. package/dist/client/internal/Fetch.d.ts.map +1 -0
  69. package/dist/client/internal/Fetch.js +99 -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 +105 -0
  180. package/dist/stripe/client/Charge.d.ts.map +1 -0
  181. package/dist/stripe/client/Charge.js +74 -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 +201 -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 +119 -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 +165 -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 +315 -0
  351. package/src/client/internal/Fetch.ts +169 -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 +329 -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 +115 -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 +276 -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 +154 -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,288 @@
1
+ import * as Credential from '../../Credential.js';
2
+ import * as ChannelStore from './ChannelStore.js';
3
+ import { createStreamReceipt } from './Receipt.js';
4
+ /**
5
+ * Format a stream receipt as a Server-Sent Event.
6
+ *
7
+ * Produces a valid SSE event string with `event: payment-receipt`
8
+ * and the receipt JSON as the `data` field.
9
+ */
10
+ export function formatReceiptEvent(receipt) {
11
+ return `event: payment-receipt\ndata: ${JSON.stringify(receipt)}\n\n`;
12
+ }
13
+ /**
14
+ * Format a need-voucher event as a Server-Sent Event.
15
+ *
16
+ * Emitted when the channel balance is exhausted mid-stream.
17
+ * The client responds by sending a new voucher credential to
18
+ * any mppx-protected endpoint.
19
+ */
20
+ export function formatNeedVoucherEvent(params) {
21
+ return `event: payment-need-voucher\ndata: ${JSON.stringify(params)}\n\n`;
22
+ }
23
+ /**
24
+ * Parse a raw SSE event string into a typed event.
25
+ *
26
+ * Handles the three event types used by mppx streaming:
27
+ * - `message` (default / no event field) — application data
28
+ * - `payment-need-voucher` — balance exhausted, client should send voucher
29
+ * - `payment-receipt` — final receipt
30
+ */
31
+ export function parseEvent(raw) {
32
+ let eventType = 'message';
33
+ const dataLines = [];
34
+ for (const line of raw.split('\n')) {
35
+ if (line.startsWith('event: ')) {
36
+ eventType = line.slice(7).trim();
37
+ }
38
+ else if (line.startsWith('data: ')) {
39
+ dataLines.push(line.slice(6));
40
+ }
41
+ else if (line === 'data:') {
42
+ dataLines.push('');
43
+ }
44
+ }
45
+ if (dataLines.length === 0)
46
+ return null;
47
+ const data = dataLines.join('\n');
48
+ switch (eventType) {
49
+ case 'message':
50
+ return { type: 'message', data };
51
+ case 'payment-need-voucher':
52
+ return { type: 'payment-need-voucher', data: JSON.parse(data) };
53
+ case 'payment-receipt':
54
+ return { type: 'payment-receipt', data: JSON.parse(data) };
55
+ default:
56
+ return { type: 'message', data };
57
+ }
58
+ }
59
+ /**
60
+ * Wrap an async iterable with payment metering, producing an SSE stream.
61
+ *
62
+ * `generate` may be either:
63
+ * - An `AsyncIterable<string>` — each yielded value is automatically charged
64
+ * (one `tickCost` per value).
65
+ * - A callback `(stream: StreamController) => AsyncIterable<string>` — the
66
+ * generator controls when charges happen by calling `stream.charge()`.
67
+ *
68
+ * For each emitted value the stream:
69
+ * 1. Deducts `tickCost` from the channel balance atomically (auto or manual).
70
+ * 2. If balance is sufficient, emits `event: message` with the value.
71
+ * 3. If balance is exhausted, emits `event: payment-need-voucher`
72
+ * and polls store until the client tops up the channel.
73
+ * 4. On generator completion, emits a final `event: payment-receipt`.
74
+ *
75
+ * Returns a `ReadableStream<Uint8Array>` suitable for use as an HTTP response body.
76
+ */
77
+ export function serve(options) {
78
+ const { store, channelId, challengeId, tickCost, generate, pollIntervalMs = 100, signal, } = options;
79
+ const encoder = new TextEncoder();
80
+ return new ReadableStream({
81
+ async start(controller) {
82
+ const aborted = () => signal?.aborted ?? false;
83
+ const emit = (event) => controller.enqueue(encoder.encode(event));
84
+ const charge = () => chargeOrWait({
85
+ store,
86
+ channelId,
87
+ amount: tickCost,
88
+ emit,
89
+ pollIntervalMs,
90
+ signal,
91
+ });
92
+ const iterable = typeof generate === 'function' ? generate({ charge }) : generate;
93
+ try {
94
+ for await (const value of iterable) {
95
+ if (aborted())
96
+ break;
97
+ if (typeof generate !== 'function')
98
+ await charge();
99
+ controller.enqueue(encoder.encode(`event: message\ndata: ${value}\n\n`));
100
+ }
101
+ if (!aborted()) {
102
+ const channel = await store.getChannel(channelId);
103
+ if (channel) {
104
+ const receipt = createStreamReceipt({
105
+ challengeId,
106
+ channelId,
107
+ acceptedCumulative: channel.highestVoucherAmount,
108
+ spent: channel.spent,
109
+ units: channel.units,
110
+ });
111
+ controller.enqueue(encoder.encode(formatReceiptEvent(receipt)));
112
+ }
113
+ }
114
+ }
115
+ catch (e) {
116
+ if (!aborted())
117
+ controller.error(e);
118
+ }
119
+ finally {
120
+ controller.close();
121
+ }
122
+ },
123
+ });
124
+ }
125
+ /**
126
+ * Wrap a `ReadableStream<Uint8Array>` (from {@link serve}) in an HTTP
127
+ * `Response` with the correct SSE headers.
128
+ */
129
+ export function toResponse(body) {
130
+ return new Response(body, {
131
+ headers: {
132
+ 'Cache-Control': 'no-cache, no-transform',
133
+ Connection: 'keep-alive',
134
+ 'Content-Type': 'text/event-stream; charset=utf-8',
135
+ },
136
+ });
137
+ }
138
+ /**
139
+ * Extract `channelId`, `challengeId`, and `tickCost` from a `Request`'s
140
+ * `Authorization: Payment …` header.
141
+ *
142
+ * This is a convenience for callers that receive a raw `Request` and need
143
+ * the parameters required by {@link serve}.
144
+ */
145
+ export function fromRequest(request) {
146
+ const header = request.headers.get('Authorization');
147
+ if (!header)
148
+ throw new Error('Missing Authorization header.');
149
+ const payment = Credential.extractPaymentScheme(header);
150
+ if (!payment)
151
+ throw new Error('Missing Payment credential in Authorization header.');
152
+ const credential = Credential.deserialize(payment);
153
+ const payload = credential.payload;
154
+ return {
155
+ challengeId: credential.challenge.id,
156
+ channelId: payload.channelId,
157
+ tickCost: BigInt(credential.challenge.request.amount),
158
+ };
159
+ }
160
+ /**
161
+ * Atomically deduct `amount` from a channel, retrying when balance is
162
+ * insufficient. Uses `store.waitForUpdate()` when available for
163
+ * event-driven wakeups, falling back to polling otherwise. Emits
164
+ * `payment-need-voucher` events via `emit` while waiting.
165
+ */
166
+ async function chargeOrWait(options) {
167
+ const { store, channelId, amount, emit, pollIntervalMs, signal } = options;
168
+ let result = await ChannelStore.deductFromChannel(store, channelId, amount);
169
+ if (!result.ok) {
170
+ // Emit a single need-voucher event, then poll/wait until the client
171
+ // sends an updated voucher. The requiredCumulative is constant here:
172
+ // `spent` only changes on successful deduction (which exits the loop),
173
+ // so re-emitting on every poll cycle would just cause redundant
174
+ // voucher POSTs from the client.
175
+ emit(formatNeedVoucherEvent({
176
+ channelId,
177
+ requiredCumulative: (result.channel.spent + amount).toString(),
178
+ acceptedCumulative: result.channel.highestVoucherAmount.toString(),
179
+ deposit: result.channel.deposit.toString(),
180
+ }));
181
+ while (!result.ok) {
182
+ await waitForUpdate(store, channelId, pollIntervalMs, signal);
183
+ result = await ChannelStore.deductFromChannel(store, channelId, amount);
184
+ }
185
+ }
186
+ }
187
+ async function waitForUpdate(store, channelId, pollIntervalMs, signal) {
188
+ if (signal?.aborted)
189
+ throw new Error('Aborted while waiting for voucher');
190
+ if (store.waitForUpdate) {
191
+ await Promise.race([store.waitForUpdate(channelId), ...(signal ? [abortPromise(signal)] : [])]);
192
+ }
193
+ else {
194
+ await sleep(pollIntervalMs);
195
+ }
196
+ if (signal?.aborted)
197
+ throw new Error('Aborted while waiting for voucher');
198
+ }
199
+ function abortPromise(signal) {
200
+ return new Promise((resolve) => {
201
+ if (signal.aborted)
202
+ return resolve();
203
+ signal.addEventListener('abort', () => resolve(), { once: true });
204
+ });
205
+ }
206
+ function sleep(ms) {
207
+ return new Promise((resolve) => setTimeout(resolve, ms));
208
+ }
209
+ /**
210
+ * Check whether a `Response` carries an SSE event stream.
211
+ *
212
+ * Returns `true` when the `Content-Type` header starts with
213
+ * `text/event-stream` (case-insensitive, ignoring charset params).
214
+ */
215
+ export function isEventStream(response) {
216
+ const ct = response.headers.get('content-type');
217
+ return ct?.toLowerCase().startsWith('text/event-stream') ?? false;
218
+ }
219
+ /**
220
+ * Parse an SSE `Response` body into an async iterable of `data:` payloads.
221
+ *
222
+ * Yields the raw `data:` field content for each SSE event in the stream.
223
+ * Events whose data matches the `skip` predicate are silently dropped
224
+ * (e.g. `[DONE]` sentinels used by OpenAI-compatible APIs).
225
+ *
226
+ * Each yielded value typically becomes one charge tick when fed to
227
+ * {@link serve} via the SSE transport's auto-charge mode.
228
+ *
229
+ * @example
230
+ * ```ts
231
+ * const upstream = await fetch('https://api.example.com/stream')
232
+ * for await (const data of Sse.iterateData(upstream)) {
233
+ * console.log(data)
234
+ * }
235
+ * ```
236
+ */
237
+ export async function* iterateData(response, options) {
238
+ const skip = options?.skip;
239
+ const body = response.body;
240
+ if (!body)
241
+ return;
242
+ const reader = body.getReader();
243
+ const decoder = new TextDecoder();
244
+ let buffer = '';
245
+ try {
246
+ while (true) {
247
+ const { value, done } = await reader.read();
248
+ if (done)
249
+ break;
250
+ buffer += decoder.decode(value, { stream: true });
251
+ // Split on double-newline SSE event boundaries.
252
+ const events = buffer.split('\n\n');
253
+ // Last element may be incomplete — keep in buffer.
254
+ buffer = events.pop() ?? '';
255
+ for (const event of events) {
256
+ if (!event.trim())
257
+ continue;
258
+ const data = extractData(event);
259
+ if (data === null)
260
+ continue;
261
+ if (skip?.(data))
262
+ continue;
263
+ yield data;
264
+ }
265
+ }
266
+ // Flush remaining buffer.
267
+ if (buffer.trim()) {
268
+ const data = extractData(buffer);
269
+ if (data !== null && !skip?.(data))
270
+ yield data;
271
+ }
272
+ }
273
+ finally {
274
+ reader.releaseLock();
275
+ }
276
+ }
277
+ /** Extract the `data:` field value from a single SSE event block. */
278
+ function extractData(event) {
279
+ const dataLines = [];
280
+ for (const line of event.split('\n')) {
281
+ if (line.startsWith('data: '))
282
+ dataLines.push(line.slice(6));
283
+ else if (line === 'data:')
284
+ dataLines.push('');
285
+ }
286
+ return dataLines.length > 0 ? dataLines.join('\n') : null;
287
+ }
288
+ //# sourceMappingURL=Sse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sse.js","sourceRoot":"","sources":["../../../src/tempo/stream/Sse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import type { Address, Hex } from 'viem';
2
+ /**
3
+ * Voucher for cumulative payment.
4
+ * Cumulative monotonicity prevents replay attacks.
5
+ */
6
+ export interface Voucher {
7
+ channelId: Hex;
8
+ cumulativeAmount: bigint;
9
+ }
10
+ /**
11
+ * Signed voucher with EIP-712 signature.
12
+ */
13
+ export interface SignedVoucher extends Voucher {
14
+ signature: Hex;
15
+ }
16
+ /**
17
+ * Stream credential payload (discriminated union).
18
+ */
19
+ export type StreamCredentialPayload = {
20
+ action: 'open';
21
+ type: 'transaction';
22
+ channelId: Hex;
23
+ transaction: Hex;
24
+ signature: Hex;
25
+ authorizedSigner?: Address | undefined;
26
+ cumulativeAmount: string;
27
+ } | {
28
+ action: 'topUp';
29
+ type: 'transaction';
30
+ channelId: Hex;
31
+ transaction: Hex;
32
+ additionalDeposit: string;
33
+ } | {
34
+ action: 'voucher';
35
+ channelId: Hex;
36
+ cumulativeAmount: string;
37
+ signature: Hex;
38
+ } | {
39
+ action: 'close';
40
+ channelId: Hex;
41
+ cumulativeAmount: string;
42
+ signature: Hex;
43
+ };
44
+ /**
45
+ * SSE event emitted when session balance is exhausted mid-stream.
46
+ * The client responds by sending a new voucher credential.
47
+ *
48
+ * Per spec §11.6, the event data contains:
49
+ * - `channelId` — channel identifier
50
+ * - `requiredCumulative` — minimum cumulative amount the next voucher must authorize
51
+ * - `acceptedCumulative` — current highest accepted voucher amount
52
+ * - `deposit` — current on-chain deposit ceiling; when `requiredCumulative > deposit`
53
+ * the client must top up the channel before sending a new voucher
54
+ */
55
+ export interface NeedVoucherEvent {
56
+ channelId: Hex;
57
+ requiredCumulative: string;
58
+ acceptedCumulative: string;
59
+ deposit: string;
60
+ }
61
+ /**
62
+ * Stream receipt returned in Payment-Receipt header.
63
+ */
64
+ export interface StreamReceipt {
65
+ method: 'tempo';
66
+ intent: 'session';
67
+ status: 'success';
68
+ timestamp: string;
69
+ /** Payment reference (channelId). Satisfies Receipt.Receipt contract. */
70
+ reference: string;
71
+ challengeId: string;
72
+ channelId: Hex;
73
+ acceptedCumulative: string;
74
+ spent: string;
75
+ units?: number | undefined;
76
+ txHash?: Hex | undefined;
77
+ }
78
+ //# sourceMappingURL=Types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Types.d.ts","sourceRoot":"","sources":["../../../src/tempo/stream/Types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAA;AAExC;;;GAGG;AACH,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,GAAG,CAAA;IACd,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,OAAO;IAC5C,SAAS,EAAE,GAAG,CAAA;CACf;AAED;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAC/B;IACE,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,aAAa,CAAA;IACnB,SAAS,EAAE,GAAG,CAAA;IACd,WAAW,EAAE,GAAG,CAAA;IAChB,SAAS,EAAE,GAAG,CAAA;IACd,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACtC,gBAAgB,EAAE,MAAM,CAAA;CACzB,GACD;IACE,MAAM,EAAE,OAAO,CAAA;IACf,IAAI,EAAE,aAAa,CAAA;IACnB,SAAS,EAAE,GAAG,CAAA;IACd,WAAW,EAAE,GAAG,CAAA;IAChB,iBAAiB,EAAE,MAAM,CAAA;CAC1B,GACD;IACE,MAAM,EAAE,SAAS,CAAA;IACjB,SAAS,EAAE,GAAG,CAAA;IACd,gBAAgB,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,GAAG,CAAA;CACf,GACD;IACE,MAAM,EAAE,OAAO,CAAA;IACf,SAAS,EAAE,GAAG,CAAA;IACd,gBAAgB,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,GAAG,CAAA;CACf,CAAA;AAEL;;;;;;;;;;GAUG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,GAAG,CAAA;IACd,kBAAkB,EAAE,MAAM,CAAA;IAC1B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,SAAS,CAAA;IACjB,MAAM,EAAE,SAAS,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,yEAAyE;IACzE,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,GAAG,CAAA;IACd,kBAAkB,EAAE,MAAM,CAAA;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,MAAM,CAAC,EAAE,GAAG,GAAG,SAAS,CAAA;CACzB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Types.js","sourceRoot":"","sources":["../../../src/tempo/stream/Types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import { type Address } from 'ox';
2
+ import type { Account, Client, Hex } from 'viem';
3
+ import type { SignedVoucher, Voucher } from './Types.js';
4
+ /**
5
+ * Sign a voucher with an account.
6
+ */
7
+ export declare function signVoucher(client: Client, account: Account, message: Voucher, escrowContract: Address.Address, chainId: number, authorizedSigner?: Address.Address | undefined): Promise<Hex>;
8
+ /**
9
+ * Verify a voucher signature matches the expected signer.
10
+ *
11
+ * Supports both direct signatures (secp256k1/p256/webAuthn) and
12
+ * Tempo access key (keychain) signatures. For keychain signatures,
13
+ * the envelope's `userAddress` is compared to `expectedSigner`.
14
+ */
15
+ export declare function verifyVoucher(escrowContract: Address.Address, chainId: number, voucher: SignedVoucher, expectedSigner: Address.Address): Promise<boolean>;
16
+ /**
17
+ * Parse a voucher from credential payload.
18
+ */
19
+ export declare function parseVoucherFromPayload(channelId: Hex, cumulativeAmount: string, signature: Hex): SignedVoucher;
20
+ //# sourceMappingURL=Voucher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Voucher.d.ts","sourceRoot":"","sources":["../../../src/tempo/stream/Voucher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAa,MAAM,IAAI,CAAA;AAE5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,MAAM,CAAA;AAGhD,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AA8BxD;;GAEG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,OAAO,CAAC,OAAO,EAC/B,OAAO,EAAE,MAAM,EACf,gBAAgB,CAAC,EAAE,OAAO,CAAC,OAAO,GAAG,SAAS,GAC7C,OAAO,CAAC,GAAG,CAAC,CAyBd;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,cAAc,EAAE,OAAO,CAAC,OAAO,EAC/B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,aAAa,EACtB,cAAc,EAAE,OAAO,CAAC,OAAO,GAC9B,OAAO,CAAC,OAAO,CAAC,CAuBlB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,GAAG,EACd,gBAAgB,EAAE,MAAM,EACxB,SAAS,EAAE,GAAG,GACb,aAAa,CAMf"}
@@ -0,0 +1,98 @@
1
+ import { Signature } from 'ox';
2
+ import { SignatureEnvelope } from 'ox/tempo';
3
+ import { isAddressEqual, recoverTypedDataAddress } from 'viem';
4
+ import { signTypedData } from 'viem/actions';
5
+ /** Must match the on-chain TempoStreamChannel DOMAIN_SEPARATOR name. */
6
+ const DOMAIN_NAME = 'Tempo Stream Channel';
7
+ /** Must match the on-chain TempoStreamChannel DOMAIN_SEPARATOR version. */
8
+ const DOMAIN_VERSION = '1';
9
+ /**
10
+ * EIP-712 domain for voucher signing.
11
+ */
12
+ function getVoucherDomain(escrowContract, chainId) {
13
+ return {
14
+ name: DOMAIN_NAME,
15
+ version: DOMAIN_VERSION,
16
+ chainId,
17
+ verifyingContract: escrowContract,
18
+ };
19
+ }
20
+ /**
21
+ * EIP-712 types for voucher signing.
22
+ * Matches @tempo/stream-channels/voucher and on-chain VOUCHER_TYPEHASH.
23
+ */
24
+ const voucherTypes = {
25
+ Voucher: [
26
+ { name: 'channelId', type: 'bytes32' },
27
+ { name: 'cumulativeAmount', type: 'uint128' },
28
+ ],
29
+ };
30
+ /**
31
+ * Sign a voucher with an account.
32
+ */
33
+ export async function signVoucher(client, account, message, escrowContract, chainId, authorizedSigner) {
34
+ const signature = await signTypedData(client, {
35
+ account,
36
+ domain: getVoucherDomain(escrowContract, chainId),
37
+ types: voucherTypes,
38
+ primaryType: 'Voucher',
39
+ message: {
40
+ channelId: message.channelId,
41
+ cumulativeAmount: message.cumulativeAmount,
42
+ },
43
+ });
44
+ // When a separate authorizedSigner is used (e.g. access key), unwrap the
45
+ // keychain envelope — the escrow contract verifies raw ECDSA signatures
46
+ // against authorizedSigner, not keychain-wrapped ones.
47
+ // TODO: when TIP-1020 is implemented, we can remove this.
48
+ if (authorizedSigner) {
49
+ try {
50
+ const envelope = SignatureEnvelope.from(signature);
51
+ if (envelope.type === 'keychain' && envelope.inner.type === 'secp256k1')
52
+ return Signature.toHex(envelope.inner.signature);
53
+ }
54
+ catch { }
55
+ }
56
+ return signature;
57
+ }
58
+ /**
59
+ * Verify a voucher signature matches the expected signer.
60
+ *
61
+ * Supports both direct signatures (secp256k1/p256/webAuthn) and
62
+ * Tempo access key (keychain) signatures. For keychain signatures,
63
+ * the envelope's `userAddress` is compared to `expectedSigner`.
64
+ */
65
+ export async function verifyVoucher(escrowContract, chainId, voucher, expectedSigner) {
66
+ try {
67
+ const domain = getVoucherDomain(escrowContract, chainId);
68
+ const message = {
69
+ channelId: voucher.channelId,
70
+ cumulativeAmount: voucher.cumulativeAmount,
71
+ };
72
+ const envelope = SignatureEnvelope.from(voucher.signature);
73
+ if (envelope.type === 'keychain')
74
+ return isAddressEqual(envelope.userAddress, expectedSigner);
75
+ const signer = await recoverTypedDataAddress({
76
+ domain,
77
+ types: voucherTypes,
78
+ primaryType: 'Voucher',
79
+ message,
80
+ signature: voucher.signature,
81
+ });
82
+ return isAddressEqual(signer, expectedSigner);
83
+ }
84
+ catch {
85
+ return false;
86
+ }
87
+ }
88
+ /**
89
+ * Parse a voucher from credential payload.
90
+ */
91
+ export function parseVoucherFromPayload(channelId, cumulativeAmount, signature) {
92
+ return {
93
+ channelId,
94
+ cumulativeAmount: BigInt(cumulativeAmount),
95
+ signature,
96
+ };
97
+ }
98
+ //# sourceMappingURL=Voucher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Voucher.js","sourceRoot":"","sources":["../../../src/tempo/stream/Voucher.ts"],"names":[],"mappings":"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"}