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.
- package/LICENSE +21 -0
- package/README.md +195 -0
- package/dist/BodyDigest.d.ts +42 -0
- package/dist/BodyDigest.d.ts.map +1 -0
- package/dist/BodyDigest.js +40 -0
- package/dist/BodyDigest.js.map +1 -0
- package/dist/Challenge.d.ts +271 -0
- package/dist/Challenge.d.ts.map +1 -0
- package/dist/Challenge.js +291 -0
- package/dist/Challenge.js.map +1 -0
- package/dist/Credential.d.ts +91 -0
- package/dist/Credential.d.ts.map +1 -0
- package/dist/Credential.js +122 -0
- package/dist/Credential.js.map +1 -0
- package/dist/Errors.d.ts +243 -0
- package/dist/Errors.d.ts.map +1 -0
- package/dist/Errors.js +201 -0
- package/dist/Errors.js.map +1 -0
- package/dist/Expires.d.ts +15 -0
- package/dist/Expires.d.ts.map +1 -0
- package/dist/Expires.js +29 -0
- package/dist/Expires.js.map +1 -0
- package/dist/Intent.d.ts +101 -0
- package/dist/Intent.d.ts.map +1 -0
- package/dist/Intent.js +83 -0
- package/dist/Intent.js.map +1 -0
- package/dist/Mcp.d.ts +74 -0
- package/dist/Mcp.d.ts.map +1 -0
- package/dist/Mcp.js +9 -0
- package/dist/Mcp.js.map +1 -0
- package/dist/MethodIntent.d.ts +225 -0
- package/dist/MethodIntent.d.ts.map +1 -0
- package/dist/MethodIntent.js +156 -0
- package/dist/MethodIntent.js.map +1 -0
- package/dist/PaymentRequest.d.ts +88 -0
- package/dist/PaymentRequest.d.ts.map +1 -0
- package/dist/PaymentRequest.js +81 -0
- package/dist/PaymentRequest.js.map +1 -0
- package/dist/Receipt.d.ts +110 -0
- package/dist/Receipt.d.ts.map +1 -0
- package/dist/Receipt.js +105 -0
- package/dist/Receipt.js.map +1 -0
- package/dist/Store.d.ts +28 -0
- package/dist/Store.d.ts.map +1 -0
- package/dist/Store.js +61 -0
- package/dist/Store.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1219 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/Methods.d.ts +4 -0
- package/dist/client/Methods.d.ts.map +1 -0
- package/dist/client/Methods.js +4 -0
- package/dist/client/Methods.js.map +1 -0
- package/dist/client/Mppx.d.ts +84 -0
- package/dist/client/Mppx.d.ts.map +1 -0
- package/dist/client/Mppx.js +64 -0
- package/dist/client/Mppx.js.map +1 -0
- package/dist/client/Transport.d.ts +56 -0
- package/dist/client/Transport.d.ts.map +1 -0
- package/dist/client/Transport.js +81 -0
- package/dist/client/Transport.js.map +1 -0
- package/dist/client/index.d.ts +5 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +5 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/internal/Fetch.d.ts +85 -0
- package/dist/client/internal/Fetch.d.ts.map +1 -0
- package/dist/client/internal/Fetch.js +95 -0
- package/dist/client/internal/Fetch.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/types.d.ts +302 -0
- package/dist/internal/types.d.ts.map +1 -0
- package/dist/internal/types.js +2 -0
- package/dist/internal/types.js.map +1 -0
- package/dist/mcp-sdk/client/McpClient.d.ts +78 -0
- package/dist/mcp-sdk/client/McpClient.d.ts.map +1 -0
- package/dist/mcp-sdk/client/McpClient.js +98 -0
- package/dist/mcp-sdk/client/McpClient.js.map +1 -0
- package/dist/mcp-sdk/client/index.d.ts +3 -0
- package/dist/mcp-sdk/client/index.d.ts.map +1 -0
- package/dist/mcp-sdk/client/index.js +3 -0
- package/dist/mcp-sdk/client/index.js.map +1 -0
- package/dist/mcp-sdk/server/Transport.d.ts +43 -0
- package/dist/mcp-sdk/server/Transport.d.ts.map +1 -0
- package/dist/mcp-sdk/server/Transport.js +71 -0
- package/dist/mcp-sdk/server/Transport.js.map +1 -0
- package/dist/mcp-sdk/server/index.d.ts +2 -0
- package/dist/mcp-sdk/server/index.d.ts.map +1 -0
- package/dist/mcp-sdk/server/index.js +2 -0
- package/dist/mcp-sdk/server/index.js.map +1 -0
- package/dist/middlewares/elysia.d.ts +51 -0
- package/dist/middlewares/elysia.d.ts.map +1 -0
- package/dist/middlewares/elysia.js +59 -0
- package/dist/middlewares/elysia.js.map +1 -0
- package/dist/middlewares/express.d.ts +46 -0
- package/dist/middlewares/express.d.ts.map +1 -0
- package/dist/middlewares/express.js +69 -0
- package/dist/middlewares/express.js.map +1 -0
- package/dist/middlewares/hono.d.ts +46 -0
- package/dist/middlewares/hono.d.ts.map +1 -0
- package/dist/middlewares/hono.js +57 -0
- package/dist/middlewares/hono.js.map +1 -0
- package/dist/middlewares/internal/mppx.d.ts +16 -0
- package/dist/middlewares/internal/mppx.d.ts.map +1 -0
- package/dist/middlewares/internal/mppx.js +16 -0
- package/dist/middlewares/internal/mppx.js.map +1 -0
- package/dist/middlewares/nextjs.d.ts +45 -0
- package/dist/middlewares/nextjs.d.ts.map +1 -0
- package/dist/middlewares/nextjs.js +57 -0
- package/dist/middlewares/nextjs.js.map +1 -0
- package/dist/proxy/Proxy.d.ts +47 -0
- package/dist/proxy/Proxy.d.ts.map +1 -0
- package/dist/proxy/Proxy.js +126 -0
- package/dist/proxy/Proxy.js.map +1 -0
- package/dist/proxy/Service.d.ts +100 -0
- package/dist/proxy/Service.d.ts.map +1 -0
- package/dist/proxy/Service.js +147 -0
- package/dist/proxy/Service.js.map +1 -0
- package/dist/proxy/index.d.ts +7 -0
- package/dist/proxy/index.d.ts.map +1 -0
- package/dist/proxy/index.js +7 -0
- package/dist/proxy/index.js.map +1 -0
- package/dist/proxy/internal/Headers.d.ts +3 -0
- package/dist/proxy/internal/Headers.d.ts.map +1 -0
- package/dist/proxy/internal/Headers.js +41 -0
- package/dist/proxy/internal/Headers.js.map +1 -0
- package/dist/proxy/internal/Route.d.ts +14 -0
- package/dist/proxy/internal/Route.d.ts.map +1 -0
- package/dist/proxy/internal/Route.js +47 -0
- package/dist/proxy/internal/Route.js.map +1 -0
- package/dist/proxy/services/anthropic.d.ts +29 -0
- package/dist/proxy/services/anthropic.d.ts.map +1 -0
- package/dist/proxy/services/anthropic.js +30 -0
- package/dist/proxy/services/anthropic.js.map +1 -0
- package/dist/proxy/services/openai.d.ts +29 -0
- package/dist/proxy/services/openai.d.ts.map +1 -0
- package/dist/proxy/services/openai.js +30 -0
- package/dist/proxy/services/openai.js.map +1 -0
- package/dist/proxy/services/stripe.d.ts +29 -0
- package/dist/proxy/services/stripe.d.ts.map +1 -0
- package/dist/proxy/services/stripe.js +30 -0
- package/dist/proxy/services/stripe.js.map +1 -0
- package/dist/server/Methods.d.ts +3 -0
- package/dist/server/Methods.d.ts.map +1 -0
- package/dist/server/Methods.js +3 -0
- package/dist/server/Methods.js.map +1 -0
- package/dist/server/Mppx.d.ts +116 -0
- package/dist/server/Mppx.d.ts.map +1 -0
- package/dist/server/Mppx.js +207 -0
- package/dist/server/Mppx.js.map +1 -0
- package/dist/server/NodeListener.d.ts +3 -0
- package/dist/server/NodeListener.d.ts.map +1 -0
- package/dist/server/NodeListener.js +3 -0
- package/dist/server/NodeListener.js.map +1 -0
- package/dist/server/Request.d.ts +24 -0
- package/dist/server/Request.d.ts.map +1 -0
- package/dist/server/Request.js +26 -0
- package/dist/server/Request.js.map +1 -0
- package/dist/server/Response.d.ts +10 -0
- package/dist/server/Response.d.ts.map +1 -0
- package/dist/server/Response.js +15 -0
- package/dist/server/Response.js.map +1 -0
- package/dist/server/Transport.d.ts +93 -0
- package/dist/server/Transport.d.ts.map +1 -0
- package/dist/server/Transport.js +132 -0
- package/dist/server/Transport.js.map +1 -0
- package/dist/server/index.d.ts +9 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +9 -0
- package/dist/server/index.js.map +1 -0
- package/dist/stripe/Intents.d.ts +54 -0
- package/dist/stripe/Intents.d.ts.map +1 -0
- package/dist/stripe/Intents.js +27 -0
- package/dist/stripe/Intents.js.map +1 -0
- package/dist/stripe/client/Charge.d.ts +114 -0
- package/dist/stripe/client/Charge.d.ts.map +1 -0
- package/dist/stripe/client/Charge.js +77 -0
- package/dist/stripe/client/Charge.js.map +1 -0
- package/dist/stripe/client/MethodIntents.d.ts +80 -0
- package/dist/stripe/client/MethodIntents.d.ts.map +1 -0
- package/dist/stripe/client/MethodIntents.js +34 -0
- package/dist/stripe/client/MethodIntents.js.map +1 -0
- package/dist/stripe/client/index.d.ts +3 -0
- package/dist/stripe/client/index.d.ts.map +1 -0
- package/dist/stripe/client/index.js +3 -0
- package/dist/stripe/client/index.js.map +1 -0
- package/dist/stripe/index.d.ts +2 -0
- package/dist/stripe/index.d.ts.map +1 -0
- package/dist/stripe/index.js +2 -0
- package/dist/stripe/index.js.map +1 -0
- package/dist/stripe/server/Charge.d.ts +74 -0
- package/dist/stripe/server/Charge.d.ts.map +1 -0
- package/dist/stripe/server/Charge.js +79 -0
- package/dist/stripe/server/Charge.js.map +1 -0
- package/dist/stripe/server/MethodIntents.d.ts +65 -0
- package/dist/stripe/server/MethodIntents.d.ts.map +1 -0
- package/dist/stripe/server/MethodIntents.js +21 -0
- package/dist/stripe/server/MethodIntents.js.map +1 -0
- package/dist/stripe/server/index.d.ts +3 -0
- package/dist/stripe/server/index.d.ts.map +1 -0
- package/dist/stripe/server/index.js +3 -0
- package/dist/stripe/server/index.js.map +1 -0
- package/dist/tempo/Attribution.d.ts +101 -0
- package/dist/tempo/Attribution.d.ts.map +1 -0
- package/dist/tempo/Attribution.js +124 -0
- package/dist/tempo/Attribution.js.map +1 -0
- package/dist/tempo/Intents.d.ts +132 -0
- package/dist/tempo/Intents.d.ts.map +1 -0
- package/dist/tempo/Intents.js +81 -0
- package/dist/tempo/Intents.js.map +1 -0
- package/dist/tempo/client/ChannelOps.d.ts +54 -0
- package/dist/tempo/client/ChannelOps.d.ts.map +1 -0
- package/dist/tempo/client/ChannelOps.js +138 -0
- package/dist/tempo/client/ChannelOps.js.map +1 -0
- package/dist/tempo/client/Charge.d.ts +76 -0
- package/dist/tempo/client/Charge.d.ts.map +1 -0
- package/dist/tempo/client/Charge.js +69 -0
- package/dist/tempo/client/Charge.js.map +1 -0
- package/dist/tempo/client/MethodIntents.d.ts +157 -0
- package/dist/tempo/client/MethodIntents.d.ts.map +1 -0
- package/dist/tempo/client/MethodIntents.js +25 -0
- package/dist/tempo/client/MethodIntents.js.map +1 -0
- package/dist/tempo/client/Session.d.ts +159 -0
- package/dist/tempo/client/Session.d.ts.map +1 -0
- package/dist/tempo/client/Session.js +263 -0
- package/dist/tempo/client/Session.js.map +1 -0
- package/dist/tempo/client/SessionManager.d.ts +62 -0
- package/dist/tempo/client/SessionManager.d.ts.map +1 -0
- package/dist/tempo/client/SessionManager.js +196 -0
- package/dist/tempo/client/SessionManager.js.map +1 -0
- package/dist/tempo/client/index.d.ts +6 -0
- package/dist/tempo/client/index.d.ts.map +1 -0
- package/dist/tempo/client/index.js +5 -0
- package/dist/tempo/client/index.js.map +1 -0
- package/dist/tempo/index.d.ts +3 -0
- package/dist/tempo/index.d.ts.map +1 -0
- package/dist/tempo/index.js +3 -0
- package/dist/tempo/index.js.map +1 -0
- package/dist/tempo/internal/account.d.ts +32 -0
- package/dist/tempo/internal/account.d.ts.map +1 -0
- package/dist/tempo/internal/account.js +33 -0
- package/dist/tempo/internal/account.js.map +1 -0
- package/dist/tempo/internal/defaults.d.ts +18 -0
- package/dist/tempo/internal/defaults.d.ts.map +1 -0
- package/dist/tempo/internal/defaults.js +18 -0
- package/dist/tempo/internal/defaults.js.map +1 -0
- package/dist/tempo/internal/types.d.ts +11 -0
- package/dist/tempo/internal/types.d.ts.map +1 -0
- package/dist/tempo/internal/types.js +2 -0
- package/dist/tempo/internal/types.js.map +1 -0
- package/dist/tempo/server/Charge.d.ts +77 -0
- package/dist/tempo/server/Charge.d.ts.map +1 -0
- package/dist/tempo/server/Charge.js +228 -0
- package/dist/tempo/server/Charge.js.map +1 -0
- package/dist/tempo/server/MethodIntents.d.ts +140 -0
- package/dist/tempo/server/MethodIntents.d.ts.map +1 -0
- package/dist/tempo/server/MethodIntents.js +26 -0
- package/dist/tempo/server/MethodIntents.js.map +1 -0
- package/dist/tempo/server/Session.d.ts +148 -0
- package/dist/tempo/server/Session.d.ts.map +1 -0
- package/dist/tempo/server/Session.js +529 -0
- package/dist/tempo/server/Session.js.map +1 -0
- package/dist/tempo/server/internal/transport.d.ts +47 -0
- package/dist/tempo/server/internal/transport.d.ts.map +1 -0
- package/dist/tempo/server/internal/transport.js +118 -0
- package/dist/tempo/server/internal/transport.js.map +1 -0
- package/dist/tempo/stream/Chain.d.ts +52 -0
- package/dist/tempo/stream/Chain.d.ts.map +1 -0
- package/dist/tempo/stream/Chain.js +215 -0
- package/dist/tempo/stream/Chain.js.map +1 -0
- package/dist/tempo/stream/Channel.d.ts +26 -0
- package/dist/tempo/stream/Channel.d.ts.map +1 -0
- package/dist/tempo/stream/Channel.js +27 -0
- package/dist/tempo/stream/Channel.js.map +1 -0
- package/dist/tempo/stream/ChannelStore.d.ts +103 -0
- package/dist/tempo/stream/ChannelStore.d.ts.map +1 -0
- package/dist/tempo/stream/ChannelStore.js +100 -0
- package/dist/tempo/stream/ChannelStore.js.map +1 -0
- package/dist/tempo/stream/Receipt.d.ts +22 -0
- package/dist/tempo/stream/Receipt.d.ts.map +1 -0
- package/dist/tempo/stream/Receipt.js +34 -0
- package/dist/tempo/stream/Receipt.js.map +1 -0
- package/dist/tempo/stream/Sse.d.ts +134 -0
- package/dist/tempo/stream/Sse.d.ts.map +1 -0
- package/dist/tempo/stream/Sse.js +288 -0
- package/dist/tempo/stream/Sse.js.map +1 -0
- package/dist/tempo/stream/Types.d.ts +78 -0
- package/dist/tempo/stream/Types.d.ts.map +1 -0
- package/dist/tempo/stream/Types.js +2 -0
- package/dist/tempo/stream/Types.js.map +1 -0
- package/dist/tempo/stream/Voucher.d.ts +20 -0
- package/dist/tempo/stream/Voucher.d.ts.map +1 -0
- package/dist/tempo/stream/Voucher.js +98 -0
- package/dist/tempo/stream/Voucher.js.map +1 -0
- package/dist/tempo/stream/escrow.abi.d.ts +598 -0
- package/dist/tempo/stream/escrow.abi.d.ts.map +1 -0
- package/dist/tempo/stream/escrow.abi.js +760 -0
- package/dist/tempo/stream/escrow.abi.js.map +1 -0
- package/dist/tempo/stream/index.d.ts +8 -0
- package/dist/tempo/stream/index.d.ts.map +1 -0
- package/dist/tempo/stream/index.js +8 -0
- package/dist/tempo/stream/index.js.map +1 -0
- package/dist/viem/Account.d.ts +12 -0
- package/dist/viem/Account.d.ts.map +1 -0
- package/dist/viem/Account.js +14 -0
- package/dist/viem/Account.js.map +1 -0
- package/dist/viem/Client.d.ts +21 -0
- package/dist/viem/Client.d.ts.map +1 -0
- package/dist/viem/Client.js +19 -0
- package/dist/viem/Client.js.map +1 -0
- package/dist/zod.d.ts +17 -0
- package/dist/zod.d.ts.map +1 -0
- package/dist/zod.js +35 -0
- package/dist/zod.js.map +1 -0
- package/package.json +117 -4
- package/src/BodyDigest.test.ts +43 -0
- package/src/BodyDigest.ts +53 -0
- package/src/Challenge.test-d.ts +81 -0
- package/src/Challenge.test.ts +414 -0
- package/src/Challenge.ts +429 -0
- package/src/Credential.test.ts +227 -0
- package/src/Credential.ts +154 -0
- package/src/Errors.test.ts +402 -0
- package/src/Errors.ts +348 -0
- package/src/Expires.ts +34 -0
- package/src/Intent.test.ts +180 -0
- package/src/Intent.ts +109 -0
- package/src/Mcp.ts +81 -0
- package/src/MethodIntent.test.ts +303 -0
- package/src/MethodIntent.ts +388 -0
- package/src/PaymentRequest.test.ts +152 -0
- package/src/PaymentRequest.ts +107 -0
- package/src/Receipt.test.ts +98 -0
- package/src/Receipt.ts +129 -0
- package/src/Store.ts +84 -0
- package/src/cli.test.ts +542 -0
- package/src/cli.ts +1319 -0
- package/src/client/Methods.ts +3 -0
- package/src/client/Mppx.test-d.ts +90 -0
- package/src/client/Mppx.test.ts +468 -0
- package/src/client/Mppx.ts +149 -0
- package/src/client/Transport.test.ts +283 -0
- package/src/client/Transport.ts +115 -0
- package/src/client/index.ts +4 -0
- package/src/client/internal/Fetch.test-d.ts +57 -0
- package/src/client/internal/Fetch.test.ts +281 -0
- package/src/client/internal/Fetch.ts +157 -0
- package/src/env.d.ts +11 -0
- package/src/index.ts +12 -0
- package/src/internal/types.ts +403 -0
- package/src/mcp-sdk/client/McpClient.test-d.ts +109 -0
- package/src/mcp-sdk/client/McpClient.test.ts +219 -0
- package/src/mcp-sdk/client/McpClient.ts +187 -0
- package/src/mcp-sdk/client/index.ts +2 -0
- package/src/mcp-sdk/server/Transport.ts +94 -0
- package/src/mcp-sdk/server/index.ts +1 -0
- package/src/middlewares/elysia.ts +66 -0
- package/src/middlewares/express.test.ts +155 -0
- package/src/middlewares/express.ts +82 -0
- package/src/middlewares/hono.test.ts +148 -0
- package/src/middlewares/hono.ts +62 -0
- package/src/middlewares/internal/mppx.ts +30 -0
- package/src/middlewares/nextjs.test.ts +164 -0
- package/src/middlewares/nextjs.ts +66 -0
- package/src/proxy/Proxy.test.ts +472 -0
- package/src/proxy/Proxy.ts +175 -0
- package/src/proxy/Service.test.ts +125 -0
- package/src/proxy/Service.ts +227 -0
- package/src/proxy/index.ts +6 -0
- package/src/proxy/internal/Headers.test.ts +100 -0
- package/src/proxy/internal/Headers.ts +40 -0
- package/src/proxy/internal/Route.test.ts +143 -0
- package/src/proxy/internal/Route.ts +54 -0
- package/src/proxy/services/anthropic.ts +45 -0
- package/src/proxy/services/openai.test.ts +97 -0
- package/src/proxy/services/openai.ts +48 -0
- package/src/proxy/services/stripe.ts +49 -0
- package/src/server/Methods.ts +2 -0
- package/src/server/Mppx.test-d.ts +343 -0
- package/src/server/Mppx.test.ts +342 -0
- package/src/server/Mppx.ts +378 -0
- package/src/server/NodeListener.test.ts +188 -0
- package/src/server/NodeListener.ts +3 -0
- package/src/server/Request.test.ts +102 -0
- package/src/server/Request.ts +33 -0
- package/src/server/Response.test.ts +31 -0
- package/src/server/Response.ts +27 -0
- package/src/server/Transport.test.ts +294 -0
- package/src/server/Transport.ts +222 -0
- package/src/server/index.ts +8 -0
- package/src/stripe/Charge.integration.test.ts +326 -0
- package/src/stripe/Intents.test.ts +52 -0
- package/src/stripe/Intents.ts +27 -0
- package/src/stripe/client/Charge.ts +119 -0
- package/src/stripe/client/MethodIntents.ts +37 -0
- package/src/stripe/client/index.ts +2 -0
- package/src/stripe/index.ts +1 -0
- package/src/stripe/server/Charge.ts +121 -0
- package/src/stripe/server/MethodIntents.ts +24 -0
- package/src/stripe/server/index.ts +2 -0
- package/src/tempo/Attribution.test.ts +187 -0
- package/src/tempo/Attribution.ts +156 -0
- package/src/tempo/Intents.test.ts +84 -0
- package/src/tempo/Intents.ts +93 -0
- package/src/tempo/client/ChannelOps.ts +233 -0
- package/src/tempo/client/Charge.ts +84 -0
- package/src/tempo/client/MethodIntents.ts +28 -0
- package/src/tempo/client/Session.ts +369 -0
- package/src/tempo/client/SessionManager.test.ts +223 -0
- package/src/tempo/client/SessionManager.ts +270 -0
- package/src/tempo/client/index.ts +5 -0
- package/src/tempo/index.ts +2 -0
- package/src/tempo/internal/account.ts +47 -0
- package/src/tempo/internal/defaults.ts +20 -0
- package/src/tempo/internal/types.ts +8 -0
- package/src/tempo/server/Charge.test.ts +847 -0
- package/src/tempo/server/Charge.ts +309 -0
- package/src/tempo/server/MethodIntents.ts +29 -0
- package/src/tempo/server/Session.test.ts +1349 -0
- package/src/tempo/server/Session.ts +773 -0
- package/src/tempo/server/Sse.test.ts +289 -0
- package/src/tempo/server/index.ts +5 -0
- package/src/tempo/server/internal/transport.ts +153 -0
- package/src/tempo/stream/Chain.ts +333 -0
- package/src/tempo/stream/Channel.ts +50 -0
- package/src/tempo/stream/ChannelStore.test.ts +473 -0
- package/src/tempo/stream/ChannelStore.ts +202 -0
- package/src/tempo/stream/Receipt.test.ts +84 -0
- package/src/tempo/stream/Receipt.ts +45 -0
- package/src/tempo/stream/Sse.test.ts +401 -0
- package/src/tempo/stream/Sse.ts +375 -0
- package/src/tempo/stream/Types.ts +86 -0
- package/src/tempo/stream/Voucher.test.ts +134 -0
- package/src/tempo/stream/Voucher.ts +123 -0
- package/src/tempo/stream/escrow.abi.ts +759 -0
- package/src/tempo/stream/index.ts +7 -0
- package/src/tsconfig.json +10 -0
- package/src/viem/Account.test.ts +71 -0
- package/src/viem/Account.ts +30 -0
- package/src/viem/Client.test.ts +58 -0
- package/src/viem/Client.ts +33 -0
- package/src/zod.ts +47 -0
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import type { Hex } from 'ox'
|
|
2
|
+
import type { Address } from 'viem'
|
|
3
|
+
import type * as Challenge from '../../Challenge.js'
|
|
4
|
+
import * as Fetch from '../../client/internal/Fetch.js'
|
|
5
|
+
import type * as Account from '../../viem/Account.js'
|
|
6
|
+
import type * as Client from '../../viem/Client.js'
|
|
7
|
+
import { deserializeStreamReceipt } from '../stream/Receipt.js'
|
|
8
|
+
import { parseEvent } from '../stream/Sse.js'
|
|
9
|
+
import type { StreamReceipt } from '../stream/Types.js'
|
|
10
|
+
import type { ChannelEntry } from './ChannelOps.js'
|
|
11
|
+
import { session as sessionPlugin } from './Session.js'
|
|
12
|
+
|
|
13
|
+
export type SessionManager = {
|
|
14
|
+
readonly channelId: Hex.Hex | undefined
|
|
15
|
+
readonly cumulative: bigint
|
|
16
|
+
readonly opened: boolean
|
|
17
|
+
|
|
18
|
+
open(options?: { deposit?: bigint }): Promise<void>
|
|
19
|
+
fetch(input: RequestInfo | URL, init?: RequestInit): Promise<PaymentResponse>
|
|
20
|
+
sse(
|
|
21
|
+
input: RequestInfo | URL,
|
|
22
|
+
init?: RequestInit & {
|
|
23
|
+
onReceipt?: ((receipt: StreamReceipt) => void) | undefined
|
|
24
|
+
signal?: AbortSignal | undefined
|
|
25
|
+
},
|
|
26
|
+
): Promise<AsyncIterable<string>>
|
|
27
|
+
close(): Promise<StreamReceipt | undefined>
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export type PaymentResponse = Response & {
|
|
31
|
+
receipt: StreamReceipt | null
|
|
32
|
+
challenge: Challenge.Challenge | null
|
|
33
|
+
channelId: Hex.Hex | null
|
|
34
|
+
cumulative: bigint
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Creates a session manager that handles the full client payment lifecycle:
|
|
39
|
+
* channel open, incremental vouchers, SSE streaming, and channel close.
|
|
40
|
+
*
|
|
41
|
+
* Internally delegates to the `session()` MethodIntent plugin for all
|
|
42
|
+
* channel state management and credential creation, and to `Fetch.from`
|
|
43
|
+
* for the 402 challenge/retry flow.
|
|
44
|
+
*
|
|
45
|
+
* ## Session resumption
|
|
46
|
+
*
|
|
47
|
+
* All channel state is held **in memory**. If the client process restarts,
|
|
48
|
+
* the session is lost and a new on-chain channel will be opened on the next
|
|
49
|
+
* request — the previous channel's deposit is orphaned until manually closed.
|
|
50
|
+
*
|
|
51
|
+
* When the server includes a `channelId` in the 402 challenge `methodDetails`,
|
|
52
|
+
* the client will attempt to recover the channel by reading its on-chain state
|
|
53
|
+
* via `getOnChainChannel()`. If the channel has a positive deposit and is not
|
|
54
|
+
* finalized, it resumes from the on-chain settled amount.
|
|
55
|
+
*/
|
|
56
|
+
export function sessionManager(parameters: sessionManager.Parameters): SessionManager {
|
|
57
|
+
const fetchFn = parameters.fetch ?? globalThis.fetch
|
|
58
|
+
|
|
59
|
+
let channel: ChannelEntry | null = null
|
|
60
|
+
let lastChallenge: Challenge.Challenge | null = null
|
|
61
|
+
let lastUrl: RequestInfo | URL | null = null
|
|
62
|
+
|
|
63
|
+
const method = sessionPlugin({
|
|
64
|
+
account: parameters.account,
|
|
65
|
+
authorizedSigner: parameters.authorizedSigner,
|
|
66
|
+
getClient: parameters.client ? () => parameters.client! : parameters.getClient,
|
|
67
|
+
escrowContract: parameters.escrowContract,
|
|
68
|
+
decimals: parameters.decimals,
|
|
69
|
+
maxDeposit: parameters.maxDeposit,
|
|
70
|
+
onChannelUpdate(entry) {
|
|
71
|
+
channel = entry
|
|
72
|
+
},
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
const wrappedFetch = Fetch.from({
|
|
76
|
+
fetch: fetchFn,
|
|
77
|
+
methods: [method],
|
|
78
|
+
onChallenge(c) {
|
|
79
|
+
lastChallenge = c
|
|
80
|
+
},
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
function toPaymentResponse(response: Response): PaymentResponse {
|
|
84
|
+
const receiptHeader = response.headers.get('Payment-Receipt')
|
|
85
|
+
const receipt = receiptHeader ? deserializeStreamReceipt(receiptHeader) : null
|
|
86
|
+
return Object.assign(response, {
|
|
87
|
+
receipt,
|
|
88
|
+
challenge: lastChallenge,
|
|
89
|
+
channelId: channel?.channelId ?? null,
|
|
90
|
+
cumulative: channel?.cumulativeAmount ?? 0n,
|
|
91
|
+
})
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async function doFetch(input: RequestInfo | URL, init?: RequestInit): Promise<PaymentResponse> {
|
|
95
|
+
lastUrl = input
|
|
96
|
+
const response = await wrappedFetch(input, init)
|
|
97
|
+
return toPaymentResponse(response)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const self: SessionManager = {
|
|
101
|
+
get channelId() {
|
|
102
|
+
return channel?.channelId
|
|
103
|
+
},
|
|
104
|
+
get cumulative() {
|
|
105
|
+
return channel?.cumulativeAmount ?? 0n
|
|
106
|
+
},
|
|
107
|
+
get opened() {
|
|
108
|
+
return channel?.opened ?? false
|
|
109
|
+
},
|
|
110
|
+
|
|
111
|
+
async open(options) {
|
|
112
|
+
if (channel?.opened) return
|
|
113
|
+
|
|
114
|
+
if (!lastChallenge) {
|
|
115
|
+
throw new Error(
|
|
116
|
+
'No challenge available. Make a request first to receive a 402 challenge, or pass a challenge via .fetch()/.sse().',
|
|
117
|
+
)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const deposit = options?.deposit
|
|
121
|
+
const credential = await method.createCredential({
|
|
122
|
+
challenge: lastChallenge as never,
|
|
123
|
+
context: {
|
|
124
|
+
...(deposit !== undefined && { depositRaw: deposit.toString() }),
|
|
125
|
+
},
|
|
126
|
+
})
|
|
127
|
+
|
|
128
|
+
if (!lastUrl) throw new Error('No URL available — call fetch() or sse() before open().')
|
|
129
|
+
const response = await fetchFn(lastUrl, {
|
|
130
|
+
method: 'POST',
|
|
131
|
+
headers: { Authorization: credential },
|
|
132
|
+
})
|
|
133
|
+
if (!response.ok) {
|
|
134
|
+
const body = await response.text().catch(() => '')
|
|
135
|
+
const wwwAuth = response.headers.get('WWW-Authenticate') ?? ''
|
|
136
|
+
throw new Error(
|
|
137
|
+
`Open request failed with status ${response.status}${body ? `: ${body}` : ''}${wwwAuth ? ` [WWW-Authenticate: ${wwwAuth}]` : ''}`,
|
|
138
|
+
)
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
|
|
142
|
+
fetch: doFetch,
|
|
143
|
+
|
|
144
|
+
async sse(input, init) {
|
|
145
|
+
const { onReceipt, signal, ...fetchInit } = init ?? {}
|
|
146
|
+
|
|
147
|
+
const sseInit = {
|
|
148
|
+
...fetchInit,
|
|
149
|
+
headers: {
|
|
150
|
+
...fetchInit.headers,
|
|
151
|
+
Accept: 'text/event-stream',
|
|
152
|
+
},
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const response = await doFetch(input, sseInit)
|
|
156
|
+
|
|
157
|
+
if (!response.body) throw new Error('Response has no body.')
|
|
158
|
+
|
|
159
|
+
const reader = response.body.getReader()
|
|
160
|
+
const decoder = new TextDecoder()
|
|
161
|
+
|
|
162
|
+
async function* iterate(): AsyncGenerator<string> {
|
|
163
|
+
let buffer = ''
|
|
164
|
+
|
|
165
|
+
try {
|
|
166
|
+
while (true) {
|
|
167
|
+
if (signal?.aborted) break
|
|
168
|
+
|
|
169
|
+
const { done, value } = await reader.read()
|
|
170
|
+
if (done) break
|
|
171
|
+
|
|
172
|
+
buffer += decoder.decode(value, { stream: true })
|
|
173
|
+
|
|
174
|
+
const parts = buffer.split('\n\n')
|
|
175
|
+
buffer = parts.pop()!
|
|
176
|
+
|
|
177
|
+
for (const part of parts) {
|
|
178
|
+
if (!part.trim()) continue
|
|
179
|
+
|
|
180
|
+
const event = parseEvent(part)
|
|
181
|
+
if (!event) continue
|
|
182
|
+
|
|
183
|
+
switch (event.type) {
|
|
184
|
+
case 'message':
|
|
185
|
+
yield event.data
|
|
186
|
+
break
|
|
187
|
+
|
|
188
|
+
case 'payment-need-voucher': {
|
|
189
|
+
if (!channel || !lastChallenge) break
|
|
190
|
+
const required = BigInt(event.data.requiredCumulative)
|
|
191
|
+
channel.cumulativeAmount =
|
|
192
|
+
channel.cumulativeAmount > required ? channel.cumulativeAmount : required
|
|
193
|
+
|
|
194
|
+
const credential = await method.createCredential({
|
|
195
|
+
challenge: lastChallenge as never,
|
|
196
|
+
context: {
|
|
197
|
+
action: 'voucher',
|
|
198
|
+
channelId: channel.channelId,
|
|
199
|
+
cumulativeAmountRaw: channel.cumulativeAmount.toString(),
|
|
200
|
+
},
|
|
201
|
+
})
|
|
202
|
+
const voucherResponse = await fetchFn(input, {
|
|
203
|
+
method: 'POST',
|
|
204
|
+
headers: { Authorization: credential },
|
|
205
|
+
})
|
|
206
|
+
if (!voucherResponse.ok) {
|
|
207
|
+
throw new Error(`Voucher POST failed with status ${voucherResponse.status}`)
|
|
208
|
+
}
|
|
209
|
+
break
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
case 'payment-receipt':
|
|
213
|
+
onReceipt?.(event.data)
|
|
214
|
+
break
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
} finally {
|
|
219
|
+
reader.releaseLock()
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
return iterate()
|
|
224
|
+
},
|
|
225
|
+
|
|
226
|
+
async close() {
|
|
227
|
+
if (!channel?.opened || !lastChallenge) return undefined
|
|
228
|
+
|
|
229
|
+
const credential = await method.createCredential({
|
|
230
|
+
challenge: lastChallenge as never,
|
|
231
|
+
context: {
|
|
232
|
+
action: 'close',
|
|
233
|
+
channelId: channel.channelId,
|
|
234
|
+
cumulativeAmountRaw: channel.cumulativeAmount.toString(),
|
|
235
|
+
},
|
|
236
|
+
})
|
|
237
|
+
|
|
238
|
+
let receipt: StreamReceipt | undefined
|
|
239
|
+
if (lastUrl) {
|
|
240
|
+
const response = await fetchFn(lastUrl, {
|
|
241
|
+
method: 'POST',
|
|
242
|
+
headers: { Authorization: credential },
|
|
243
|
+
})
|
|
244
|
+
const receiptHeader = response.headers.get('Payment-Receipt')
|
|
245
|
+
if (receiptHeader) receipt = deserializeStreamReceipt(receiptHeader)
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
return receipt
|
|
249
|
+
},
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
return self
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
export declare namespace sessionManager {
|
|
256
|
+
type Parameters = Account.getResolver.Parameters &
|
|
257
|
+
Client.getResolver.Parameters & {
|
|
258
|
+
/** Address authorized to sign vouchers. Defaults to the account address. */
|
|
259
|
+
authorizedSigner?: Address | undefined
|
|
260
|
+
/** Viem client instance. Shorthand for `getClient: () => client`. */
|
|
261
|
+
client?: import('viem').Client | undefined
|
|
262
|
+
/** Token decimals used to convert `maxDeposit` to raw units. Defaults to `6`. */
|
|
263
|
+
decimals?: number | undefined
|
|
264
|
+
/** Escrow contract address. */
|
|
265
|
+
escrowContract?: Address | undefined
|
|
266
|
+
fetch?: typeof globalThis.fetch | undefined
|
|
267
|
+
/** Maximum deposit in human-readable units (e.g. `'10'` for 10 tokens). Converted to raw units via `decimals`. */
|
|
268
|
+
maxDeposit?: string | undefined
|
|
269
|
+
}
|
|
270
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { Account, Address } from 'viem'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Resolves a recipient address and optional fee payer from flexible input parameters.
|
|
5
|
+
*
|
|
6
|
+
* Accepts either `account` or `recipient` as the parameter name. When the value
|
|
7
|
+
* is an `Account`, its address is extracted. If `feePayer` is `true`, the
|
|
8
|
+
* account also acts as the fee payer. Alternatively, a separate `Account`
|
|
9
|
+
* can be provided as the fee payer.
|
|
10
|
+
*
|
|
11
|
+
* @returns An object with `account`, `feePayer`, and `recipient`.
|
|
12
|
+
*/
|
|
13
|
+
export function resolve(parameters: resolve.Parameters) {
|
|
14
|
+
const account = (() => {
|
|
15
|
+
if (typeof parameters.account === 'object') return parameters.account
|
|
16
|
+
return undefined
|
|
17
|
+
})()
|
|
18
|
+
const recipient = (() => {
|
|
19
|
+
if (parameters.recipient) return parameters.recipient
|
|
20
|
+
if (typeof parameters.account === 'object') return parameters.account.address
|
|
21
|
+
return parameters.account
|
|
22
|
+
})()
|
|
23
|
+
const feePayer = (() => {
|
|
24
|
+
if (typeof parameters.account === 'object' && parameters.feePayer === true)
|
|
25
|
+
return parameters.account
|
|
26
|
+
if (typeof parameters.feePayer === 'object') return parameters.feePayer
|
|
27
|
+
return undefined
|
|
28
|
+
})()
|
|
29
|
+
return { account, feePayer, recipient: recipient as Address | undefined }
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export declare namespace resolve {
|
|
33
|
+
type Parameters = { recipient?: Address | undefined } & (
|
|
34
|
+
| {
|
|
35
|
+
/** Account that performs payment operations. */
|
|
36
|
+
account?: Account | undefined
|
|
37
|
+
/** When true, the account also sponsors (pays) transaction fees. */
|
|
38
|
+
feePayer?: true | undefined
|
|
39
|
+
}
|
|
40
|
+
| {
|
|
41
|
+
/** Address that receives payment. */
|
|
42
|
+
account?: Address | undefined
|
|
43
|
+
/** Optional fee payer account for covering transaction fees. */
|
|
44
|
+
feePayer?: Account | undefined
|
|
45
|
+
}
|
|
46
|
+
)
|
|
47
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export const rpcUrl = {
|
|
2
|
+
4217: 'https://rpc.tempo.xyz',
|
|
3
|
+
42431: 'https://rpc.moderato.tempo.xyz',
|
|
4
|
+
} as const
|
|
5
|
+
|
|
6
|
+
export const escrowContract = {
|
|
7
|
+
4217: '0x0901aED692C755b870F9605E56BAA66C35BEfF69',
|
|
8
|
+
42431: '0x542831e3E4Ace07559b7C8787395f4Fb99F70787',
|
|
9
|
+
} as const
|
|
10
|
+
|
|
11
|
+
export const testnetChainId = 42431
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Default token decimals for TIP-20 stablecoins (e.g. alphaUSD).
|
|
15
|
+
*
|
|
16
|
+
* All TIP-20 tokens on Tempo use 6 decimals, so there is no risk of
|
|
17
|
+
* client/server mismatch within the Tempo ecosystem. Other chains and
|
|
18
|
+
* runtimes should set `decimals` explicitly to match their token.
|
|
19
|
+
*/
|
|
20
|
+
export const decimals = 6
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Account } from 'viem'
|
|
2
|
+
|
|
3
|
+
export type DeriveDefaults<parameters, defaults> = Pick<
|
|
4
|
+
parameters,
|
|
5
|
+
Extract<keyof parameters, keyof defaults>
|
|
6
|
+
> &
|
|
7
|
+
(parameters extends { account: Account | string } ? { recipient: string } : {}) &
|
|
8
|
+
(parameters extends { recipient: string } ? { recipient: string } : {})
|