mppx 0.6.30 → 0.7.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/CHANGELOG.md +25 -0
- package/dist/Challenge.d.ts.map +1 -1
- package/dist/Challenge.js +9 -7
- package/dist/Challenge.js.map +1 -1
- package/dist/Constants.d.ts +46 -0
- package/dist/Constants.d.ts.map +1 -0
- package/dist/Constants.js +46 -0
- package/dist/Constants.js.map +1 -0
- package/dist/Credential.d.ts.map +1 -1
- package/dist/Credential.js +5 -4
- package/dist/Credential.js.map +1 -1
- package/dist/Method.d.ts +32 -4
- package/dist/Method.d.ts.map +1 -1
- package/dist/Method.js +5 -2
- package/dist/Method.js.map +1 -1
- package/dist/Receipt.d.ts.map +1 -1
- package/dist/Receipt.js +3 -2
- package/dist/Receipt.js.map +1 -1
- package/dist/cli/cli.d.ts.map +1 -1
- package/dist/cli/cli.js +19 -11
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/plugins/tempo.d.ts.map +1 -1
- package/dist/cli/plugins/tempo.js +17 -6
- package/dist/cli/plugins/tempo.js.map +1 -1
- package/dist/cli/utils.d.ts +5 -0
- package/dist/cli/utils.d.ts.map +1 -1
- package/dist/cli/utils.js +10 -0
- package/dist/cli/utils.js.map +1 -1
- package/dist/client/Methods.d.ts +5 -2
- package/dist/client/Methods.d.ts.map +1 -1
- package/dist/client/Methods.js +5 -2
- package/dist/client/Methods.js.map +1 -1
- package/dist/client/Transport.d.ts.map +1 -1
- package/dist/client/Transport.js +4 -5
- package/dist/client/Transport.js.map +1 -1
- package/dist/client/index.d.ts +2 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +2 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal/Fetch.d.ts.map +1 -1
- package/dist/client/internal/Fetch.js +14 -6
- package/dist/client/internal/Fetch.js.map +1 -1
- package/dist/evm/server/Methods.d.ts +1 -1
- package/dist/evm/server/Methods.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/internal/AcceptPayment.d.ts +3 -0
- package/dist/internal/AcceptPayment.d.ts.map +1 -1
- package/dist/internal/AcceptPayment.js +15 -11
- package/dist/internal/AcceptPayment.js.map +1 -1
- package/dist/mcp-sdk/client/McpClient.d.ts +12 -5
- package/dist/mcp-sdk/client/McpClient.d.ts.map +1 -1
- package/dist/mcp-sdk/client/McpClient.js +55 -42
- package/dist/mcp-sdk/client/McpClient.js.map +1 -1
- package/dist/server/Mppx.d.ts +11 -3
- package/dist/server/Mppx.d.ts.map +1 -1
- package/dist/server/Mppx.js +76 -27
- package/dist/server/Mppx.js.map +1 -1
- package/dist/server/Request.js +24 -10
- package/dist/server/Request.js.map +1 -1
- package/dist/server/Response.d.ts.map +1 -1
- package/dist/server/Response.js +2 -1
- package/dist/server/Response.js.map +1 -1
- package/dist/server/Transport.d.ts.map +1 -1
- package/dist/server/Transport.js +4 -3
- package/dist/server/Transport.js.map +1 -1
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -0
- package/dist/server/index.js.map +1 -1
- package/dist/stripe/client/Charge.d.ts +1 -1
- package/dist/stripe/client/Charge.d.ts.map +1 -1
- package/dist/stripe/client/Charge.js +3 -1
- package/dist/stripe/client/Charge.js.map +1 -1
- package/dist/stripe/server/Charge.d.ts +1 -1
- package/dist/stripe/server/Charge.d.ts.map +1 -1
- package/dist/stripe/server/Charge.js +9 -2
- package/dist/stripe/server/Charge.js.map +1 -1
- package/dist/stripe/server/Methods.d.ts +1 -1
- package/dist/stripe/server/Methods.d.ts.map +1 -1
- package/dist/stripe/server/internal/html.gen.d.ts +1 -1
- package/dist/stripe/server/internal/html.gen.d.ts.map +1 -1
- package/dist/stripe/server/internal/html.gen.js +1 -1
- package/dist/stripe/server/internal/html.gen.js.map +1 -1
- package/dist/tempo/Methods.d.ts +18 -0
- package/dist/tempo/Methods.d.ts.map +1 -1
- package/dist/tempo/Methods.js +16 -1
- package/dist/tempo/Methods.js.map +1 -1
- package/dist/tempo/client/Charge.d.ts +6 -0
- package/dist/tempo/client/Charge.d.ts.map +1 -1
- package/dist/tempo/client/Charge.js +9 -2
- package/dist/tempo/client/Charge.js.map +1 -1
- package/dist/tempo/client/Methods.d.ts +36 -7
- package/dist/tempo/client/Methods.d.ts.map +1 -1
- package/dist/tempo/client/Methods.js +12 -5
- package/dist/tempo/client/Methods.js.map +1 -1
- package/dist/tempo/client/index.d.ts +7 -4
- package/dist/tempo/client/index.d.ts.map +1 -1
- package/dist/tempo/client/index.js +5 -3
- package/dist/tempo/client/index.js.map +1 -1
- package/dist/tempo/index.d.ts +1 -0
- package/dist/tempo/index.d.ts.map +1 -1
- package/dist/tempo/index.js +1 -0
- package/dist/tempo/index.js.map +1 -1
- package/dist/tempo/internal/fee-payer.d.ts +21 -1
- package/dist/tempo/internal/fee-payer.d.ts.map +1 -1
- package/dist/tempo/internal/fee-payer.js +109 -4
- package/dist/tempo/internal/fee-payer.js.map +1 -1
- package/dist/tempo/{client → legacy/client}/ChannelOps.d.ts +19 -6
- package/dist/tempo/legacy/client/ChannelOps.d.ts.map +1 -0
- package/dist/tempo/{client → legacy/client}/ChannelOps.js +9 -3
- package/dist/tempo/legacy/client/ChannelOps.js.map +1 -0
- package/dist/tempo/{client → legacy/client}/Session.d.ts +23 -4
- package/dist/tempo/legacy/client/Session.d.ts.map +1 -0
- package/dist/tempo/{client → legacy/client}/Session.js +14 -7
- package/dist/tempo/legacy/client/Session.js.map +1 -0
- package/dist/tempo/{client → legacy/client}/SessionManager.d.ts +20 -5
- package/dist/tempo/legacy/client/SessionManager.d.ts.map +1 -0
- package/dist/tempo/{client → legacy/client}/SessionManager.js +20 -16
- package/dist/tempo/legacy/client/SessionManager.js.map +1 -0
- package/dist/tempo/legacy/client/index.d.ts +7 -0
- package/dist/tempo/legacy/client/index.d.ts.map +1 -0
- package/dist/tempo/legacy/client/index.js +5 -0
- package/dist/tempo/legacy/client/index.js.map +1 -0
- package/dist/tempo/legacy/index.d.ts +7 -0
- package/dist/tempo/legacy/index.d.ts.map +1 -0
- package/dist/tempo/legacy/index.js +7 -0
- package/dist/tempo/legacy/index.js.map +1 -0
- package/dist/tempo/{server → legacy/server}/Session.d.ts +28 -11
- package/dist/tempo/legacy/server/Session.d.ts.map +1 -0
- package/dist/tempo/{server → legacy/server}/Session.js +28 -23
- package/dist/tempo/legacy/server/Session.js.map +1 -0
- package/dist/tempo/legacy/server/index.d.ts +5 -0
- package/dist/tempo/legacy/server/index.d.ts.map +1 -0
- package/dist/tempo/legacy/server/index.js +5 -0
- package/dist/tempo/legacy/server/index.js.map +1 -0
- package/dist/tempo/{session → legacy/session}/Chain.d.ts +30 -23
- package/dist/tempo/legacy/session/Chain.d.ts.map +1 -0
- package/dist/tempo/{session → legacy/session}/Chain.js +12 -11
- package/dist/tempo/legacy/session/Chain.js.map +1 -0
- package/dist/tempo/{session → legacy/session}/Channel.d.ts +1 -0
- package/dist/tempo/legacy/session/Channel.d.ts.map +1 -0
- package/dist/tempo/legacy/session/Channel.js.map +1 -0
- package/dist/tempo/legacy/session/ChannelStore.d.ts +22 -0
- package/dist/tempo/legacy/session/ChannelStore.d.ts.map +1 -0
- package/dist/tempo/legacy/session/ChannelStore.js +6 -0
- package/dist/tempo/legacy/session/ChannelStore.js.map +1 -0
- package/dist/tempo/legacy/session/Types.d.ts +73 -0
- package/dist/tempo/legacy/session/Types.d.ts.map +1 -0
- package/dist/tempo/legacy/session/Types.js.map +1 -0
- package/dist/tempo/{session → legacy/session}/Voucher.d.ts +4 -4
- package/dist/tempo/legacy/session/Voucher.d.ts.map +1 -0
- package/dist/tempo/{session → legacy/session}/Voucher.js +1 -1
- package/dist/tempo/legacy/session/Voucher.js.map +1 -0
- package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts +1 -0
- package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts.map +1 -1
- package/dist/tempo/{session → legacy/session}/escrow.abi.js +1 -0
- package/dist/tempo/legacy/session/escrow.abi.js.map +1 -0
- package/dist/tempo/legacy/session/index.d.ts +9 -0
- package/dist/tempo/legacy/session/index.d.ts.map +1 -0
- package/dist/tempo/legacy/session/index.js +9 -0
- package/dist/tempo/legacy/session/index.js.map +1 -0
- package/dist/tempo/server/Charge.d.ts +1 -1
- package/dist/tempo/server/Charge.d.ts.map +1 -1
- package/dist/tempo/server/Charge.js +13 -16
- package/dist/tempo/server/Charge.js.map +1 -1
- package/dist/tempo/server/Methods.d.ts +63 -6
- package/dist/tempo/server/Methods.d.ts.map +1 -1
- package/dist/tempo/server/Methods.js +36 -8
- package/dist/tempo/server/Methods.js.map +1 -1
- package/dist/tempo/server/Subscription.d.ts +1 -1
- package/dist/tempo/server/Subscription.d.ts.map +1 -1
- package/dist/tempo/server/index.d.ts +6 -5
- package/dist/tempo/server/index.d.ts.map +1 -1
- package/dist/tempo/server/index.js +5 -5
- package/dist/tempo/server/index.js.map +1 -1
- package/dist/tempo/server/internal/html.gen.d.ts +1 -1
- package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
- package/dist/tempo/server/internal/html.gen.js +1 -1
- package/dist/tempo/server/internal/html.gen.js.map +1 -1
- package/dist/tempo/server/internal/request-body.d.ts +7 -2
- package/dist/tempo/server/internal/request-body.d.ts.map +1 -1
- package/dist/tempo/server/internal/request-body.js +20 -3
- package/dist/tempo/server/internal/request-body.js.map +1 -1
- package/dist/tempo/server/internal/transport.d.ts +8 -4
- package/dist/tempo/server/internal/transport.d.ts.map +1 -1
- package/dist/tempo/server/internal/transport.js +8 -7
- package/dist/tempo/server/internal/transport.js.map +1 -1
- package/dist/tempo/session/Snapshot.d.ts +32 -0
- package/dist/tempo/session/Snapshot.d.ts.map +1 -0
- package/dist/tempo/session/Snapshot.js +37 -0
- package/dist/tempo/session/Snapshot.js.map +1 -0
- package/dist/tempo/session/client/ChannelOps.d.ts +82 -0
- package/dist/tempo/session/client/ChannelOps.d.ts.map +1 -0
- package/dist/tempo/session/client/ChannelOps.js +204 -0
- package/dist/tempo/session/client/ChannelOps.js.map +1 -0
- package/dist/tempo/session/client/CredentialState.d.ts +262 -0
- package/dist/tempo/session/client/CredentialState.d.ts.map +1 -0
- package/dist/tempo/session/client/CredentialState.js +417 -0
- package/dist/tempo/session/client/CredentialState.js.map +1 -0
- package/dist/tempo/session/client/ReceiptCoordinator.d.ts +26 -0
- package/dist/tempo/session/client/ReceiptCoordinator.d.ts.map +1 -0
- package/dist/tempo/session/client/ReceiptCoordinator.js +61 -0
- package/dist/tempo/session/client/ReceiptCoordinator.js.map +1 -0
- package/dist/tempo/session/client/Runtime.d.ts +464 -0
- package/dist/tempo/session/client/Runtime.d.ts.map +1 -0
- package/dist/tempo/session/client/Runtime.js +499 -0
- package/dist/tempo/session/client/Runtime.js.map +1 -0
- package/dist/tempo/session/client/Session.d.ts +132 -0
- package/dist/tempo/session/client/Session.d.ts.map +1 -0
- package/dist/tempo/session/client/Session.js +55 -0
- package/dist/tempo/session/client/Session.js.map +1 -0
- package/dist/tempo/session/client/SessionManager.d.ts +120 -0
- package/dist/tempo/session/client/SessionManager.d.ts.map +1 -0
- package/dist/tempo/session/client/SessionManager.js +627 -0
- package/dist/tempo/session/client/SessionManager.js.map +1 -0
- package/dist/tempo/session/client/Transports.d.ts +449 -0
- package/dist/tempo/session/client/Transports.d.ts.map +1 -0
- package/dist/tempo/session/client/Transports.js +721 -0
- package/dist/tempo/session/client/Transports.js.map +1 -0
- package/dist/tempo/session/client/index.d.ts +12 -0
- package/dist/tempo/session/client/index.d.ts.map +1 -0
- package/dist/tempo/session/client/index.js +5 -0
- package/dist/tempo/session/client/index.js.map +1 -0
- package/dist/tempo/session/index.d.ts +7 -8
- package/dist/tempo/session/index.d.ts.map +1 -1
- package/dist/tempo/session/index.js +7 -8
- package/dist/tempo/session/index.js.map +1 -1
- package/dist/tempo/session/precompile/Chain.d.ts +319 -0
- package/dist/tempo/session/precompile/Chain.d.ts.map +1 -0
- package/dist/tempo/session/precompile/Chain.js +492 -0
- package/dist/tempo/session/precompile/Chain.js.map +1 -0
- package/dist/tempo/session/precompile/Channel.d.ts +46 -0
- package/dist/tempo/session/precompile/Channel.d.ts.map +1 -0
- package/dist/tempo/session/precompile/Channel.js +56 -0
- package/dist/tempo/session/precompile/Channel.js.map +1 -0
- package/dist/tempo/session/precompile/Protocol.d.ts +308 -0
- package/dist/tempo/session/precompile/Protocol.d.ts.map +1 -0
- package/dist/tempo/session/precompile/Protocol.js +264 -0
- package/dist/tempo/session/precompile/Protocol.js.map +1 -0
- package/dist/tempo/session/precompile/Voucher.d.ts +40 -0
- package/dist/tempo/session/precompile/Voucher.d.ts.map +1 -0
- package/dist/tempo/session/precompile/Voucher.js +126 -0
- package/dist/tempo/session/precompile/Voucher.js.map +1 -0
- package/dist/tempo/session/precompile/escrow.abi.d.ts +522 -0
- package/dist/tempo/session/precompile/escrow.abi.d.ts.map +1 -0
- package/dist/tempo/session/precompile/escrow.abi.js +224 -0
- package/dist/tempo/session/precompile/escrow.abi.js.map +1 -0
- package/dist/tempo/session/precompile/index.d.ts +24 -0
- package/dist/tempo/session/precompile/index.d.ts.map +1 -0
- package/dist/tempo/session/precompile/index.js +22 -0
- package/dist/tempo/session/precompile/index.js.map +1 -0
- package/dist/tempo/session/server/ChannelOps.d.ts +56 -0
- package/dist/tempo/session/server/ChannelOps.d.ts.map +1 -0
- package/dist/tempo/session/server/ChannelOps.js +91 -0
- package/dist/tempo/session/server/ChannelOps.js.map +1 -0
- package/dist/tempo/session/server/ChannelStore.d.ts +347 -0
- package/dist/tempo/session/server/ChannelStore.d.ts.map +1 -0
- package/dist/tempo/session/server/ChannelStore.js +404 -0
- package/dist/tempo/session/server/ChannelStore.js.map +1 -0
- package/dist/tempo/session/server/CredentialVerification.d.ts +85 -0
- package/dist/tempo/session/server/CredentialVerification.d.ts.map +1 -0
- package/dist/tempo/session/server/CredentialVerification.js +494 -0
- package/dist/tempo/session/server/CredentialVerification.js.map +1 -0
- package/dist/tempo/session/server/MeteredStream.d.ts +40 -0
- package/dist/tempo/session/server/MeteredStream.d.ts.map +1 -0
- package/dist/tempo/session/server/MeteredStream.js +42 -0
- package/dist/tempo/session/server/MeteredStream.js.map +1 -0
- package/dist/tempo/session/server/RequestState.d.ts +208 -0
- package/dist/tempo/session/server/RequestState.d.ts.map +1 -0
- package/dist/tempo/session/server/RequestState.js +252 -0
- package/dist/tempo/session/server/RequestState.js.map +1 -0
- package/dist/tempo/session/server/Session.d.ts +169 -0
- package/dist/tempo/session/server/Session.d.ts.map +1 -0
- package/dist/tempo/session/server/Session.js +351 -0
- package/dist/tempo/session/server/Session.js.map +1 -0
- package/dist/tempo/session/server/Settlement.d.ts +185 -0
- package/dist/tempo/session/server/Settlement.d.ts.map +1 -0
- package/dist/tempo/session/server/Settlement.js +250 -0
- package/dist/tempo/session/server/Settlement.js.map +1 -0
- package/dist/tempo/session/{Sse.d.ts → server/Sse.d.ts} +9 -56
- package/dist/tempo/session/server/Sse.d.ts.map +1 -0
- package/dist/tempo/session/server/Sse.js +184 -0
- package/dist/tempo/session/server/Sse.js.map +1 -0
- package/dist/tempo/session/server/Transports.d.ts +89 -0
- package/dist/tempo/session/server/Transports.d.ts.map +1 -0
- package/dist/tempo/session/server/Transports.js +149 -0
- package/dist/tempo/session/server/Transports.js.map +1 -0
- package/dist/tempo/session/server/Ws.d.ts +48 -0
- package/dist/tempo/session/server/Ws.d.ts.map +1 -0
- package/dist/tempo/session/server/Ws.js +244 -0
- package/dist/tempo/session/server/Ws.js.map +1 -0
- package/dist/tempo/session/server/index.d.ts +4 -0
- package/dist/tempo/session/server/index.d.ts.map +1 -0
- package/dist/tempo/session/server/index.js +2 -0
- package/dist/tempo/session/server/index.js.map +1 -0
- package/package.json +8 -3
- package/src/Challenge.ts +9 -7
- package/src/Constants.ts +58 -0
- package/src/Credential.ts +5 -4
- package/src/Method.ts +46 -5
- package/src/Receipt.ts +3 -2
- package/src/cli/cli.test.ts +23 -28
- package/src/cli/cli.ts +23 -10
- package/src/cli/mcp.test.ts +21 -7
- package/src/cli/plugins/tempo.ts +21 -8
- package/src/cli/utils.test.ts +25 -1
- package/src/cli/utils.ts +10 -0
- package/src/client/Methods.ts +5 -2
- package/src/client/Mppx.test-d.ts +10 -0
- package/src/client/Mppx.test.ts +75 -0
- package/src/client/Transport.ts +4 -5
- package/src/client/index.ts +11 -1
- package/src/client/internal/Fetch.test.ts +29 -4
- package/src/client/internal/Fetch.ts +17 -5
- package/src/env.d.ts +1 -1
- package/src/index.ts +1 -0
- package/src/internal/AcceptPayment.test.ts +61 -0
- package/src/internal/AcceptPayment.ts +21 -14
- package/src/mcp-sdk/client/McpClient.integration.test.ts +8 -7
- package/src/mcp-sdk/client/McpClient.test-d.ts +7 -0
- package/src/mcp-sdk/client/McpClient.ts +99 -67
- package/src/mcp-sdk/client/McpClient.unit.test.ts +131 -0
- package/src/middlewares/elysia.test.ts +8 -4
- package/src/middlewares/express.test.ts +8 -4
- package/src/middlewares/hono.test.ts +4 -4
- package/src/middlewares/nextjs.test.ts +8 -4
- package/src/proxy/Proxy.test.ts +8 -8
- package/src/server/Mppx.test-d.ts +54 -0
- package/src/server/Mppx.test.ts +274 -7
- package/src/server/Mppx.ts +487 -406
- package/src/server/Request.test.ts +81 -0
- package/src/server/Request.ts +23 -9
- package/src/server/Response.ts +2 -1
- package/src/server/Transport.ts +4 -3
- package/src/server/index.ts +1 -0
- package/src/stripe/client/Charge.test.ts +20 -5
- package/src/stripe/client/Charge.ts +6 -2
- package/src/stripe/server/Charge.test.ts +114 -1
- package/src/stripe/server/Charge.ts +13 -2
- package/src/stripe/server/internal/html/package.json +1 -1
- package/src/stripe/server/internal/html.gen.ts +1 -1
- package/src/tempo/AccessKeyAuthorization.test.ts +4 -94
- package/src/tempo/Methods.test.ts +45 -17
- package/src/tempo/Methods.ts +22 -0
- package/src/tempo/PublicExports.test-d.ts +105 -0
- package/src/tempo/client/Charge.test.ts +85 -0
- package/src/tempo/client/Charge.ts +19 -2
- package/src/tempo/client/Methods.ts +18 -6
- package/src/tempo/client/index.ts +15 -4
- package/src/tempo/index.ts +1 -0
- package/src/tempo/internal/fee-payer.test.ts +241 -17
- package/src/tempo/internal/fee-payer.ts +150 -4
- package/src/tempo/internal/fee-token.test.ts +14 -9
- package/src/tempo/legacy/AccessKeyAuthorization.test.ts +162 -0
- package/src/tempo/legacy/README.md +9 -0
- package/src/tempo/{client → legacy/client}/ChannelOps.test.ts +6 -7
- package/src/tempo/{client → legacy/client}/ChannelOps.ts +22 -9
- package/src/tempo/{client → legacy/client}/Session.test.ts +51 -9
- package/src/tempo/{client → legacy/client}/Session.ts +25 -11
- package/src/tempo/{client → legacy/client}/SessionManager.test.ts +81 -9
- package/src/tempo/{client → legacy/client}/SessionManager.ts +41 -20
- package/src/tempo/legacy/client/index.ts +6 -0
- package/src/tempo/legacy/index.ts +6 -0
- package/src/tempo/{server → legacy/server}/Session.test.ts +162 -63
- package/src/tempo/{server → legacy/server}/Session.ts +49 -37
- package/src/tempo/legacy/server/index.ts +4 -0
- package/src/tempo/{session → legacy/session}/Chain.test.ts +3 -4
- package/src/tempo/{session → legacy/session}/Chain.ts +94 -63
- package/src/tempo/{session → legacy/session}/Channel.ts +1 -0
- package/src/tempo/legacy/session/ChannelStore.test.ts +58 -0
- package/src/tempo/legacy/session/ChannelStore.ts +39 -0
- package/src/tempo/legacy/session/Types.ts +91 -0
- package/src/tempo/{session → legacy/session}/Voucher.ts +12 -8
- package/src/tempo/{session → legacy/session}/escrow.abi.ts +1 -0
- package/src/tempo/legacy/session/index.ts +8 -0
- package/src/tempo/server/AtomicStore.test-d.ts +16 -11
- package/src/tempo/server/Charge.test.ts +92 -14
- package/src/tempo/server/Charge.ts +18 -16
- package/src/tempo/server/Methods.ts +54 -8
- package/src/tempo/server/Sse.test.ts +2 -2
- package/src/tempo/server/index.ts +6 -5
- package/src/tempo/server/internal/html/package.json +1 -1
- package/src/tempo/server/internal/html.gen.ts +1 -1
- package/src/tempo/server/internal/request-body.test.ts +37 -4
- package/src/tempo/server/internal/request-body.ts +25 -6
- package/src/tempo/server/internal/transport.test.ts +4 -4
- package/src/tempo/server/internal/transport.ts +19 -10
- package/src/tempo/session/Snapshot.test.ts +41 -0
- package/src/tempo/session/Snapshot.ts +74 -0
- package/src/tempo/session/client/ChannelOps.test.ts +163 -0
- package/src/tempo/session/client/ChannelOps.ts +344 -0
- package/src/tempo/session/client/CredentialState.test.ts +645 -0
- package/src/tempo/session/client/CredentialState.ts +814 -0
- package/src/tempo/session/client/ReceiptCoordinator.ts +95 -0
- package/src/tempo/session/client/Runtime.test.ts +1092 -0
- package/src/tempo/session/client/Runtime.ts +986 -0
- package/src/tempo/session/client/Session.test.ts +734 -0
- package/src/tempo/session/client/Session.ts +97 -0
- package/src/tempo/session/client/SessionManager.test.ts +1308 -0
- package/src/tempo/session/client/SessionManager.ts +845 -0
- package/src/tempo/session/client/Transports.test.ts +837 -0
- package/src/tempo/session/client/Transports.ts +1292 -0
- package/src/tempo/session/client/index.ts +37 -0
- package/src/tempo/session/index.ts +7 -8
- package/src/tempo/session/precompile/Chain.integration.test.ts +321 -0
- package/src/tempo/session/precompile/Chain.test.ts +1258 -0
- package/src/tempo/session/precompile/Chain.ts +979 -0
- package/src/tempo/session/precompile/Channel.test.ts +138 -0
- package/src/tempo/session/precompile/Channel.ts +103 -0
- package/src/tempo/session/precompile/Protocol.test.ts +358 -0
- package/src/tempo/session/precompile/Protocol.ts +520 -0
- package/src/tempo/session/precompile/Voucher.test.ts +316 -0
- package/src/tempo/session/precompile/Voucher.ts +160 -0
- package/src/tempo/session/precompile/escrow.abi.ts +226 -0
- package/src/tempo/session/precompile/index.ts +33 -0
- package/src/tempo/session/server/ChannelOps.test.ts +129 -0
- package/src/tempo/session/server/ChannelOps.ts +157 -0
- package/src/tempo/session/{ChannelStore.test.ts → server/ChannelStore.test.ts} +536 -29
- package/src/tempo/session/server/ChannelStore.ts +835 -0
- package/src/tempo/session/server/CredentialVerification.test.ts +146 -0
- package/src/tempo/session/server/CredentialVerification.ts +710 -0
- package/src/tempo/session/server/MeteredStream.ts +88 -0
- package/src/tempo/session/server/RequestState.test.ts +531 -0
- package/src/tempo/session/server/RequestState.ts +499 -0
- package/src/tempo/session/server/Session.integration.test.ts +444 -0
- package/src/tempo/session/server/Session.test.ts +3253 -0
- package/src/tempo/session/server/Session.ts +543 -0
- package/src/tempo/session/server/Settlement.test.ts +242 -0
- package/src/tempo/session/server/Settlement.ts +470 -0
- package/src/tempo/session/{Sse.test.ts → server/Sse.test.ts} +37 -3
- package/src/tempo/session/server/Sse.ts +256 -0
- package/src/tempo/session/server/Transports.test.ts +346 -0
- package/src/tempo/session/server/Transports.ts +255 -0
- package/src/tempo/session/{Ws.test.ts → server/Ws.test.ts} +4 -4
- package/src/tempo/session/server/Ws.ts +384 -0
- package/src/tempo/session/server/index.ts +8 -0
- package/dist/tempo/client/ChannelOps.d.ts.map +0 -1
- package/dist/tempo/client/ChannelOps.js.map +0 -1
- package/dist/tempo/client/Session.d.ts.map +0 -1
- package/dist/tempo/client/Session.js.map +0 -1
- package/dist/tempo/client/SessionManager.d.ts.map +0 -1
- package/dist/tempo/client/SessionManager.js.map +0 -1
- package/dist/tempo/server/Session.d.ts.map +0 -1
- package/dist/tempo/server/Session.js.map +0 -1
- package/dist/tempo/session/Chain.d.ts.map +0 -1
- package/dist/tempo/session/Chain.js.map +0 -1
- package/dist/tempo/session/Channel.d.ts.map +0 -1
- package/dist/tempo/session/Channel.js.map +0 -1
- package/dist/tempo/session/ChannelStore.d.ts +0 -117
- package/dist/tempo/session/ChannelStore.d.ts.map +0 -1
- package/dist/tempo/session/ChannelStore.js +0 -172
- package/dist/tempo/session/ChannelStore.js.map +0 -1
- package/dist/tempo/session/Receipt.d.ts +0 -22
- package/dist/tempo/session/Receipt.d.ts.map +0 -1
- package/dist/tempo/session/Receipt.js +0 -34
- package/dist/tempo/session/Receipt.js.map +0 -1
- package/dist/tempo/session/Sse.d.ts.map +0 -1
- package/dist/tempo/session/Sse.js +0 -363
- package/dist/tempo/session/Sse.js.map +0 -1
- package/dist/tempo/session/Types.d.ts +0 -78
- package/dist/tempo/session/Types.d.ts.map +0 -1
- package/dist/tempo/session/Types.js.map +0 -1
- package/dist/tempo/session/Voucher.d.ts.map +0 -1
- package/dist/tempo/session/Voucher.js.map +0 -1
- package/dist/tempo/session/Ws.d.ts +0 -87
- package/dist/tempo/session/Ws.d.ts.map +0 -1
- package/dist/tempo/session/Ws.js +0 -443
- package/dist/tempo/session/Ws.js.map +0 -1
- package/dist/tempo/session/escrow.abi.js.map +0 -1
- package/src/tempo/session/ChannelStore.ts +0 -308
- package/src/tempo/session/Receipt.test.ts +0 -89
- package/src/tempo/session/Receipt.ts +0 -46
- package/src/tempo/session/Sse.ts +0 -462
- package/src/tempo/session/Types.ts +0 -86
- package/src/tempo/session/Ws.ts +0 -576
- /package/dist/tempo/{session → legacy/session}/Channel.js +0 -0
- /package/dist/tempo/{session → legacy/session}/Types.js +0 -0
- /package/src/tempo/{session → legacy/session}/Channel.test.ts +0 -0
- /package/src/tempo/{session → legacy/session}/Voucher.test.ts +0 -0
- /package/src/tempo/session/{Sse.fuzz.test.ts → server/Sse.fuzz.test.ts} +0 -0
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import * as Constants from '../../../Constants.js';
|
|
2
|
+
import * as Credential from '../../../Credential.js';
|
|
3
|
+
import { createSessionReceipt, extractData, formatMessageEvent, formatNeedVoucherEvent, formatReceiptEvent, readSessionChallengeAmount, requireSessionCredentialContext, } from '../precompile/Protocol.js';
|
|
4
|
+
import { meterIterable } from './MeteredStream.js';
|
|
5
|
+
/**
|
|
6
|
+
* SSE (Server-Sent Events) utilities for metered streaming payments.
|
|
7
|
+
*
|
|
8
|
+
* Provides event formatting/parsing, balance polling, the core
|
|
9
|
+
* `serve()` loop that meters an async iterable into a ReadableStream
|
|
10
|
+
* of SSE events, and helpers (`toResponse`, `fromRequest`) for
|
|
11
|
+
* building HTTP responses from the stream.
|
|
12
|
+
*/
|
|
13
|
+
export { extractData, formatMessageEvent, formatNeedVoucherEvent, formatReceiptEvent, parseEvent, readSessionChallengeAmount, requireSessionCredentialContext, } from '../precompile/Protocol.js';
|
|
14
|
+
/**
|
|
15
|
+
* Wrap an async iterable with payment metering, producing an SSE stream.
|
|
16
|
+
*
|
|
17
|
+
* `generate` may be either:
|
|
18
|
+
* - An `AsyncIterable<string>` — each yielded value is automatically charged
|
|
19
|
+
* (one `tickCost` per value).
|
|
20
|
+
* - A callback `(stream: SessionController) => AsyncIterable<string>` — the
|
|
21
|
+
* generator controls when charges happen by calling `stream.charge()`.
|
|
22
|
+
*
|
|
23
|
+
* For each emitted value the stream:
|
|
24
|
+
* 1. Reserves `tickCost` from the channel's available voucher headroom
|
|
25
|
+
* (auto or manual).
|
|
26
|
+
* 2. If balance is sufficient, emits `event: message` with the value.
|
|
27
|
+
* 3. If balance is exhausted, emits `event: payment-need-voucher`
|
|
28
|
+
* and polls store until the client tops up the channel.
|
|
29
|
+
* 4. Commits the reserved charge immediately before the chunk is emitted.
|
|
30
|
+
* 5. On generator completion, emits a final `event: payment-receipt`.
|
|
31
|
+
*
|
|
32
|
+
* Returns a `ReadableStream<Uint8Array>` suitable for use as an HTTP response body.
|
|
33
|
+
*/
|
|
34
|
+
export function serve(options) {
|
|
35
|
+
const { store, channelId, challengeId, tickCost, generate, pollIntervalMs = 100, signal, } = options;
|
|
36
|
+
const encoder = new TextEncoder();
|
|
37
|
+
return new ReadableStream({
|
|
38
|
+
async start(controller) {
|
|
39
|
+
const aborted = () => signal?.aborted ?? false;
|
|
40
|
+
const emit = (event) => controller.enqueue(encoder.encode(event));
|
|
41
|
+
try {
|
|
42
|
+
for await (const value of meterIterable({
|
|
43
|
+
store,
|
|
44
|
+
channelId,
|
|
45
|
+
tickCost,
|
|
46
|
+
generate,
|
|
47
|
+
pollIntervalMs,
|
|
48
|
+
prepaidUnits: options.prepaidUnits,
|
|
49
|
+
signal,
|
|
50
|
+
emitNeedVoucher: emit,
|
|
51
|
+
formatNeedVoucher: formatNeedVoucherEvent,
|
|
52
|
+
})) {
|
|
53
|
+
if (aborted())
|
|
54
|
+
break;
|
|
55
|
+
controller.enqueue(encoder.encode(formatMessageEvent(value)));
|
|
56
|
+
}
|
|
57
|
+
if (!aborted()) {
|
|
58
|
+
const channel = await store.getChannel(channelId);
|
|
59
|
+
if (channel) {
|
|
60
|
+
const receipt = createSessionReceipt({
|
|
61
|
+
challengeId,
|
|
62
|
+
channelId,
|
|
63
|
+
acceptedCumulative: channel.highestVoucherAmount,
|
|
64
|
+
spent: channel.spent,
|
|
65
|
+
units: channel.units,
|
|
66
|
+
});
|
|
67
|
+
controller.enqueue(encoder.encode(formatReceiptEvent(receipt)));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (e) {
|
|
72
|
+
if (!aborted())
|
|
73
|
+
controller.error(e);
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
controller.close();
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Wrap a `ReadableStream<Uint8Array>` (from {@link serve}) in an HTTP
|
|
83
|
+
* `Response` with the correct SSE headers.
|
|
84
|
+
*/
|
|
85
|
+
export function toResponse(body) {
|
|
86
|
+
return new Response(body, {
|
|
87
|
+
headers: {
|
|
88
|
+
'Cache-Control': 'no-cache, no-transform',
|
|
89
|
+
Connection: 'keep-alive',
|
|
90
|
+
'Content-Type': 'text/event-stream; charset=utf-8',
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Extract `channelId`, `challengeId`, and `tickCost` from a `Request`'s
|
|
96
|
+
* `Authorization: Payment …` header.
|
|
97
|
+
*
|
|
98
|
+
* This is a convenience for callers that receive a raw `Request` and need
|
|
99
|
+
* the parameters required by {@link serve}.
|
|
100
|
+
*/
|
|
101
|
+
export function fromRequest(request) {
|
|
102
|
+
const header = request.headers.get(Constants.Headers.authorization);
|
|
103
|
+
if (!header)
|
|
104
|
+
throw new Error('Missing Authorization header.');
|
|
105
|
+
const payment = Credential.extractPaymentScheme(header);
|
|
106
|
+
if (!payment)
|
|
107
|
+
throw new Error('Missing Payment credential in Authorization header.');
|
|
108
|
+
const credential = Credential.deserialize(payment);
|
|
109
|
+
const payload = requireSessionCredentialContext(credential.payload);
|
|
110
|
+
return {
|
|
111
|
+
challengeId: credential.challenge.id,
|
|
112
|
+
channelId: payload.channelId,
|
|
113
|
+
tickCost: readSessionChallengeAmount(credential.challenge),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Check whether a `Response` carries an SSE event stream.
|
|
118
|
+
*
|
|
119
|
+
* Returns `true` when the `Content-Type` header starts with
|
|
120
|
+
* `text/event-stream` (case-insensitive, ignoring charset params).
|
|
121
|
+
*/
|
|
122
|
+
export function isEventStream(response) {
|
|
123
|
+
const ct = response.headers.get('content-type');
|
|
124
|
+
return ct?.toLowerCase().startsWith('text/event-stream') ?? false;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Parse an SSE `Response` body into an async iterable of `data:` payloads.
|
|
128
|
+
*
|
|
129
|
+
* Yields the raw `data:` field content for each SSE event in the stream.
|
|
130
|
+
* Events whose data matches the `skip` predicate are silently dropped
|
|
131
|
+
* (e.g. `[DONE]` sentinels used by OpenAI-compatible APIs).
|
|
132
|
+
*
|
|
133
|
+
* Each yielded value typically becomes one charge tick when fed to
|
|
134
|
+
* {@link serve} via the SSE transport's auto-charge mode.
|
|
135
|
+
*
|
|
136
|
+
* @example
|
|
137
|
+
* ```ts
|
|
138
|
+
* const upstream = await fetch('https://api.example.com/stream')
|
|
139
|
+
* for await (const data of Sse.iterateData(upstream)) {
|
|
140
|
+
* console.log(data)
|
|
141
|
+
* }
|
|
142
|
+
* ```
|
|
143
|
+
*/
|
|
144
|
+
export async function* iterateData(response, options) {
|
|
145
|
+
const skip = options?.skip;
|
|
146
|
+
const body = response.body;
|
|
147
|
+
if (!body)
|
|
148
|
+
return;
|
|
149
|
+
const reader = body.getReader();
|
|
150
|
+
const decoder = new TextDecoder();
|
|
151
|
+
let buffer = '';
|
|
152
|
+
try {
|
|
153
|
+
while (true) {
|
|
154
|
+
const { value, done } = await reader.read();
|
|
155
|
+
if (done)
|
|
156
|
+
break;
|
|
157
|
+
buffer += decoder.decode(value, { stream: true });
|
|
158
|
+
// Split on double-newline SSE event boundaries.
|
|
159
|
+
const events = buffer.split('\n\n');
|
|
160
|
+
// Last element may be incomplete — keep in buffer.
|
|
161
|
+
buffer = events.pop() ?? '';
|
|
162
|
+
for (const event of events) {
|
|
163
|
+
if (!event.trim())
|
|
164
|
+
continue;
|
|
165
|
+
const data = extractData(event);
|
|
166
|
+
if (data === null)
|
|
167
|
+
continue;
|
|
168
|
+
if (skip?.(data))
|
|
169
|
+
continue;
|
|
170
|
+
yield data;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Flush remaining buffer.
|
|
174
|
+
if (buffer.trim()) {
|
|
175
|
+
const data = extractData(buffer);
|
|
176
|
+
if (data !== null && !skip?.(data))
|
|
177
|
+
yield data;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
finally {
|
|
181
|
+
reader.releaseLock();
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=Sse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Sse.js","sourceRoot":"","sources":["../../../../src/tempo/session/server/Sse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { Hex } from 'viem';
|
|
2
|
+
import type { NeedVoucherEvent } from '../precompile/Protocol.js';
|
|
3
|
+
import * as ChannelStore from './ChannelStore.js';
|
|
4
|
+
/** Parameters for reserving voucher headroom before emitting a stream item. */
|
|
5
|
+
export type ReserveChargeParameters = {
|
|
6
|
+
/** Amount required for the next stream item. */
|
|
7
|
+
amount: bigint;
|
|
8
|
+
/** Channel being metered. */
|
|
9
|
+
channelId: Hex;
|
|
10
|
+
/** Emits the transport-specific need-voucher frame. */
|
|
11
|
+
emit: (message: string) => void | Promise<void>;
|
|
12
|
+
/** Formats a transport-specific need-voucher frame. */
|
|
13
|
+
formatNeedVoucher(parameters: NeedVoucherEvent): string;
|
|
14
|
+
/** Store polling interval when `waitForUpdate` is unavailable. */
|
|
15
|
+
pollIntervalMs: number;
|
|
16
|
+
/** Amount already reserved but not yet committed by this stream loop. */
|
|
17
|
+
reservedAmount: bigint;
|
|
18
|
+
/** Optional abort signal for long waits. */
|
|
19
|
+
signal?: AbortSignal | undefined;
|
|
20
|
+
/** Channel store used for state reads and waits. */
|
|
21
|
+
store: ChannelStore.ChannelStore;
|
|
22
|
+
};
|
|
23
|
+
/** Parameters for committing previously reserved stream charges. */
|
|
24
|
+
export type CommitReservedChargesParameters = {
|
|
25
|
+
/** Reserved amount to commit. */
|
|
26
|
+
amount: bigint;
|
|
27
|
+
/** Channel being metered. */
|
|
28
|
+
channelId: Hex;
|
|
29
|
+
/** Channel store used for atomic updates. */
|
|
30
|
+
store: ChannelStore.ChannelStore;
|
|
31
|
+
/** Number of charge units to add. */
|
|
32
|
+
units: number;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Reserves voucher headroom for a future stream emission.
|
|
36
|
+
*
|
|
37
|
+
* If the channel lacks headroom, emits one need-voucher frame, then waits for
|
|
38
|
+
* a store update or polling interval until the accepted voucher covers both
|
|
39
|
+
* already-reserved charges and the next requested amount.
|
|
40
|
+
*/
|
|
41
|
+
export declare function reserveChargeOrWait(options: ReserveChargeParameters): Promise<void>;
|
|
42
|
+
/** Atomically commits previously reserved stream charges to channel spend and unit counters. */
|
|
43
|
+
export declare function commitReservedCharges(options: CommitReservedChargesParameters): Promise<void>;
|
|
44
|
+
/** Throws when a channel can no longer be used for streaming charges. */
|
|
45
|
+
export declare function throwIfChannelClosed(channel: ChannelStore.State): void;
|
|
46
|
+
/** Minimal socket event map supported by browser and Node-style WebSocket runtimes. */
|
|
47
|
+
export type SocketEventMap = {
|
|
48
|
+
close: Event | {
|
|
49
|
+
code?: number | undefined;
|
|
50
|
+
reason?: string | undefined;
|
|
51
|
+
type?: string;
|
|
52
|
+
};
|
|
53
|
+
error: Event | {
|
|
54
|
+
type?: string;
|
|
55
|
+
};
|
|
56
|
+
message: Event | {
|
|
57
|
+
data: unknown;
|
|
58
|
+
type?: string;
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
/** Socket event listener accepted by browser and Node-style runtimes. */
|
|
62
|
+
export type SocketEventListener<type extends keyof SocketEventMap> = ((event: SocketEventMap[type]) => void) | {
|
|
63
|
+
handleEvent(event: SocketEventMap[type]): void;
|
|
64
|
+
};
|
|
65
|
+
/** Minimal socket shape required by the session WebSocket adapter. */
|
|
66
|
+
export type Socket = {
|
|
67
|
+
close(code?: number, reason?: string): unknown;
|
|
68
|
+
send(data: string): unknown;
|
|
69
|
+
addEventListener?: <type extends keyof SocketEventMap>(type: type, listener: SocketEventListener<type>) => unknown;
|
|
70
|
+
removeEventListener?: <type extends keyof SocketEventMap>(type: type, listener: SocketEventListener<type>) => unknown;
|
|
71
|
+
on?: <type extends keyof SocketEventMap>(type: type, listener: (event: SocketEventMap[type]) => void) => unknown;
|
|
72
|
+
off?: <type extends keyof SocketEventMap>(type: type, listener: (event: SocketEventMap[type]) => void) => unknown;
|
|
73
|
+
};
|
|
74
|
+
/** Handlers for socket lifecycle and message events. */
|
|
75
|
+
export type SocketHandlers = {
|
|
76
|
+
/** Called when the socket closes. */
|
|
77
|
+
close(): void;
|
|
78
|
+
/** Called when the socket reports an error. */
|
|
79
|
+
error(): void;
|
|
80
|
+
/** Called with raw message payloads. */
|
|
81
|
+
message(payload: unknown): void;
|
|
82
|
+
};
|
|
83
|
+
/** Subscribes to browser or Node-style socket events and returns an unsubscribe callback. */
|
|
84
|
+
export declare function subscribe(socket: Socket, handlers: SocketHandlers): () => void;
|
|
85
|
+
/** Sends a text frame through sync or async socket implementations. */
|
|
86
|
+
export declare function send(socket: Socket, data: string): Promise<void>;
|
|
87
|
+
/** Converts socket message payloads into text frames when possible. */
|
|
88
|
+
export declare function toText(value: unknown): string | null;
|
|
89
|
+
//# sourceMappingURL=Transports.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Transports.d.ts","sourceRoot":"","sources":["../../../../src/tempo/session/server/Transports.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { ChannelClosedError } from '../../../Errors.js';
|
|
2
|
+
/**
|
|
3
|
+
* Reserves voucher headroom for a future stream emission.
|
|
4
|
+
*
|
|
5
|
+
* If the channel lacks headroom, emits one need-voucher frame, then waits for
|
|
6
|
+
* a store update or polling interval until the accepted voucher covers both
|
|
7
|
+
* already-reserved charges and the next requested amount.
|
|
8
|
+
*/
|
|
9
|
+
export async function reserveChargeOrWait(options) {
|
|
10
|
+
const { amount, channelId, emit, formatNeedVoucher, pollIntervalMs, reservedAmount, signal, store, } = options;
|
|
11
|
+
let channel = await store.getChannel(channelId);
|
|
12
|
+
if (!channel)
|
|
13
|
+
throw new Error('channel not found');
|
|
14
|
+
throwIfChannelClosed(channel);
|
|
15
|
+
const hasHeadroom = (state) => state.highestVoucherAmount - state.spent - reservedAmount >= amount;
|
|
16
|
+
if (hasHeadroom(channel))
|
|
17
|
+
return;
|
|
18
|
+
await Promise.resolve(emit(formatNeedVoucher({
|
|
19
|
+
channelId,
|
|
20
|
+
requiredCumulative: (channel.spent + reservedAmount + amount).toString(),
|
|
21
|
+
acceptedCumulative: channel.highestVoucherAmount.toString(),
|
|
22
|
+
deposit: channel.deposit.toString(),
|
|
23
|
+
})));
|
|
24
|
+
while (!hasHeadroom(channel)) {
|
|
25
|
+
await waitForUpdate(store, channelId, pollIntervalMs, signal);
|
|
26
|
+
channel = await store.getChannel(channelId);
|
|
27
|
+
if (!channel)
|
|
28
|
+
throw new Error('channel not found');
|
|
29
|
+
throwIfChannelClosed(channel);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** Atomically commits previously reserved stream charges to channel spend and unit counters. */
|
|
33
|
+
export async function commitReservedCharges(options) {
|
|
34
|
+
const { amount, channelId, store, units } = options;
|
|
35
|
+
if (amount === 0n || units === 0)
|
|
36
|
+
return;
|
|
37
|
+
let committed = false;
|
|
38
|
+
const channel = await store.updateChannel(channelId, (current) => {
|
|
39
|
+
if (!current)
|
|
40
|
+
return null;
|
|
41
|
+
if (current.finalized)
|
|
42
|
+
return current;
|
|
43
|
+
if (current.closeRequestedAt !== 0n)
|
|
44
|
+
return current;
|
|
45
|
+
if (current.highestVoucherAmount - current.spent < amount)
|
|
46
|
+
return current;
|
|
47
|
+
committed = true;
|
|
48
|
+
return {
|
|
49
|
+
...current,
|
|
50
|
+
spent: current.spent + amount,
|
|
51
|
+
units: current.units + units,
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
if (!channel)
|
|
55
|
+
throw new Error('channel not found');
|
|
56
|
+
throwIfChannelClosed(channel);
|
|
57
|
+
if (!committed)
|
|
58
|
+
throw new Error('reserved voucher coverage is no longer available');
|
|
59
|
+
}
|
|
60
|
+
/** Throws when a channel can no longer be used for streaming charges. */
|
|
61
|
+
export function throwIfChannelClosed(channel) {
|
|
62
|
+
if (channel.finalized)
|
|
63
|
+
throw new ChannelClosedError({ reason: 'channel is finalized' });
|
|
64
|
+
if (channel.closeRequestedAt !== 0n)
|
|
65
|
+
throw new ChannelClosedError({ reason: 'channel has a pending close request' });
|
|
66
|
+
}
|
|
67
|
+
async function waitForUpdate(store, channelId, pollIntervalMs, signal) {
|
|
68
|
+
throwIfAborted(signal);
|
|
69
|
+
if (store.waitForUpdate) {
|
|
70
|
+
await Promise.race([
|
|
71
|
+
store.waitForUpdate(channelId),
|
|
72
|
+
sleep(pollIntervalMs, signal),
|
|
73
|
+
...(signal ? [onceAborted(signal)] : []),
|
|
74
|
+
]);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
await sleep(pollIntervalMs, signal);
|
|
78
|
+
}
|
|
79
|
+
throwIfAborted(signal);
|
|
80
|
+
}
|
|
81
|
+
function sleep(ms, signal) {
|
|
82
|
+
return new Promise((resolve, reject) => {
|
|
83
|
+
const timeout = setTimeout(() => {
|
|
84
|
+
signal?.removeEventListener('abort', onAbort);
|
|
85
|
+
resolve();
|
|
86
|
+
}, ms);
|
|
87
|
+
const onAbort = () => {
|
|
88
|
+
clearTimeout(timeout);
|
|
89
|
+
reject(signal?.reason ?? new Error('aborted'));
|
|
90
|
+
};
|
|
91
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
function onceAborted(signal) {
|
|
95
|
+
return new Promise((_, reject) => {
|
|
96
|
+
if (signal.aborted) {
|
|
97
|
+
reject(signal.reason ?? new Error('aborted'));
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
signal.addEventListener('abort', () => reject(signal.reason ?? new Error('aborted')), {
|
|
101
|
+
once: true,
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
function throwIfAborted(signal) {
|
|
106
|
+
if (signal?.aborted)
|
|
107
|
+
throw signal.reason ?? new Error('aborted');
|
|
108
|
+
}
|
|
109
|
+
/** Subscribes to browser or Node-style socket events and returns an unsubscribe callback. */
|
|
110
|
+
export function subscribe(socket, handlers) {
|
|
111
|
+
if (socket.addEventListener && socket.removeEventListener) {
|
|
112
|
+
const onMessage = (event) => handlers.message('data' in event ? event.data : undefined);
|
|
113
|
+
socket.addEventListener('message', onMessage);
|
|
114
|
+
socket.addEventListener('close', handlers.close);
|
|
115
|
+
socket.addEventListener('error', handlers.error);
|
|
116
|
+
return () => {
|
|
117
|
+
socket.removeEventListener?.('message', onMessage);
|
|
118
|
+
socket.removeEventListener?.('close', handlers.close);
|
|
119
|
+
socket.removeEventListener?.('error', handlers.error);
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
if (socket.on && socket.off) {
|
|
123
|
+
const onMessage = (data) => handlers.message(data);
|
|
124
|
+
socket.on('message', onMessage);
|
|
125
|
+
socket.on('close', handlers.close);
|
|
126
|
+
socket.on('error', handlers.error);
|
|
127
|
+
return () => {
|
|
128
|
+
socket.off?.('message', onMessage);
|
|
129
|
+
socket.off?.('close', handlers.close);
|
|
130
|
+
socket.off?.('error', handlers.error);
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
throw new Error('unsupported websocket implementation');
|
|
134
|
+
}
|
|
135
|
+
/** Sends a text frame through sync or async socket implementations. */
|
|
136
|
+
export async function send(socket, data) {
|
|
137
|
+
await Promise.resolve(socket.send(data));
|
|
138
|
+
}
|
|
139
|
+
/** Converts socket message payloads into text frames when possible. */
|
|
140
|
+
export function toText(value) {
|
|
141
|
+
if (typeof value === 'string')
|
|
142
|
+
return value;
|
|
143
|
+
if (value instanceof ArrayBuffer)
|
|
144
|
+
return new TextDecoder().decode(value);
|
|
145
|
+
if (ArrayBuffer.isView(value))
|
|
146
|
+
return new TextDecoder().decode(value);
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=Transports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Transports.js","sourceRoot":"","sources":["../../../../src/tempo/session/server/Transports.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAoCvD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAAgC;IACxE,MAAM,EACJ,MAAM,EACN,SAAS,EACT,IAAI,EACJ,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,MAAM,EACN,KAAK,GACN,GAAG,OAAO,CAAA;IAEX,IAAI,OAAO,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;IAC/C,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;IAClD,oBAAoB,CAAC,OAAO,CAAC,CAAA;IAE7B,MAAM,WAAW,GAAG,CAAC,KAAyB,EAAE,EAAE,CAChD,KAAK,CAAC,oBAAoB,GAAG,KAAK,CAAC,KAAK,GAAG,cAAc,IAAI,MAAM,CAAA;IAErE,IAAI,WAAW,CAAC,OAAO,CAAC;QAAE,OAAM;IAEhC,MAAM,OAAO,CAAC,OAAO,CACnB,IAAI,CACF,iBAAiB,CAAC;QAChB,SAAS;QACT,kBAAkB,EAAE,CAAC,OAAO,CAAC,KAAK,GAAG,cAAc,GAAG,MAAM,CAAC,CAAC,QAAQ,EAAE;QACxE,kBAAkB,EAAE,OAAO,CAAC,oBAAoB,CAAC,QAAQ,EAAE;QAC3D,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE;KACpC,CAAC,CACH,CACF,CAAA;IAED,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,MAAM,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,CAAC,CAAA;QAC7D,OAAO,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;QAC3C,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;QAClD,oBAAoB,CAAC,OAAO,CAAC,CAAA;IAC/B,CAAC;AACH,CAAC;AAED,gGAAgG;AAChG,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAAwC;IAExC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,OAAO,CAAA;IACnD,IAAI,MAAM,KAAK,EAAE,IAAI,KAAK,KAAK,CAAC;QAAE,OAAM;IAExC,IAAI,SAAS,GAAG,KAAK,CAAA;IACrB,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;QAC/D,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAA;QACzB,IAAI,OAAO,CAAC,SAAS;YAAE,OAAO,OAAO,CAAA;QACrC,IAAI,OAAO,CAAC,gBAAgB,KAAK,EAAE;YAAE,OAAO,OAAO,CAAA;QACnD,IAAI,OAAO,CAAC,oBAAoB,GAAG,OAAO,CAAC,KAAK,GAAG,MAAM;YAAE,OAAO,OAAO,CAAA;QACzE,SAAS,GAAG,IAAI,CAAA;QAChB,OAAO;YACL,GAAG,OAAO;YACV,KAAK,EAAE,OAAO,CAAC,KAAK,GAAG,MAAM;YAC7B,KAAK,EAAE,OAAO,CAAC,KAAK,GAAG,KAAK;SAC7B,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;IAClD,oBAAoB,CAAC,OAAO,CAAC,CAAA;IAC7B,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;AACrF,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,oBAAoB,CAAC,OAA2B;IAC9D,IAAI,OAAO,CAAC,SAAS;QAAE,MAAM,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC,CAAA;IACvF,IAAI,OAAO,CAAC,gBAAgB,KAAK,EAAE;QACjC,MAAM,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,qCAAqC,EAAE,CAAC,CAAA;AACnF,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,KAAgC,EAChC,SAAc,EACd,cAAsB,EACtB,MAAoB;IAEpB,cAAc,CAAC,MAAM,CAAC,CAAA;IAEtB,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;QACxB,MAAM,OAAO,CAAC,IAAI,CAAC;YACjB,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC;YAC9B,KAAK,CAAC,cAAc,EAAE,MAAM,CAAC;YAC7B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACzC,CAAC,CAAA;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;IACrC,CAAC;IAED,cAAc,CAAC,MAAM,CAAC,CAAA;AACxB,CAAC;AAED,SAAS,KAAK,CAAC,EAAU,EAAE,MAAoB;IAC7C,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YAC7C,OAAO,EAAE,CAAA;QACX,CAAC,EAAE,EAAE,CAAC,CAAA;QACN,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,YAAY,CAAC,OAAO,CAAC,CAAA;YACrB,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAA;QAChD,CAAC,CAAA;QACD,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IAC5D,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,MAAmB;IACtC,OAAO,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QACtC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAA;YAC7C,OAAM;QACR,CAAC;QACD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE;YACpF,IAAI,EAAE,IAAI;SACX,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,MAAoB;IAC1C,IAAI,MAAM,EAAE,OAAO;QAAE,MAAM,MAAM,CAAC,MAAM,IAAI,IAAI,KAAK,CAAC,SAAS,CAAC,CAAA;AAClE,CAAC;AA8CD,6FAA6F;AAC7F,MAAM,UAAU,SAAS,CAAC,MAAc,EAAE,QAAwB;IAChE,IAAI,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAC;QAC1D,MAAM,SAAS,GAAG,CAAC,KAAgC,EAAE,EAAE,CACrD,QAAQ,CAAC,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QAC5D,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QAC7C,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAA;QAChD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAA;QAChD,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;YAClD,MAAM,CAAC,mBAAmB,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAA;YACrD,MAAM,CAAC,mBAAmB,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAA;QACvD,CAAC,CAAA;IACH,CAAC;IAED,IAAI,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,CAAC,IAAa,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAC3D,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QAC/B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAA;QAClC,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;YAClC,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAA;YACrC,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAA;QACvC,CAAC,CAAA;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;AACzD,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,MAAc,EAAE,IAAY;IACrD,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;AAC1C,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,MAAM,CAAC,KAAc;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC3C,IAAI,KAAK,YAAY,WAAW;QAAE,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACxE,IAAI,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACrE,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import * as ChannelStore from './ChannelStore.js';
|
|
2
|
+
import type { SessionController } from './MeteredStream.js';
|
|
3
|
+
export type { SessionController } from './MeteredStream.js';
|
|
4
|
+
export type { Socket } from './Transports.js';
|
|
5
|
+
import { type Socket } from './Transports.js';
|
|
6
|
+
/** Public WebSocket payment frame helpers. */
|
|
7
|
+
export { formatApplicationMessage, formatAuthorizationMessage, formatCloseReadyMessage, formatCloseRequestMessage, formatErrorMessage, formatNeedVoucherMessage, formatReceiptMessage, parseMessage, type ErrorMessageParameters, type Message, } from '../precompile/Protocol.js';
|
|
8
|
+
/** Result returned by an HTTP route before upgrading or authorizing a WebSocket session. */
|
|
9
|
+
export type SessionRouteResult = {
|
|
10
|
+
status: 402;
|
|
11
|
+
challenge: Response;
|
|
12
|
+
} | {
|
|
13
|
+
status: 200;
|
|
14
|
+
withReceipt(response?: Response): Response;
|
|
15
|
+
};
|
|
16
|
+
/** HTTP route used to perform a WebSocket payment probe. */
|
|
17
|
+
export type SessionRoute = (request: Request) => Promise<SessionRouteResult>;
|
|
18
|
+
/**
|
|
19
|
+
* Bridge a WebSocket connection to a Tempo session payment flow.
|
|
20
|
+
*
|
|
21
|
+
* Credential verification is performed by routing each in-band authorization
|
|
22
|
+
* frame through `route` as a **synthetic `POST` request** that carries only
|
|
23
|
+
* the `Authorization` header. The synthetic request does not include cookies,
|
|
24
|
+
* bodies, query parameters, or other headers from the original WebSocket
|
|
25
|
+
* upgrade request. Do not wrap `route` with middleware that depends on
|
|
26
|
+
* HTTP-specific context beyond the `Authorization` header.
|
|
27
|
+
*/
|
|
28
|
+
export declare function serve(options: serve.Options): Promise<void>;
|
|
29
|
+
/** Type helpers for {@link serve}. */
|
|
30
|
+
export declare namespace serve {
|
|
31
|
+
type Options = {
|
|
32
|
+
/** Expected per-tick amount in raw units. When set, credentials whose
|
|
33
|
+
* challenge `request.amount` does not match are rejected. Use this to
|
|
34
|
+
* pin the price when the route is backed by `Mppx.compose()` with
|
|
35
|
+
* multiple offers — otherwise a client can select the cheapest offer
|
|
36
|
+
* and still receive the same stream. */
|
|
37
|
+
amount?: string | undefined;
|
|
38
|
+
generate: AsyncIterable<string> | ((stream: SessionController) => AsyncIterable<string>);
|
|
39
|
+
pollIntervalMs?: number | undefined;
|
|
40
|
+
/** Payment route handler. Receives synthetic `POST` requests with only
|
|
41
|
+
* the `Authorization` header — no cookies, bodies, or upgrade headers. */
|
|
42
|
+
route: SessionRoute;
|
|
43
|
+
socket: Socket;
|
|
44
|
+
store: ChannelStore.ChannelStore | import('../../../Store.js').Store;
|
|
45
|
+
url: string | URL;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=Ws.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Ws.d.ts","sourceRoot":"","sources":["../../../../src/tempo/session/server/Ws.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,YAAY,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAE7C,OAAO,EAA2B,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAEtE,8CAA8C;AAC9C,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,uBAAuB,EACvB,yBAAyB,EACzB,kBAAkB,EAClB,wBAAwB,EACxB,oBAAoB,EACpB,YAAY,EACZ,KAAK,sBAAsB,EAC3B,KAAK,OAAO,GACb,MAAM,2BAA2B,CAAA;AAElC,4FAA4F;AAC5F,MAAM,MAAM,kBAAkB,GAC1B;IAAE,MAAM,EAAE,GAAG,CAAC;IAAC,SAAS,EAAE,QAAQ,CAAA;CAAE,GACpC;IAAE,MAAM,EAAE,GAAG,CAAC;IAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAA;CAAE,CAAA;AAE/D,4DAA4D;AAC5D,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAA;AA0C5E;;;;;;;;;GASG;AACH,wBAAsB,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA0NjE;AAED,sCAAsC;AACtC,MAAM,CAAC,OAAO,WAAW,KAAK,CAAC;IAC7B,KAAK,OAAO,GAAG;QACb;;;;iDAIyC;QACzC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC3B,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,iBAAiB,KAAK,aAAa,CAAC,MAAM,CAAC,CAAC,CAAA;QACxF,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACnC;mFAC2E;QAC3E,KAAK,EAAE,YAAY,CAAA;QACnB,MAAM,EAAE,MAAM,CAAA;QACd,KAAK,EAAE,YAAY,CAAC,YAAY,GAAG,OAAO,mBAAmB,EAAE,KAAK,CAAA;QACpE,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAClB,CAAA;CACF"}
|