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,291 @@
1
+ import { Base64, Bytes, Hash } from 'ox';
2
+ import * as PaymentRequest from './PaymentRequest.js';
3
+ import * as z from './zod.js';
4
+ /**
5
+ * Schema for a payment challenge.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * import { Challenge } from 'mppx'
10
+ *
11
+ * const challenge = Challenge.Schema.parse(data)
12
+ * ```
13
+ */
14
+ export const Schema = z.object({
15
+ /** Optional human-readable description of the payment. */
16
+ description: z.optional(z.string()),
17
+ /** Optional digest of the request body (format: "sha-256=base64hash"). */
18
+ digest: z.optional(z.string().check(z.regex(/^sha-256=/, 'Invalid digest format'))),
19
+ /** Optional expiration timestamp (ISO 8601). */
20
+ expires: z.optional(z.datetime()),
21
+ /** Unique challenge identifier (HMAC-bound). */
22
+ id: z.string(),
23
+ /** Intent type (e.g., "charge", "authorize"). */
24
+ intent: z.string(),
25
+ /** Payment method (e.g., "tempo", "stripe"). */
26
+ method: z.string(),
27
+ /** Server realm (e.g., hostname). */
28
+ realm: z.string(),
29
+ /** Method-specific request data. */
30
+ request: z.record(z.string(), z.unknown()),
31
+ });
32
+ /**
33
+ * Creates a challenge from the given parameters.
34
+ *
35
+ * If `secretKey` option is provided, the challenge ID is computed as HMAC-SHA256
36
+ * over the challenge parameters (realm|method|intent|request|expires|digest),
37
+ * cryptographically binding the ID to its contents.
38
+ *
39
+ * @param parameters - Challenge parameters.
40
+ * @param options - Optional settings including secretKey for HMAC-bound ID.
41
+ * @returns A challenge.
42
+ *
43
+ * @example
44
+ * ```ts
45
+ * import { Challenge } from 'mppx'
46
+ *
47
+ * // With HMAC-bound ID (recommended for servers)
48
+ * const challenge = Challenge.from(
49
+ * {
50
+ * realm: 'api.example.com',
51
+ * method: 'tempo',
52
+ * intent: 'charge',
53
+ * request: { amount: '1000000', currency: '0x...', recipient: '0x...' },
54
+ * },
55
+ * { secretKey: 'my-secret' },
56
+ * )
57
+ *
58
+ * // With explicit ID
59
+ * const challenge = Challenge.from({
60
+ * id: 'abc123',
61
+ * realm: 'api.example.com',
62
+ * method: 'tempo',
63
+ * intent: 'charge',
64
+ * request: { amount: '1000000', currency: '0x...', recipient: '0x...' },
65
+ * })
66
+ * ```
67
+ */
68
+ export function from(parameters, options) {
69
+ void options;
70
+ const { description, digest, method: methodName, intent, realm, request, secretKey } = parameters;
71
+ const expires = (parameters.expires ?? request.expires);
72
+ const id = secretKey
73
+ ? computeId({ ...parameters, expires }, { secretKey })
74
+ : parameters.id;
75
+ return Schema.parse({
76
+ id,
77
+ realm,
78
+ method: methodName,
79
+ intent,
80
+ request,
81
+ ...(description && { description }),
82
+ ...(digest && { digest }),
83
+ ...(expires && { expires }),
84
+ });
85
+ }
86
+ /**
87
+ * Creates a validated challenge from a method intent.
88
+ *
89
+ * If `secretKey` option is provided, the challenge ID is computed as HMAC-SHA256
90
+ * over the challenge parameters, cryptographically binding the ID to its contents.
91
+ *
92
+ * @param intent - The method intent to validate against.
93
+ * @param parameters - Challenge parameters (realm, request, optional expires/digest, and id if no secretKey).
94
+ * @param options - Optional settings including secretKey for HMAC-bound ID.
95
+ * @returns A validated challenge.
96
+ *
97
+ * @example
98
+ * ```ts
99
+ * import { Challenge } from 'mppx'
100
+ * import { Intents } from 'mppx/tempo'
101
+ *
102
+ * // With HMAC-bound ID (recommended for servers)
103
+ * const challenge = Challenge.fromIntent(
104
+ * Intents.charge,
105
+ * {
106
+ * realm: 'api.example.com',
107
+ * request: {
108
+ * amount: '1000000',
109
+ * currency: '0x20c0000000000000000000000000000000000001',
110
+ * recipient: '0x742d35Cc6634C0532925a3b844Bc9e7595f8fE00',
111
+ * expires: '2025-01-06T12:00:00Z',
112
+ * },
113
+ * },
114
+ * { secretKey: 'my-secret' },
115
+ * )
116
+ * ```
117
+ */
118
+ export function fromIntent(intent, parameters) {
119
+ const { method, name } = intent;
120
+ const { description, digest, expires, id, realm, secretKey } = parameters;
121
+ const request = PaymentRequest.fromIntent(intent, parameters.request);
122
+ return from({
123
+ ...(id ? { id } : { secretKey }),
124
+ realm,
125
+ method,
126
+ intent: name,
127
+ request,
128
+ description,
129
+ digest,
130
+ expires,
131
+ });
132
+ }
133
+ /**
134
+ * Serializes a challenge to the WWW-Authenticate header format.
135
+ *
136
+ * @param challenge - The challenge to serialize.
137
+ * @returns A string suitable for the WWW-Authenticate header value.
138
+ *
139
+ * @example
140
+ * ```ts
141
+ * import { Challenge } from 'mppx'
142
+ *
143
+ * const header = Challenge.serialize(challenge)
144
+ * // => 'Payment id="abc123", realm="api.example.com", method="tempo", intent="charge", request="eyJhbW91bnQiOi..."'
145
+ * ```
146
+ */
147
+ export function serialize(challenge) {
148
+ const parts = [
149
+ `id="${challenge.id}"`,
150
+ `realm="${challenge.realm}"`,
151
+ `method="${challenge.method}"`,
152
+ `intent="${challenge.intent}"`,
153
+ `request="${PaymentRequest.serialize(challenge.request)}"`,
154
+ ];
155
+ if (challenge.description !== undefined)
156
+ parts.push(`description="${challenge.description}"`);
157
+ if (challenge.digest !== undefined)
158
+ parts.push(`digest="${challenge.digest}"`);
159
+ if (challenge.expires !== undefined)
160
+ parts.push(`expires="${challenge.expires}"`);
161
+ return `Payment ${parts.join(', ')}`;
162
+ }
163
+ /**
164
+ * Deserializes a WWW-Authenticate header value to a challenge.
165
+ *
166
+ * @example
167
+ * ```ts
168
+ * import { Challenge } from 'mppx'
169
+ *
170
+ * const challenge = Challenge.deserialize(header)
171
+ *
172
+ * // With methods for type narrowing
173
+ * const challenge = Challenge.deserialize(header, { methods })
174
+ * ```
175
+ *
176
+ * @param header - The WWW-Authenticate header value.
177
+ * @param options - Optional settings to narrow the challenge type.
178
+ * @returns The deserialized challenge.
179
+ */
180
+ export function deserialize(value, options) {
181
+ const prefixMatch = value.match(/^Payment\s+(.+)$/i);
182
+ if (!prefixMatch?.[1])
183
+ throw new Error('Missing Payment scheme.');
184
+ const params = prefixMatch[1];
185
+ const result = {};
186
+ for (const match of params.matchAll(/(\w+)="([^"]+)"/g)) {
187
+ const key = match[1];
188
+ const value = match[2];
189
+ if (key && value)
190
+ result[key] = value;
191
+ }
192
+ const { request, ...rest } = result;
193
+ if (!request)
194
+ throw new Error('Missing request parameter.');
195
+ return from({
196
+ ...rest,
197
+ request: PaymentRequest.deserialize(request),
198
+ }, options);
199
+ }
200
+ /**
201
+ * Extracts the challenge from a Headers object.
202
+ *
203
+ * @param headers - The HTTP headers.
204
+ * @param options - Optional settings to narrow the challenge type.
205
+ * @returns The deserialized challenge.
206
+ *
207
+ * @example
208
+ * ```ts
209
+ * import { Challenge } from 'mppx'
210
+ *
211
+ * const challenge = Challenge.fromHeaders(response.headers)
212
+ *
213
+ * // With methods for type narrowing
214
+ * const challenge = Challenge.fromHeaders(response.headers, { methods })
215
+ * ```
216
+ */
217
+ export function fromHeaders(headers, options) {
218
+ const header = headers.get('WWW-Authenticate');
219
+ if (!header)
220
+ throw new Error('Missing WWW-Authenticate header.');
221
+ return deserialize(header, options);
222
+ }
223
+ /**
224
+ * Extracts the challenge from a Response's WWW-Authenticate header.
225
+ *
226
+ * @param response - The HTTP response (must be 402 status).
227
+ * @param options - Optional settings to narrow the challenge type.
228
+ * @returns The deserialized challenge.
229
+ *
230
+ * @example
231
+ * ```ts
232
+ * import { Challenge } from 'mppx'
233
+ *
234
+ * const response = await fetch('/resource')
235
+ * if (response.status === 402)
236
+ * const challenge = Challenge.fromResponse(response)
237
+ *
238
+ * // With methods for type narrowing
239
+ * const challenge = Challenge.fromResponse(response, { methods })
240
+ * ```
241
+ */
242
+ export function fromResponse(response, options) {
243
+ if (response.status !== 402)
244
+ throw new Error('Response status is not 402.');
245
+ return fromHeaders(response.headers, options);
246
+ }
247
+ /**
248
+ * Verifies that a challenge ID matches the expected HMAC for the given parameters.
249
+ *
250
+ * @param challenge - The challenge to verify.
251
+ * @param options - Options including the secret key.
252
+ * @returns True if the challenge ID is valid, false otherwise.
253
+ *
254
+ * @example
255
+ * ```ts
256
+ * import { Challenge } from 'mppx'
257
+ *
258
+ * const isValid = Challenge.verify(challenge, { secretKey: 'my-secret' })
259
+ * ```
260
+ */
261
+ export function verify(challenge, options) {
262
+ const expectedId = computeId(challenge, options);
263
+ return constantTimeEqual(challenge.id, expectedId);
264
+ }
265
+ /** @internal Computes HMAC-SHA256 challenge ID from parameters. */
266
+ function computeId(challenge, options) {
267
+ const input = [
268
+ challenge.realm,
269
+ challenge.method,
270
+ challenge.intent,
271
+ PaymentRequest.serialize(challenge.request),
272
+ challenge.expires ?? '',
273
+ challenge.digest ?? '',
274
+ ]
275
+ .filter(Boolean)
276
+ .join('|');
277
+ const key = Bytes.fromString(options.secretKey);
278
+ const data = Bytes.fromString(input);
279
+ const mac = Hash.hmac256(key, data, { as: 'Bytes' });
280
+ return Base64.fromBytes(mac, { url: true, pad: false });
281
+ }
282
+ /** @internal Constant-time string comparison to prevent timing attacks. */
283
+ function constantTimeEqual(a, b) {
284
+ if (a.length !== b.length)
285
+ return false;
286
+ let result = 0;
287
+ for (let i = 0; i < a.length; i++)
288
+ result |= a.charCodeAt(i) ^ b.charCodeAt(i);
289
+ return result === 0;
290
+ }
291
+ //# sourceMappingURL=Challenge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Challenge.js","sourceRoot":"","sources":["../src/Challenge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ import * as Challenge from './Challenge.js';
2
+ /**
3
+ * A payment credential containing the challenge and payment proof.
4
+ */
5
+ export type Credential<payload = unknown, challenge extends Challenge.Challenge = Challenge.Challenge> = {
6
+ /** The challenge from the 402 response. */
7
+ challenge: challenge;
8
+ /** Method-specific payment proof. */
9
+ payload: payload;
10
+ /** Optional payer identifier as a DID (e.g., "did:pkh:eip155:1:0x..."). */
11
+ source?: string;
12
+ };
13
+ /**
14
+ * Deserializes an Authorization header value to a credential.
15
+ *
16
+ * @param header - The Authorization header value.
17
+ * @returns The deserialized credential.
18
+ *
19
+ * @example
20
+ * ```ts
21
+ * import { Credential } from 'mppx'
22
+ *
23
+ * const credential = Credential.deserialize(header)
24
+ * ```
25
+ */
26
+ export declare function deserialize<payload = unknown>(value: string): Credential<payload>;
27
+ /**
28
+ * Creates a credential from the given parameters.
29
+ *
30
+ * @param parameters - Credential parameters with a Challenge object.
31
+ * @returns A credential.
32
+ *
33
+ * @example
34
+ * ```ts
35
+ * import { Credential, Challenge } from 'mppx'
36
+ *
37
+ * const credential = Credential.from({
38
+ * challenge,
39
+ * payload: { signature: '0x...' },
40
+ * })
41
+ * ```
42
+ */
43
+ export declare function from<const parameters extends from.Parameters>(parameters: parameters): Credential<parameters['payload'], parameters['challenge']>;
44
+ export declare namespace from {
45
+ type Parameters = {
46
+ /** The challenge from the 402 response. */
47
+ challenge: Challenge.Challenge;
48
+ /** Method-specific payment proof. */
49
+ payload: unknown;
50
+ /** Optional payer identifier as a DID (e.g., "did:pkh:eip155:1:0x..."). */
51
+ source?: string;
52
+ };
53
+ }
54
+ /**
55
+ * Extracts the credential from a Request's Authorization header.
56
+ *
57
+ * @param request - The HTTP request.
58
+ * @returns The deserialized credential.
59
+ *
60
+ * @example
61
+ * ```ts
62
+ * import { Credential } from 'mppx'
63
+ *
64
+ * const credential = Credential.fromRequest(request)
65
+ * ```
66
+ */
67
+ export declare function fromRequest<payload = unknown>(request: Request): Credential<payload>;
68
+ /**
69
+ * Serializes a credential to the Authorization header format.
70
+ *
71
+ * @param credential - The credential to serialize.
72
+ * @returns A string suitable for the Authorization header value.
73
+ *
74
+ * @example
75
+ * ```ts
76
+ * import { Credential } from 'mppx'
77
+ *
78
+ * const header = Credential.serialize(credential)
79
+ * // => 'Payment eyJjaGFsbGVuZ2UiOnsi...'
80
+ * ```
81
+ */
82
+ export declare function serialize(credential: Credential): string;
83
+ /**
84
+ * Extracts the `Payment` scheme from an Authorization header value
85
+ * that may contain multiple schemes (comma-separated per RFC 9110).
86
+ *
87
+ * @param header - The raw Authorization header value.
88
+ * @returns The `Payment ...` scheme string, or `null` if not found.
89
+ */
90
+ export declare function extractPaymentScheme(header: string): string | null;
91
+ //# sourceMappingURL=Credential.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Credential.d.ts","sourceRoot":"","sources":["../src/Credential.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAG3C;;GAEG;AACH,MAAM,MAAM,UAAU,CACpB,OAAO,GAAG,OAAO,EACjB,SAAS,SAAS,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,SAAS,IACzD;IACF,2CAA2C;IAC3C,SAAS,EAAE,SAAS,CAAA;IACpB,qCAAqC;IACrC,OAAO,EAAE,OAAO,CAAA;IAChB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAsBjF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,IAAI,CAAC,KAAK,CAAC,UAAU,SAAS,IAAI,CAAC,UAAU,EAC3D,UAAU,EAAE,UAAU,GACrB,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC,CAO5D;AAED,MAAM,CAAC,OAAO,WAAW,IAAI,CAAC;IAC5B,KAAK,UAAU,GAAG;QAChB,2CAA2C;QAC3C,SAAS,EAAE,SAAS,CAAC,SAAS,CAAA;QAC9B,qCAAqC;QACrC,OAAO,EAAE,OAAO,CAAA;QAChB,2EAA2E;QAC3E,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,CAAA;CACF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAMpF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAYxD;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGlE"}
@@ -0,0 +1,122 @@
1
+ import { Base64 } from 'ox';
2
+ import * as Challenge from './Challenge.js';
3
+ import * as PaymentRequest from './PaymentRequest.js';
4
+ /**
5
+ * Deserializes an Authorization header value to a credential.
6
+ *
7
+ * @param header - The Authorization header value.
8
+ * @returns The deserialized credential.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * import { Credential } from 'mppx'
13
+ *
14
+ * const credential = Credential.deserialize(header)
15
+ * ```
16
+ */
17
+ export function deserialize(value) {
18
+ const prefixMatch = value.match(/^Payment\s+(.+)$/i);
19
+ if (!prefixMatch?.[1])
20
+ throw new Error('Missing Payment scheme.');
21
+ try {
22
+ const json = Base64.toString(prefixMatch[1]);
23
+ const parsed = JSON.parse(json);
24
+ const challenge = Challenge.Schema.parse({
25
+ ...parsed.challenge,
26
+ request: PaymentRequest.deserialize(parsed.challenge.request),
27
+ });
28
+ return {
29
+ challenge,
30
+ payload: parsed.payload,
31
+ ...(parsed.source && { source: parsed.source }),
32
+ };
33
+ }
34
+ catch {
35
+ throw new Error('Invalid base64url or JSON.');
36
+ }
37
+ }
38
+ /**
39
+ * Creates a credential from the given parameters.
40
+ *
41
+ * @param parameters - Credential parameters with a Challenge object.
42
+ * @returns A credential.
43
+ *
44
+ * @example
45
+ * ```ts
46
+ * import { Credential, Challenge } from 'mppx'
47
+ *
48
+ * const credential = Credential.from({
49
+ * challenge,
50
+ * payload: { signature: '0x...' },
51
+ * })
52
+ * ```
53
+ */
54
+ export function from(parameters) {
55
+ const { challenge, payload, source } = parameters;
56
+ return {
57
+ challenge,
58
+ payload,
59
+ ...(source && { source }),
60
+ };
61
+ }
62
+ /**
63
+ * Extracts the credential from a Request's Authorization header.
64
+ *
65
+ * @param request - The HTTP request.
66
+ * @returns The deserialized credential.
67
+ *
68
+ * @example
69
+ * ```ts
70
+ * import { Credential } from 'mppx'
71
+ *
72
+ * const credential = Credential.fromRequest(request)
73
+ * ```
74
+ */
75
+ export function fromRequest(request) {
76
+ const header = request.headers.get('Authorization');
77
+ if (!header)
78
+ throw new Error('Missing Authorization header.');
79
+ const payment = extractPaymentScheme(header);
80
+ if (!payment)
81
+ throw new Error('Missing Payment scheme.');
82
+ return deserialize(payment);
83
+ }
84
+ /**
85
+ * Serializes a credential to the Authorization header format.
86
+ *
87
+ * @param credential - The credential to serialize.
88
+ * @returns A string suitable for the Authorization header value.
89
+ *
90
+ * @example
91
+ * ```ts
92
+ * import { Credential } from 'mppx'
93
+ *
94
+ * const header = Credential.serialize(credential)
95
+ * // => 'Payment eyJjaGFsbGVuZ2UiOnsi...'
96
+ * ```
97
+ */
98
+ export function serialize(credential) {
99
+ const wire = {
100
+ challenge: {
101
+ ...credential.challenge,
102
+ request: PaymentRequest.serialize(credential.challenge.request),
103
+ },
104
+ payload: credential.payload,
105
+ ...(credential.source && { source: credential.source }),
106
+ };
107
+ const json = JSON.stringify(wire);
108
+ const encoded = Base64.fromString(json, { pad: false, url: true });
109
+ return `Payment ${encoded}`;
110
+ }
111
+ /**
112
+ * Extracts the `Payment` scheme from an Authorization header value
113
+ * that may contain multiple schemes (comma-separated per RFC 9110).
114
+ *
115
+ * @param header - The raw Authorization header value.
116
+ * @returns The `Payment ...` scheme string, or `null` if not found.
117
+ */
118
+ export function extractPaymentScheme(header) {
119
+ const schemes = header.split(',').map((s) => s.trim());
120
+ return schemes.find((s) => /^Payment\s+/i.test(s)) ?? null;
121
+ }
122
+ //# sourceMappingURL=Credential.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Credential.js","sourceRoot":"","sources":["../src/Credential.ts"],"names":[],"mappings":"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"}