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,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Atomically deduct `amount` from a channel's available balance.
|
|
3
|
+
*
|
|
4
|
+
* Returns `{ ok: true, channel }` if the deduction succeeded, or
|
|
5
|
+
* `{ ok: false, channel }` with the unchanged state if balance is
|
|
6
|
+
* insufficient. Throws if the channel does not exist.
|
|
7
|
+
*/
|
|
8
|
+
export async function deductFromChannel(store, channelId, amount) {
|
|
9
|
+
let deducted = false;
|
|
10
|
+
const channel = await store.updateChannel(channelId, (current) => {
|
|
11
|
+
deducted = false;
|
|
12
|
+
if (!current)
|
|
13
|
+
return null;
|
|
14
|
+
if (current.highestVoucherAmount - current.spent >= amount) {
|
|
15
|
+
deducted = true;
|
|
16
|
+
return { ...current, spent: current.spent + amount, units: current.units + 1 };
|
|
17
|
+
}
|
|
18
|
+
return current;
|
|
19
|
+
});
|
|
20
|
+
if (!channel)
|
|
21
|
+
throw new Error('channel not found');
|
|
22
|
+
return { ok: deducted, channel };
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Wraps a generic {@link Store} into the internal {@link Store}
|
|
26
|
+
* interface used by server handlers and the SSE metering loop.
|
|
27
|
+
*
|
|
28
|
+
* Provides `waitForUpdate` notifications so the SSE `chargeOrWait` loop
|
|
29
|
+
* can wake up without polling.
|
|
30
|
+
*
|
|
31
|
+
* ## Atomicity
|
|
32
|
+
*
|
|
33
|
+
* Mutations use `get` → `fn` → `set` guarded by a per-key in-process
|
|
34
|
+
* mutex. This serializes concurrent `updateChannel` calls within a
|
|
35
|
+
* single JS runtime but does **not** protect against races across
|
|
36
|
+
* multiple processes or instances.
|
|
37
|
+
*
|
|
38
|
+
* Backends that need true atomicity (e.g., Durable Objects, D1)
|
|
39
|
+
* should implement {@link Store} directly.
|
|
40
|
+
*/
|
|
41
|
+
const storeCache = new WeakMap();
|
|
42
|
+
export function fromStore(store) {
|
|
43
|
+
const cached = storeCache.get(store);
|
|
44
|
+
if (cached)
|
|
45
|
+
return cached;
|
|
46
|
+
const waiters = new Map();
|
|
47
|
+
const locks = new Map();
|
|
48
|
+
function notify(channelId) {
|
|
49
|
+
const set = waiters.get(channelId);
|
|
50
|
+
if (!set)
|
|
51
|
+
return;
|
|
52
|
+
for (const resolve of set)
|
|
53
|
+
resolve();
|
|
54
|
+
waiters.delete(channelId);
|
|
55
|
+
}
|
|
56
|
+
async function update(channelId, fn) {
|
|
57
|
+
while (locks.has(channelId))
|
|
58
|
+
await locks.get(channelId);
|
|
59
|
+
let release;
|
|
60
|
+
locks.set(channelId, new Promise((r) => {
|
|
61
|
+
release = r;
|
|
62
|
+
}));
|
|
63
|
+
try {
|
|
64
|
+
const current = await store.get(channelId);
|
|
65
|
+
const next = fn(current);
|
|
66
|
+
if (next)
|
|
67
|
+
await store.put(channelId, next);
|
|
68
|
+
else
|
|
69
|
+
await store.delete(channelId);
|
|
70
|
+
return next;
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
locks.delete(channelId);
|
|
74
|
+
release();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const cs = {
|
|
78
|
+
async getChannel(channelId) {
|
|
79
|
+
return store.get(channelId);
|
|
80
|
+
},
|
|
81
|
+
async updateChannel(channelId, fn) {
|
|
82
|
+
const result = await update(channelId, fn);
|
|
83
|
+
notify(channelId);
|
|
84
|
+
return result;
|
|
85
|
+
},
|
|
86
|
+
waitForUpdate(channelId) {
|
|
87
|
+
return new Promise((resolve) => {
|
|
88
|
+
let set = waiters.get(channelId);
|
|
89
|
+
if (!set) {
|
|
90
|
+
set = new Set();
|
|
91
|
+
waiters.set(channelId, set);
|
|
92
|
+
}
|
|
93
|
+
set.add(resolve);
|
|
94
|
+
});
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
storeCache.set(store, cs);
|
|
98
|
+
return cs;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=ChannelStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChannelStore.js","sourceRoot":"","sources":["../../../src/tempo/stream/ChannelStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Hex } from 'viem';
|
|
2
|
+
import type { StreamReceipt } from './Types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Create a stream receipt.
|
|
5
|
+
*/
|
|
6
|
+
export declare function createStreamReceipt(params: {
|
|
7
|
+
challengeId: string;
|
|
8
|
+
channelId: Hex;
|
|
9
|
+
acceptedCumulative: bigint;
|
|
10
|
+
spent: bigint;
|
|
11
|
+
units?: number | undefined;
|
|
12
|
+
txHash?: Hex | undefined;
|
|
13
|
+
}): StreamReceipt;
|
|
14
|
+
/**
|
|
15
|
+
* Serialize a stream receipt to the Payment-Receipt header format.
|
|
16
|
+
*/
|
|
17
|
+
export declare function serializeStreamReceipt(receipt: StreamReceipt): string;
|
|
18
|
+
/**
|
|
19
|
+
* Deserialize a Payment-Receipt header value to a stream receipt.
|
|
20
|
+
*/
|
|
21
|
+
export declare function deserializeStreamReceipt(encoded: string): StreamReceipt;
|
|
22
|
+
//# sourceMappingURL=Receipt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Receipt.d.ts","sourceRoot":"","sources":["../../../src/tempo/stream/Receipt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAA;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAC1C,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,GAAG,aAAa,CAchB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAGrE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAGvE"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Base64 } from 'ox';
|
|
2
|
+
/**
|
|
3
|
+
* Create a stream receipt.
|
|
4
|
+
*/
|
|
5
|
+
export function createStreamReceipt(params) {
|
|
6
|
+
return {
|
|
7
|
+
method: 'tempo',
|
|
8
|
+
intent: 'session',
|
|
9
|
+
status: 'success',
|
|
10
|
+
timestamp: new Date().toISOString(),
|
|
11
|
+
reference: params.channelId,
|
|
12
|
+
challengeId: params.challengeId,
|
|
13
|
+
channelId: params.channelId,
|
|
14
|
+
acceptedCumulative: params.acceptedCumulative.toString(),
|
|
15
|
+
spent: params.spent.toString(),
|
|
16
|
+
...(params.units !== undefined && { units: params.units }),
|
|
17
|
+
...(params.txHash !== undefined && { txHash: params.txHash }),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Serialize a stream receipt to the Payment-Receipt header format.
|
|
22
|
+
*/
|
|
23
|
+
export function serializeStreamReceipt(receipt) {
|
|
24
|
+
const json = JSON.stringify(receipt);
|
|
25
|
+
return Base64.fromString(json, { pad: false, url: true });
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Deserialize a Payment-Receipt header value to a stream receipt.
|
|
29
|
+
*/
|
|
30
|
+
export function deserializeStreamReceipt(encoded) {
|
|
31
|
+
const json = Base64.toString(encoded);
|
|
32
|
+
return JSON.parse(json);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=Receipt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Receipt.js","sourceRoot":"","sources":["../../../src/tempo/stream/Receipt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAA;AAI3B;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAOnC;IACC,OAAO;QACL,MAAM,EAAE,OAAO;QACf,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE;QACxD,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE;QAC9B,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAC1D,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;KAC9D,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAsB;IAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IACpC,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAA;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAe;IACtD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IACrC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAkB,CAAA;AAC1C,CAAC"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSE (Server-Sent Events) utilities for metered streaming payments.
|
|
3
|
+
*
|
|
4
|
+
* Provides event formatting/parsing, balance polling, the core
|
|
5
|
+
* `serve()` loop that meters an async iterable into a ReadableStream
|
|
6
|
+
* of SSE events, and helpers (`toResponse`, `fromRequest`) for
|
|
7
|
+
* building HTTP responses from the stream.
|
|
8
|
+
*/
|
|
9
|
+
import type { Hex } from 'viem';
|
|
10
|
+
import * as ChannelStore from './ChannelStore.js';
|
|
11
|
+
import type { NeedVoucherEvent, StreamReceipt } from './Types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Format a stream receipt as a Server-Sent Event.
|
|
14
|
+
*
|
|
15
|
+
* Produces a valid SSE event string with `event: payment-receipt`
|
|
16
|
+
* and the receipt JSON as the `data` field.
|
|
17
|
+
*/
|
|
18
|
+
export declare function formatReceiptEvent(receipt: StreamReceipt): string;
|
|
19
|
+
/**
|
|
20
|
+
* Format a need-voucher event as a Server-Sent Event.
|
|
21
|
+
*
|
|
22
|
+
* Emitted when the channel balance is exhausted mid-stream.
|
|
23
|
+
* The client responds by sending a new voucher credential to
|
|
24
|
+
* any mppx-protected endpoint.
|
|
25
|
+
*/
|
|
26
|
+
export declare function formatNeedVoucherEvent(params: NeedVoucherEvent): string;
|
|
27
|
+
/**
|
|
28
|
+
* Parsed SSE event (discriminated union by `type`).
|
|
29
|
+
*/
|
|
30
|
+
export type SseEvent = {
|
|
31
|
+
type: 'message';
|
|
32
|
+
data: string;
|
|
33
|
+
} | {
|
|
34
|
+
type: 'payment-need-voucher';
|
|
35
|
+
data: NeedVoucherEvent;
|
|
36
|
+
} | {
|
|
37
|
+
type: 'payment-receipt';
|
|
38
|
+
data: StreamReceipt;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Parse a raw SSE event string into a typed event.
|
|
42
|
+
*
|
|
43
|
+
* Handles the three event types used by mppx streaming:
|
|
44
|
+
* - `message` (default / no event field) — application data
|
|
45
|
+
* - `payment-need-voucher` — balance exhausted, client should send voucher
|
|
46
|
+
* - `payment-receipt` — final receipt
|
|
47
|
+
*/
|
|
48
|
+
export declare function parseEvent(raw: string): SseEvent | null;
|
|
49
|
+
export type StreamController = {
|
|
50
|
+
charge(): Promise<void>;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Wrap an async iterable with payment metering, producing an SSE stream.
|
|
54
|
+
*
|
|
55
|
+
* `generate` may be either:
|
|
56
|
+
* - An `AsyncIterable<string>` — each yielded value is automatically charged
|
|
57
|
+
* (one `tickCost` per value).
|
|
58
|
+
* - A callback `(stream: StreamController) => AsyncIterable<string>` — the
|
|
59
|
+
* generator controls when charges happen by calling `stream.charge()`.
|
|
60
|
+
*
|
|
61
|
+
* For each emitted value the stream:
|
|
62
|
+
* 1. Deducts `tickCost` from the channel balance atomically (auto or manual).
|
|
63
|
+
* 2. If balance is sufficient, emits `event: message` with the value.
|
|
64
|
+
* 3. If balance is exhausted, emits `event: payment-need-voucher`
|
|
65
|
+
* and polls store until the client tops up the channel.
|
|
66
|
+
* 4. On generator completion, emits a final `event: payment-receipt`.
|
|
67
|
+
*
|
|
68
|
+
* Returns a `ReadableStream<Uint8Array>` suitable for use as an HTTP response body.
|
|
69
|
+
*/
|
|
70
|
+
export declare function serve(options: serve.Options): ReadableStream<Uint8Array>;
|
|
71
|
+
export declare namespace serve {
|
|
72
|
+
type Options = {
|
|
73
|
+
store: ChannelStore.ChannelStore;
|
|
74
|
+
channelId: Hex;
|
|
75
|
+
challengeId: string;
|
|
76
|
+
tickCost: bigint;
|
|
77
|
+
generate: AsyncIterable<string> | ((stream: StreamController) => AsyncIterable<string>);
|
|
78
|
+
pollIntervalMs?: number | undefined;
|
|
79
|
+
signal?: AbortSignal | undefined;
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Wrap a `ReadableStream<Uint8Array>` (from {@link serve}) in an HTTP
|
|
84
|
+
* `Response` with the correct SSE headers.
|
|
85
|
+
*/
|
|
86
|
+
export declare function toResponse(body: ReadableStream<Uint8Array>): Response;
|
|
87
|
+
/**
|
|
88
|
+
* Extract `channelId`, `challengeId`, and `tickCost` from a `Request`'s
|
|
89
|
+
* `Authorization: Payment …` header.
|
|
90
|
+
*
|
|
91
|
+
* This is a convenience for callers that receive a raw `Request` and need
|
|
92
|
+
* the parameters required by {@link serve}.
|
|
93
|
+
*/
|
|
94
|
+
export declare function fromRequest(request: Request): fromRequest.Context;
|
|
95
|
+
export declare namespace fromRequest {
|
|
96
|
+
type Context = {
|
|
97
|
+
challengeId: string;
|
|
98
|
+
channelId: Hex;
|
|
99
|
+
tickCost: bigint;
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Check whether a `Response` carries an SSE event stream.
|
|
104
|
+
*
|
|
105
|
+
* Returns `true` when the `Content-Type` header starts with
|
|
106
|
+
* `text/event-stream` (case-insensitive, ignoring charset params).
|
|
107
|
+
*/
|
|
108
|
+
export declare function isEventStream(response: Response): boolean;
|
|
109
|
+
/**
|
|
110
|
+
* Parse an SSE `Response` body into an async iterable of `data:` payloads.
|
|
111
|
+
*
|
|
112
|
+
* Yields the raw `data:` field content for each SSE event in the stream.
|
|
113
|
+
* Events whose data matches the `skip` predicate are silently dropped
|
|
114
|
+
* (e.g. `[DONE]` sentinels used by OpenAI-compatible APIs).
|
|
115
|
+
*
|
|
116
|
+
* Each yielded value typically becomes one charge tick when fed to
|
|
117
|
+
* {@link serve} via the SSE transport's auto-charge mode.
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
* ```ts
|
|
121
|
+
* const upstream = await fetch('https://api.example.com/stream')
|
|
122
|
+
* for await (const data of Sse.iterateData(upstream)) {
|
|
123
|
+
* console.log(data)
|
|
124
|
+
* }
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
export declare function iterateData(response: Response, options?: iterateData.Options): AsyncGenerator<string>;
|
|
128
|
+
export declare namespace iterateData {
|
|
129
|
+
type Options = {
|
|
130
|
+
/** Predicate to skip specific data payloads (e.g. `d => d === '[DONE]'`). */
|
|
131
|
+
skip?: ((data: string) => boolean) | undefined;
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=Sse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Sse.d.ts","sourceRoot":"","sources":["../../../src/tempo/stream/Sse.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAA;AAE/B,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA;AAEjD,OAAO,KAAK,EAAE,gBAAgB,EAA2B,aAAa,EAAE,MAAM,YAAY,CAAA;AAE1F;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAEjE;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAEvE;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GAChB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,GACxD;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,IAAI,EAAE,aAAa,CAAA;CAAE,CAAA;AAEpD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CA2BvD;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACxB,CAAA;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,GAAG,cAAc,CAAC,UAAU,CAAC,CA4DxE;AAED,MAAM,CAAC,OAAO,WAAW,KAAK,CAAC;IAC7B,KAAK,OAAO,GAAG;QACb,KAAK,EAAE,YAAY,CAAC,YAAY,CAAA;QAChC,SAAS,EAAE,GAAG,CAAA;QACd,WAAW,EAAE,MAAM,CAAA;QACnB,QAAQ,EAAE,MAAM,CAAA;QAChB,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,gBAAgB,KAAK,aAAa,CAAC,MAAM,CAAC,CAAC,CAAA;QACvF,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACnC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAA;KACjC,CAAA;CACF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,QAAQ,CAQrE;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,CAAC,OAAO,CAcjE;AAED,MAAM,CAAC,OAAO,WAAW,WAAW,CAAC;IACnC,KAAK,OAAO,GAAG;QACb,WAAW,EAAE,MAAM,CAAA;QACnB,SAAS,EAAE,GAAG,CAAA;QACd,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;CACF;AAoED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAGzD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAuB,WAAW,CAChC,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE,WAAW,CAAC,OAAO,GAC5B,cAAc,CAAC,MAAM,CAAC,CAsCxB;AAED,MAAM,CAAC,OAAO,WAAW,WAAW,CAAC;IACnC,KAAK,OAAO,GAAG;QACb,6EAA6E;QAC7E,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,SAAS,CAAA;KAC/C,CAAA;CACF"}
|
|
@@ -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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"}
|