mppx 0.6.31 → 0.8.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 +50 -0
- package/README.md +20 -11
- package/dist/Challenge.d.ts.map +1 -1
- package/dist/Challenge.js +27 -13
- 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/Mcp.d.ts +3 -0
- package/dist/Mcp.d.ts.map +1 -1
- package/dist/Mcp.js +2 -0
- package/dist/Mcp.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/PaymentRequest.d.ts +10 -10
- package/dist/PaymentRequest.js +8 -8
- 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/Mppx.js +2 -2
- package/dist/client/Mppx.js.map +1 -1
- package/dist/client/Transport.d.ts +11 -16
- package/dist/client/Transport.d.ts.map +1 -1
- package/dist/client/Transport.js +55 -76
- package/dist/client/Transport.js.map +1 -1
- package/dist/client/index.d.ts +5 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -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 +60 -13
- package/dist/client/internal/Fetch.js.map +1 -1
- package/dist/client/internal/protocols/Mcp.d.ts +7 -0
- package/dist/client/internal/protocols/Mcp.d.ts.map +1 -0
- package/dist/client/internal/protocols/Mcp.js +159 -0
- package/dist/client/internal/protocols/Mcp.js.map +1 -0
- package/dist/client/internal/protocols/Mpp.d.ts +4 -0
- package/dist/client/internal/protocols/Mpp.d.ts.map +1 -0
- package/dist/client/internal/protocols/Mpp.js +18 -0
- package/dist/client/internal/protocols/Mpp.js.map +1 -0
- package/dist/client/internal/protocols/Protocol.d.ts +10 -0
- package/dist/client/internal/protocols/Protocol.d.ts.map +1 -0
- package/dist/client/internal/protocols/Protocol.js +2 -0
- package/dist/client/internal/protocols/Protocol.js.map +1 -0
- package/dist/client/internal/protocols/Shared.d.ts +5 -0
- package/dist/client/internal/protocols/Shared.d.ts.map +1 -0
- package/dist/client/internal/protocols/Shared.js +20 -0
- package/dist/client/internal/protocols/Shared.js.map +1 -0
- package/dist/client/internal/protocols/X402.d.ts +8 -0
- package/dist/client/internal/protocols/X402.d.ts.map +1 -0
- package/dist/client/internal/protocols/X402.js +39 -0
- package/dist/client/internal/protocols/X402.js.map +1 -0
- package/dist/evm/client/index.d.ts +1 -0
- package/dist/evm/client/index.d.ts.map +1 -1
- package/dist/evm/client/index.js +1 -0
- package/dist/evm/client/index.js.map +1 -1
- package/dist/evm/index.d.ts +2 -0
- package/dist/evm/index.d.ts.map +1 -1
- package/dist/evm/index.js +2 -0
- package/dist/evm/index.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/evm/server/index.d.ts +1 -0
- package/dist/evm/server/index.d.ts.map +1 -1
- package/dist/evm/server/index.js +1 -0
- package/dist/evm/server/index.js.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/client/McpClient.d.ts +101 -0
- package/dist/mcp/client/McpClient.d.ts.map +1 -0
- package/dist/mcp/client/McpClient.js +162 -0
- package/dist/mcp/client/McpClient.js.map +1 -0
- package/dist/mcp/client/index.d.ts.map +1 -0
- package/dist/mcp/client/index.js.map +1 -0
- package/dist/mcp/server/Transport.d.ts.map +1 -0
- package/dist/mcp/server/Transport.js.map +1 -0
- package/dist/mcp/server/index.d.ts.map +1 -0
- package/dist/mcp/server/index.js.map +1 -0
- package/dist/server/Mppx.d.ts +12 -4
- package/dist/server/Mppx.d.ts.map +1 -1
- package/dist/server/Mppx.js +85 -27
- package/dist/server/Mppx.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 +1 -1
- package/dist/server/Transport.d.ts.map +1 -1
- package/dist/server/Transport.js +5 -4
- 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/Proof.d.ts +85 -1
- package/dist/tempo/Proof.d.ts.map +1 -1
- package/dist/tempo/Proof.js +35 -0
- package/dist/tempo/Proof.js.map +1 -1
- package/dist/tempo/client/Charge.d.ts +19 -1
- package/dist/tempo/client/Charge.d.ts.map +1 -1
- package/dist/tempo/client/Charge.js +47 -27
- package/dist/tempo/client/Charge.js.map +1 -1
- package/dist/tempo/client/Methods.d.ts +41 -10
- package/dist/tempo/client/Methods.d.ts.map +1 -1
- package/dist/tempo/client/Methods.js +16 -7
- package/dist/tempo/client/Methods.js.map +1 -1
- package/dist/tempo/client/ResolveAccount.d.ts +40 -0
- package/dist/tempo/client/ResolveAccount.d.ts.map +1 -0
- package/dist/tempo/client/ResolveAccount.js +2 -0
- package/dist/tempo/client/ResolveAccount.js.map +1 -0
- 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 +29 -1
- package/dist/tempo/internal/fee-payer.d.ts.map +1 -1
- package/dist/tempo/internal/fee-payer.js +138 -4
- package/dist/tempo/internal/fee-payer.js.map +1 -1
- package/dist/tempo/internal/proof.d.ts +71 -5
- package/dist/tempo/internal/proof.d.ts.map +1 -1
- package/dist/tempo/internal/proof.js +42 -6
- package/dist/tempo/internal/proof.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 +30 -19
- 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 +12 -10
- 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 +51 -30
- package/dist/tempo/server/Charge.js.map +1 -1
- package/dist/tempo/server/Methods.d.ts +67 -8
- package/dist/tempo/server/Methods.d.ts.map +1 -1
- package/dist/tempo/server/Methods.js +40 -10
- package/dist/tempo/server/Methods.js.map +1 -1
- package/dist/tempo/server/Subscription.d.ts +11 -1
- package/dist/tempo/server/Subscription.d.ts.map +1 -1
- package/dist/tempo/server/Subscription.js +135 -23
- package/dist/tempo/server/Subscription.js.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 +81 -0
- package/dist/tempo/session/client/ChannelOps.d.ts.map +1 -0
- package/dist/tempo/session/client/ChannelOps.js +201 -0
- package/dist/tempo/session/client/ChannelOps.js.map +1 -0
- package/dist/tempo/session/client/ChannelStore.d.ts +51 -0
- package/dist/tempo/session/client/ChannelStore.d.ts.map +1 -0
- package/dist/tempo/session/client/ChannelStore.js +63 -0
- package/dist/tempo/session/client/ChannelStore.js.map +1 -0
- package/dist/tempo/session/client/CredentialState.d.ts +245 -0
- package/dist/tempo/session/client/CredentialState.d.ts.map +1 -0
- package/dist/tempo/session/client/CredentialState.js +419 -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 +138 -0
- package/dist/tempo/session/client/Session.d.ts.map +1 -0
- package/dist/tempo/session/client/Session.js +69 -0
- package/dist/tempo/session/client/Session.js.map +1 -0
- package/dist/tempo/session/client/SessionManager.d.ts +84 -0
- package/dist/tempo/session/client/SessionManager.d.ts.map +1 -0
- package/dist/tempo/session/client/SessionManager.js +577 -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 +11 -0
- package/dist/tempo/session/client/index.d.ts.map +1 -0
- package/dist/tempo/session/client/index.js +6 -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 +125 -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 +252 -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/dist/tempo/subscription/KeyAuthorization.d.ts +712 -1
- package/dist/tempo/subscription/KeyAuthorization.d.ts.map +1 -1
- package/dist/tempo/subscription/Store.d.ts +2 -0
- package/dist/tempo/subscription/Store.d.ts.map +1 -1
- package/dist/tempo/subscription/Store.js +16 -1
- package/dist/tempo/subscription/Store.js.map +1 -1
- package/dist/x402/index.d.ts +1 -0
- package/dist/x402/index.d.ts.map +1 -1
- package/dist/x402/index.js +1 -0
- package/dist/x402/index.js.map +1 -1
- package/package.json +25 -9
- package/src/Challenge.test.ts +40 -0
- package/src/Challenge.ts +28 -13
- package/src/Constants.ts +58 -0
- package/src/Credential.ts +5 -4
- package/src/Mcp.ts +4 -0
- package/src/Method.ts +46 -5
- package/src/PaymentRequest.ts +10 -10
- package/src/Receipt.ts +3 -2
- package/src/cli/cli.test.ts +38 -43
- 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 +31 -1
- package/src/client/Mppx.test.ts +76 -1
- package/src/client/Mppx.ts +2 -2
- package/src/client/Transport.test.ts +225 -178
- package/src/client/Transport.ts +77 -84
- package/src/client/index.ts +25 -1
- package/src/client/internal/Fetch.test.ts +236 -6
- package/src/client/internal/Fetch.ts +69 -11
- package/src/client/internal/protocols/Mcp.test.ts +220 -0
- package/src/client/internal/protocols/Mcp.ts +162 -0
- package/src/client/internal/protocols/Mpp.ts +21 -0
- package/src/client/internal/protocols/Protocol.ts +10 -0
- package/src/client/internal/protocols/Shared.ts +25 -0
- package/src/client/internal/protocols/X402.ts +42 -0
- package/src/discovery/OpenApi.test.ts +1 -1
- package/src/env.d.ts +1 -1
- package/src/evm/PublicInterface.test-d.ts +1 -1
- package/src/evm/client/index.ts +1 -0
- package/src/evm/index.ts +2 -0
- package/src/evm/server/Charge.test.ts +1 -1
- package/src/evm/server/index.ts +1 -0
- 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 → mcp}/client/McpClient.integration.test.ts +18 -11
- package/src/{mcp-sdk → mcp}/client/McpClient.test-d.ts +45 -11
- package/src/{mcp-sdk → mcp}/client/McpClient.test.ts +211 -5
- package/src/mcp/client/McpClient.ts +307 -0
- package/src/mcp/client/McpClient.unit.test.ts +135 -0
- package/src/middlewares/elysia.test.ts +9 -5
- package/src/middlewares/express.test.ts +9 -5
- package/src/middlewares/hono.test.ts +5 -5
- package/src/middlewares/internal/mppx.test.ts +1 -1
- package/src/middlewares/nextjs.test.ts +9 -5
- package/src/proxy/Proxy.test.ts +9 -9
- package/src/proxy/services/anthropic.test.ts +1 -1
- package/src/proxy/services/openai.test.ts +1 -1
- package/src/proxy/services/stripe.test.ts +1 -1
- package/src/server/Mppx.authorize.test.ts +1 -1
- package/src/server/Mppx.test-d.ts +55 -1
- package/src/server/Mppx.test.ts +220 -9
- package/src/server/Mppx.ts +501 -407
- package/src/server/Response.ts +2 -1
- package/src/server/Transport.test.ts +6 -6
- package/src/server/Transport.ts +5 -4
- package/src/server/index.ts +1 -0
- package/src/stripe/Charge.integration.test.ts +1 -1
- package/src/stripe/client/Charge.test.ts +21 -6
- package/src/stripe/client/Charge.ts +6 -2
- package/src/stripe/server/Charge.test.ts +115 -2
- 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/Proof.conformance.test.ts +146 -0
- package/src/tempo/Proof.test-d.ts +15 -0
- package/src/tempo/Proof.ts +52 -1
- package/src/tempo/PublicExports.test-d.ts +105 -0
- package/src/tempo/Subscription.integration.test.ts +1 -1
- package/src/tempo/client/Charge.test.ts +258 -0
- package/src/tempo/client/Charge.ts +84 -38
- package/src/tempo/client/Methods.ts +22 -8
- package/src/tempo/client/ResolveAccount.ts +46 -0
- package/src/tempo/client/index.ts +15 -4
- package/src/tempo/index.ts +1 -0
- package/src/tempo/internal/fee-payer.test.ts +296 -17
- package/src/tempo/internal/fee-payer.ts +186 -4
- package/src/tempo/internal/fee-token.test.ts +14 -9
- package/src/tempo/internal/proof.test.ts +12 -4
- package/src/tempo/internal/proof.ts +55 -6
- 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 +52 -23
- 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 +136 -71
- package/src/tempo/{server → legacy/server}/Session.ts +32 -23
- 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 +480 -31
- package/src/tempo/server/Charge.ts +54 -30
- package/src/tempo/server/Methods.ts +58 -10
- package/src/tempo/server/Sse.test.ts +2 -2
- package/src/tempo/server/Subscription.test.ts +465 -3
- package/src/tempo/server/Subscription.ts +174 -19
- package/src/tempo/server/index.ts +6 -5
- package/src/tempo/server/internal/html/package.json +2 -2
- 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 +330 -0
- package/src/tempo/session/client/ChannelStore.ts +111 -0
- package/src/tempo/session/client/CredentialState.test.ts +789 -0
- package/src/tempo/session/client/CredentialState.ts +799 -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 +774 -0
- package/src/tempo/session/client/Session.ts +123 -0
- package/src/tempo/session/client/SessionManager.test.ts +1397 -0
- package/src/tempo/session/client/SessionManager.ts +751 -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 +40 -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 +354 -0
- package/src/tempo/session/precompile/Voucher.ts +162 -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 +329 -0
- package/src/tempo/session/server/Settlement.ts +471 -0
- package/src/tempo/session/{Sse.test.ts → server/Sse.test.ts} +37 -3
- package/src/tempo/session/server/Sse.ts +254 -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 +380 -0
- package/src/tempo/session/server/index.ts +8 -0
- package/src/tempo/subscription/Store.ts +27 -9
- package/src/x402/Exact.e2e.test.ts +1 -1
- package/src/x402/PublicInterface.test-d.ts +1 -1
- package/src/x402/index.ts +1 -0
- package/dist/mcp-sdk/client/McpClient.d.ts +0 -78
- package/dist/mcp-sdk/client/McpClient.d.ts.map +0 -1
- package/dist/mcp-sdk/client/McpClient.js +0 -105
- package/dist/mcp-sdk/client/McpClient.js.map +0 -1
- package/dist/mcp-sdk/client/index.d.ts.map +0 -1
- package/dist/mcp-sdk/client/index.js.map +0 -1
- package/dist/mcp-sdk/server/Transport.d.ts.map +0 -1
- package/dist/mcp-sdk/server/Transport.js.map +0 -1
- package/dist/mcp-sdk/server/index.d.ts.map +0 -1
- package/dist/mcp-sdk/server/index.js.map +0 -1
- 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/mcp-sdk/client/McpClient.ts +0 -196
- 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/{mcp-sdk → mcp}/client/index.d.ts +0 -0
- /package/dist/{mcp-sdk → mcp}/client/index.js +0 -0
- /package/dist/{mcp-sdk → mcp}/server/Transport.d.ts +0 -0
- /package/dist/{mcp-sdk → mcp}/server/Transport.js +0 -0
- /package/dist/{mcp-sdk → mcp}/server/index.d.ts +0 -0
- /package/dist/{mcp-sdk → mcp}/server/index.js +0 -0
- /package/dist/tempo/{session → legacy/session}/Channel.js +0 -0
- /package/dist/tempo/{session → legacy/session}/Types.js +0 -0
- /package/src/{mcp-sdk → mcp}/client/index.ts +0 -0
- /package/src/{mcp-sdk → mcp}/server/Transport.test.ts +0 -0
- /package/src/{mcp-sdk → mcp}/server/Transport.ts +0 -0
- /package/src/{mcp-sdk → mcp}/server/index.ts +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
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
import type { Client } from '@modelcontextprotocol/sdk/client/index.js'
|
|
2
|
-
import type { McpError } from '@modelcontextprotocol/sdk/types.js'
|
|
3
|
-
|
|
4
|
-
import type * as Challenge from '../../Challenge.js'
|
|
5
|
-
import * as Credential from '../../Credential.js'
|
|
6
|
-
import * as Expires from '../../Expires.js'
|
|
7
|
-
import * as AcceptPayment from '../../internal/AcceptPayment.js'
|
|
8
|
-
import * as core_Mcp from '../../Mcp.js'
|
|
9
|
-
import type * as Method from '../../Method.js'
|
|
10
|
-
import type * as z from '../../zod.js'
|
|
11
|
-
|
|
12
|
-
type AnyClient = Method.Client<any, any>
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Result of a tool call with payment handling.
|
|
16
|
-
* Extends the SDK's callTool return type with an optional payment receipt.
|
|
17
|
-
*/
|
|
18
|
-
export type CallToolResult = Awaited<ReturnType<Client['callTool']>> & {
|
|
19
|
-
/** Payment receipt if payment was made. */
|
|
20
|
-
receipt: core_Mcp.Receipt | undefined
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Creates a payment-aware wrapper around an MCP SDK client.
|
|
25
|
-
*
|
|
26
|
-
* Similar to `Fetch.from()` for HTTP, this wraps an MCP client's `callTool`
|
|
27
|
-
* method to automatically handle payment challenges.
|
|
28
|
-
*
|
|
29
|
-
* @example
|
|
30
|
-
* ```ts
|
|
31
|
-
* import { Client } from '@modelcontextprotocol/sdk/client'
|
|
32
|
-
* import { McpClient, tempo } from 'mppx/mcp-sdk/client'
|
|
33
|
-
* import { privateKeyToAccount } from 'viem/accounts'
|
|
34
|
-
*
|
|
35
|
-
* const client = new Client({ name: 'my-client', version: '1.0.0' })
|
|
36
|
-
* await client.connect(transport)
|
|
37
|
-
*
|
|
38
|
-
* const mcp = McpClient.wrap(client, {
|
|
39
|
-
* methods: [
|
|
40
|
-
* tempo({
|
|
41
|
-
* account: privateKeyToAccount('0x...'),
|
|
42
|
-
* }),
|
|
43
|
-
* ],
|
|
44
|
-
* })
|
|
45
|
-
*
|
|
46
|
-
* // Automatically handles payment challenges
|
|
47
|
-
* const result = await mcp.callTool({ name: 'premium_tool', arguments: {} })
|
|
48
|
-
* console.log(result.content, result.receipt)
|
|
49
|
-
* ```
|
|
50
|
-
*/
|
|
51
|
-
export function wrap<
|
|
52
|
-
const client extends Pick<Client, 'callTool'>,
|
|
53
|
-
const methods extends readonly Method.AnyClient[],
|
|
54
|
-
>(client: client, config: wrap.Config<methods>): wrap.McpClient<client, methods> {
|
|
55
|
-
const { methods } = config
|
|
56
|
-
const paymentPreferences = AcceptPayment.resolve(methods)
|
|
57
|
-
|
|
58
|
-
return {
|
|
59
|
-
...client,
|
|
60
|
-
async callTool(params, options) {
|
|
61
|
-
const context = options?.context
|
|
62
|
-
const timeout = options?.timeout
|
|
63
|
-
|
|
64
|
-
try {
|
|
65
|
-
const result = await client.callTool(
|
|
66
|
-
params,
|
|
67
|
-
undefined,
|
|
68
|
-
timeout !== undefined ? { timeout } : undefined,
|
|
69
|
-
)
|
|
70
|
-
|
|
71
|
-
return {
|
|
72
|
-
...result,
|
|
73
|
-
receipt: result._meta?.[core_Mcp.receiptMetaKey] as core_Mcp.Receipt | undefined,
|
|
74
|
-
}
|
|
75
|
-
} catch (error) {
|
|
76
|
-
// Check if this is a payment required error
|
|
77
|
-
if (!isPaymentRequiredError(error)) throw error
|
|
78
|
-
|
|
79
|
-
const challenges = (error.data as { challenges?: Challenge.Challenge[] })?.challenges
|
|
80
|
-
if (!challenges?.length) throw error
|
|
81
|
-
|
|
82
|
-
const selected = AcceptPayment.selectChallenge(
|
|
83
|
-
challenges,
|
|
84
|
-
methods,
|
|
85
|
-
paymentPreferences.entries,
|
|
86
|
-
)
|
|
87
|
-
if (!selected) {
|
|
88
|
-
const available = challenges.map((c) => `${c.method}.${c.intent}`).join(', ')
|
|
89
|
-
const installed = methods.map((m) => `${m.name}.${m.intent}`).join(', ')
|
|
90
|
-
throw new Error(
|
|
91
|
-
`No compatible payment method. Server offers: ${available}. Client has: ${installed}`,
|
|
92
|
-
{ cause: error },
|
|
93
|
-
)
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
const credential = await createCredential(selected.challenge, {
|
|
97
|
-
context,
|
|
98
|
-
methods,
|
|
99
|
-
})
|
|
100
|
-
const parsed = Credential.deserialize(credential)
|
|
101
|
-
|
|
102
|
-
const retryResult = await client.callTool(
|
|
103
|
-
{
|
|
104
|
-
...params,
|
|
105
|
-
_meta: {
|
|
106
|
-
...params._meta,
|
|
107
|
-
[core_Mcp.credentialMetaKey]: parsed,
|
|
108
|
-
},
|
|
109
|
-
},
|
|
110
|
-
undefined,
|
|
111
|
-
timeout !== undefined ? { timeout } : undefined,
|
|
112
|
-
)
|
|
113
|
-
|
|
114
|
-
return {
|
|
115
|
-
...retryResult,
|
|
116
|
-
receipt: retryResult._meta?.[core_Mcp.receiptMetaKey] as core_Mcp.Receipt | undefined,
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
},
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/** Union of all context types from all methods that have context schemas. */
|
|
124
|
-
type AnyContextFor<methods extends readonly AnyClient[]> = {
|
|
125
|
-
[key in keyof methods]: methods[key] extends Method.Client<any, infer context>
|
|
126
|
-
? context extends z.ZodMiniType
|
|
127
|
-
? z.input<context>
|
|
128
|
-
: undefined
|
|
129
|
-
: undefined
|
|
130
|
-
}[number]
|
|
131
|
-
|
|
132
|
-
export declare namespace wrap {
|
|
133
|
-
type Config<methods extends readonly Method.AnyClient[] = readonly Method.AnyClient[]> = {
|
|
134
|
-
/** Array of methods to use. */
|
|
135
|
-
methods: methods
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
type McpClient<
|
|
139
|
-
client extends Pick<Client, 'callTool'> = Pick<Client, 'callTool'>,
|
|
140
|
-
methods extends readonly AnyClient[] = readonly AnyClient[],
|
|
141
|
-
> = Omit<client, 'callTool'> & {
|
|
142
|
-
/** Call a tool with automatic payment handling. */
|
|
143
|
-
callTool: (
|
|
144
|
-
params: {
|
|
145
|
-
name: string
|
|
146
|
-
arguments?: Record<string, unknown>
|
|
147
|
-
_meta?: Record<string, unknown>
|
|
148
|
-
},
|
|
149
|
-
options?: CallToolOptions<methods>,
|
|
150
|
-
) => Promise<CallToolResult>
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
type CallToolOptions<methods extends readonly AnyClient[] = readonly AnyClient[]> = {
|
|
154
|
-
/** Context to pass to the method intent's createCredential. */
|
|
155
|
-
context?: AnyContextFor<methods>
|
|
156
|
-
/** Request timeout in milliseconds. */
|
|
157
|
-
timeout?: number
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* Checks if an error is a payment required error.
|
|
163
|
-
*/
|
|
164
|
-
export function isPaymentRequiredError(
|
|
165
|
-
error: unknown,
|
|
166
|
-
): error is McpError & { data: { challenges: Challenge.Challenge[] } } {
|
|
167
|
-
if (typeof error !== 'object' || error === null) return false
|
|
168
|
-
if (!('code' in error) || !('message' in error)) return false
|
|
169
|
-
if ((error as { code: unknown }).code !== core_Mcp.paymentRequiredCode) return false
|
|
170
|
-
const data = (error as { data?: { challenges?: unknown } }).data
|
|
171
|
-
return Array.isArray(data?.challenges) && data.challenges.length > 0
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
/** @internal */
|
|
175
|
-
async function createCredential<methods extends readonly Method.AnyClient[]>(
|
|
176
|
-
challenge: Challenge.Challenge,
|
|
177
|
-
config: {
|
|
178
|
-
context?: unknown
|
|
179
|
-
methods: methods
|
|
180
|
-
},
|
|
181
|
-
): Promise<string> {
|
|
182
|
-
const { context, methods } = config
|
|
183
|
-
|
|
184
|
-
const mi = methods.find((m) => m.name === challenge.method && m.intent === challenge.intent)
|
|
185
|
-
if (!mi)
|
|
186
|
-
throw new Error(
|
|
187
|
-
`No method found for "${challenge.method}.${challenge.intent}". Available: ${methods.map((m) => `${m.name}.${m.intent}`).join(', ')}`,
|
|
188
|
-
)
|
|
189
|
-
|
|
190
|
-
if (challenge.expires) Expires.assert(challenge.expires, challenge.id)
|
|
191
|
-
|
|
192
|
-
const parsedContext = mi.context && context !== undefined ? mi.context.parse(context) : undefined
|
|
193
|
-
return mi.createCredential(
|
|
194
|
-
parsedContext !== undefined ? { challenge, context: parsedContext } : ({ challenge } as never),
|
|
195
|
-
)
|
|
196
|
-
}
|
|
@@ -1,308 +0,0 @@
|
|
|
1
|
-
import type { Address, Hex } from 'viem'
|
|
2
|
-
|
|
3
|
-
import type * as Store from '../../Store.js'
|
|
4
|
-
import type { SignedVoucher } from './Types.js'
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* State for an on-chain payment channel, including per-session accounting.
|
|
8
|
-
*
|
|
9
|
-
* Tracks the channel's identity, on-chain balance, the highest voucher
|
|
10
|
-
* the server has accepted, and the current session's spend counters.
|
|
11
|
-
* A channel is created when a payer opens an escrow on-chain and persists
|
|
12
|
-
* until the channel is finalized (closed/settled).
|
|
13
|
-
*
|
|
14
|
-
* One channel = one session. The client owns the key and can't race with
|
|
15
|
-
* itself, so concurrent session support is unnecessary.
|
|
16
|
-
*
|
|
17
|
-
* Monotonicity invariants (enforced by update callbacks):
|
|
18
|
-
* - `highestVoucherAmount` only increases
|
|
19
|
-
* - `settledOnChain` only increases
|
|
20
|
-
* - `deposit` reflects the latest on-chain value
|
|
21
|
-
*/
|
|
22
|
-
export interface State {
|
|
23
|
-
/** Address authorized to sign vouchers on behalf of the payer. */
|
|
24
|
-
authorizedSigner: Address
|
|
25
|
-
/** Chain ID the channel was opened on. */
|
|
26
|
-
chainId: number
|
|
27
|
-
/** Escrow contract address the channel was opened on. */
|
|
28
|
-
escrowContract: Address
|
|
29
|
-
/** Unique identifier for this payment channel. */
|
|
30
|
-
channelId: Hex
|
|
31
|
-
/** On-chain timestamp when a force-close was requested (0n if not requested). */
|
|
32
|
-
closeRequestedAt: bigint
|
|
33
|
-
/** ISO 8601 timestamp when the channel was created. */
|
|
34
|
-
createdAt: string
|
|
35
|
-
/** Current on-chain deposit in the escrow contract. */
|
|
36
|
-
deposit: bigint
|
|
37
|
-
/** Whether the channel has been finalized (closed) on-chain. */
|
|
38
|
-
finalized: boolean
|
|
39
|
-
/** The signed voucher corresponding to `highestVoucherAmount`. */
|
|
40
|
-
highestVoucher: SignedVoucher | null
|
|
41
|
-
/** Highest cumulative voucher amount accepted by the server. */
|
|
42
|
-
highestVoucherAmount: bigint
|
|
43
|
-
/** Address of the payment recipient. */
|
|
44
|
-
payee: Address
|
|
45
|
-
/** Address of the payment sender. */
|
|
46
|
-
payer: Address
|
|
47
|
-
/** Cumulative amount settled on-chain so far. */
|
|
48
|
-
settledOnChain: bigint
|
|
49
|
-
/** Cumulative amount spent (charged) against this channel's current session. */
|
|
50
|
-
spent: bigint
|
|
51
|
-
/** Token contract address used for payments. */
|
|
52
|
-
token: Address
|
|
53
|
-
/** Number of charge operations (API requests) fulfilled in the current session. */
|
|
54
|
-
units: number
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Internal store interface for channel state persistence.
|
|
59
|
-
*
|
|
60
|
-
* ## Atomicity contract
|
|
61
|
-
*
|
|
62
|
-
* The `updateChannel` method uses an atomic read-modify-write callback.
|
|
63
|
-
* The callback receives the current state (or `null` if none exists), and
|
|
64
|
-
* returns the next state (or `null` to delete). Implementations must
|
|
65
|
-
* guarantee that no concurrent mutation occurs between reading `current`
|
|
66
|
-
* and writing the return value.
|
|
67
|
-
*
|
|
68
|
-
* Callbacks should be synchronous and deterministic. When a `ChannelStore`
|
|
69
|
-
* is backed by `Store.update()`, adapters may retry them internally.
|
|
70
|
-
*
|
|
71
|
-
* Backends implement this via their native mechanisms:
|
|
72
|
-
* - **In-memory / JS single-thread**: Synchronous callback execution
|
|
73
|
-
* - **Durable Objects**: Single-threaded execution model
|
|
74
|
-
* - **D1 / SQL**: Database transactions
|
|
75
|
-
*/
|
|
76
|
-
export type ChannelStore = {
|
|
77
|
-
getChannel(channelId: Hex): Promise<State | null>
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Atomic read-modify-write for channel state.
|
|
81
|
-
* Return `null` from `fn` to delete the channel.
|
|
82
|
-
*/
|
|
83
|
-
updateChannel(channelId: Hex, fn: (current: State | null) => State | null): Promise<State | null>
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Wait for the next update to a channel.
|
|
87
|
-
*
|
|
88
|
-
* Returns a `Promise` that resolves once `updateChannel` is called for
|
|
89
|
-
* `channelId`. Implementations should resolve immediately if the channel
|
|
90
|
-
* was updated between the call to `waitForUpdate` and the `Promise`
|
|
91
|
-
* being awaited.
|
|
92
|
-
*
|
|
93
|
-
* When not implemented, callers fall back to polling.
|
|
94
|
-
*/
|
|
95
|
-
waitForUpdate?(channelId: Hex): Promise<void>
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Atomic read-modify-write that returns the callback's `result` directly.
|
|
99
|
-
*
|
|
100
|
-
* Used by {@link deductFromChannel} to atomically compute the deduction
|
|
101
|
-
* outcome. When backed by `Store.update()`, this delegates to the store's
|
|
102
|
-
* native atomic primitive.
|
|
103
|
-
*/
|
|
104
|
-
updateChannelResult?<result>(
|
|
105
|
-
channelId: Hex,
|
|
106
|
-
fn: (current: State | null) => Store.Change<State, result>,
|
|
107
|
-
): Promise<result>
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
export type DeductResult = { ok: true; channel: State } | { ok: false; channel: State }
|
|
111
|
-
|
|
112
|
-
export function normalizeChannelId(channelId: Hex): Hex {
|
|
113
|
-
return channelId.toLowerCase() as Hex
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
function normalizeState(channelId: Hex, state: State): State {
|
|
117
|
-
return state.channelId === channelId ? state : { ...state, channelId }
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
function normalizeMaybeState(channelId: Hex, state: State | null): State | null {
|
|
121
|
-
return state ? normalizeState(channelId, state) : null
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Atomically deduct `amount` from a channel's available balance.
|
|
126
|
-
*
|
|
127
|
-
* Returns `{ ok: true, channel }` if the deduction succeeded, or
|
|
128
|
-
* `{ ok: false, channel }` with the unchanged state if balance is
|
|
129
|
-
* insufficient. Throws if the channel does not exist.
|
|
130
|
-
*/
|
|
131
|
-
export async function deductFromChannel(
|
|
132
|
-
store: ChannelStore,
|
|
133
|
-
channelId: Hex,
|
|
134
|
-
amount: bigint,
|
|
135
|
-
): Promise<DeductResult> {
|
|
136
|
-
if (store.updateChannelResult) {
|
|
137
|
-
const result = await store.updateChannelResult<DeductResult | null>(
|
|
138
|
-
channelId,
|
|
139
|
-
(current): Store.Change<State, DeductResult | null> => {
|
|
140
|
-
if (!current) return { op: 'noop', result: null }
|
|
141
|
-
if (current.finalized)
|
|
142
|
-
return { op: 'noop', result: { ok: false, channel: current } as const }
|
|
143
|
-
if (current.closeRequestedAt !== 0n)
|
|
144
|
-
return { op: 'noop', result: { ok: false, channel: current } as const }
|
|
145
|
-
if (current.highestVoucherAmount - current.spent >= amount) {
|
|
146
|
-
const next = { ...current, spent: current.spent + amount, units: current.units + 1 }
|
|
147
|
-
return { op: 'set', value: next, result: { ok: true, channel: next } as const }
|
|
148
|
-
}
|
|
149
|
-
return { op: 'noop', result: { ok: false, channel: current } as const }
|
|
150
|
-
},
|
|
151
|
-
)
|
|
152
|
-
if (!result) throw new Error('channel not found')
|
|
153
|
-
return result
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
let result: DeductResult | null = null
|
|
157
|
-
const channel = await store.updateChannel(channelId, (current) => {
|
|
158
|
-
if (!current) return null
|
|
159
|
-
if (current.finalized) {
|
|
160
|
-
result = { ok: false, channel: current }
|
|
161
|
-
return current
|
|
162
|
-
}
|
|
163
|
-
if (current.closeRequestedAt !== 0n) {
|
|
164
|
-
result = { ok: false, channel: current }
|
|
165
|
-
return current
|
|
166
|
-
}
|
|
167
|
-
if (current.highestVoucherAmount - current.spent >= amount) {
|
|
168
|
-
const next = { ...current, spent: current.spent + amount, units: current.units + 1 }
|
|
169
|
-
result = { ok: true, channel: next }
|
|
170
|
-
return next
|
|
171
|
-
}
|
|
172
|
-
result = { ok: false, channel: current }
|
|
173
|
-
return current
|
|
174
|
-
})
|
|
175
|
-
if (!channel) throw new Error('channel not found')
|
|
176
|
-
return result ?? { ok: false, channel }
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* Wraps a generic {@link Store} into the internal {@link Store}
|
|
181
|
-
* interface used by server handlers and the SSE metering loop.
|
|
182
|
-
*
|
|
183
|
-
* Provides `waitForUpdate` notifications so the SSE `chargeOrWait` loop
|
|
184
|
-
* can wake up without polling.
|
|
185
|
-
*
|
|
186
|
-
* ## Atomicity
|
|
187
|
-
*
|
|
188
|
-
* Mutations use `get` → `fn` → `set` guarded by a per-key in-process
|
|
189
|
-
* mutex. This serializes concurrent `updateChannel` calls within a
|
|
190
|
-
* single JS runtime but does **not** protect against races across
|
|
191
|
-
* multiple processes or instances.
|
|
192
|
-
*
|
|
193
|
-
* Backends that need true atomicity (e.g., Durable Objects, D1)
|
|
194
|
-
* should implement {@link Store} directly.
|
|
195
|
-
*/
|
|
196
|
-
const storeCache = new WeakMap<Store.Store, ChannelStore>()
|
|
197
|
-
|
|
198
|
-
export function fromStore(store: Store.Store | Store.AtomicStore): ChannelStore {
|
|
199
|
-
const cached = storeCache.get(store)
|
|
200
|
-
if (cached) return cached
|
|
201
|
-
|
|
202
|
-
const atomicUpdate = 'update' in store ? (store as Store.AtomicStore).update : undefined
|
|
203
|
-
|
|
204
|
-
const waiters = new Map<string, Set<() => void>>()
|
|
205
|
-
const locks = new Map<string, Promise<void>>()
|
|
206
|
-
|
|
207
|
-
function notify(channelId: string) {
|
|
208
|
-
const set = waiters.get(channelId)
|
|
209
|
-
if (!set) return
|
|
210
|
-
for (const resolve of set) resolve()
|
|
211
|
-
waiters.delete(channelId)
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
async function update(
|
|
215
|
-
channelId: Hex,
|
|
216
|
-
fn: (current: State | null) => State | null,
|
|
217
|
-
): Promise<State | null> {
|
|
218
|
-
return updateResult(channelId, (current) => {
|
|
219
|
-
const next = fn(current)
|
|
220
|
-
if (next) return { op: 'set', value: next, result: next }
|
|
221
|
-
return { op: 'delete', result: null }
|
|
222
|
-
})
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
async function updateResult<result>(
|
|
226
|
-
channelId: Hex,
|
|
227
|
-
fn: (current: State | null) => Store.Change<State, result>,
|
|
228
|
-
): Promise<result> {
|
|
229
|
-
const normalizedChannelId = normalizeChannelId(channelId)
|
|
230
|
-
let change: Store.Change<State, result> | undefined
|
|
231
|
-
|
|
232
|
-
if (atomicUpdate) {
|
|
233
|
-
const result = await atomicUpdate(normalizedChannelId, (current) => {
|
|
234
|
-
change = fn(normalizeMaybeState(normalizedChannelId, (current as State | null) ?? null))
|
|
235
|
-
if (change.op === 'set') {
|
|
236
|
-
change = {
|
|
237
|
-
...change,
|
|
238
|
-
value: normalizeState(normalizedChannelId, change.value),
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
if (change.op !== 'set') return change
|
|
242
|
-
return { ...change, value: change.value as never }
|
|
243
|
-
})
|
|
244
|
-
if (change?.op !== 'noop') notify(normalizedChannelId)
|
|
245
|
-
return result
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
while (locks.has(normalizedChannelId)) await locks.get(normalizedChannelId)
|
|
249
|
-
|
|
250
|
-
let release!: () => void
|
|
251
|
-
locks.set(
|
|
252
|
-
normalizedChannelId,
|
|
253
|
-
new Promise<void>((r) => {
|
|
254
|
-
release = r
|
|
255
|
-
}),
|
|
256
|
-
)
|
|
257
|
-
|
|
258
|
-
try {
|
|
259
|
-
const current = normalizeMaybeState(
|
|
260
|
-
normalizedChannelId,
|
|
261
|
-
(await store.get(normalizedChannelId)) as State | null,
|
|
262
|
-
)
|
|
263
|
-
change = fn(current)
|
|
264
|
-
if (change.op === 'set') {
|
|
265
|
-
change = {
|
|
266
|
-
...change,
|
|
267
|
-
value: normalizeState(normalizedChannelId, change.value),
|
|
268
|
-
}
|
|
269
|
-
await store.put(normalizedChannelId, change.value as never)
|
|
270
|
-
}
|
|
271
|
-
if (change.op === 'delete') await store.delete(normalizedChannelId)
|
|
272
|
-
if (change.op !== 'noop') notify(normalizedChannelId)
|
|
273
|
-
return change.result
|
|
274
|
-
} finally {
|
|
275
|
-
locks.delete(normalizedChannelId)
|
|
276
|
-
release()
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
const cs: ChannelStore = {
|
|
281
|
-
async getChannel(channelId) {
|
|
282
|
-
const normalizedChannelId = normalizeChannelId(channelId)
|
|
283
|
-
return normalizeMaybeState(
|
|
284
|
-
normalizedChannelId,
|
|
285
|
-
(await store.get(normalizedChannelId)) as State | null,
|
|
286
|
-
)
|
|
287
|
-
},
|
|
288
|
-
async updateChannel(channelId, fn) {
|
|
289
|
-
return update(channelId, fn)
|
|
290
|
-
},
|
|
291
|
-
waitForUpdate(channelId) {
|
|
292
|
-
return new Promise<void>((resolve) => {
|
|
293
|
-
const normalizedChannelId = normalizeChannelId(channelId)
|
|
294
|
-
let set = waiters.get(normalizedChannelId)
|
|
295
|
-
if (!set) {
|
|
296
|
-
set = new Set()
|
|
297
|
-
waiters.set(normalizedChannelId, set)
|
|
298
|
-
}
|
|
299
|
-
set.add(resolve)
|
|
300
|
-
})
|
|
301
|
-
},
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
cs.updateChannelResult = updateResult
|
|
305
|
-
|
|
306
|
-
storeCache.set(store, cs)
|
|
307
|
-
return cs
|
|
308
|
-
}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import type { Hex } from 'viem'
|
|
2
|
-
import { describe, expect, test } from 'vp/test'
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
createSessionReceipt,
|
|
6
|
-
deserializeSessionReceipt,
|
|
7
|
-
serializeSessionReceipt,
|
|
8
|
-
} from './Receipt.js'
|
|
9
|
-
|
|
10
|
-
const channelId = '0x0000000000000000000000000000000000000000000000000000000000000001' as Hex
|
|
11
|
-
|
|
12
|
-
describe('Receipt', () => {
|
|
13
|
-
test('createSessionReceipt', () => {
|
|
14
|
-
const receipt = createSessionReceipt({
|
|
15
|
-
challengeId: 'test-challenge-id',
|
|
16
|
-
channelId,
|
|
17
|
-
acceptedCumulative: 5000000n,
|
|
18
|
-
spent: 3000000n,
|
|
19
|
-
units: 42,
|
|
20
|
-
})
|
|
21
|
-
|
|
22
|
-
expect(receipt.method).toBe('tempo')
|
|
23
|
-
expect(receipt.intent).toBe('session')
|
|
24
|
-
expect(receipt.status).toBe('success')
|
|
25
|
-
expect(receipt.reference).toBe(channelId)
|
|
26
|
-
expect(receipt.challengeId).toBe('test-challenge-id')
|
|
27
|
-
expect(receipt.channelId).toBe(channelId)
|
|
28
|
-
expect(receipt.acceptedCumulative).toBe('5000000')
|
|
29
|
-
expect(receipt.spent).toBe('3000000')
|
|
30
|
-
expect(receipt.units).toBe(42)
|
|
31
|
-
expect(receipt.timestamp).toBeTruthy()
|
|
32
|
-
expect(receipt.txHash).toBeUndefined()
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
test('createSessionReceipt with txHash', () => {
|
|
36
|
-
const txHash = '0xabcdef' as Hex
|
|
37
|
-
const receipt = createSessionReceipt({
|
|
38
|
-
challengeId: 'test-challenge-id',
|
|
39
|
-
channelId,
|
|
40
|
-
acceptedCumulative: 5000000n,
|
|
41
|
-
spent: 3000000n,
|
|
42
|
-
txHash,
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
expect(receipt.txHash).toBe(txHash)
|
|
46
|
-
expect(receipt.units).toBeUndefined()
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
test('createSessionReceipt omits optional fields when undefined', () => {
|
|
50
|
-
const receipt = createSessionReceipt({
|
|
51
|
-
challengeId: 'test-challenge-id',
|
|
52
|
-
channelId,
|
|
53
|
-
acceptedCumulative: 1000n,
|
|
54
|
-
spent: 0n,
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
expect('units' in receipt).toBe(false)
|
|
58
|
-
expect('txHash' in receipt).toBe(false)
|
|
59
|
-
})
|
|
60
|
-
|
|
61
|
-
test('serialize and deserialize round-trip', () => {
|
|
62
|
-
const receipt = createSessionReceipt({
|
|
63
|
-
challengeId: 'test-challenge-id',
|
|
64
|
-
channelId,
|
|
65
|
-
acceptedCumulative: 5000000n,
|
|
66
|
-
spent: 3000000n,
|
|
67
|
-
units: 42,
|
|
68
|
-
})
|
|
69
|
-
|
|
70
|
-
const encoded = serializeSessionReceipt(receipt)
|
|
71
|
-
expect(typeof encoded).toBe('string')
|
|
72
|
-
|
|
73
|
-
const decoded = deserializeSessionReceipt(encoded)
|
|
74
|
-
expect(decoded).toEqual(receipt)
|
|
75
|
-
})
|
|
76
|
-
|
|
77
|
-
test('serialize produces base64url without padding', () => {
|
|
78
|
-
const receipt = createSessionReceipt({
|
|
79
|
-
challengeId: 'test-challenge-id',
|
|
80
|
-
channelId,
|
|
81
|
-
acceptedCumulative: 1n,
|
|
82
|
-
spent: 0n,
|
|
83
|
-
})
|
|
84
|
-
|
|
85
|
-
const encoded = serializeSessionReceipt(receipt)
|
|
86
|
-
// base64url uses - and _ instead of + and /, no = padding
|
|
87
|
-
expect(encoded).not.toMatch(/[+/=]/)
|
|
88
|
-
})
|
|
89
|
-
})
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { Base64 } from 'ox'
|
|
2
|
-
import type { Hex } from 'viem'
|
|
3
|
-
|
|
4
|
-
import type { SessionReceipt } from './Types.js'
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Create a session receipt.
|
|
8
|
-
*/
|
|
9
|
-
export function createSessionReceipt(params: {
|
|
10
|
-
challengeId: string
|
|
11
|
-
channelId: Hex
|
|
12
|
-
acceptedCumulative: bigint
|
|
13
|
-
spent: bigint
|
|
14
|
-
units?: number | undefined
|
|
15
|
-
txHash?: Hex | undefined
|
|
16
|
-
}): SessionReceipt {
|
|
17
|
-
return {
|
|
18
|
-
method: 'tempo',
|
|
19
|
-
intent: 'session',
|
|
20
|
-
status: 'success',
|
|
21
|
-
timestamp: new Date().toISOString(),
|
|
22
|
-
reference: params.channelId,
|
|
23
|
-
challengeId: params.challengeId,
|
|
24
|
-
channelId: params.channelId,
|
|
25
|
-
acceptedCumulative: params.acceptedCumulative.toString(),
|
|
26
|
-
spent: params.spent.toString(),
|
|
27
|
-
...(params.units !== undefined && { units: params.units }),
|
|
28
|
-
...(params.txHash !== undefined && { txHash: params.txHash }),
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Serialize a session receipt to the Payment-Receipt header format.
|
|
34
|
-
*/
|
|
35
|
-
export function serializeSessionReceipt(receipt: SessionReceipt): string {
|
|
36
|
-
const json = JSON.stringify(receipt)
|
|
37
|
-
return Base64.fromString(json, { pad: false, url: true })
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Deserialize a Payment-Receipt header value to a session receipt.
|
|
42
|
-
*/
|
|
43
|
-
export function deserializeSessionReceipt(encoded: string): SessionReceipt {
|
|
44
|
-
const json = Base64.toString(encoded)
|
|
45
|
-
return JSON.parse(json) as SessionReceipt
|
|
46
|
-
}
|