mppx 0.6.30 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/dist/Challenge.d.ts.map +1 -1
- package/dist/Challenge.js +9 -7
- package/dist/Challenge.js.map +1 -1
- package/dist/Constants.d.ts +46 -0
- package/dist/Constants.d.ts.map +1 -0
- package/dist/Constants.js +46 -0
- package/dist/Constants.js.map +1 -0
- package/dist/Credential.d.ts.map +1 -1
- package/dist/Credential.js +5 -4
- package/dist/Credential.js.map +1 -1
- package/dist/Method.d.ts +32 -4
- package/dist/Method.d.ts.map +1 -1
- package/dist/Method.js +5 -2
- package/dist/Method.js.map +1 -1
- package/dist/Receipt.d.ts.map +1 -1
- package/dist/Receipt.js +3 -2
- package/dist/Receipt.js.map +1 -1
- package/dist/cli/cli.d.ts.map +1 -1
- package/dist/cli/cli.js +19 -11
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/plugins/tempo.d.ts.map +1 -1
- package/dist/cli/plugins/tempo.js +17 -6
- package/dist/cli/plugins/tempo.js.map +1 -1
- package/dist/cli/utils.d.ts +5 -0
- package/dist/cli/utils.d.ts.map +1 -1
- package/dist/cli/utils.js +10 -0
- package/dist/cli/utils.js.map +1 -1
- package/dist/client/Methods.d.ts +5 -2
- package/dist/client/Methods.d.ts.map +1 -1
- package/dist/client/Methods.js +5 -2
- package/dist/client/Methods.js.map +1 -1
- package/dist/client/Transport.d.ts.map +1 -1
- package/dist/client/Transport.js +4 -5
- package/dist/client/Transport.js.map +1 -1
- package/dist/client/index.d.ts +2 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +2 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal/Fetch.d.ts.map +1 -1
- package/dist/client/internal/Fetch.js +14 -6
- package/dist/client/internal/Fetch.js.map +1 -1
- package/dist/evm/server/Methods.d.ts +1 -1
- package/dist/evm/server/Methods.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/internal/AcceptPayment.d.ts +3 -0
- package/dist/internal/AcceptPayment.d.ts.map +1 -1
- package/dist/internal/AcceptPayment.js +15 -11
- package/dist/internal/AcceptPayment.js.map +1 -1
- package/dist/mcp-sdk/client/McpClient.d.ts +12 -5
- package/dist/mcp-sdk/client/McpClient.d.ts.map +1 -1
- package/dist/mcp-sdk/client/McpClient.js +55 -42
- package/dist/mcp-sdk/client/McpClient.js.map +1 -1
- package/dist/server/Mppx.d.ts +11 -3
- package/dist/server/Mppx.d.ts.map +1 -1
- package/dist/server/Mppx.js +76 -27
- package/dist/server/Mppx.js.map +1 -1
- package/dist/server/Request.js +24 -10
- package/dist/server/Request.js.map +1 -1
- package/dist/server/Response.d.ts.map +1 -1
- package/dist/server/Response.js +2 -1
- package/dist/server/Response.js.map +1 -1
- package/dist/server/Transport.d.ts.map +1 -1
- package/dist/server/Transport.js +4 -3
- package/dist/server/Transport.js.map +1 -1
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -0
- package/dist/server/index.js.map +1 -1
- package/dist/stripe/client/Charge.d.ts +1 -1
- package/dist/stripe/client/Charge.d.ts.map +1 -1
- package/dist/stripe/client/Charge.js +3 -1
- package/dist/stripe/client/Charge.js.map +1 -1
- package/dist/stripe/server/Charge.d.ts +1 -1
- package/dist/stripe/server/Charge.d.ts.map +1 -1
- package/dist/stripe/server/Charge.js +9 -2
- package/dist/stripe/server/Charge.js.map +1 -1
- package/dist/stripe/server/Methods.d.ts +1 -1
- package/dist/stripe/server/Methods.d.ts.map +1 -1
- package/dist/stripe/server/internal/html.gen.d.ts +1 -1
- package/dist/stripe/server/internal/html.gen.d.ts.map +1 -1
- package/dist/stripe/server/internal/html.gen.js +1 -1
- package/dist/stripe/server/internal/html.gen.js.map +1 -1
- package/dist/tempo/Methods.d.ts +18 -0
- package/dist/tempo/Methods.d.ts.map +1 -1
- package/dist/tempo/Methods.js +16 -1
- package/dist/tempo/Methods.js.map +1 -1
- package/dist/tempo/client/Charge.d.ts +6 -0
- package/dist/tempo/client/Charge.d.ts.map +1 -1
- package/dist/tempo/client/Charge.js +9 -2
- package/dist/tempo/client/Charge.js.map +1 -1
- package/dist/tempo/client/Methods.d.ts +36 -7
- package/dist/tempo/client/Methods.d.ts.map +1 -1
- package/dist/tempo/client/Methods.js +12 -5
- package/dist/tempo/client/Methods.js.map +1 -1
- package/dist/tempo/client/index.d.ts +7 -4
- package/dist/tempo/client/index.d.ts.map +1 -1
- package/dist/tempo/client/index.js +5 -3
- package/dist/tempo/client/index.js.map +1 -1
- package/dist/tempo/index.d.ts +1 -0
- package/dist/tempo/index.d.ts.map +1 -1
- package/dist/tempo/index.js +1 -0
- package/dist/tempo/index.js.map +1 -1
- package/dist/tempo/internal/fee-payer.d.ts +21 -1
- package/dist/tempo/internal/fee-payer.d.ts.map +1 -1
- package/dist/tempo/internal/fee-payer.js +109 -4
- package/dist/tempo/internal/fee-payer.js.map +1 -1
- package/dist/tempo/{client → legacy/client}/ChannelOps.d.ts +19 -6
- package/dist/tempo/legacy/client/ChannelOps.d.ts.map +1 -0
- package/dist/tempo/{client → legacy/client}/ChannelOps.js +9 -3
- package/dist/tempo/legacy/client/ChannelOps.js.map +1 -0
- package/dist/tempo/{client → legacy/client}/Session.d.ts +23 -4
- package/dist/tempo/legacy/client/Session.d.ts.map +1 -0
- package/dist/tempo/{client → legacy/client}/Session.js +14 -7
- package/dist/tempo/legacy/client/Session.js.map +1 -0
- package/dist/tempo/{client → legacy/client}/SessionManager.d.ts +20 -5
- package/dist/tempo/legacy/client/SessionManager.d.ts.map +1 -0
- package/dist/tempo/{client → legacy/client}/SessionManager.js +20 -16
- package/dist/tempo/legacy/client/SessionManager.js.map +1 -0
- package/dist/tempo/legacy/client/index.d.ts +7 -0
- package/dist/tempo/legacy/client/index.d.ts.map +1 -0
- package/dist/tempo/legacy/client/index.js +5 -0
- package/dist/tempo/legacy/client/index.js.map +1 -0
- package/dist/tempo/legacy/index.d.ts +7 -0
- package/dist/tempo/legacy/index.d.ts.map +1 -0
- package/dist/tempo/legacy/index.js +7 -0
- package/dist/tempo/legacy/index.js.map +1 -0
- package/dist/tempo/{server → legacy/server}/Session.d.ts +28 -11
- package/dist/tempo/legacy/server/Session.d.ts.map +1 -0
- package/dist/tempo/{server → legacy/server}/Session.js +28 -23
- package/dist/tempo/legacy/server/Session.js.map +1 -0
- package/dist/tempo/legacy/server/index.d.ts +5 -0
- package/dist/tempo/legacy/server/index.d.ts.map +1 -0
- package/dist/tempo/legacy/server/index.js +5 -0
- package/dist/tempo/legacy/server/index.js.map +1 -0
- package/dist/tempo/{session → legacy/session}/Chain.d.ts +30 -23
- package/dist/tempo/legacy/session/Chain.d.ts.map +1 -0
- package/dist/tempo/{session → legacy/session}/Chain.js +12 -11
- package/dist/tempo/legacy/session/Chain.js.map +1 -0
- package/dist/tempo/{session → legacy/session}/Channel.d.ts +1 -0
- package/dist/tempo/legacy/session/Channel.d.ts.map +1 -0
- package/dist/tempo/legacy/session/Channel.js.map +1 -0
- package/dist/tempo/legacy/session/ChannelStore.d.ts +22 -0
- package/dist/tempo/legacy/session/ChannelStore.d.ts.map +1 -0
- package/dist/tempo/legacy/session/ChannelStore.js +6 -0
- package/dist/tempo/legacy/session/ChannelStore.js.map +1 -0
- package/dist/tempo/legacy/session/Types.d.ts +73 -0
- package/dist/tempo/legacy/session/Types.d.ts.map +1 -0
- package/dist/tempo/legacy/session/Types.js.map +1 -0
- package/dist/tempo/{session → legacy/session}/Voucher.d.ts +4 -4
- package/dist/tempo/legacy/session/Voucher.d.ts.map +1 -0
- package/dist/tempo/{session → legacy/session}/Voucher.js +1 -1
- package/dist/tempo/legacy/session/Voucher.js.map +1 -0
- package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts +1 -0
- package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts.map +1 -1
- package/dist/tempo/{session → legacy/session}/escrow.abi.js +1 -0
- package/dist/tempo/legacy/session/escrow.abi.js.map +1 -0
- package/dist/tempo/legacy/session/index.d.ts +9 -0
- package/dist/tempo/legacy/session/index.d.ts.map +1 -0
- package/dist/tempo/legacy/session/index.js +9 -0
- package/dist/tempo/legacy/session/index.js.map +1 -0
- package/dist/tempo/server/Charge.d.ts +1 -1
- package/dist/tempo/server/Charge.d.ts.map +1 -1
- package/dist/tempo/server/Charge.js +13 -16
- package/dist/tempo/server/Charge.js.map +1 -1
- package/dist/tempo/server/Methods.d.ts +63 -6
- package/dist/tempo/server/Methods.d.ts.map +1 -1
- package/dist/tempo/server/Methods.js +36 -8
- package/dist/tempo/server/Methods.js.map +1 -1
- package/dist/tempo/server/Subscription.d.ts +1 -1
- package/dist/tempo/server/Subscription.d.ts.map +1 -1
- package/dist/tempo/server/index.d.ts +6 -5
- package/dist/tempo/server/index.d.ts.map +1 -1
- package/dist/tempo/server/index.js +5 -5
- package/dist/tempo/server/index.js.map +1 -1
- package/dist/tempo/server/internal/html.gen.d.ts +1 -1
- package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
- package/dist/tempo/server/internal/html.gen.js +1 -1
- package/dist/tempo/server/internal/html.gen.js.map +1 -1
- package/dist/tempo/server/internal/request-body.d.ts +7 -2
- package/dist/tempo/server/internal/request-body.d.ts.map +1 -1
- package/dist/tempo/server/internal/request-body.js +20 -3
- package/dist/tempo/server/internal/request-body.js.map +1 -1
- package/dist/tempo/server/internal/transport.d.ts +8 -4
- package/dist/tempo/server/internal/transport.d.ts.map +1 -1
- package/dist/tempo/server/internal/transport.js +8 -7
- package/dist/tempo/server/internal/transport.js.map +1 -1
- package/dist/tempo/session/Snapshot.d.ts +32 -0
- package/dist/tempo/session/Snapshot.d.ts.map +1 -0
- package/dist/tempo/session/Snapshot.js +37 -0
- package/dist/tempo/session/Snapshot.js.map +1 -0
- package/dist/tempo/session/client/ChannelOps.d.ts +82 -0
- package/dist/tempo/session/client/ChannelOps.d.ts.map +1 -0
- package/dist/tempo/session/client/ChannelOps.js +204 -0
- package/dist/tempo/session/client/ChannelOps.js.map +1 -0
- package/dist/tempo/session/client/CredentialState.d.ts +262 -0
- package/dist/tempo/session/client/CredentialState.d.ts.map +1 -0
- package/dist/tempo/session/client/CredentialState.js +417 -0
- package/dist/tempo/session/client/CredentialState.js.map +1 -0
- package/dist/tempo/session/client/ReceiptCoordinator.d.ts +26 -0
- package/dist/tempo/session/client/ReceiptCoordinator.d.ts.map +1 -0
- package/dist/tempo/session/client/ReceiptCoordinator.js +61 -0
- package/dist/tempo/session/client/ReceiptCoordinator.js.map +1 -0
- package/dist/tempo/session/client/Runtime.d.ts +464 -0
- package/dist/tempo/session/client/Runtime.d.ts.map +1 -0
- package/dist/tempo/session/client/Runtime.js +499 -0
- package/dist/tempo/session/client/Runtime.js.map +1 -0
- package/dist/tempo/session/client/Session.d.ts +132 -0
- package/dist/tempo/session/client/Session.d.ts.map +1 -0
- package/dist/tempo/session/client/Session.js +55 -0
- package/dist/tempo/session/client/Session.js.map +1 -0
- package/dist/tempo/session/client/SessionManager.d.ts +120 -0
- package/dist/tempo/session/client/SessionManager.d.ts.map +1 -0
- package/dist/tempo/session/client/SessionManager.js +627 -0
- package/dist/tempo/session/client/SessionManager.js.map +1 -0
- package/dist/tempo/session/client/Transports.d.ts +449 -0
- package/dist/tempo/session/client/Transports.d.ts.map +1 -0
- package/dist/tempo/session/client/Transports.js +721 -0
- package/dist/tempo/session/client/Transports.js.map +1 -0
- package/dist/tempo/session/client/index.d.ts +12 -0
- package/dist/tempo/session/client/index.d.ts.map +1 -0
- package/dist/tempo/session/client/index.js +5 -0
- package/dist/tempo/session/client/index.js.map +1 -0
- package/dist/tempo/session/index.d.ts +7 -8
- package/dist/tempo/session/index.d.ts.map +1 -1
- package/dist/tempo/session/index.js +7 -8
- package/dist/tempo/session/index.js.map +1 -1
- package/dist/tempo/session/precompile/Chain.d.ts +319 -0
- package/dist/tempo/session/precompile/Chain.d.ts.map +1 -0
- package/dist/tempo/session/precompile/Chain.js +492 -0
- package/dist/tempo/session/precompile/Chain.js.map +1 -0
- package/dist/tempo/session/precompile/Channel.d.ts +46 -0
- package/dist/tempo/session/precompile/Channel.d.ts.map +1 -0
- package/dist/tempo/session/precompile/Channel.js +56 -0
- package/dist/tempo/session/precompile/Channel.js.map +1 -0
- package/dist/tempo/session/precompile/Protocol.d.ts +308 -0
- package/dist/tempo/session/precompile/Protocol.d.ts.map +1 -0
- package/dist/tempo/session/precompile/Protocol.js +264 -0
- package/dist/tempo/session/precompile/Protocol.js.map +1 -0
- package/dist/tempo/session/precompile/Voucher.d.ts +40 -0
- package/dist/tempo/session/precompile/Voucher.d.ts.map +1 -0
- package/dist/tempo/session/precompile/Voucher.js +126 -0
- package/dist/tempo/session/precompile/Voucher.js.map +1 -0
- package/dist/tempo/session/precompile/escrow.abi.d.ts +522 -0
- package/dist/tempo/session/precompile/escrow.abi.d.ts.map +1 -0
- package/dist/tempo/session/precompile/escrow.abi.js +224 -0
- package/dist/tempo/session/precompile/escrow.abi.js.map +1 -0
- package/dist/tempo/session/precompile/index.d.ts +24 -0
- package/dist/tempo/session/precompile/index.d.ts.map +1 -0
- package/dist/tempo/session/precompile/index.js +22 -0
- package/dist/tempo/session/precompile/index.js.map +1 -0
- package/dist/tempo/session/server/ChannelOps.d.ts +56 -0
- package/dist/tempo/session/server/ChannelOps.d.ts.map +1 -0
- package/dist/tempo/session/server/ChannelOps.js +91 -0
- package/dist/tempo/session/server/ChannelOps.js.map +1 -0
- package/dist/tempo/session/server/ChannelStore.d.ts +347 -0
- package/dist/tempo/session/server/ChannelStore.d.ts.map +1 -0
- package/dist/tempo/session/server/ChannelStore.js +404 -0
- package/dist/tempo/session/server/ChannelStore.js.map +1 -0
- package/dist/tempo/session/server/CredentialVerification.d.ts +85 -0
- package/dist/tempo/session/server/CredentialVerification.d.ts.map +1 -0
- package/dist/tempo/session/server/CredentialVerification.js +494 -0
- package/dist/tempo/session/server/CredentialVerification.js.map +1 -0
- package/dist/tempo/session/server/MeteredStream.d.ts +40 -0
- package/dist/tempo/session/server/MeteredStream.d.ts.map +1 -0
- package/dist/tempo/session/server/MeteredStream.js +42 -0
- package/dist/tempo/session/server/MeteredStream.js.map +1 -0
- package/dist/tempo/session/server/RequestState.d.ts +208 -0
- package/dist/tempo/session/server/RequestState.d.ts.map +1 -0
- package/dist/tempo/session/server/RequestState.js +252 -0
- package/dist/tempo/session/server/RequestState.js.map +1 -0
- package/dist/tempo/session/server/Session.d.ts +169 -0
- package/dist/tempo/session/server/Session.d.ts.map +1 -0
- package/dist/tempo/session/server/Session.js +351 -0
- package/dist/tempo/session/server/Session.js.map +1 -0
- package/dist/tempo/session/server/Settlement.d.ts +185 -0
- package/dist/tempo/session/server/Settlement.d.ts.map +1 -0
- package/dist/tempo/session/server/Settlement.js +250 -0
- package/dist/tempo/session/server/Settlement.js.map +1 -0
- package/dist/tempo/session/{Sse.d.ts → server/Sse.d.ts} +9 -56
- package/dist/tempo/session/server/Sse.d.ts.map +1 -0
- package/dist/tempo/session/server/Sse.js +184 -0
- package/dist/tempo/session/server/Sse.js.map +1 -0
- package/dist/tempo/session/server/Transports.d.ts +89 -0
- package/dist/tempo/session/server/Transports.d.ts.map +1 -0
- package/dist/tempo/session/server/Transports.js +149 -0
- package/dist/tempo/session/server/Transports.js.map +1 -0
- package/dist/tempo/session/server/Ws.d.ts +48 -0
- package/dist/tempo/session/server/Ws.d.ts.map +1 -0
- package/dist/tempo/session/server/Ws.js +244 -0
- package/dist/tempo/session/server/Ws.js.map +1 -0
- package/dist/tempo/session/server/index.d.ts +4 -0
- package/dist/tempo/session/server/index.d.ts.map +1 -0
- package/dist/tempo/session/server/index.js +2 -0
- package/dist/tempo/session/server/index.js.map +1 -0
- package/package.json +8 -3
- package/src/Challenge.ts +9 -7
- package/src/Constants.ts +58 -0
- package/src/Credential.ts +5 -4
- package/src/Method.ts +46 -5
- package/src/Receipt.ts +3 -2
- package/src/cli/cli.test.ts +23 -28
- package/src/cli/cli.ts +23 -10
- package/src/cli/mcp.test.ts +21 -7
- package/src/cli/plugins/tempo.ts +21 -8
- package/src/cli/utils.test.ts +25 -1
- package/src/cli/utils.ts +10 -0
- package/src/client/Methods.ts +5 -2
- package/src/client/Mppx.test-d.ts +10 -0
- package/src/client/Mppx.test.ts +75 -0
- package/src/client/Transport.ts +4 -5
- package/src/client/index.ts +11 -1
- package/src/client/internal/Fetch.test.ts +29 -4
- package/src/client/internal/Fetch.ts +17 -5
- package/src/env.d.ts +1 -1
- package/src/index.ts +1 -0
- package/src/internal/AcceptPayment.test.ts +61 -0
- package/src/internal/AcceptPayment.ts +21 -14
- package/src/mcp-sdk/client/McpClient.integration.test.ts +8 -7
- package/src/mcp-sdk/client/McpClient.test-d.ts +7 -0
- package/src/mcp-sdk/client/McpClient.ts +99 -67
- package/src/mcp-sdk/client/McpClient.unit.test.ts +131 -0
- package/src/middlewares/elysia.test.ts +8 -4
- package/src/middlewares/express.test.ts +8 -4
- package/src/middlewares/hono.test.ts +4 -4
- package/src/middlewares/nextjs.test.ts +8 -4
- package/src/proxy/Proxy.test.ts +8 -8
- package/src/server/Mppx.test-d.ts +54 -0
- package/src/server/Mppx.test.ts +274 -7
- package/src/server/Mppx.ts +487 -406
- package/src/server/Request.test.ts +81 -0
- package/src/server/Request.ts +23 -9
- package/src/server/Response.ts +2 -1
- package/src/server/Transport.ts +4 -3
- package/src/server/index.ts +1 -0
- package/src/stripe/client/Charge.test.ts +20 -5
- package/src/stripe/client/Charge.ts +6 -2
- package/src/stripe/server/Charge.test.ts +114 -1
- package/src/stripe/server/Charge.ts +13 -2
- package/src/stripe/server/internal/html/package.json +1 -1
- package/src/stripe/server/internal/html.gen.ts +1 -1
- package/src/tempo/AccessKeyAuthorization.test.ts +4 -94
- package/src/tempo/Methods.test.ts +45 -17
- package/src/tempo/Methods.ts +22 -0
- package/src/tempo/PublicExports.test-d.ts +105 -0
- package/src/tempo/client/Charge.test.ts +85 -0
- package/src/tempo/client/Charge.ts +19 -2
- package/src/tempo/client/Methods.ts +18 -6
- package/src/tempo/client/index.ts +15 -4
- package/src/tempo/index.ts +1 -0
- package/src/tempo/internal/fee-payer.test.ts +241 -17
- package/src/tempo/internal/fee-payer.ts +150 -4
- package/src/tempo/internal/fee-token.test.ts +14 -9
- package/src/tempo/legacy/AccessKeyAuthorization.test.ts +162 -0
- package/src/tempo/legacy/README.md +9 -0
- package/src/tempo/{client → legacy/client}/ChannelOps.test.ts +6 -7
- package/src/tempo/{client → legacy/client}/ChannelOps.ts +22 -9
- package/src/tempo/{client → legacy/client}/Session.test.ts +51 -9
- package/src/tempo/{client → legacy/client}/Session.ts +25 -11
- package/src/tempo/{client → legacy/client}/SessionManager.test.ts +81 -9
- package/src/tempo/{client → legacy/client}/SessionManager.ts +41 -20
- package/src/tempo/legacy/client/index.ts +6 -0
- package/src/tempo/legacy/index.ts +6 -0
- package/src/tempo/{server → legacy/server}/Session.test.ts +162 -63
- package/src/tempo/{server → legacy/server}/Session.ts +49 -37
- package/src/tempo/legacy/server/index.ts +4 -0
- package/src/tempo/{session → legacy/session}/Chain.test.ts +3 -4
- package/src/tempo/{session → legacy/session}/Chain.ts +94 -63
- package/src/tempo/{session → legacy/session}/Channel.ts +1 -0
- package/src/tempo/legacy/session/ChannelStore.test.ts +58 -0
- package/src/tempo/legacy/session/ChannelStore.ts +39 -0
- package/src/tempo/legacy/session/Types.ts +91 -0
- package/src/tempo/{session → legacy/session}/Voucher.ts +12 -8
- package/src/tempo/{session → legacy/session}/escrow.abi.ts +1 -0
- package/src/tempo/legacy/session/index.ts +8 -0
- package/src/tempo/server/AtomicStore.test-d.ts +16 -11
- package/src/tempo/server/Charge.test.ts +92 -14
- package/src/tempo/server/Charge.ts +18 -16
- package/src/tempo/server/Methods.ts +54 -8
- package/src/tempo/server/Sse.test.ts +2 -2
- package/src/tempo/server/index.ts +6 -5
- package/src/tempo/server/internal/html/package.json +1 -1
- package/src/tempo/server/internal/html.gen.ts +1 -1
- package/src/tempo/server/internal/request-body.test.ts +37 -4
- package/src/tempo/server/internal/request-body.ts +25 -6
- package/src/tempo/server/internal/transport.test.ts +4 -4
- package/src/tempo/server/internal/transport.ts +19 -10
- package/src/tempo/session/Snapshot.test.ts +41 -0
- package/src/tempo/session/Snapshot.ts +74 -0
- package/src/tempo/session/client/ChannelOps.test.ts +163 -0
- package/src/tempo/session/client/ChannelOps.ts +344 -0
- package/src/tempo/session/client/CredentialState.test.ts +645 -0
- package/src/tempo/session/client/CredentialState.ts +814 -0
- package/src/tempo/session/client/ReceiptCoordinator.ts +95 -0
- package/src/tempo/session/client/Runtime.test.ts +1092 -0
- package/src/tempo/session/client/Runtime.ts +986 -0
- package/src/tempo/session/client/Session.test.ts +734 -0
- package/src/tempo/session/client/Session.ts +97 -0
- package/src/tempo/session/client/SessionManager.test.ts +1308 -0
- package/src/tempo/session/client/SessionManager.ts +845 -0
- package/src/tempo/session/client/Transports.test.ts +837 -0
- package/src/tempo/session/client/Transports.ts +1292 -0
- package/src/tempo/session/client/index.ts +37 -0
- package/src/tempo/session/index.ts +7 -8
- package/src/tempo/session/precompile/Chain.integration.test.ts +321 -0
- package/src/tempo/session/precompile/Chain.test.ts +1258 -0
- package/src/tempo/session/precompile/Chain.ts +979 -0
- package/src/tempo/session/precompile/Channel.test.ts +138 -0
- package/src/tempo/session/precompile/Channel.ts +103 -0
- package/src/tempo/session/precompile/Protocol.test.ts +358 -0
- package/src/tempo/session/precompile/Protocol.ts +520 -0
- package/src/tempo/session/precompile/Voucher.test.ts +316 -0
- package/src/tempo/session/precompile/Voucher.ts +160 -0
- package/src/tempo/session/precompile/escrow.abi.ts +226 -0
- package/src/tempo/session/precompile/index.ts +33 -0
- package/src/tempo/session/server/ChannelOps.test.ts +129 -0
- package/src/tempo/session/server/ChannelOps.ts +157 -0
- package/src/tempo/session/{ChannelStore.test.ts → server/ChannelStore.test.ts} +536 -29
- package/src/tempo/session/server/ChannelStore.ts +835 -0
- package/src/tempo/session/server/CredentialVerification.test.ts +146 -0
- package/src/tempo/session/server/CredentialVerification.ts +710 -0
- package/src/tempo/session/server/MeteredStream.ts +88 -0
- package/src/tempo/session/server/RequestState.test.ts +531 -0
- package/src/tempo/session/server/RequestState.ts +499 -0
- package/src/tempo/session/server/Session.integration.test.ts +444 -0
- package/src/tempo/session/server/Session.test.ts +3253 -0
- package/src/tempo/session/server/Session.ts +543 -0
- package/src/tempo/session/server/Settlement.test.ts +242 -0
- package/src/tempo/session/server/Settlement.ts +470 -0
- package/src/tempo/session/{Sse.test.ts → server/Sse.test.ts} +37 -3
- package/src/tempo/session/server/Sse.ts +256 -0
- package/src/tempo/session/server/Transports.test.ts +346 -0
- package/src/tempo/session/server/Transports.ts +255 -0
- package/src/tempo/session/{Ws.test.ts → server/Ws.test.ts} +4 -4
- package/src/tempo/session/server/Ws.ts +384 -0
- package/src/tempo/session/server/index.ts +8 -0
- package/dist/tempo/client/ChannelOps.d.ts.map +0 -1
- package/dist/tempo/client/ChannelOps.js.map +0 -1
- package/dist/tempo/client/Session.d.ts.map +0 -1
- package/dist/tempo/client/Session.js.map +0 -1
- package/dist/tempo/client/SessionManager.d.ts.map +0 -1
- package/dist/tempo/client/SessionManager.js.map +0 -1
- package/dist/tempo/server/Session.d.ts.map +0 -1
- package/dist/tempo/server/Session.js.map +0 -1
- package/dist/tempo/session/Chain.d.ts.map +0 -1
- package/dist/tempo/session/Chain.js.map +0 -1
- package/dist/tempo/session/Channel.d.ts.map +0 -1
- package/dist/tempo/session/Channel.js.map +0 -1
- package/dist/tempo/session/ChannelStore.d.ts +0 -117
- package/dist/tempo/session/ChannelStore.d.ts.map +0 -1
- package/dist/tempo/session/ChannelStore.js +0 -172
- package/dist/tempo/session/ChannelStore.js.map +0 -1
- package/dist/tempo/session/Receipt.d.ts +0 -22
- package/dist/tempo/session/Receipt.d.ts.map +0 -1
- package/dist/tempo/session/Receipt.js +0 -34
- package/dist/tempo/session/Receipt.js.map +0 -1
- package/dist/tempo/session/Sse.d.ts.map +0 -1
- package/dist/tempo/session/Sse.js +0 -363
- package/dist/tempo/session/Sse.js.map +0 -1
- package/dist/tempo/session/Types.d.ts +0 -78
- package/dist/tempo/session/Types.d.ts.map +0 -1
- package/dist/tempo/session/Types.js.map +0 -1
- package/dist/tempo/session/Voucher.d.ts.map +0 -1
- package/dist/tempo/session/Voucher.js.map +0 -1
- package/dist/tempo/session/Ws.d.ts +0 -87
- package/dist/tempo/session/Ws.d.ts.map +0 -1
- package/dist/tempo/session/Ws.js +0 -443
- package/dist/tempo/session/Ws.js.map +0 -1
- package/dist/tempo/session/escrow.abi.js.map +0 -1
- package/src/tempo/session/ChannelStore.ts +0 -308
- package/src/tempo/session/Receipt.test.ts +0 -89
- package/src/tempo/session/Receipt.ts +0 -46
- package/src/tempo/session/Sse.ts +0 -462
- package/src/tempo/session/Types.ts +0 -86
- package/src/tempo/session/Ws.ts +0 -576
- /package/dist/tempo/{session → legacy/session}/Channel.js +0 -0
- /package/dist/tempo/{session → legacy/session}/Types.js +0 -0
- /package/src/tempo/{session → legacy/session}/Channel.test.ts +0 -0
- /package/src/tempo/{session → legacy/session}/Voucher.test.ts +0 -0
- /package/src/tempo/session/{Sse.fuzz.test.ts → server/Sse.fuzz.test.ts} +0 -0
|
@@ -2,14 +2,18 @@ import * as http from 'node:http'
|
|
|
2
2
|
|
|
3
3
|
import { Elysia } from 'elysia'
|
|
4
4
|
import { Receipt } from 'mppx'
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
Mppx as Mppx_client,
|
|
7
|
+
sessionLegacy as sessionIntent,
|
|
8
|
+
tempo as tempo_client,
|
|
9
|
+
} from 'mppx/client'
|
|
6
10
|
import { Mppx, discovery, payment } from 'mppx/elysia'
|
|
7
11
|
import { tempo as tempo_server } from 'mppx/server'
|
|
8
12
|
import type { Address } from 'viem'
|
|
9
13
|
import { Addresses } from 'viem/tempo'
|
|
10
14
|
import { beforeAll, describe, expect, test } from 'vp/test'
|
|
11
15
|
import * as TestHttp from '~test/Http.js'
|
|
12
|
-
import { deployEscrow } from '~test/tempo/session.js'
|
|
16
|
+
import { deployEscrow } from '~test/tempo/legacy/session.js'
|
|
13
17
|
import { accounts, asset, client, fundAccount } from '~test/tempo/viem.js'
|
|
14
18
|
|
|
15
19
|
function createServer(app: Elysia<any, any, any, any, any, any, any>) {
|
|
@@ -202,7 +206,7 @@ describe('session', () => {
|
|
|
202
206
|
function createSessionHarness(feePayer: boolean) {
|
|
203
207
|
const mppx = Mppx.create({
|
|
204
208
|
methods: [
|
|
205
|
-
tempo_server.
|
|
209
|
+
tempo_server.sessionLegacy({
|
|
206
210
|
getClient: () => client,
|
|
207
211
|
account: accounts[0],
|
|
208
212
|
currency: asset,
|
|
@@ -218,7 +222,7 @@ describe('session', () => {
|
|
|
218
222
|
methods: [
|
|
219
223
|
sessionIntent({
|
|
220
224
|
account: accounts[2],
|
|
221
|
-
|
|
225
|
+
maxDeposit: '10',
|
|
222
226
|
getClient: () => client,
|
|
223
227
|
}),
|
|
224
228
|
],
|
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import express from 'express'
|
|
2
2
|
import { Receipt } from 'mppx'
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
Mppx as Mppx_client,
|
|
5
|
+
sessionLegacy as sessionIntent,
|
|
6
|
+
tempo as tempo_client,
|
|
7
|
+
} from 'mppx/client'
|
|
4
8
|
import { Mppx, discovery, payment } from 'mppx/express'
|
|
5
9
|
import { Mppx as Mppx_server, tempo as tempo_server } from 'mppx/server'
|
|
6
10
|
import type { Address } from 'viem'
|
|
7
11
|
import { Addresses } from 'viem/tempo'
|
|
8
12
|
import { beforeAll, describe, expect, test } from 'vp/test'
|
|
9
13
|
import * as Http from '~test/Http.js'
|
|
10
|
-
import { deployEscrow } from '~test/tempo/session.js'
|
|
14
|
+
import { deployEscrow } from '~test/tempo/legacy/session.js'
|
|
11
15
|
import { accounts, asset, client, fundAccount } from '~test/tempo/viem.js'
|
|
12
16
|
|
|
13
17
|
function createServer(app: express.Express) {
|
|
@@ -196,7 +200,7 @@ describe('session', () => {
|
|
|
196
200
|
function createSessionHarness(feePayer: boolean) {
|
|
197
201
|
const mppx = Mppx.create({
|
|
198
202
|
methods: [
|
|
199
|
-
tempo_server.
|
|
203
|
+
tempo_server.sessionLegacy({
|
|
200
204
|
getClient: () => client,
|
|
201
205
|
account: accounts[0],
|
|
202
206
|
currency: asset,
|
|
@@ -212,7 +216,7 @@ describe('session', () => {
|
|
|
212
216
|
methods: [
|
|
213
217
|
sessionIntent({
|
|
214
218
|
account: accounts[2],
|
|
215
|
-
|
|
219
|
+
maxDeposit: '10',
|
|
216
220
|
getClient: () => client,
|
|
217
221
|
}),
|
|
218
222
|
],
|
|
@@ -4,7 +4,7 @@ import { Challenge, Credential, Method, Receipt, z } from 'mppx'
|
|
|
4
4
|
import {
|
|
5
5
|
evm as evm_client,
|
|
6
6
|
Mppx as Mppx_client,
|
|
7
|
-
|
|
7
|
+
sessionLegacy as sessionIntent,
|
|
8
8
|
tempo as tempo_client,
|
|
9
9
|
} from 'mppx/client'
|
|
10
10
|
import { Mppx, discovery, payment } from 'mppx/hono'
|
|
@@ -19,7 +19,7 @@ import type { Address } from 'viem'
|
|
|
19
19
|
import { Addresses } from 'viem/tempo'
|
|
20
20
|
import { beforeAll, describe, expect, test } from 'vp/test'
|
|
21
21
|
import * as Http from '~test/Http.js'
|
|
22
|
-
import { deployEscrow } from '~test/tempo/session.js'
|
|
22
|
+
import { deployEscrow } from '~test/tempo/legacy/session.js'
|
|
23
23
|
import { accounts, asset, client, fundAccount } from '~test/tempo/viem.js'
|
|
24
24
|
|
|
25
25
|
function createServer(app: Hono) {
|
|
@@ -391,7 +391,7 @@ describe('session', () => {
|
|
|
391
391
|
function createSessionHarness(feePayer: boolean) {
|
|
392
392
|
const mppx = Mppx.create({
|
|
393
393
|
methods: [
|
|
394
|
-
tempo_server.
|
|
394
|
+
tempo_server.sessionLegacy({
|
|
395
395
|
getClient: () => client,
|
|
396
396
|
account: accounts[0],
|
|
397
397
|
currency: asset,
|
|
@@ -407,7 +407,7 @@ describe('session', () => {
|
|
|
407
407
|
methods: [
|
|
408
408
|
sessionIntent({
|
|
409
409
|
account: accounts[2],
|
|
410
|
-
|
|
410
|
+
maxDeposit: '10',
|
|
411
411
|
getClient: () => client,
|
|
412
412
|
}),
|
|
413
413
|
],
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
import * as http from 'node:http'
|
|
2
2
|
|
|
3
3
|
import { Challenge, Credential, Receipt } from 'mppx'
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
Mppx as Mppx_client,
|
|
6
|
+
sessionLegacy as sessionIntent,
|
|
7
|
+
tempo as tempo_client,
|
|
8
|
+
} from 'mppx/client'
|
|
5
9
|
import { Mppx, discovery, payment } from 'mppx/nextjs'
|
|
6
10
|
import { tempo as tempo_server } from 'mppx/server'
|
|
7
11
|
import type { Address } from 'viem'
|
|
8
12
|
import { Addresses } from 'viem/tempo'
|
|
9
13
|
import { beforeAll, describe, expect, test } from 'vp/test'
|
|
10
14
|
import * as TestHttp from '~test/Http.js'
|
|
11
|
-
import { deployEscrow } from '~test/tempo/session.js'
|
|
15
|
+
import { deployEscrow } from '~test/tempo/legacy/session.js'
|
|
12
16
|
import { accounts, asset, chain, client, fundAccount } from '~test/tempo/viem.js'
|
|
13
17
|
|
|
14
18
|
function createServer(handler: (request: Request) => Promise<Response> | Response) {
|
|
@@ -279,7 +283,7 @@ describe('session', () => {
|
|
|
279
283
|
function createSessionHarness(feePayer: boolean) {
|
|
280
284
|
const mppx = Mppx.create({
|
|
281
285
|
methods: [
|
|
282
|
-
tempo_server.
|
|
286
|
+
tempo_server.sessionLegacy({
|
|
283
287
|
getClient: () => client,
|
|
284
288
|
account: accounts[0],
|
|
285
289
|
currency: asset,
|
|
@@ -295,7 +299,7 @@ describe('session', () => {
|
|
|
295
299
|
methods: [
|
|
296
300
|
sessionIntent({
|
|
297
301
|
account: accounts[2],
|
|
298
|
-
|
|
302
|
+
maxDeposit: '10',
|
|
299
303
|
getClient: () => client,
|
|
300
304
|
}),
|
|
301
305
|
],
|
package/src/proxy/Proxy.test.ts
CHANGED
|
@@ -3,20 +3,20 @@ import { Mppx as Mppx_client, tempo as tempo_client } from 'mppx/client'
|
|
|
3
3
|
import { Mppx as Mppx_server, tempo as tempo_server } from 'mppx/server'
|
|
4
4
|
import type { Address } from 'viem'
|
|
5
5
|
import { afterEach, beforeAll, describe, expect, test } from 'vp/test'
|
|
6
|
-
import {
|
|
6
|
+
import { tempoNetwork } from '~test/config.js'
|
|
7
7
|
import * as Http from '~test/Http.js'
|
|
8
|
-
import { deployEscrow } from '~test/tempo/session.js'
|
|
8
|
+
import { deployEscrow } from '~test/tempo/legacy/session.js'
|
|
9
9
|
import { accounts, asset, client } from '~test/tempo/viem.js'
|
|
10
10
|
|
|
11
|
-
import { sessionManager } from '../tempo/client/
|
|
12
|
-
import { deserializeSessionReceipt } from '../tempo/session/
|
|
11
|
+
import { sessionManager } from '../tempo/legacy/client/index.js'
|
|
12
|
+
import { deserializeSessionReceipt } from '../tempo/session/precompile/Protocol.js'
|
|
13
13
|
import * as ApiProxy from './Proxy.js'
|
|
14
14
|
import * as Service from './Service.js'
|
|
15
15
|
import { anthropic } from './services/anthropic.js'
|
|
16
16
|
import { openai } from './services/openai.js'
|
|
17
17
|
|
|
18
18
|
const secretKey = 'test-secret-key'
|
|
19
|
-
const isLocalnet =
|
|
19
|
+
const isLocalnet = tempoNetwork === 'localnet'
|
|
20
20
|
|
|
21
21
|
const mppx_server = Mppx_server.create({
|
|
22
22
|
methods: [
|
|
@@ -907,7 +907,7 @@ describe.runIf(isLocalnet)('plain HTTP session proxy', () => {
|
|
|
907
907
|
|
|
908
908
|
const sessionHandler = Mppx_server.create({
|
|
909
909
|
methods: [
|
|
910
|
-
tempo_server.
|
|
910
|
+
tempo_server.sessionLegacy({
|
|
911
911
|
account: accounts[0],
|
|
912
912
|
currency: asset,
|
|
913
913
|
escrowContract: sessionEscrow,
|
|
@@ -967,7 +967,7 @@ describe.runIf(isLocalnet)('plain HTTP session proxy', () => {
|
|
|
967
967
|
|
|
968
968
|
const sessionHandler = Mppx_server.create({
|
|
969
969
|
methods: [
|
|
970
|
-
tempo_server.
|
|
970
|
+
tempo_server.sessionLegacy({
|
|
971
971
|
account: accounts[0],
|
|
972
972
|
currency: asset,
|
|
973
973
|
escrowContract: sessionEscrow,
|
|
@@ -997,7 +997,7 @@ describe.runIf(isLocalnet)('plain HTTP session proxy', () => {
|
|
|
997
997
|
const sessionClient = Mppx_client.create({
|
|
998
998
|
polyfill: false,
|
|
999
999
|
methods: [
|
|
1000
|
-
tempo_client({
|
|
1000
|
+
tempo_client.sessionLegacy.method({
|
|
1001
1001
|
account: accounts[1],
|
|
1002
1002
|
getClient: () => client,
|
|
1003
1003
|
maxDeposit: '2',
|
|
@@ -34,6 +34,22 @@ const mockChargeB = Method.from({
|
|
|
34
34
|
},
|
|
35
35
|
})
|
|
36
36
|
|
|
37
|
+
const mockSession = Method.from({
|
|
38
|
+
name: 'tempo',
|
|
39
|
+
intent: 'session',
|
|
40
|
+
schema: {
|
|
41
|
+
credential: {
|
|
42
|
+
payload: z.object({ token: z.string() }),
|
|
43
|
+
},
|
|
44
|
+
request: z.object({
|
|
45
|
+
amount: z.string(),
|
|
46
|
+
currency: z.string(),
|
|
47
|
+
methodDetails: z.object({ sessionProtocol: z.string() }),
|
|
48
|
+
unitType: z.string(),
|
|
49
|
+
}),
|
|
50
|
+
},
|
|
51
|
+
})
|
|
52
|
+
|
|
37
53
|
const alphaMethod = Method.toServer(mockChargeA, {
|
|
38
54
|
async verify() {
|
|
39
55
|
return {
|
|
@@ -56,6 +72,29 @@ const betaMethod = Method.toServer(mockChargeB, {
|
|
|
56
72
|
},
|
|
57
73
|
})
|
|
58
74
|
|
|
75
|
+
const tip1034SessionMethod = Method.toServer(mockSession, {
|
|
76
|
+
async verify() {
|
|
77
|
+
return {
|
|
78
|
+
method: 'tempo',
|
|
79
|
+
reference: 'tx',
|
|
80
|
+
status: 'success' as const,
|
|
81
|
+
timestamp: new Date().toISOString(),
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
const legacySessionMethod = Method.toServer(mockSession, {
|
|
87
|
+
alias: 'sessionLegacy',
|
|
88
|
+
async verify() {
|
|
89
|
+
return {
|
|
90
|
+
method: 'tempo',
|
|
91
|
+
reference: 'tx',
|
|
92
|
+
status: 'success' as const,
|
|
93
|
+
timestamp: new Date().toISOString(),
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
})
|
|
97
|
+
|
|
59
98
|
const secretKey = 'test-secret'
|
|
60
99
|
const realm = 'api.example.com'
|
|
61
100
|
|
|
@@ -105,6 +144,21 @@ describe('Mppx type tests', () => {
|
|
|
105
144
|
expectTypeOf(mppx.beta.charge).toBeFunction()
|
|
106
145
|
})
|
|
107
146
|
|
|
147
|
+
test('aliased duplicate handlers are accessible by nested and slash keys', () => {
|
|
148
|
+
const mppx = Mppx.create({
|
|
149
|
+
methods: [tip1034SessionMethod, legacySessionMethod],
|
|
150
|
+
realm,
|
|
151
|
+
secretKey,
|
|
152
|
+
})
|
|
153
|
+
|
|
154
|
+
expectTypeOf(mppx.tempo.session).toBeFunction()
|
|
155
|
+
expectTypeOf(mppx.tempo.sessionLegacy).toBeFunction()
|
|
156
|
+
expectTypeOf(mppx['tempo/session']).toBeFunction()
|
|
157
|
+
expectTypeOf(mppx['tempo/sessionLegacy']).toBeFunction()
|
|
158
|
+
expectTypeOf(mppx.challenge.tempo.session).toBeFunction()
|
|
159
|
+
expectTypeOf(mppx.challenge.tempo.sessionLegacy).toBeFunction()
|
|
160
|
+
})
|
|
161
|
+
|
|
108
162
|
test('slash key handlers are accessible', () => {
|
|
109
163
|
const mppx = Mppx.create({ methods: [alphaMethod, betaMethod], realm, secretKey })
|
|
110
164
|
|
package/src/server/Mppx.test.ts
CHANGED
|
@@ -3,7 +3,7 @@ import * as http from 'node:http'
|
|
|
3
3
|
import { Challenge, Credential, Errors, Method, Receipt, z } from 'mppx'
|
|
4
4
|
import {
|
|
5
5
|
Mppx as Mppx_client,
|
|
6
|
-
|
|
6
|
+
sessionLegacy as tempo_session_client,
|
|
7
7
|
tempo as tempo_client,
|
|
8
8
|
} from 'mppx/client'
|
|
9
9
|
import { Types as evm_Types } from 'mppx/evm'
|
|
@@ -12,10 +12,10 @@ import { Header as x402_Header, Types as x402_Types, type PaymentPayload } from
|
|
|
12
12
|
import { getTransactionReceipt } from 'viem/actions'
|
|
13
13
|
import { describe, expect, test } from 'vp/test'
|
|
14
14
|
import * as Http from '~test/Http.js'
|
|
15
|
-
import { deployEscrow } from '~test/tempo/session.js'
|
|
15
|
+
import { deployEscrow } from '~test/tempo/legacy/session.js'
|
|
16
16
|
import { accounts, asset, client } from '~test/tempo/viem.js'
|
|
17
17
|
|
|
18
|
-
import type { SessionReceipt } from '../tempo/session/
|
|
18
|
+
import type { SessionReceipt } from '../tempo/session/precompile/Protocol.js'
|
|
19
19
|
import * as x402_RouteBinding from '../x402/internal/RouteBinding.js'
|
|
20
20
|
|
|
21
21
|
const realm = 'api.example.com'
|
|
@@ -1837,6 +1837,22 @@ describe('compose', () => {
|
|
|
1837
1837
|
},
|
|
1838
1838
|
})
|
|
1839
1839
|
|
|
1840
|
+
const mockSession = Method.from({
|
|
1841
|
+
name: 'tempo',
|
|
1842
|
+
intent: 'session',
|
|
1843
|
+
schema: {
|
|
1844
|
+
credential: {
|
|
1845
|
+
payload: z.object({ token: z.string() }),
|
|
1846
|
+
},
|
|
1847
|
+
request: z.object({
|
|
1848
|
+
amount: z.string(),
|
|
1849
|
+
currency: z.string(),
|
|
1850
|
+
methodDetails: z.object({ sessionProtocol: z.optional(z.string()) }),
|
|
1851
|
+
unitType: z.string(),
|
|
1852
|
+
}),
|
|
1853
|
+
},
|
|
1854
|
+
})
|
|
1855
|
+
|
|
1840
1856
|
function mockReceipt(name: string) {
|
|
1841
1857
|
return {
|
|
1842
1858
|
method: name,
|
|
@@ -1858,6 +1874,19 @@ describe('compose', () => {
|
|
|
1858
1874
|
},
|
|
1859
1875
|
})
|
|
1860
1876
|
|
|
1877
|
+
const tip1034SessionMethod = Method.toServer(mockSession, {
|
|
1878
|
+
async verify() {
|
|
1879
|
+
return mockReceipt('v2')
|
|
1880
|
+
},
|
|
1881
|
+
})
|
|
1882
|
+
|
|
1883
|
+
const legacySessionMethod = Method.toServer(mockSession, {
|
|
1884
|
+
alias: 'sessionLegacy',
|
|
1885
|
+
async verify() {
|
|
1886
|
+
return mockReceipt('v1')
|
|
1887
|
+
},
|
|
1888
|
+
})
|
|
1889
|
+
|
|
1861
1890
|
const x402Method = evm.charge({
|
|
1862
1891
|
currency: evm.assets.baseSepolia.USDC,
|
|
1863
1892
|
recipient: accounts[0].address,
|
|
@@ -1889,6 +1918,19 @@ describe('compose', () => {
|
|
|
1889
1918
|
recipient: '0x0000000000000000000000000000000000000002',
|
|
1890
1919
|
}
|
|
1891
1920
|
|
|
1921
|
+
const sessionChallengeOpts = {
|
|
1922
|
+
amount: '100',
|
|
1923
|
+
currency: asset,
|
|
1924
|
+
expires: new Date(Date.now() + 60_000),
|
|
1925
|
+
methodDetails: { sessionProtocol: 'v2' },
|
|
1926
|
+
unitType: 'request',
|
|
1927
|
+
}
|
|
1928
|
+
|
|
1929
|
+
const legacySessionChallengeOpts = {
|
|
1930
|
+
...sessionChallengeOpts,
|
|
1931
|
+
methodDetails: { sessionProtocol: 'v1' },
|
|
1932
|
+
}
|
|
1933
|
+
|
|
1892
1934
|
test('returns 402 with multiple WWW-Authenticate headers when no credential', async () => {
|
|
1893
1935
|
const mppx = Mppx.create({ methods: [alphaMethod, betaMethod], realm, secretKey })
|
|
1894
1936
|
|
|
@@ -1905,6 +1947,157 @@ describe('compose', () => {
|
|
|
1905
1947
|
expect(wwwAuth).toContain('method="beta"')
|
|
1906
1948
|
})
|
|
1907
1949
|
|
|
1950
|
+
test('broadcasts duplicate tempo/session variants in compose order', async () => {
|
|
1951
|
+
const mppx = Mppx.create({
|
|
1952
|
+
methods: [tip1034SessionMethod, legacySessionMethod],
|
|
1953
|
+
realm,
|
|
1954
|
+
secretKey,
|
|
1955
|
+
})
|
|
1956
|
+
|
|
1957
|
+
const result = await mppx.compose(
|
|
1958
|
+
[mppx.tempo.session, sessionChallengeOpts],
|
|
1959
|
+
[mppx.tempo.sessionLegacy, legacySessionChallengeOpts],
|
|
1960
|
+
)(new Request('https://example.com/resource'))
|
|
1961
|
+
|
|
1962
|
+
expect(result.status).toBe(402)
|
|
1963
|
+
if (result.status !== 402) throw new Error()
|
|
1964
|
+
|
|
1965
|
+
const challenges = Challenge.fromResponseList(result.challenge)
|
|
1966
|
+
expect(challenges.map((challenge) => challenge.request.methodDetails)).toEqual([
|
|
1967
|
+
{ sessionProtocol: 'v2' },
|
|
1968
|
+
{ sessionProtocol: 'v1' },
|
|
1969
|
+
])
|
|
1970
|
+
})
|
|
1971
|
+
|
|
1972
|
+
test('keeps duplicate tempo/session variants when Accept-Payment allows tempo/session', async () => {
|
|
1973
|
+
const mppx = Mppx.create({
|
|
1974
|
+
methods: [tip1034SessionMethod, legacySessionMethod],
|
|
1975
|
+
realm,
|
|
1976
|
+
secretKey,
|
|
1977
|
+
})
|
|
1978
|
+
|
|
1979
|
+
const result = await mppx.compose(
|
|
1980
|
+
[mppx.tempo.session, sessionChallengeOpts],
|
|
1981
|
+
[mppx.tempo.sessionLegacy, legacySessionChallengeOpts],
|
|
1982
|
+
)(
|
|
1983
|
+
new Request('https://example.com/resource', {
|
|
1984
|
+
headers: { 'Accept-Payment': 'tempo/session' },
|
|
1985
|
+
}),
|
|
1986
|
+
)
|
|
1987
|
+
|
|
1988
|
+
expect(result.status).toBe(402)
|
|
1989
|
+
if (result.status !== 402) throw new Error()
|
|
1990
|
+
|
|
1991
|
+
expect(Challenge.fromResponseList(result.challenge)).toHaveLength(2)
|
|
1992
|
+
})
|
|
1993
|
+
|
|
1994
|
+
test('uses TIP-1034 as the bare tempo/session handler regardless of registration order', async () => {
|
|
1995
|
+
const mppx = Mppx.create({
|
|
1996
|
+
methods: [legacySessionMethod, tip1034SessionMethod],
|
|
1997
|
+
realm,
|
|
1998
|
+
secretKey,
|
|
1999
|
+
})
|
|
2000
|
+
|
|
2001
|
+
const result = await mppx.compose([mppx.tempo.session, sessionChallengeOpts])(
|
|
2002
|
+
new Request('https://example.com/resource'),
|
|
2003
|
+
)
|
|
2004
|
+
|
|
2005
|
+
expect(result.status).toBe(402)
|
|
2006
|
+
if (result.status !== 402) throw new Error()
|
|
2007
|
+
expect(Challenge.fromResponse(result.challenge).request.methodDetails).toEqual({
|
|
2008
|
+
sessionProtocol: 'v2',
|
|
2009
|
+
})
|
|
2010
|
+
})
|
|
2011
|
+
|
|
2012
|
+
test('rejects cross-protocol tempo/session credential replay', async () => {
|
|
2013
|
+
const mppx = Mppx.create({
|
|
2014
|
+
methods: [tip1034SessionMethod, legacySessionMethod],
|
|
2015
|
+
realm,
|
|
2016
|
+
secretKey,
|
|
2017
|
+
})
|
|
2018
|
+
const tip1034ChallengeResponse = await mppx.compose([mppx.tempo.session, sessionChallengeOpts])(
|
|
2019
|
+
new Request('https://example.com/resource'),
|
|
2020
|
+
)
|
|
2021
|
+
expect(tip1034ChallengeResponse.status).toBe(402)
|
|
2022
|
+
if (tip1034ChallengeResponse.status !== 402) throw new Error()
|
|
2023
|
+
const tip1034Challenge = Challenge.fromResponse(tip1034ChallengeResponse.challenge)
|
|
2024
|
+
|
|
2025
|
+
const credential = Credential.serialize({
|
|
2026
|
+
challenge: tip1034Challenge,
|
|
2027
|
+
payload: { token: 'valid' },
|
|
2028
|
+
})
|
|
2029
|
+
const legacyResult = await mppx.compose([mppx.tempo.sessionLegacy, legacySessionChallengeOpts])(
|
|
2030
|
+
new Request('https://example.com/resource', {
|
|
2031
|
+
headers: { Authorization: credential },
|
|
2032
|
+
}),
|
|
2033
|
+
)
|
|
2034
|
+
|
|
2035
|
+
expect(legacyResult.status).toBe(402)
|
|
2036
|
+
})
|
|
2037
|
+
|
|
2038
|
+
test('verifyCredential dispatches duplicate tempo/session variants by sessionProtocol', async () => {
|
|
2039
|
+
const mppx = Mppx.create({
|
|
2040
|
+
methods: [tip1034SessionMethod, legacySessionMethod],
|
|
2041
|
+
realm,
|
|
2042
|
+
secretKey,
|
|
2043
|
+
})
|
|
2044
|
+
const tip1034Challenge = await mppx.challenge.tempo.session(sessionChallengeOpts)
|
|
2045
|
+
const legacyChallenge = await mppx.challenge.tempo.sessionLegacy(legacySessionChallengeOpts)
|
|
2046
|
+
|
|
2047
|
+
const tip1034Receipt = await mppx.verifyCredential(
|
|
2048
|
+
Credential.serialize({
|
|
2049
|
+
challenge: tip1034Challenge,
|
|
2050
|
+
payload: { token: 'valid' },
|
|
2051
|
+
}),
|
|
2052
|
+
)
|
|
2053
|
+
const legacyReceipt = await mppx.verifyCredential(
|
|
2054
|
+
Credential.serialize({
|
|
2055
|
+
challenge: legacyChallenge,
|
|
2056
|
+
payload: { token: 'valid' },
|
|
2057
|
+
}),
|
|
2058
|
+
)
|
|
2059
|
+
|
|
2060
|
+
expect(tip1034Receipt.reference).toBe('tx-v2')
|
|
2061
|
+
expect(legacyReceipt.reference).toBe('tx-v1')
|
|
2062
|
+
})
|
|
2063
|
+
|
|
2064
|
+
test('verifyCredential routes unmarked tempo/session challenges to legacy v1', async () => {
|
|
2065
|
+
const mppx = Mppx.create({
|
|
2066
|
+
methods: [legacySessionMethod, tip1034SessionMethod],
|
|
2067
|
+
realm,
|
|
2068
|
+
secretKey,
|
|
2069
|
+
})
|
|
2070
|
+
const unmarkedLegacyChallenge = await mppx.challenge.tempo.sessionLegacy({
|
|
2071
|
+
...legacySessionChallengeOpts,
|
|
2072
|
+
methodDetails: {},
|
|
2073
|
+
})
|
|
2074
|
+
|
|
2075
|
+
await expect(
|
|
2076
|
+
mppx.verifyCredential(
|
|
2077
|
+
Credential.serialize({
|
|
2078
|
+
challenge: unmarkedLegacyChallenge,
|
|
2079
|
+
payload: { token: 'valid' },
|
|
2080
|
+
}),
|
|
2081
|
+
),
|
|
2082
|
+
).resolves.toMatchObject({ reference: 'tx-v1' })
|
|
2083
|
+
})
|
|
2084
|
+
|
|
2085
|
+
test('verifyCredential rejects unknown tempo/session protocol markers', async () => {
|
|
2086
|
+
const mppx = Mppx.create({
|
|
2087
|
+
methods: [legacySessionMethod, tip1034SessionMethod],
|
|
2088
|
+
realm,
|
|
2089
|
+
secretKey,
|
|
2090
|
+
})
|
|
2091
|
+
const challenge = await mppx.challenge.tempo.session({
|
|
2092
|
+
...sessionChallengeOpts,
|
|
2093
|
+
methodDetails: { sessionProtocol: 'future' },
|
|
2094
|
+
})
|
|
2095
|
+
|
|
2096
|
+
await expect(
|
|
2097
|
+
mppx.verifyCredential(Credential.serialize({ challenge, payload: { token: 'valid' } })),
|
|
2098
|
+
).rejects.toThrow('no registered method for tempo/session')
|
|
2099
|
+
})
|
|
2100
|
+
|
|
1908
2101
|
test('returns composed x402 challenge headers when no credential', async () => {
|
|
1909
2102
|
const mppx = Mppx.create({ methods: [x402Method], realm, secretKey })
|
|
1910
2103
|
|
|
@@ -3983,6 +4176,80 @@ describe('realm auto-detection', () => {
|
|
|
3983
4176
|
}
|
|
3984
4177
|
})
|
|
3985
4178
|
|
|
4179
|
+
// A raw request line can carry a protocol-relative or embedded-authority
|
|
4180
|
+
// target that WHATWG URL would resolve into a foreign host, which would then
|
|
4181
|
+
// be auto-detected as the challenge realm. The realm must stay bound to the
|
|
4182
|
+
// Host header.
|
|
4183
|
+
test.each([
|
|
4184
|
+
{ name: 'protocol-relative', path: '//evil.com/resource' },
|
|
4185
|
+
{ name: 'embedded authority', path: '//first.example//evil.com/resource' },
|
|
4186
|
+
])('ignores $name request targets when deriving realm in node listeners', async ({ path }) => {
|
|
4187
|
+
const handler = Mppx.create({ methods: [mockMethod], secretKey })
|
|
4188
|
+
const server = await Http.createServer(async (req, res) => {
|
|
4189
|
+
const result = await Mppx.toNodeListener(
|
|
4190
|
+
handler.charge({
|
|
4191
|
+
amount: '100',
|
|
4192
|
+
currency: '0x0000000000000000000000000000000000000001',
|
|
4193
|
+
recipient: '0x0000000000000000000000000000000000000002',
|
|
4194
|
+
}),
|
|
4195
|
+
)(req, res)
|
|
4196
|
+
|
|
4197
|
+
if (result.status !== 402) res.end('OK')
|
|
4198
|
+
})
|
|
4199
|
+
|
|
4200
|
+
try {
|
|
4201
|
+
const rawResponse = await new Promise<{
|
|
4202
|
+
body: string
|
|
4203
|
+
headers: http.IncomingHttpHeaders
|
|
4204
|
+
statusCode: number
|
|
4205
|
+
}>((resolve, reject) => {
|
|
4206
|
+
const request = http.request(
|
|
4207
|
+
{
|
|
4208
|
+
host: '127.0.0.1',
|
|
4209
|
+
port: server.port,
|
|
4210
|
+
method: 'GET',
|
|
4211
|
+
path,
|
|
4212
|
+
headers: { Host: `localhost:${server.port}` },
|
|
4213
|
+
},
|
|
4214
|
+
(response) => {
|
|
4215
|
+
const chunks: Buffer[] = []
|
|
4216
|
+
response.on('data', (chunk) => chunks.push(Buffer.from(chunk)))
|
|
4217
|
+
response.on('end', () => {
|
|
4218
|
+
resolve({
|
|
4219
|
+
body: Buffer.concat(chunks).toString('utf8'),
|
|
4220
|
+
headers: response.headers,
|
|
4221
|
+
statusCode: response.statusCode ?? 0,
|
|
4222
|
+
})
|
|
4223
|
+
})
|
|
4224
|
+
},
|
|
4225
|
+
)
|
|
4226
|
+
|
|
4227
|
+
request.on('error', reject)
|
|
4228
|
+
request.end()
|
|
4229
|
+
})
|
|
4230
|
+
|
|
4231
|
+
const headers = new Headers()
|
|
4232
|
+
for (const [name, value] of Object.entries(rawResponse.headers)) {
|
|
4233
|
+
if (Array.isArray(value)) {
|
|
4234
|
+
for (const item of value) headers.append(name, item)
|
|
4235
|
+
} else if (value !== undefined) {
|
|
4236
|
+
headers.append(name, value)
|
|
4237
|
+
}
|
|
4238
|
+
}
|
|
4239
|
+
|
|
4240
|
+
const challenge = Challenge.fromResponse(
|
|
4241
|
+
new Response(rawResponse.body, {
|
|
4242
|
+
status: rawResponse.statusCode,
|
|
4243
|
+
headers,
|
|
4244
|
+
}),
|
|
4245
|
+
)
|
|
4246
|
+
|
|
4247
|
+
expect(challenge.realm).toBe('localhost')
|
|
4248
|
+
} finally {
|
|
4249
|
+
server.close()
|
|
4250
|
+
}
|
|
4251
|
+
})
|
|
4252
|
+
|
|
3986
4253
|
test('credential verifies across different casing of same host', async () => {
|
|
3987
4254
|
const handler = Mppx.create({ methods: [mockMethod], secretKey })
|
|
3988
4255
|
|
|
@@ -5104,7 +5371,7 @@ describe('verifyCredential', () => {
|
|
|
5104
5371
|
const escrowContract = await deployEscrow()
|
|
5105
5372
|
const server = Mppx.create({
|
|
5106
5373
|
methods: [
|
|
5107
|
-
tempo.
|
|
5374
|
+
tempo.sessionLegacy({
|
|
5108
5375
|
store: Store.memory(),
|
|
5109
5376
|
getClient: () => client,
|
|
5110
5377
|
account: accounts[0],
|
|
@@ -5121,7 +5388,7 @@ describe('verifyCredential', () => {
|
|
|
5121
5388
|
methods: [
|
|
5122
5389
|
tempo_session_client({
|
|
5123
5390
|
account: accounts[1],
|
|
5124
|
-
|
|
5391
|
+
maxDeposit: '10',
|
|
5125
5392
|
getClient: () => client,
|
|
5126
5393
|
}),
|
|
5127
5394
|
],
|
|
@@ -5167,7 +5434,7 @@ describe('verifyCredential', () => {
|
|
|
5167
5434
|
const escrowContract = await deployEscrow()
|
|
5168
5435
|
const server = Mppx.create({
|
|
5169
5436
|
methods: [
|
|
5170
|
-
tempo.
|
|
5437
|
+
tempo.sessionLegacy({
|
|
5171
5438
|
store: Store.memory(),
|
|
5172
5439
|
getClient: () => client,
|
|
5173
5440
|
account: accounts[0],
|
|
@@ -5185,7 +5452,7 @@ describe('verifyCredential', () => {
|
|
|
5185
5452
|
methods: [
|
|
5186
5453
|
tempo_session_client({
|
|
5187
5454
|
account: accounts[1],
|
|
5188
|
-
|
|
5455
|
+
maxDeposit: '10',
|
|
5189
5456
|
getClient: () => client,
|
|
5190
5457
|
}),
|
|
5191
5458
|
],
|