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
|
@@ -6,16 +6,12 @@ import {
|
|
|
6
6
|
Secp256k1,
|
|
7
7
|
Transaction,
|
|
8
8
|
} from 'viem/tempo'
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import { deployEscrow, openChannel } from '~test/tempo/session.js'
|
|
9
|
+
import { describe, expect, test } from 'vp/test'
|
|
10
|
+
import { tempoNetwork } from '~test/config.js'
|
|
12
11
|
import { asset as currency, chain, http } from '~test/tempo/viem.js'
|
|
13
12
|
|
|
14
|
-
import { createOpenPayload } from './client/ChannelOps.js'
|
|
15
13
|
import { charge } from './client/Charge.js'
|
|
16
14
|
import * as Methods from './Methods.js'
|
|
17
|
-
import { closeOnChain, settleOnChain } from './session/Chain.js'
|
|
18
|
-
import { signVoucher } from './session/Voucher.js'
|
|
19
15
|
|
|
20
16
|
type ChargeCredentialPayload =
|
|
21
17
|
| { hash: Hex; type: 'hash' }
|
|
@@ -25,6 +21,7 @@ const rootAccount = TempoAccount.fromSecp256k1(
|
|
|
25
21
|
'0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',
|
|
26
22
|
)
|
|
27
23
|
const recipient = '0x2222222222222222222222222222222222222222' as Address
|
|
24
|
+
const isLocalnet = tempoNetwork === 'localnet'
|
|
28
25
|
|
|
29
26
|
type ChargeRequest = ReturnType<typeof Methods.charge.schema.request.parse>
|
|
30
27
|
|
|
@@ -100,35 +97,7 @@ function expectTransactionKeyAuthorization(
|
|
|
100
97
|
expect(transaction.keyAuthorization).toEqual(keyAuthorization)
|
|
101
98
|
}
|
|
102
99
|
|
|
103
|
-
|
|
104
|
-
const payer = rootAccount
|
|
105
|
-
const { channelId } = await openChannel({
|
|
106
|
-
deposit: 10_000_000n,
|
|
107
|
-
escrow: escrowContract,
|
|
108
|
-
payee,
|
|
109
|
-
payer,
|
|
110
|
-
salt: Secp256k1.randomPrivateKey(),
|
|
111
|
-
token: currency,
|
|
112
|
-
})
|
|
113
|
-
const cumulativeAmount = 1_000_000n
|
|
114
|
-
const signature = await signVoucher(
|
|
115
|
-
createClient({ account: payer, chain, transport: http() }),
|
|
116
|
-
payer,
|
|
117
|
-
{ channelId, cumulativeAmount },
|
|
118
|
-
escrowContract,
|
|
119
|
-
chain.id,
|
|
120
|
-
)
|
|
121
|
-
|
|
122
|
-
return { channelId, cumulativeAmount, escrowContract, signature }
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
describe.runIf(nodeEnv === 'localnet')('Tempo access-key authorization attachment', () => {
|
|
126
|
-
let escrowContract: Address
|
|
127
|
-
|
|
128
|
-
beforeAll(async () => {
|
|
129
|
-
escrowContract = await deployEscrow()
|
|
130
|
-
})
|
|
131
|
-
|
|
100
|
+
describe.runIf(isLocalnet)('Tempo access-key authorization attachment', () => {
|
|
132
101
|
test('tempo.charge pull signs a prepared transaction with keyAuthorization', async () => {
|
|
133
102
|
const { accessKey, client, keyAuthorization } = await createAccessKeyClient()
|
|
134
103
|
const method = charge({
|
|
@@ -169,63 +138,4 @@ describe.runIf(nodeEnv === 'localnet')('Tempo access-key authorization attachmen
|
|
|
169
138
|
expect(signedTransactions).toHaveLength(1)
|
|
170
139
|
expectTransactionKeyAuthorization(signedTransactions[0]!, keyAuthorization)
|
|
171
140
|
})
|
|
172
|
-
|
|
173
|
-
test('tempo.session open signs a prepared transaction with keyAuthorization', async () => {
|
|
174
|
-
const { accessKey, client, keyAuthorization } = await createAccessKeyClient()
|
|
175
|
-
|
|
176
|
-
const { payload } = await createOpenPayload(client, accessKey, {
|
|
177
|
-
chainId: chain.id,
|
|
178
|
-
currency,
|
|
179
|
-
deposit: 5_000_000n,
|
|
180
|
-
escrowContract,
|
|
181
|
-
initialAmount: 1_000_000n,
|
|
182
|
-
payee: recipient,
|
|
183
|
-
})
|
|
184
|
-
|
|
185
|
-
expect(payload.action).toBe('open')
|
|
186
|
-
if (payload.action !== 'open') throw new Error('unexpected payload action')
|
|
187
|
-
expectTransactionKeyAuthorization(payload.transaction, keyAuthorization)
|
|
188
|
-
})
|
|
189
|
-
|
|
190
|
-
test('tempo.session settle sends a prepared transaction with keyAuthorization', async () => {
|
|
191
|
-
const { accessKey, client, keyAuthorization, signedTransactions } =
|
|
192
|
-
await createAccessKeyClient()
|
|
193
|
-
const channel = await createChannelForPayee(rootAccount.address, escrowContract)
|
|
194
|
-
|
|
195
|
-
const hash = await settleOnChain(
|
|
196
|
-
client,
|
|
197
|
-
channel.escrowContract,
|
|
198
|
-
{
|
|
199
|
-
channelId: channel.channelId,
|
|
200
|
-
cumulativeAmount: channel.cumulativeAmount,
|
|
201
|
-
signature: channel.signature,
|
|
202
|
-
},
|
|
203
|
-
{ account: accessKey },
|
|
204
|
-
)
|
|
205
|
-
|
|
206
|
-
expect(hash).toMatch(/^0x[0-9a-f]{64}$/)
|
|
207
|
-
expect(signedTransactions).toHaveLength(1)
|
|
208
|
-
expectTransactionKeyAuthorization(signedTransactions[0]!, keyAuthorization)
|
|
209
|
-
})
|
|
210
|
-
|
|
211
|
-
test('tempo.session close sends a prepared transaction with keyAuthorization', async () => {
|
|
212
|
-
const { accessKey, client, keyAuthorization, signedTransactions } =
|
|
213
|
-
await createAccessKeyClient()
|
|
214
|
-
const channel = await createChannelForPayee(rootAccount.address, escrowContract)
|
|
215
|
-
|
|
216
|
-
const hash = await closeOnChain(
|
|
217
|
-
client,
|
|
218
|
-
channel.escrowContract,
|
|
219
|
-
{
|
|
220
|
-
channelId: channel.channelId,
|
|
221
|
-
cumulativeAmount: channel.cumulativeAmount,
|
|
222
|
-
signature: channel.signature,
|
|
223
|
-
},
|
|
224
|
-
{ account: accessKey },
|
|
225
|
-
)
|
|
226
|
-
|
|
227
|
-
expect(hash).toMatch(/^0x[0-9a-f]{64}$/)
|
|
228
|
-
expect(signedTransactions).toHaveLength(1)
|
|
229
|
-
expectTransactionKeyAuthorization(signedTransactions[0]!, keyAuthorization)
|
|
230
|
-
})
|
|
231
141
|
})
|
|
@@ -248,6 +248,51 @@ describe('session', () => {
|
|
|
248
248
|
expect(request.amount).toBe('1000000')
|
|
249
249
|
expect(request.methodDetails?.minVoucherDelta).toBe('100000')
|
|
250
250
|
})
|
|
251
|
+
|
|
252
|
+
test('schema: preserves precompile session snapshots in method details', () => {
|
|
253
|
+
const sessionSnapshot = {
|
|
254
|
+
acceptedCumulative: '2',
|
|
255
|
+
channelId: `0x${'11'.repeat(32)}` as const,
|
|
256
|
+
deposit: '5',
|
|
257
|
+
descriptor: {
|
|
258
|
+
authorizedSigner: '0x0000000000000000000000000000000000000006',
|
|
259
|
+
expiringNonceHash: `0x${'22'.repeat(32)}` as const,
|
|
260
|
+
operator: '0x0000000000000000000000000000000000000000',
|
|
261
|
+
payee: '0x0000000000000000000000000000000000000002',
|
|
262
|
+
payer: '0x0000000000000000000000000000000000000001',
|
|
263
|
+
salt: `0x${'33'.repeat(32)}` as const,
|
|
264
|
+
token: '0x0000000000000000000000000000000000000003',
|
|
265
|
+
},
|
|
266
|
+
requiredCumulative: '3',
|
|
267
|
+
settled: '0',
|
|
268
|
+
spent: '2',
|
|
269
|
+
units: 2,
|
|
270
|
+
}
|
|
271
|
+
const request = Methods.session.schema.request.parse({
|
|
272
|
+
amount: '1',
|
|
273
|
+
currency: '0x20c0000000000000000000000000000000000001',
|
|
274
|
+
decimals: 6,
|
|
275
|
+
recipient: '0x1234567890abcdef1234567890abcdef12345678',
|
|
276
|
+
sessionSnapshot,
|
|
277
|
+
unitType: 'token',
|
|
278
|
+
})
|
|
279
|
+
|
|
280
|
+
expect(request.methodDetails?.sessionSnapshot).toEqual(sessionSnapshot)
|
|
281
|
+
})
|
|
282
|
+
|
|
283
|
+
test('schema: advertises precompile session operator in method details', () => {
|
|
284
|
+
const operator = '0x0000000000000000000000000000000000000006'
|
|
285
|
+
const request = Methods.session.schema.request.parse({
|
|
286
|
+
amount: '1',
|
|
287
|
+
currency: '0x20c0000000000000000000000000000000000001',
|
|
288
|
+
decimals: 6,
|
|
289
|
+
operator,
|
|
290
|
+
recipient: '0x1234567890abcdef1234567890abcdef12345678',
|
|
291
|
+
unitType: 'token',
|
|
292
|
+
})
|
|
293
|
+
|
|
294
|
+
expect(request.methodDetails?.operator).toBe(operator)
|
|
295
|
+
})
|
|
251
296
|
})
|
|
252
297
|
|
|
253
298
|
describe('subscription', () => {
|
|
@@ -313,23 +358,6 @@ describe('subscription', () => {
|
|
|
313
358
|
expect(request.periodCount).toBe(expected)
|
|
314
359
|
})
|
|
315
360
|
|
|
316
|
-
test.each(['dev_second'] as const)(
|
|
317
|
-
'schema: accepts %s subscription periods for development and tests',
|
|
318
|
-
(periodUnit) => {
|
|
319
|
-
const request = Methods.subscription.schema.request.parse({
|
|
320
|
-
amount: '10',
|
|
321
|
-
currency: '0x20c0000000000000000000000000000000000001',
|
|
322
|
-
decimals: 6,
|
|
323
|
-
periodCount: '5',
|
|
324
|
-
periodUnit,
|
|
325
|
-
recipient: '0x1234567890abcdef1234567890abcdef12345678',
|
|
326
|
-
subscriptionExpires: '2026-01-01T00:00:00Z',
|
|
327
|
-
})
|
|
328
|
-
|
|
329
|
-
expect(request.periodUnit).toBe(periodUnit)
|
|
330
|
-
},
|
|
331
|
-
)
|
|
332
|
-
|
|
333
361
|
test('schema: rejects non-numeric periodCount', () => {
|
|
334
362
|
const result = Methods.subscription.schema.request.safeParse({
|
|
335
363
|
amount: '10',
|
package/src/tempo/Methods.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import type { Account, Address } from 'viem'
|
|
2
2
|
import { parseUnits } from 'viem'
|
|
3
3
|
|
|
4
|
+
import * as Constants from '../Constants.js'
|
|
4
5
|
import * as Method from '../Method.js'
|
|
5
6
|
import * as z from '../zod.js'
|
|
7
|
+
import type { SessionSnapshot } from './session/client/Runtime.js'
|
|
8
|
+
import type * as PrecompileChannel from './session/precompile/Channel.js'
|
|
6
9
|
import type { SubscriptionPeriodUnit } from './subscription/Types.js'
|
|
7
10
|
|
|
8
11
|
export const chargeModes = ['push', 'pull'] as const
|
|
@@ -196,6 +199,7 @@ export const session = Method.from({
|
|
|
196
199
|
authorizedSigner: z.optional(z.string()),
|
|
197
200
|
channelId: z.hash(),
|
|
198
201
|
cumulativeAmount: z.amount(),
|
|
202
|
+
descriptor: z.optional(z.custom<PrecompileChannel.ChannelDescriptor>()),
|
|
199
203
|
signature: z.signature(),
|
|
200
204
|
transaction: z.signature(),
|
|
201
205
|
type: z.literal('transaction'),
|
|
@@ -204,6 +208,7 @@ export const session = Method.from({
|
|
|
204
208
|
action: z.literal('topUp'),
|
|
205
209
|
additionalDeposit: z.amount(),
|
|
206
210
|
channelId: z.hash(),
|
|
211
|
+
descriptor: z.optional(z.custom<PrecompileChannel.ChannelDescriptor>()),
|
|
207
212
|
transaction: z.signature(),
|
|
208
213
|
type: z.literal('transaction'),
|
|
209
214
|
}),
|
|
@@ -211,12 +216,14 @@ export const session = Method.from({
|
|
|
211
216
|
action: z.literal('voucher'),
|
|
212
217
|
channelId: z.hash(),
|
|
213
218
|
cumulativeAmount: z.amount(),
|
|
219
|
+
descriptor: z.optional(z.custom<PrecompileChannel.ChannelDescriptor>()),
|
|
214
220
|
signature: z.signature(),
|
|
215
221
|
}),
|
|
216
222
|
z.object({
|
|
217
223
|
action: z.literal('close'),
|
|
218
224
|
channelId: z.hash(),
|
|
219
225
|
cumulativeAmount: z.amount(),
|
|
226
|
+
descriptor: z.optional(z.custom<PrecompileChannel.ChannelDescriptor>()),
|
|
220
227
|
signature: z.signature(),
|
|
221
228
|
}),
|
|
222
229
|
]),
|
|
@@ -237,7 +244,12 @@ export const session = Method.from({
|
|
|
237
244
|
),
|
|
238
245
|
),
|
|
239
246
|
minVoucherDelta: z.optional(z.amount()),
|
|
247
|
+
operator: z.optional(z.address()),
|
|
240
248
|
recipient: z.optional(z.string()),
|
|
249
|
+
sessionProtocol: z.optional(
|
|
250
|
+
z.enum([Constants.SessionProtocols.v2, Constants.SessionProtocols.v1]),
|
|
251
|
+
),
|
|
252
|
+
sessionSnapshot: z.optional(z.custom<SessionSnapshot>()),
|
|
241
253
|
suggestedDeposit: z.optional(z.amount()),
|
|
242
254
|
unitType: z.string(),
|
|
243
255
|
})
|
|
@@ -256,6 +268,9 @@ export const session = Method.from({
|
|
|
256
268
|
escrowContract,
|
|
257
269
|
feePayer,
|
|
258
270
|
minVoucherDelta,
|
|
271
|
+
operator,
|
|
272
|
+
sessionProtocol,
|
|
273
|
+
sessionSnapshot,
|
|
259
274
|
suggestedDeposit,
|
|
260
275
|
...rest
|
|
261
276
|
}) => ({
|
|
@@ -274,6 +289,13 @@ export const session = Method.from({
|
|
|
274
289
|
}),
|
|
275
290
|
...(chainId !== undefined && { chainId }),
|
|
276
291
|
...(feePayer !== undefined && { feePayer }),
|
|
292
|
+
...(operator !== undefined && { operator }),
|
|
293
|
+
...(sessionProtocol !== undefined && {
|
|
294
|
+
[Constants.MethodDetailKeys.sessionProtocol]: sessionProtocol,
|
|
295
|
+
}),
|
|
296
|
+
...(sessionSnapshot !== undefined && {
|
|
297
|
+
[Constants.MethodDetailKeys.sessionSnapshot]: sessionSnapshot,
|
|
298
|
+
}),
|
|
277
299
|
},
|
|
278
300
|
}),
|
|
279
301
|
),
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { expectTypeOf, test } from 'vp/test'
|
|
2
|
+
|
|
3
|
+
import type {
|
|
4
|
+
PaymentResponse as ClientPaymentResponse,
|
|
5
|
+
SessionManager as ClientSessionManager,
|
|
6
|
+
SessionManagerSseOptions as ClientSessionManagerSseOptions,
|
|
7
|
+
SessionManagerWebSocketOptions as ClientSessionManagerWebSocketOptions,
|
|
8
|
+
} from './client/index.js'
|
|
9
|
+
import * as Tempo from './index.js'
|
|
10
|
+
import type { SettlementSchedule as ServerSettlementSchedule } from './server/index.js'
|
|
11
|
+
import type {
|
|
12
|
+
ActiveSessionState,
|
|
13
|
+
ClosedSessionState,
|
|
14
|
+
PaymentResponse as SessionPaymentResponse,
|
|
15
|
+
SessionManager,
|
|
16
|
+
SessionManagerSseOptions,
|
|
17
|
+
SessionManagerWebSocketOptions,
|
|
18
|
+
SessionTransition,
|
|
19
|
+
VoucherNeededSessionState,
|
|
20
|
+
} from './session/client/index.js'
|
|
21
|
+
import type { SessionTransition as MachineSessionTransition } from './session/client/index.js'
|
|
22
|
+
import type { ChannelTransactionOptions } from './session/precompile/Chain.js'
|
|
23
|
+
import type { RawAmountString } from './session/precompile/index.js'
|
|
24
|
+
import type { SettlementSchedule as SessionSettlementSchedule } from './session/server/index.js'
|
|
25
|
+
|
|
26
|
+
test('tempo session public barrels expose manager and schedule interfaces', () => {
|
|
27
|
+
expectTypeOf(Tempo.Session).toBeObject()
|
|
28
|
+
expectTypeOf(Tempo.Session.Client).toBeObject()
|
|
29
|
+
expectTypeOf(Tempo.Session.Precompile).toBeObject()
|
|
30
|
+
expectTypeOf(Tempo.Session.Server).toBeObject()
|
|
31
|
+
expectTypeOf<typeof Tempo>().not.toHaveProperty('Precompile')
|
|
32
|
+
|
|
33
|
+
expectTypeOf<ClientPaymentResponse>().toEqualTypeOf<SessionPaymentResponse>()
|
|
34
|
+
expectTypeOf<ClientSessionManager>().toEqualTypeOf<SessionManager>()
|
|
35
|
+
expectTypeOf<ClientSessionManagerSseOptions>().toEqualTypeOf<SessionManagerSseOptions>()
|
|
36
|
+
expectTypeOf<ClientSessionManagerWebSocketOptions>().toEqualTypeOf<SessionManagerWebSocketOptions>()
|
|
37
|
+
|
|
38
|
+
expectTypeOf<ServerSettlementSchedule>().toEqualTypeOf<SessionSettlementSchedule>()
|
|
39
|
+
expectTypeOf<MachineSessionTransition>().toEqualTypeOf<SessionTransition>()
|
|
40
|
+
expectTypeOf<ServerSettlementSchedule>().toEqualTypeOf<{
|
|
41
|
+
amount?: string | bigint | undefined
|
|
42
|
+
intervalMs?: number | undefined
|
|
43
|
+
units?: number | undefined
|
|
44
|
+
}>()
|
|
45
|
+
expectTypeOf<RawAmountString>().toEqualTypeOf<string>()
|
|
46
|
+
expectTypeOf<ActiveSessionState['status']>().toEqualTypeOf<'active'>()
|
|
47
|
+
expectTypeOf<VoucherNeededSessionState['status']>().toEqualTypeOf<'voucherNeeded'>()
|
|
48
|
+
expectTypeOf<ClosedSessionState['status']>().toEqualTypeOf<'closed'>()
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
test('tempo session chain exports canonical transaction options', () => {
|
|
52
|
+
expectTypeOf<ChannelTransactionOptions>().toEqualTypeOf<{
|
|
53
|
+
account?: import('viem').Account | undefined
|
|
54
|
+
candidateFeeTokens?: readonly import('viem').Address[] | undefined
|
|
55
|
+
feePayer?: import('viem').Account | undefined
|
|
56
|
+
feePayerPolicy?: Partial<import('./internal/fee-payer.js').Policy> | undefined
|
|
57
|
+
feeToken?: import('viem').Address | undefined
|
|
58
|
+
}>()
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
test('tempo session public barrel hides internal session drivers', () => {
|
|
62
|
+
type SessionNamespacePublic = typeof import('./session/index.js')
|
|
63
|
+
type SessionPublic = typeof import('./session/precompile/index.js')
|
|
64
|
+
type SessionClientPublic = typeof import('./session/client/index.js')
|
|
65
|
+
type SessionServerPublic = typeof import('./session/server/index.js')
|
|
66
|
+
|
|
67
|
+
expectTypeOf<SessionNamespacePublic>().toHaveProperty('Precompile')
|
|
68
|
+
expectTypeOf<SessionNamespacePublic>().toHaveProperty('Client')
|
|
69
|
+
expectTypeOf<SessionNamespacePublic>().toHaveProperty('Server')
|
|
70
|
+
expectTypeOf<SessionNamespacePublic>().not.toHaveProperty('ChannelStore')
|
|
71
|
+
expectTypeOf<SessionNamespacePublic>().not.toHaveProperty('Receipt')
|
|
72
|
+
expectTypeOf<SessionNamespacePublic>().not.toHaveProperty('Sse')
|
|
73
|
+
expectTypeOf<SessionNamespacePublic>().not.toHaveProperty('Types')
|
|
74
|
+
expectTypeOf<SessionNamespacePublic>().not.toHaveProperty('Ws')
|
|
75
|
+
expectTypeOf<SessionNamespacePublic>().not.toHaveProperty('session')
|
|
76
|
+
expectTypeOf<SessionNamespacePublic>().not.toHaveProperty('sessionManager')
|
|
77
|
+
expectTypeOf<SessionPublic>().not.toHaveProperty('openSseSession')
|
|
78
|
+
expectTypeOf<SessionPublic>().not.toHaveProperty('openWebSocketSession')
|
|
79
|
+
expectTypeOf<SessionPublic>().not.toHaveProperty('Client')
|
|
80
|
+
expectTypeOf<SessionPublic>().not.toHaveProperty('Server')
|
|
81
|
+
expectTypeOf<SessionPublic>().not.toHaveProperty('session')
|
|
82
|
+
expectTypeOf<SessionPublic>().not.toHaveProperty('sessionManager')
|
|
83
|
+
expectTypeOf<SessionPublic>().not.toHaveProperty('settle')
|
|
84
|
+
expectTypeOf<SessionClientPublic>().not.toHaveProperty('ChannelOps')
|
|
85
|
+
expectTypeOf<SessionClientPublic>().not.toHaveProperty('Chain')
|
|
86
|
+
expectTypeOf<SessionServerPublic>().not.toHaveProperty('ChannelOps')
|
|
87
|
+
expectTypeOf<SessionServerPublic>().not.toHaveProperty('Chain')
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
test('tempo legacy namespace keeps client, server, and channel primitives isolated', () => {
|
|
91
|
+
type LegacySessionPublic = typeof import('./legacy/session/index.js')
|
|
92
|
+
|
|
93
|
+
expectTypeOf(Tempo.SessionLegacy.Client.session).toBeFunction()
|
|
94
|
+
expectTypeOf(Tempo.SessionLegacy.Client.sessionManager).toBeFunction()
|
|
95
|
+
expectTypeOf(Tempo.SessionLegacy.Server.session).toBeFunction()
|
|
96
|
+
expectTypeOf(Tempo.SessionLegacy.Server.settle).toBeFunction()
|
|
97
|
+
expectTypeOf(Tempo.SessionLegacy.Session.Chain).toBeObject()
|
|
98
|
+
expectTypeOf(Tempo.SessionLegacy.Session.Channel).toBeObject()
|
|
99
|
+
expectTypeOf(Tempo.SessionLegacy.Session.Voucher).toBeObject()
|
|
100
|
+
|
|
101
|
+
expectTypeOf<LegacySessionPublic>().not.toHaveProperty('ChannelStore')
|
|
102
|
+
expectTypeOf<LegacySessionPublic>().not.toHaveProperty('Receipt')
|
|
103
|
+
expectTypeOf<LegacySessionPublic>().not.toHaveProperty('Sse')
|
|
104
|
+
expectTypeOf<LegacySessionPublic>().not.toHaveProperty('Ws')
|
|
105
|
+
})
|
|
@@ -123,4 +123,89 @@ describe('tempo.charge client', () => {
|
|
|
123
123
|
vi.resetModules()
|
|
124
124
|
}
|
|
125
125
|
})
|
|
126
|
+
|
|
127
|
+
describe('chain pinning', () => {
|
|
128
|
+
const client = createClient({
|
|
129
|
+
account,
|
|
130
|
+
chain: tempoLocalnet,
|
|
131
|
+
transport: http('http://127.0.0.1'),
|
|
132
|
+
})
|
|
133
|
+
|
|
134
|
+
test('rejects a challenge whose chainId conflicts with the pin', async () => {
|
|
135
|
+
const getClient = vi.fn(() => client)
|
|
136
|
+
const method = charge({
|
|
137
|
+
account,
|
|
138
|
+
expectedChainId: 42431,
|
|
139
|
+
getClient,
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
await expect(
|
|
143
|
+
method.createCredential({
|
|
144
|
+
challenge: createChallenge({ chainId: 1 }),
|
|
145
|
+
context: {},
|
|
146
|
+
}),
|
|
147
|
+
).rejects.toThrow('Chain ID mismatch: expected 42431, got 1.')
|
|
148
|
+
|
|
149
|
+
// The mismatch is rejected before resolving a client or signing.
|
|
150
|
+
expect(getClient).not.toHaveBeenCalled()
|
|
151
|
+
})
|
|
152
|
+
|
|
153
|
+
test('accepts a challenge whose chainId matches the pin', async () => {
|
|
154
|
+
const chainId = 42431
|
|
155
|
+
const method = charge({
|
|
156
|
+
account,
|
|
157
|
+
expectedChainId: chainId,
|
|
158
|
+
getClient: () => client,
|
|
159
|
+
})
|
|
160
|
+
|
|
161
|
+
const credential = Credential.deserialize(
|
|
162
|
+
await method.createCredential({
|
|
163
|
+
challenge: createChallenge({ chainId }),
|
|
164
|
+
context: {},
|
|
165
|
+
}),
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
expect(credential.source).toBe(`did:pkh:eip155:${chainId}:${account.address}`)
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
test('signs on the pin when the challenge omits chainId', async () => {
|
|
172
|
+
let requestedChainId: number | undefined
|
|
173
|
+
const chainId = 42431
|
|
174
|
+
const method = charge({
|
|
175
|
+
account,
|
|
176
|
+
expectedChainId: chainId,
|
|
177
|
+
getClient: (parameters) => {
|
|
178
|
+
requestedChainId = parameters.chainId
|
|
179
|
+
return client
|
|
180
|
+
},
|
|
181
|
+
})
|
|
182
|
+
|
|
183
|
+
const credential = Credential.deserialize(
|
|
184
|
+
await method.createCredential({
|
|
185
|
+
challenge: createChallenge(),
|
|
186
|
+
context: {},
|
|
187
|
+
}),
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
expect(requestedChainId).toBe(chainId)
|
|
191
|
+
expect(credential.source).toBe(`did:pkh:eip155:${chainId}:${account.address}`)
|
|
192
|
+
})
|
|
193
|
+
|
|
194
|
+
test('unpinned client accepts any challenge chainId', async () => {
|
|
195
|
+
const chainId = 1
|
|
196
|
+
const method = charge({
|
|
197
|
+
account,
|
|
198
|
+
getClient: () => client,
|
|
199
|
+
})
|
|
200
|
+
|
|
201
|
+
const credential = Credential.deserialize(
|
|
202
|
+
await method.createCredential({
|
|
203
|
+
challenge: createChallenge({ chainId }),
|
|
204
|
+
context: {},
|
|
205
|
+
}),
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
expect(credential.source).toBe(`did:pkh:eip155:${chainId}:${account.address}`)
|
|
209
|
+
})
|
|
210
|
+
})
|
|
126
211
|
})
|
|
@@ -51,9 +51,20 @@ export function charge(parameters: charge.Parameters = {}) {
|
|
|
51
51
|
}),
|
|
52
52
|
|
|
53
53
|
async createCredential({ challenge, context }) {
|
|
54
|
+
// Chain pinning: reject a challenge whose chain ID conflicts with the
|
|
55
|
+
// pinned one, and sign on the pin when the challenge omits a chain ID.
|
|
54
56
|
const challengeChainId = challenge.request.methodDetails?.chainId
|
|
55
|
-
|
|
56
|
-
|
|
57
|
+
if (
|
|
58
|
+
parameters.expectedChainId !== undefined &&
|
|
59
|
+
challengeChainId !== undefined &&
|
|
60
|
+
challengeChainId !== parameters.expectedChainId
|
|
61
|
+
)
|
|
62
|
+
throw new Error(
|
|
63
|
+
`Chain ID mismatch: expected ${parameters.expectedChainId}, got ${challengeChainId}.`,
|
|
64
|
+
)
|
|
65
|
+
const resolvedChainId = challengeChainId ?? parameters.expectedChainId
|
|
66
|
+
const client = await getClient({ chainId: resolvedChainId })
|
|
67
|
+
const chainId = resolvedChainId ?? client.chain?.id
|
|
57
68
|
if (chainId === undefined)
|
|
58
69
|
throw new Error('No `chainId` provided. Pass a chain ID in the challenge or client.')
|
|
59
70
|
|
|
@@ -198,6 +209,12 @@ export declare namespace charge {
|
|
|
198
209
|
autoSwap?: AutoSwap | undefined
|
|
199
210
|
/** Client identifier used to derive the client fingerprint in attribution memos. */
|
|
200
211
|
clientId?: string | undefined
|
|
212
|
+
/**
|
|
213
|
+
* Chain ID this client is willing to pay on. When set, the client rejects
|
|
214
|
+
* any challenge whose `methodDetails.chainId` differs, and signs on this
|
|
215
|
+
* chain when the challenge omits a chain ID.
|
|
216
|
+
*/
|
|
217
|
+
expectedChainId?: number | undefined
|
|
201
218
|
/**
|
|
202
219
|
* Allowlist of expected split recipient addresses. When set, the client
|
|
203
220
|
* rejects any challenge whose split recipients are not in this list.
|
|
@@ -1,8 +1,18 @@
|
|
|
1
|
+
import {
|
|
2
|
+
session as sessionLegacyIntent_,
|
|
3
|
+
sessionManager as sessionLegacy_,
|
|
4
|
+
} from '../legacy/client/index.js'
|
|
5
|
+
import { session as sessionMethod_ } from '../session/client/Session.js'
|
|
6
|
+
import { sessionManager as session_ } from '../session/client/SessionManager.js'
|
|
1
7
|
import { charge as charge_ } from './Charge.js'
|
|
2
|
-
import { session as sessionIntent_ } from './Session.js'
|
|
3
|
-
import { sessionManager as session_ } from './SessionManager.js'
|
|
4
8
|
import { subscription as subscription_ } from './Subscription.js'
|
|
5
9
|
|
|
10
|
+
const sessionClient = Object.assign(sessionMethod_, { manager: session_ })
|
|
11
|
+
const sessionLegacyClient = Object.assign(sessionLegacy_, { method: sessionLegacyIntent_ })
|
|
12
|
+
|
|
13
|
+
/** Creates a TIP-1034 client method, with explicit managed lifecycle helpers attached. */
|
|
14
|
+
export { sessionClient as session }
|
|
15
|
+
|
|
6
16
|
/**
|
|
7
17
|
* Creates both Tempo `charge` and `session` client methods from shared parameters.
|
|
8
18
|
*
|
|
@@ -16,16 +26,18 @@ import { subscription as subscription_ } from './Subscription.js'
|
|
|
16
26
|
* ```
|
|
17
27
|
*/
|
|
18
28
|
export function tempo(parameters: tempo.Parameters = {}) {
|
|
19
|
-
return [charge_(parameters),
|
|
29
|
+
return [charge_(parameters), sessionClient(parameters)] as const
|
|
20
30
|
}
|
|
21
31
|
|
|
22
32
|
export namespace tempo {
|
|
23
|
-
export type Parameters = charge_.Parameters &
|
|
33
|
+
export type Parameters = charge_.Parameters & sessionMethod_.Parameters
|
|
24
34
|
|
|
25
35
|
/** Creates a Tempo `charge` client method for one-time TIP-20 token transfers. */
|
|
26
36
|
export const charge = charge_
|
|
27
|
-
/** Creates a
|
|
28
|
-
export const session =
|
|
37
|
+
/** Creates a TIP-1034 client method for Mppx registration. Use `tempo.session.manager()` for direct lifecycle control. */
|
|
38
|
+
export const session = sessionClient
|
|
39
|
+
/** @deprecated Use `tempo.session()` for the TIP-1034 session client method. */
|
|
40
|
+
export const sessionLegacy = sessionLegacyClient
|
|
29
41
|
/** Creates a Tempo `subscription` client method for recurring TIP-20 payments. */
|
|
30
42
|
export const subscription = subscription_
|
|
31
43
|
}
|
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
export { charge } from './Charge.js'
|
|
2
|
-
export { tempo } from './Methods.js'
|
|
3
|
-
export { session } from '
|
|
2
|
+
export { session, tempo } from './Methods.js'
|
|
3
|
+
export { session as sessionLegacy } from '../legacy/client/index.js'
|
|
4
4
|
export { subscription } from './Subscription.js'
|
|
5
|
-
export type {
|
|
6
|
-
|
|
5
|
+
export type {
|
|
6
|
+
PaymentResponse as SessionLegacyPaymentResponse,
|
|
7
|
+
SessionManager as SessionLegacyManager,
|
|
8
|
+
} from '../legacy/client/index.js'
|
|
9
|
+
export { sessionManager as sessionLegacyManager } from '../legacy/client/index.js'
|
|
10
|
+
export { session as sessionMethod } from '../session/client/Session.js'
|
|
11
|
+
export type {
|
|
12
|
+
PaymentResponse,
|
|
13
|
+
SessionManager,
|
|
14
|
+
SessionManagerSseOptions,
|
|
15
|
+
SessionManagerWebSocketOptions,
|
|
16
|
+
} from '../session/client/SessionManager.js'
|
|
17
|
+
export { sessionManager } from '../session/client/SessionManager.js'
|