mppx 0.6.31 → 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 +17 -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/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 +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 +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 +6 -1
- 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 +200 -7
- package/src/server/Mppx.ts +487 -406
- 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.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 +45 -45
- 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 +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.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
package/src/cli/cli.test.ts
CHANGED
|
@@ -4,16 +4,16 @@ import * as os from 'node:os'
|
|
|
4
4
|
import * as path from 'node:path'
|
|
5
5
|
import { pathToFileURL } from 'node:url'
|
|
6
6
|
|
|
7
|
-
import { decodeFunctionData,
|
|
7
|
+
import { decodeFunctionData, parseUnits, type Address } from 'viem'
|
|
8
8
|
import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts'
|
|
9
9
|
import { Addresses, Transaction } from 'viem/tempo'
|
|
10
10
|
import { afterAll, describe, expect, test } from 'vp/test'
|
|
11
11
|
import * as Http from '~test/Http.js'
|
|
12
|
-
import { rpcUrl } from '~test/tempo/
|
|
13
|
-
import { deployEscrow, escrowAbi } from '~test/tempo/session.js'
|
|
12
|
+
import { rpcUrl } from '~test/tempo/rpc.js'
|
|
14
13
|
import { accounts, asset, chain, client, fundAccount } from '~test/tempo/viem.js'
|
|
15
14
|
|
|
16
15
|
import * as Challenge from '../Challenge.js'
|
|
16
|
+
import * as Constants from '../Constants.js'
|
|
17
17
|
import * as Credential from '../Credential.js'
|
|
18
18
|
import * as Method from '../Method.js'
|
|
19
19
|
import * as Receipt from '../Receipt.js'
|
|
@@ -22,7 +22,9 @@ import { toNodeListener } from '../server/Mppx.js'
|
|
|
22
22
|
import * as Store from '../Store.js'
|
|
23
23
|
import { stripe as stripe_server } from '../stripe/server/Methods.js'
|
|
24
24
|
import { tempo } from '../tempo/server/Methods.js'
|
|
25
|
-
import
|
|
25
|
+
import { escrowAbi } from '../tempo/session/precompile/escrow.abi.js'
|
|
26
|
+
import { tip20ChannelEscrow } from '../tempo/session/precompile/Protocol.js'
|
|
27
|
+
import type { SessionCredentialPayload } from '../tempo/session/precompile/Protocol.js'
|
|
26
28
|
import * as z from '../zod.js'
|
|
27
29
|
import cli from './cli.js'
|
|
28
30
|
|
|
@@ -798,7 +800,7 @@ describe('session multi-fetch (examples/session/multi-fetch)', () => {
|
|
|
798
800
|
await fundAccount({ address: testAccount.address, token: Addresses.pathUsd })
|
|
799
801
|
await fundAccount({ address: testAccount.address, token: asset })
|
|
800
802
|
|
|
801
|
-
const escrow =
|
|
803
|
+
const escrow = tip20ChannelEscrow
|
|
802
804
|
const store = Store.memory()
|
|
803
805
|
const server = Mppx_server.create({
|
|
804
806
|
methods: [
|
|
@@ -840,11 +842,11 @@ describe('session multi-fetch (examples/session/multi-fetch)', () => {
|
|
|
840
842
|
}
|
|
841
843
|
})
|
|
842
844
|
|
|
843
|
-
test('
|
|
845
|
+
test('uses server suggestedDeposit within CLI max deposit', { timeout: 120_000 }, async () => {
|
|
844
846
|
await fundAccount({ address: testAccount.address, token: Addresses.pathUsd })
|
|
845
847
|
await fundAccount({ address: testAccount.address, token: asset })
|
|
846
848
|
|
|
847
|
-
const escrow =
|
|
849
|
+
const escrow = tip20ChannelEscrow
|
|
848
850
|
let openCredential: SessionCredentialPayload | undefined
|
|
849
851
|
|
|
850
852
|
const httpServer = await Http.createServer(async (req, res) => {
|
|
@@ -867,6 +869,7 @@ describe('session multi-fetch (examples/session/multi-fetch)', () => {
|
|
|
867
869
|
methodDetails: {
|
|
868
870
|
chainId: chain.id,
|
|
869
871
|
escrowContract: escrow,
|
|
872
|
+
sessionProtocol: Constants.SessionProtocols.v2,
|
|
870
873
|
},
|
|
871
874
|
},
|
|
872
875
|
}),
|
|
@@ -897,27 +900,18 @@ describe('session multi-fetch (examples/session/multi-fetch)', () => {
|
|
|
897
900
|
|
|
898
901
|
const transaction = Transaction.deserialize(openCredential.transaction)
|
|
899
902
|
if (!('calls' in transaction)) throw new Error('unexpected transaction type')
|
|
900
|
-
const [
|
|
901
|
-
{ to?: Address; data?: `0x${string}` },
|
|
902
|
-
{ to?: Address; data?: `0x${string}` },
|
|
903
|
-
]
|
|
904
|
-
const approve = decodeFunctionData({ abi: erc20Abi, data: approveCall.data ?? '0x' })
|
|
903
|
+
const [openCall] = transaction.calls as readonly [{ to?: Address; data?: `0x${string}` }]
|
|
905
904
|
const open = decodeFunctionData({ abi: escrowAbi, data: openCall.data ?? '0x' })
|
|
906
|
-
const
|
|
907
|
-
const openArgs = open.args as readonly [Address, Address, bigint, string, Address]
|
|
908
|
-
|
|
909
|
-
expect(approveCall.to).toBe(asset)
|
|
910
|
-
expect(approve.functionName).toBe('approve')
|
|
911
|
-
expect(approveArgs[0].toLowerCase()).toBe(escrow.toLowerCase())
|
|
912
|
-
expect(approveArgs[1]).toBe(10_000_000n)
|
|
905
|
+
const openArgs = open.args as readonly [Address, Address, Address, bigint, string, Address]
|
|
913
906
|
|
|
914
907
|
expect(openCall.to?.toLowerCase()).toBe(escrow.toLowerCase())
|
|
915
908
|
expect(open.functionName).toBe('open')
|
|
916
909
|
expect(openArgs[0].toLowerCase()).toBe(accounts[0].address.toLowerCase())
|
|
917
|
-
expect(openArgs[1]
|
|
918
|
-
expect(openArgs[2]).toBe(
|
|
919
|
-
expect(openArgs[3]).
|
|
920
|
-
expect(openArgs[4]
|
|
910
|
+
expect(openArgs[1]).toBe('0x0000000000000000000000000000000000000000')
|
|
911
|
+
expect(openArgs[2].toLowerCase()).toBe(asset.toLowerCase())
|
|
912
|
+
expect(openArgs[3]).toBe(7_000_000n)
|
|
913
|
+
expect(openArgs[4]).toEqual(expect.any(String))
|
|
914
|
+
expect(openArgs[5].toLowerCase()).toBe(testAccount.address.toLowerCase())
|
|
921
915
|
} finally {
|
|
922
916
|
httpServer.close()
|
|
923
917
|
}
|
|
@@ -927,7 +921,7 @@ describe('session multi-fetch (examples/session/multi-fetch)', () => {
|
|
|
927
921
|
await fundAccount({ address: testAccount.address, token: Addresses.pathUsd })
|
|
928
922
|
await fundAccount({ address: testAccount.address, token: asset })
|
|
929
923
|
|
|
930
|
-
const escrow =
|
|
924
|
+
const escrow = tip20ChannelEscrow
|
|
931
925
|
const store = Store.memory()
|
|
932
926
|
const tickAmount = '0.001'
|
|
933
927
|
const server = Mppx_server.create({
|
|
@@ -991,7 +985,7 @@ describe('session multi-fetch (examples/session/multi-fetch)', () => {
|
|
|
991
985
|
await fundAccount({ address: testAccount.address, token: Addresses.pathUsd })
|
|
992
986
|
await fundAccount({ address: testAccount.address, token: asset })
|
|
993
987
|
|
|
994
|
-
const escrow =
|
|
988
|
+
const escrow = tip20ChannelEscrow
|
|
995
989
|
const store = Store.memory()
|
|
996
990
|
const server = Mppx_server.create({
|
|
997
991
|
methods: [
|
|
@@ -1069,7 +1063,7 @@ describe('session sse (examples/session/sse)', () => {
|
|
|
1069
1063
|
await fundAccount({ address: testAccount.address, token: Addresses.pathUsd })
|
|
1070
1064
|
await fundAccount({ address: testAccount.address, token: asset })
|
|
1071
1065
|
|
|
1072
|
-
const escrow =
|
|
1066
|
+
const escrow = tip20ChannelEscrow
|
|
1073
1067
|
const store = Store.memory()
|
|
1074
1068
|
const server = Mppx_server.create({
|
|
1075
1069
|
methods: [
|
|
@@ -1251,9 +1245,10 @@ describe('stripe charge', () => {
|
|
|
1251
1245
|
|
|
1252
1246
|
// ---------------------------------------------------------------------------
|
|
1253
1247
|
// account [action]
|
|
1254
|
-
//
|
|
1248
|
+
// Keychain tests are opt-in because macOS/Linux keychain commands can block on
|
|
1249
|
+
// developer machines without an unlocked keychain daemon.
|
|
1255
1250
|
// ---------------------------------------------------------------------------
|
|
1256
|
-
describe.
|
|
1251
|
+
describe.runIf(process.env.MPPX_TEST_KEYCHAIN === 'true')('account', () => {
|
|
1257
1252
|
const binPath = path.resolve(import.meta.dirname, '../bin.ts')
|
|
1258
1253
|
const cwd = path.resolve(import.meta.dirname, '../..')
|
|
1259
1254
|
const accountEnv = {
|
package/src/cli/cli.ts
CHANGED
|
@@ -11,6 +11,7 @@ import { tempo as tempoMainnet } from 'viem/tempo/chains'
|
|
|
11
11
|
import * as Challenge from '../Challenge.js'
|
|
12
12
|
import { normalizeHeaders } from '../client/internal/Fetch.js'
|
|
13
13
|
import * as Mppx from '../client/Mppx.js'
|
|
14
|
+
import * as Constants from '../Constants.js'
|
|
14
15
|
import { validate as validateDiscovery } from '../discovery/Validate.js'
|
|
15
16
|
import { createDefaultStore, createKeychain, resolveAccountName } from './account.js'
|
|
16
17
|
import { loadConfig, resolveAcceptPayment, selectChallenge } from './internal.js'
|
|
@@ -32,6 +33,7 @@ import {
|
|
|
32
33
|
printResponseHeaders,
|
|
33
34
|
prompt,
|
|
34
35
|
resolveChain,
|
|
36
|
+
resolveFundingNetwork,
|
|
35
37
|
resolveRpcUrl,
|
|
36
38
|
} from './utils.js'
|
|
37
39
|
|
|
@@ -373,7 +375,7 @@ const cli = Cli.create('mppx', {
|
|
|
373
375
|
const { challenge, plugin, method: configMethod } = selected
|
|
374
376
|
const selectedChallengeResponse = new Response(null, {
|
|
375
377
|
status: 402,
|
|
376
|
-
headers: {
|
|
378
|
+
headers: { [Constants.Headers.wwwAuthenticate]: Challenge.serialize(challenge) },
|
|
377
379
|
})
|
|
378
380
|
|
|
379
381
|
let tokenSymbol = (challenge.request.currency as string | undefined) ?? ''
|
|
@@ -547,7 +549,7 @@ const cli = Cli.create('mppx', {
|
|
|
547
549
|
|
|
548
550
|
if (!handled) {
|
|
549
551
|
// Default: print receipt + body
|
|
550
|
-
const receiptHeader = credentialResponse.headers.get(
|
|
552
|
+
const receiptHeader = credentialResponse.headers.get(Constants.Headers.paymentReceipt)
|
|
551
553
|
if (receiptHeader && c.options.verbose >= 1) {
|
|
552
554
|
try {
|
|
553
555
|
const receiptJson = JSON.parse(Base64.toString(receiptHeader)) as Record<
|
|
@@ -704,8 +706,9 @@ const account = Cli.create('account', {
|
|
|
704
706
|
const addrDisplay = explorerUrl
|
|
705
707
|
? link(`${explorerUrl}/address/${acct.address}`, acct.address)
|
|
706
708
|
: acct.address
|
|
707
|
-
const
|
|
708
|
-
|
|
709
|
+
const fundingNetwork = resolveFundingNetwork(c.options)
|
|
710
|
+
const rpcUrl = resolveRpcUrl(c.options.rpcUrl, { network: fundingNetwork })
|
|
711
|
+
resolveChain({ network: fundingNetwork, rpcUrl })
|
|
709
712
|
.then((chain) => createClient({ chain, transport: http(rpcUrl) }))
|
|
710
713
|
.then((client) =>
|
|
711
714
|
import('viem/tempo').then(({ Actions }) =>
|
|
@@ -715,6 +718,11 @@ const account = Cli.create('account', {
|
|
|
715
718
|
return outputResult(c, { address: acct.address, name: resolvedName }, () => {
|
|
716
719
|
console.log(`Account "${resolvedName}" saved to keychain.`)
|
|
717
720
|
console.log(pc.dim(`Address ${addrDisplay}`))
|
|
721
|
+
console.log(
|
|
722
|
+
pc.dim(
|
|
723
|
+
`Fund testnet tokens: mppx account fund --account ${resolvedName} --network testnet`,
|
|
724
|
+
),
|
|
725
|
+
)
|
|
718
726
|
})
|
|
719
727
|
},
|
|
720
728
|
})
|
|
@@ -840,8 +848,9 @@ const account = Cli.create('account', {
|
|
|
840
848
|
return c.error({ code: 'ACCOUNT_NOT_FOUND', message: 'No account found.', exitCode: 69 })
|
|
841
849
|
}
|
|
842
850
|
const acct = privateKeyToAccount(key as `0x${string}`)
|
|
843
|
-
const
|
|
844
|
-
const
|
|
851
|
+
const fundingNetwork = resolveFundingNetwork(c.options)
|
|
852
|
+
const rpcUrl = resolveRpcUrl(c.options.rpcUrl, { network: fundingNetwork })
|
|
853
|
+
const chain = await resolveChain({ network: fundingNetwork, rpcUrl })
|
|
845
854
|
const client = createClient({ chain, transport: http(rpcUrl) })
|
|
846
855
|
if (!structured) console.log(`Funding "${accountName}" on ${chainName(chain)}`)
|
|
847
856
|
try {
|
|
@@ -864,14 +873,18 @@ const account = Cli.create('account', {
|
|
|
864
873
|
},
|
|
865
874
|
)
|
|
866
875
|
} catch (err) {
|
|
876
|
+
const message = err instanceof Error ? err.message : String(err)
|
|
867
877
|
if (structured)
|
|
868
878
|
return c.error({
|
|
869
879
|
code: 'FUNDING_FAILED',
|
|
870
|
-
message
|
|
880
|
+
message,
|
|
871
881
|
exitCode: 1,
|
|
872
882
|
})
|
|
873
|
-
|
|
874
|
-
|
|
883
|
+
return c.error({
|
|
884
|
+
code: 'FUNDING_FAILED',
|
|
885
|
+
message: `Funding failed: ${message}`,
|
|
886
|
+
exitCode: 1,
|
|
887
|
+
})
|
|
875
888
|
}
|
|
876
889
|
},
|
|
877
890
|
})
|
|
@@ -1145,7 +1158,7 @@ const sign = Cli.create('sign', {
|
|
|
1145
1158
|
const wwwAuth = Challenge.serialize(challenge)
|
|
1146
1159
|
const fakeResponse = new Response(null, {
|
|
1147
1160
|
status: 402,
|
|
1148
|
-
headers: {
|
|
1161
|
+
headers: { [Constants.Headers.wwwAuthenticate]: wwwAuth },
|
|
1149
1162
|
})
|
|
1150
1163
|
|
|
1151
1164
|
let credential: string
|
package/src/cli/mcp.test.ts
CHANGED
|
@@ -48,6 +48,14 @@ function createLineClient(child: ChildProcessWithoutNullStreams) {
|
|
|
48
48
|
child.stderr.setEncoding('utf8')
|
|
49
49
|
child.stdout.on('data', (chunk) => {
|
|
50
50
|
buffer += chunk
|
|
51
|
+
drainLines()
|
|
52
|
+
drainJsonBuffer()
|
|
53
|
+
})
|
|
54
|
+
child.stderr.on('data', (chunk) => {
|
|
55
|
+
stderr += chunk
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
function drainLines() {
|
|
51
59
|
for (;;) {
|
|
52
60
|
const index = buffer.indexOf('\n')
|
|
53
61
|
if (index === -1) break
|
|
@@ -60,10 +68,16 @@ function createLineClient(child: ChildProcessWithoutNullStreams) {
|
|
|
60
68
|
nonJsonLines.push(line)
|
|
61
69
|
}
|
|
62
70
|
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function drainJsonBuffer() {
|
|
74
|
+
const text = buffer.trim()
|
|
75
|
+
if (!text) return
|
|
76
|
+
try {
|
|
77
|
+
messages.push(JSON.parse(text))
|
|
78
|
+
buffer = ''
|
|
79
|
+
} catch {}
|
|
80
|
+
}
|
|
67
81
|
|
|
68
82
|
return {
|
|
69
83
|
get nonJsonLines() {
|
|
@@ -88,9 +102,9 @@ function createLineClient(child: ChildProcessWithoutNullStreams) {
|
|
|
88
102
|
await new Promise((resolve) => setTimeout(resolve, 20))
|
|
89
103
|
}
|
|
90
104
|
throw new Error(
|
|
91
|
-
`Timed out waiting for MCP response ${id}. stderr=${stderr}
|
|
92
|
-
|
|
93
|
-
)}`,
|
|
105
|
+
`Timed out waiting for MCP response ${id}. stderr=${stderr} buffer=${JSON.stringify(
|
|
106
|
+
buffer,
|
|
107
|
+
)} nonJson=${JSON.stringify(nonJsonLines)}`,
|
|
94
108
|
)
|
|
95
109
|
},
|
|
96
110
|
}
|
package/src/cli/plugins/tempo.ts
CHANGED
|
@@ -11,10 +11,15 @@ import { createClient, http } from 'viem'
|
|
|
11
11
|
import { privateKeyToAccount } from 'viem/accounts'
|
|
12
12
|
|
|
13
13
|
import { normalizeHeaders } from '../../client/internal/Fetch.js'
|
|
14
|
+
import * as Constants from '../../Constants.js'
|
|
14
15
|
import * as Credential from '../../Credential.js'
|
|
15
16
|
import { tempo as tempoMethods } from '../../tempo/client/index.js'
|
|
16
|
-
import
|
|
17
|
-
import {
|
|
17
|
+
import { tip20ChannelEscrow } from '../../tempo/session/precompile/Protocol.js'
|
|
18
|
+
import type {
|
|
19
|
+
ChannelDescriptor,
|
|
20
|
+
SessionCredentialPayload,
|
|
21
|
+
} from '../../tempo/session/precompile/Protocol.js'
|
|
22
|
+
import { signVoucher } from '../../tempo/session/precompile/Voucher.js'
|
|
18
23
|
import { createDefaultStore, createKeychain, resolveAccountName } from '../account.js'
|
|
19
24
|
import {
|
|
20
25
|
fetchTokenInfo,
|
|
@@ -40,6 +45,7 @@ export function tempo() {
|
|
|
40
45
|
chainId: number
|
|
41
46
|
action?: 'voucher' | 'close'
|
|
42
47
|
}): Promise<string>
|
|
48
|
+
descriptor?: ChannelDescriptor | undefined
|
|
43
49
|
source: string
|
|
44
50
|
}
|
|
45
51
|
| undefined
|
|
@@ -176,7 +182,7 @@ export function tempo() {
|
|
|
176
182
|
account,
|
|
177
183
|
getClient: () => client!,
|
|
178
184
|
...(autoSwap !== undefined ? { autoSwap } : {}),
|
|
179
|
-
|
|
185
|
+
maxDeposit: (() => {
|
|
180
186
|
if (challenge.intent !== 'session') return undefined
|
|
181
187
|
const suggestedDeposit = (challenge.request as Record<string, unknown>)
|
|
182
188
|
.suggestedDeposit as string | undefined
|
|
@@ -209,6 +215,7 @@ export function tempo() {
|
|
|
209
215
|
|
|
210
216
|
// Store session support for use in lifecycle hooks
|
|
211
217
|
_session = {
|
|
218
|
+
descriptor: undefined,
|
|
212
219
|
async signVoucher({
|
|
213
220
|
channelId,
|
|
214
221
|
cumulativeAmount,
|
|
@@ -216,11 +223,14 @@ export function tempo() {
|
|
|
216
223
|
chainId,
|
|
217
224
|
action = 'voucher',
|
|
218
225
|
}) {
|
|
226
|
+
const descriptor = _session?.descriptor
|
|
227
|
+
if (!descriptor) throw new Error('session descriptor not available')
|
|
219
228
|
return Credential.serialize({
|
|
220
229
|
challenge,
|
|
221
230
|
payload: {
|
|
222
231
|
action,
|
|
223
232
|
channelId,
|
|
233
|
+
descriptor,
|
|
224
234
|
cumulativeAmount: cumulativeAmount.toString(),
|
|
225
235
|
signature: await signVoucher(
|
|
226
236
|
client!,
|
|
@@ -260,16 +270,19 @@ export function tempo() {
|
|
|
260
270
|
const parsed = Credential.deserialize<SessionCredentialPayload>(credential)
|
|
261
271
|
const challengeRequest = challenge.request as Record<string, unknown>
|
|
262
272
|
const sessionMd = challengeRequest.methodDetails as
|
|
263
|
-
| { escrowContract?: string; chainId?: number }
|
|
273
|
+
| { escrow?: string; escrowContract?: string; chainId?: number }
|
|
264
274
|
| undefined
|
|
265
275
|
const channelId = parsed.payload.channelId
|
|
266
|
-
const escrowContract = sessionMd?.escrowContract
|
|
276
|
+
const escrowContract = (sessionMd?.escrowContract ??
|
|
277
|
+
sessionMd?.escrow ??
|
|
278
|
+
tip20ChannelEscrow) as Address
|
|
267
279
|
const chainId = sessionMd?.chainId ?? 0
|
|
268
280
|
const tickCost = BigInt(challengeRequest.amount as string)
|
|
269
281
|
let cumulativeAmount =
|
|
270
282
|
'cumulativeAmount' in parsed.payload && parsed.payload.cumulativeAmount
|
|
271
283
|
? BigInt(parsed.payload.cumulativeAmount)
|
|
272
284
|
: 0n
|
|
285
|
+
if ('descriptor' in parsed.payload) _session.descriptor = parsed.payload.descriptor
|
|
273
286
|
|
|
274
287
|
if (verbose >= 1) {
|
|
275
288
|
if (parsed.payload.action === 'open') {
|
|
@@ -302,7 +315,7 @@ export function tempo() {
|
|
|
302
315
|
}
|
|
303
316
|
|
|
304
317
|
// Print receipt from initial response headers
|
|
305
|
-
const receiptHeader = credentialResponse.headers.get(
|
|
318
|
+
const receiptHeader = credentialResponse.headers.get(Constants.Headers.paymentReceipt)
|
|
306
319
|
if (receiptHeader) {
|
|
307
320
|
try {
|
|
308
321
|
const receiptJson = JSON.parse(Base64.toString(receiptHeader)) as Record<string, unknown>
|
|
@@ -556,7 +569,7 @@ async function handleSseStream(
|
|
|
556
569
|
})
|
|
557
570
|
await globalThis.fetch(opts.fetchUrl, {
|
|
558
571
|
method: 'POST',
|
|
559
|
-
headers: {
|
|
572
|
+
headers: { [Constants.Headers.authorization]: voucherCred },
|
|
560
573
|
})
|
|
561
574
|
} catch (e) {
|
|
562
575
|
opts.info(pc.dim(pc.yellow(` [voucher failed: ${e instanceof Error ? e.message : e}]`)))
|
|
@@ -669,7 +682,7 @@ async function closeChannel(opts: {
|
|
|
669
682
|
if (closeRes.ok) {
|
|
670
683
|
deleteChannelState(opts.channelId)
|
|
671
684
|
if (opts.verbose >= 1) {
|
|
672
|
-
const closeReceiptHeader = closeRes.headers.get(
|
|
685
|
+
const closeReceiptHeader = closeRes.headers.get(Constants.Headers.paymentReceipt)
|
|
673
686
|
let closeTxHash: string | undefined
|
|
674
687
|
if (closeReceiptHeader) {
|
|
675
688
|
try {
|
package/src/cli/utils.test.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { tempo as tempoMainnet, tempoModerato } from 'viem/tempo/chains'
|
|
2
2
|
import { afterEach, describe, expect, test } from 'vp/test'
|
|
3
3
|
|
|
4
|
-
import { networkRpcUrls, resolveChain, resolveRpcUrl } from './utils.js'
|
|
4
|
+
import { networkRpcUrls, resolveChain, resolveFundingNetwork, resolveRpcUrl } from './utils.js'
|
|
5
5
|
|
|
6
6
|
describe('resolveRpcUrl', () => {
|
|
7
7
|
afterEach(() => {
|
|
@@ -52,6 +52,30 @@ describe('resolveRpcUrl', () => {
|
|
|
52
52
|
})
|
|
53
53
|
})
|
|
54
54
|
|
|
55
|
+
describe('resolveFundingNetwork', () => {
|
|
56
|
+
afterEach(() => {
|
|
57
|
+
delete process.env.MPPX_RPC_URL
|
|
58
|
+
delete process.env.RPC_URL
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
test('defaults faucet funding to testnet', () => {
|
|
62
|
+
expect(resolveFundingNetwork()).toBe('testnet')
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
test('keeps explicit network selection', () => {
|
|
66
|
+
expect(resolveFundingNetwork({ network: 'mainnet' })).toBe('mainnet')
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
test('does not override explicit rpc url', () => {
|
|
70
|
+
expect(resolveFundingNetwork({ rpcUrl: 'https://explicit.example.com' })).toBeUndefined()
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
test('does not override env rpc urls', () => {
|
|
74
|
+
process.env.MPPX_RPC_URL = 'https://env.example.com'
|
|
75
|
+
expect(resolveFundingNetwork()).toBeUndefined()
|
|
76
|
+
})
|
|
77
|
+
})
|
|
78
|
+
|
|
55
79
|
describe('resolveChain', () => {
|
|
56
80
|
afterEach(() => {
|
|
57
81
|
delete process.env.MPPX_RPC_URL
|
package/src/cli/utils.ts
CHANGED
|
@@ -242,6 +242,16 @@ export function resolveRpcUrl(
|
|
|
242
242
|
)
|
|
243
243
|
}
|
|
244
244
|
|
|
245
|
+
/** Select the default network for faucet funding without overriding explicit RPC configuration. */
|
|
246
|
+
export function resolveFundingNetwork(
|
|
247
|
+
options: { network?: Network | undefined; rpcUrl?: string | undefined } = {},
|
|
248
|
+
): Network | undefined {
|
|
249
|
+
if (options.network) return options.network
|
|
250
|
+
if (options.rpcUrl) return undefined
|
|
251
|
+
if (process.env.MPPX_RPC_URL?.trim() || process.env.RPC_URL?.trim()) return undefined
|
|
252
|
+
return 'testnet'
|
|
253
|
+
}
|
|
254
|
+
|
|
245
255
|
export async function resolveChain(
|
|
246
256
|
opts: { network?: Network | undefined; rpcUrl?: string | undefined } = {},
|
|
247
257
|
): Promise<Chain> {
|
package/src/client/Methods.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
export { evm } from '../evm/client/index.js'
|
|
2
2
|
export { stripe } from '../stripe/client/index.js'
|
|
3
3
|
export { subscription } from '../tempo/client/Subscription.js'
|
|
4
|
-
export { tempo } from '../tempo/client/index.js'
|
|
5
|
-
export { session } from '../tempo/client/Session.js'
|
|
4
|
+
export { session, tempo } from '../tempo/client/index.js'
|
|
5
|
+
export { session as sessionMethod } from '../tempo/session/client/Session.js'
|
|
6
|
+
export { sessionManager } from '../tempo/session/client/SessionManager.js'
|
|
7
|
+
export { session as sessionLegacy } from '../tempo/legacy/client/index.js'
|
|
8
|
+
export { sessionManager as sessionLegacyManager } from '../tempo/legacy/client/index.js'
|
|
@@ -10,10 +10,20 @@ import type * as AutoSwap from '../tempo/internal/auto-swap.js'
|
|
|
10
10
|
import * as Methods from '../tempo/Methods.js'
|
|
11
11
|
import * as z from '../zod.js'
|
|
12
12
|
import * as Fetch from './internal/Fetch.js'
|
|
13
|
+
import { session, sessionManager, sessionMethod } from './Methods.js'
|
|
13
14
|
import * as Mppx from './Mppx.js'
|
|
14
15
|
import * as Transport from './Transport.js'
|
|
15
16
|
|
|
16
17
|
describe('Mppx', () => {
|
|
18
|
+
test('exports low-level session method and explicit managed session helper', () => {
|
|
19
|
+
expectTypeOf(session({ account: {} as Account })).toMatchTypeOf<Method.AnyClient>()
|
|
20
|
+
expectTypeOf(session.manager({ account: {} as Account })).toHaveProperty('fetch')
|
|
21
|
+
expectTypeOf(sessionManager({ account: {} as Account })).toHaveProperty('fetch')
|
|
22
|
+
expectTypeOf(sessionMethod({ account: {} as Account })).toMatchTypeOf<Method.AnyClient>()
|
|
23
|
+
expectTypeOf(tempo.session({ account: {} as Account })).toMatchTypeOf<Method.AnyClient>()
|
|
24
|
+
expectTypeOf(tempo.session.manager({ account: {} as Account })).toHaveProperty('fetch')
|
|
25
|
+
})
|
|
26
|
+
|
|
17
27
|
test('has methods array', () => {
|
|
18
28
|
const method = charge({
|
|
19
29
|
account: {} as Account,
|
package/src/client/Mppx.test.ts
CHANGED
|
@@ -74,6 +74,81 @@ describe('Mppx.create', () => {
|
|
|
74
74
|
})
|
|
75
75
|
|
|
76
76
|
describe('createCredential', () => {
|
|
77
|
+
function sessionChallenge(id: string, sessionProtocol?: string) {
|
|
78
|
+
return {
|
|
79
|
+
expires: new Date(Date.now() + 60_000).toISOString(),
|
|
80
|
+
id,
|
|
81
|
+
intent: 'session',
|
|
82
|
+
method: 'tempo',
|
|
83
|
+
realm,
|
|
84
|
+
request: {
|
|
85
|
+
amount: '100',
|
|
86
|
+
currency: asset,
|
|
87
|
+
unitType: 'request',
|
|
88
|
+
methodDetails: {
|
|
89
|
+
chainId: 1,
|
|
90
|
+
escrowContract: '0x0000000000000000000000000000000000000001',
|
|
91
|
+
...(sessionProtocol !== undefined ? { sessionProtocol } : {}),
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
} as const
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function paymentRequiredResponse(...challenges: Challenge.Challenge[]) {
|
|
98
|
+
return new Response(null, {
|
|
99
|
+
status: 402,
|
|
100
|
+
headers: { 'WWW-Authenticate': challenges.map(Challenge.serialize).join(', ') },
|
|
101
|
+
})
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function taggedSessionMethod(tag: string, canHandleChallenge: Method.CanHandleChallengeFn) {
|
|
105
|
+
return Method.toClient(Methods.session, {
|
|
106
|
+
canHandleChallenge,
|
|
107
|
+
async createCredential({ challenge }) {
|
|
108
|
+
return Credential.serialize({ challenge, payload: { tag } })
|
|
109
|
+
},
|
|
110
|
+
})
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
test('behavior: routes duplicate tempo/session client methods by sessionProtocol', async () => {
|
|
114
|
+
const tip1034 = taggedSessionMethod(
|
|
115
|
+
'v2',
|
|
116
|
+
({ challenge }) =>
|
|
117
|
+
(challenge.request.methodDetails as { sessionProtocol?: string } | undefined)
|
|
118
|
+
?.sessionProtocol === 'v2',
|
|
119
|
+
)
|
|
120
|
+
const legacy = taggedSessionMethod('v1', ({ challenge }) => {
|
|
121
|
+
const sessionProtocol = (
|
|
122
|
+
challenge.request.methodDetails as { sessionProtocol?: string } | undefined
|
|
123
|
+
)?.sessionProtocol
|
|
124
|
+
return sessionProtocol === undefined || sessionProtocol === 'v1'
|
|
125
|
+
})
|
|
126
|
+
const mppx = Mppx.create({ polyfill: false, methods: [tip1034, legacy] })
|
|
127
|
+
|
|
128
|
+
const [newCredential, legacyCredential, oldCredential] = await Promise.all([
|
|
129
|
+
mppx.createCredential(paymentRequiredResponse(sessionChallenge('new', 'v2'))),
|
|
130
|
+
mppx.createCredential(paymentRequiredResponse(sessionChallenge('v1', 'v1'))),
|
|
131
|
+
mppx.createCredential(paymentRequiredResponse(sessionChallenge('old'))),
|
|
132
|
+
])
|
|
133
|
+
expect(Credential.deserialize(newCredential).payload).toEqual({ tag: 'v2' })
|
|
134
|
+
expect(Credential.deserialize(legacyCredential).payload).toEqual({ tag: 'v1' })
|
|
135
|
+
expect(Credential.deserialize(oldCredential).payload).toEqual({ tag: 'v1' })
|
|
136
|
+
})
|
|
137
|
+
|
|
138
|
+
test('behavior: rejects unknown tempo/session sessionProtocol', async () => {
|
|
139
|
+
const method = taggedSessionMethod(
|
|
140
|
+
'v2',
|
|
141
|
+
({ challenge }) =>
|
|
142
|
+
(challenge.request.methodDetails as { sessionProtocol?: string } | undefined)
|
|
143
|
+
?.sessionProtocol === 'v2',
|
|
144
|
+
)
|
|
145
|
+
const mppx = Mppx.create({ polyfill: false, methods: [method] })
|
|
146
|
+
|
|
147
|
+
await expect(
|
|
148
|
+
mppx.createCredential(paymentRequiredResponse(sessionChallenge('unknown', 'future'))),
|
|
149
|
+
).rejects.toThrow('No method found for challenges: tempo.session')
|
|
150
|
+
})
|
|
151
|
+
|
|
77
152
|
test('behavior: routes to correct method based on challenge', async () => {
|
|
78
153
|
const mppx = Mppx.create({
|
|
79
154
|
polyfill: false,
|
package/src/client/Transport.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as Challenge from '../Challenge.js'
|
|
2
|
+
import * as Constants from '../Constants.js'
|
|
2
3
|
import * as Credential from '../Credential.js'
|
|
3
4
|
import * as Mcp from '../Mcp.js'
|
|
4
5
|
import * as x402_Header from '../x402/Header.js'
|
|
@@ -6,10 +7,8 @@ import * as x402_ChallengeBrand from '../x402/internal/ChallengeBrand.js'
|
|
|
6
7
|
import * as x402_Types from '../x402/Types.js'
|
|
7
8
|
|
|
8
9
|
const paymentRequiredStatus = 402
|
|
9
|
-
const paymentAuthChallengeHeader = 'WWW-Authenticate'
|
|
10
|
-
const paymentAuthCredentialHeader = 'Authorization'
|
|
11
10
|
const credentialHeaders = [
|
|
12
|
-
|
|
11
|
+
Constants.Headers.authorization,
|
|
13
12
|
x402_Types.paymentRequiredHeader,
|
|
14
13
|
x402_Types.paymentResponseHeader,
|
|
15
14
|
x402_Types.paymentSignatureHeader,
|
|
@@ -107,7 +106,7 @@ export function http() {
|
|
|
107
106
|
if (isX402Challenge(options?.challenge)) {
|
|
108
107
|
headers.set(x402_Types.paymentSignatureHeader, credential)
|
|
109
108
|
} else {
|
|
110
|
-
headers.set(
|
|
109
|
+
headers.set(Constants.Headers.authorization, credential)
|
|
111
110
|
}
|
|
112
111
|
return { ...request, headers }
|
|
113
112
|
},
|
|
@@ -116,7 +115,7 @@ export function http() {
|
|
|
116
115
|
|
|
117
116
|
function paymentRequiredChallenges(response: Response): Challenge.Challenge[] {
|
|
118
117
|
return [
|
|
119
|
-
...(response.headers.has(
|
|
118
|
+
...(response.headers.has(Constants.Headers.wwwAuthenticate)
|
|
120
119
|
? Challenge.fromResponseList(response)
|
|
121
120
|
: []),
|
|
122
121
|
...x402Challenges(response),
|
package/src/client/index.ts
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
|
+
export * as Constants from '../Constants.js'
|
|
1
2
|
export * as Expires from '../Expires.js'
|
|
2
3
|
export * as Fetch from './internal/Fetch.js'
|
|
3
|
-
export {
|
|
4
|
+
export {
|
|
5
|
+
evm,
|
|
6
|
+
session,
|
|
7
|
+
sessionManager,
|
|
8
|
+
sessionMethod,
|
|
9
|
+
sessionLegacy,
|
|
10
|
+
sessionLegacyManager,
|
|
11
|
+
stripe,
|
|
12
|
+
tempo,
|
|
13
|
+
} from './Methods.js'
|
|
4
14
|
export * as Mppx from './Mppx.js'
|
|
5
15
|
export * as Transport from './Transport.js'
|