mppx 0.6.31 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/dist/Challenge.d.ts.map +1 -1
- package/dist/Challenge.js +9 -7
- package/dist/Challenge.js.map +1 -1
- package/dist/Constants.d.ts +46 -0
- package/dist/Constants.d.ts.map +1 -0
- package/dist/Constants.js +46 -0
- package/dist/Constants.js.map +1 -0
- package/dist/Credential.d.ts.map +1 -1
- package/dist/Credential.js +5 -4
- package/dist/Credential.js.map +1 -1
- package/dist/Method.d.ts +32 -4
- package/dist/Method.d.ts.map +1 -1
- package/dist/Method.js +5 -2
- package/dist/Method.js.map +1 -1
- package/dist/Receipt.d.ts.map +1 -1
- package/dist/Receipt.js +3 -2
- package/dist/Receipt.js.map +1 -1
- package/dist/cli/cli.d.ts.map +1 -1
- package/dist/cli/cli.js +19 -11
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/plugins/tempo.d.ts.map +1 -1
- package/dist/cli/plugins/tempo.js +17 -6
- package/dist/cli/plugins/tempo.js.map +1 -1
- package/dist/cli/utils.d.ts +5 -0
- package/dist/cli/utils.d.ts.map +1 -1
- package/dist/cli/utils.js +10 -0
- package/dist/cli/utils.js.map +1 -1
- package/dist/client/Methods.d.ts +5 -2
- package/dist/client/Methods.d.ts.map +1 -1
- package/dist/client/Methods.js +5 -2
- package/dist/client/Methods.js.map +1 -1
- package/dist/client/Transport.d.ts.map +1 -1
- package/dist/client/Transport.js +4 -5
- package/dist/client/Transport.js.map +1 -1
- package/dist/client/index.d.ts +2 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +2 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal/Fetch.d.ts.map +1 -1
- package/dist/client/internal/Fetch.js +14 -6
- package/dist/client/internal/Fetch.js.map +1 -1
- package/dist/evm/server/Methods.d.ts +1 -1
- package/dist/evm/server/Methods.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/internal/AcceptPayment.d.ts +3 -0
- package/dist/internal/AcceptPayment.d.ts.map +1 -1
- package/dist/internal/AcceptPayment.js +15 -11
- package/dist/internal/AcceptPayment.js.map +1 -1
- package/dist/mcp-sdk/client/McpClient.d.ts +12 -5
- package/dist/mcp-sdk/client/McpClient.d.ts.map +1 -1
- package/dist/mcp-sdk/client/McpClient.js +55 -42
- package/dist/mcp-sdk/client/McpClient.js.map +1 -1
- package/dist/server/Mppx.d.ts +11 -3
- package/dist/server/Mppx.d.ts.map +1 -1
- package/dist/server/Mppx.js +76 -27
- package/dist/server/Mppx.js.map +1 -1
- package/dist/server/Response.d.ts.map +1 -1
- package/dist/server/Response.js +2 -1
- package/dist/server/Response.js.map +1 -1
- package/dist/server/Transport.d.ts.map +1 -1
- package/dist/server/Transport.js +4 -3
- package/dist/server/Transport.js.map +1 -1
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -0
- package/dist/server/index.js.map +1 -1
- package/dist/stripe/client/Charge.d.ts +1 -1
- package/dist/stripe/client/Charge.d.ts.map +1 -1
- package/dist/stripe/client/Charge.js +3 -1
- package/dist/stripe/client/Charge.js.map +1 -1
- package/dist/stripe/server/Charge.d.ts +1 -1
- package/dist/stripe/server/Charge.d.ts.map +1 -1
- package/dist/stripe/server/Charge.js +9 -2
- package/dist/stripe/server/Charge.js.map +1 -1
- package/dist/stripe/server/Methods.d.ts +1 -1
- package/dist/stripe/server/Methods.d.ts.map +1 -1
- package/dist/stripe/server/internal/html.gen.d.ts +1 -1
- package/dist/stripe/server/internal/html.gen.d.ts.map +1 -1
- package/dist/stripe/server/internal/html.gen.js +1 -1
- package/dist/stripe/server/internal/html.gen.js.map +1 -1
- package/dist/tempo/Methods.d.ts +18 -0
- package/dist/tempo/Methods.d.ts.map +1 -1
- package/dist/tempo/Methods.js +16 -1
- package/dist/tempo/Methods.js.map +1 -1
- package/dist/tempo/client/Charge.d.ts +6 -0
- package/dist/tempo/client/Charge.d.ts.map +1 -1
- package/dist/tempo/client/Charge.js +9 -2
- package/dist/tempo/client/Charge.js.map +1 -1
- package/dist/tempo/client/Methods.d.ts +36 -7
- package/dist/tempo/client/Methods.d.ts.map +1 -1
- package/dist/tempo/client/Methods.js +12 -5
- package/dist/tempo/client/Methods.js.map +1 -1
- package/dist/tempo/client/index.d.ts +7 -4
- package/dist/tempo/client/index.d.ts.map +1 -1
- package/dist/tempo/client/index.js +5 -3
- package/dist/tempo/client/index.js.map +1 -1
- package/dist/tempo/index.d.ts +1 -0
- package/dist/tempo/index.d.ts.map +1 -1
- package/dist/tempo/index.js +1 -0
- package/dist/tempo/index.js.map +1 -1
- package/dist/tempo/internal/fee-payer.d.ts +21 -1
- package/dist/tempo/internal/fee-payer.d.ts.map +1 -1
- package/dist/tempo/internal/fee-payer.js +109 -4
- package/dist/tempo/internal/fee-payer.js.map +1 -1
- package/dist/tempo/{client → legacy/client}/ChannelOps.d.ts +19 -6
- package/dist/tempo/legacy/client/ChannelOps.d.ts.map +1 -0
- package/dist/tempo/{client → legacy/client}/ChannelOps.js +9 -3
- package/dist/tempo/legacy/client/ChannelOps.js.map +1 -0
- package/dist/tempo/{client → legacy/client}/Session.d.ts +23 -4
- package/dist/tempo/legacy/client/Session.d.ts.map +1 -0
- package/dist/tempo/{client → legacy/client}/Session.js +14 -7
- package/dist/tempo/legacy/client/Session.js.map +1 -0
- package/dist/tempo/{client → legacy/client}/SessionManager.d.ts +20 -5
- package/dist/tempo/legacy/client/SessionManager.d.ts.map +1 -0
- package/dist/tempo/{client → legacy/client}/SessionManager.js +20 -16
- package/dist/tempo/legacy/client/SessionManager.js.map +1 -0
- package/dist/tempo/legacy/client/index.d.ts +7 -0
- package/dist/tempo/legacy/client/index.d.ts.map +1 -0
- package/dist/tempo/legacy/client/index.js +5 -0
- package/dist/tempo/legacy/client/index.js.map +1 -0
- package/dist/tempo/legacy/index.d.ts +7 -0
- package/dist/tempo/legacy/index.d.ts.map +1 -0
- package/dist/tempo/legacy/index.js +7 -0
- package/dist/tempo/legacy/index.js.map +1 -0
- package/dist/tempo/{server → legacy/server}/Session.d.ts +28 -11
- package/dist/tempo/legacy/server/Session.d.ts.map +1 -0
- package/dist/tempo/{server → legacy/server}/Session.js +12 -10
- package/dist/tempo/legacy/server/Session.js.map +1 -0
- package/dist/tempo/legacy/server/index.d.ts +5 -0
- package/dist/tempo/legacy/server/index.d.ts.map +1 -0
- package/dist/tempo/legacy/server/index.js +5 -0
- package/dist/tempo/legacy/server/index.js.map +1 -0
- package/dist/tempo/{session → legacy/session}/Chain.d.ts +30 -23
- package/dist/tempo/legacy/session/Chain.d.ts.map +1 -0
- package/dist/tempo/{session → legacy/session}/Chain.js +12 -11
- package/dist/tempo/legacy/session/Chain.js.map +1 -0
- package/dist/tempo/{session → legacy/session}/Channel.d.ts +1 -0
- package/dist/tempo/legacy/session/Channel.d.ts.map +1 -0
- package/dist/tempo/legacy/session/Channel.js.map +1 -0
- package/dist/tempo/legacy/session/ChannelStore.d.ts +22 -0
- package/dist/tempo/legacy/session/ChannelStore.d.ts.map +1 -0
- package/dist/tempo/legacy/session/ChannelStore.js +6 -0
- package/dist/tempo/legacy/session/ChannelStore.js.map +1 -0
- package/dist/tempo/legacy/session/Types.d.ts +73 -0
- package/dist/tempo/legacy/session/Types.d.ts.map +1 -0
- package/dist/tempo/legacy/session/Types.js.map +1 -0
- package/dist/tempo/{session → legacy/session}/Voucher.d.ts +4 -4
- package/dist/tempo/legacy/session/Voucher.d.ts.map +1 -0
- package/dist/tempo/{session → legacy/session}/Voucher.js +1 -1
- package/dist/tempo/legacy/session/Voucher.js.map +1 -0
- package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts +1 -0
- package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts.map +1 -1
- package/dist/tempo/{session → legacy/session}/escrow.abi.js +1 -0
- package/dist/tempo/legacy/session/escrow.abi.js.map +1 -0
- package/dist/tempo/legacy/session/index.d.ts +9 -0
- package/dist/tempo/legacy/session/index.d.ts.map +1 -0
- package/dist/tempo/legacy/session/index.js +9 -0
- package/dist/tempo/legacy/session/index.js.map +1 -0
- package/dist/tempo/server/Charge.d.ts +1 -1
- package/dist/tempo/server/Charge.d.ts.map +1 -1
- package/dist/tempo/server/Charge.js +13 -16
- package/dist/tempo/server/Charge.js.map +1 -1
- package/dist/tempo/server/Methods.d.ts +63 -6
- package/dist/tempo/server/Methods.d.ts.map +1 -1
- package/dist/tempo/server/Methods.js +36 -8
- package/dist/tempo/server/Methods.js.map +1 -1
- package/dist/tempo/server/Subscription.d.ts +1 -1
- package/dist/tempo/server/Subscription.d.ts.map +1 -1
- package/dist/tempo/server/index.d.ts +6 -5
- package/dist/tempo/server/index.d.ts.map +1 -1
- package/dist/tempo/server/index.js +5 -5
- package/dist/tempo/server/index.js.map +1 -1
- package/dist/tempo/server/internal/html.gen.d.ts +1 -1
- package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
- package/dist/tempo/server/internal/html.gen.js +1 -1
- package/dist/tempo/server/internal/html.gen.js.map +1 -1
- package/dist/tempo/server/internal/request-body.d.ts +7 -2
- package/dist/tempo/server/internal/request-body.d.ts.map +1 -1
- package/dist/tempo/server/internal/request-body.js +20 -3
- package/dist/tempo/server/internal/request-body.js.map +1 -1
- package/dist/tempo/server/internal/transport.d.ts +8 -4
- package/dist/tempo/server/internal/transport.d.ts.map +1 -1
- package/dist/tempo/server/internal/transport.js +8 -7
- package/dist/tempo/server/internal/transport.js.map +1 -1
- package/dist/tempo/session/Snapshot.d.ts +32 -0
- package/dist/tempo/session/Snapshot.d.ts.map +1 -0
- package/dist/tempo/session/Snapshot.js +37 -0
- package/dist/tempo/session/Snapshot.js.map +1 -0
- package/dist/tempo/session/client/ChannelOps.d.ts +82 -0
- package/dist/tempo/session/client/ChannelOps.d.ts.map +1 -0
- package/dist/tempo/session/client/ChannelOps.js +204 -0
- package/dist/tempo/session/client/ChannelOps.js.map +1 -0
- package/dist/tempo/session/client/CredentialState.d.ts +262 -0
- package/dist/tempo/session/client/CredentialState.d.ts.map +1 -0
- package/dist/tempo/session/client/CredentialState.js +417 -0
- package/dist/tempo/session/client/CredentialState.js.map +1 -0
- package/dist/tempo/session/client/ReceiptCoordinator.d.ts +26 -0
- package/dist/tempo/session/client/ReceiptCoordinator.d.ts.map +1 -0
- package/dist/tempo/session/client/ReceiptCoordinator.js +61 -0
- package/dist/tempo/session/client/ReceiptCoordinator.js.map +1 -0
- package/dist/tempo/session/client/Runtime.d.ts +464 -0
- package/dist/tempo/session/client/Runtime.d.ts.map +1 -0
- package/dist/tempo/session/client/Runtime.js +499 -0
- package/dist/tempo/session/client/Runtime.js.map +1 -0
- package/dist/tempo/session/client/Session.d.ts +132 -0
- package/dist/tempo/session/client/Session.d.ts.map +1 -0
- package/dist/tempo/session/client/Session.js +55 -0
- package/dist/tempo/session/client/Session.js.map +1 -0
- package/dist/tempo/session/client/SessionManager.d.ts +120 -0
- package/dist/tempo/session/client/SessionManager.d.ts.map +1 -0
- package/dist/tempo/session/client/SessionManager.js +627 -0
- package/dist/tempo/session/client/SessionManager.js.map +1 -0
- package/dist/tempo/session/client/Transports.d.ts +449 -0
- package/dist/tempo/session/client/Transports.d.ts.map +1 -0
- package/dist/tempo/session/client/Transports.js +721 -0
- package/dist/tempo/session/client/Transports.js.map +1 -0
- package/dist/tempo/session/client/index.d.ts +12 -0
- package/dist/tempo/session/client/index.d.ts.map +1 -0
- package/dist/tempo/session/client/index.js +5 -0
- package/dist/tempo/session/client/index.js.map +1 -0
- package/dist/tempo/session/index.d.ts +7 -8
- package/dist/tempo/session/index.d.ts.map +1 -1
- package/dist/tempo/session/index.js +7 -8
- package/dist/tempo/session/index.js.map +1 -1
- package/dist/tempo/session/precompile/Chain.d.ts +319 -0
- package/dist/tempo/session/precompile/Chain.d.ts.map +1 -0
- package/dist/tempo/session/precompile/Chain.js +492 -0
- package/dist/tempo/session/precompile/Chain.js.map +1 -0
- package/dist/tempo/session/precompile/Channel.d.ts +46 -0
- package/dist/tempo/session/precompile/Channel.d.ts.map +1 -0
- package/dist/tempo/session/precompile/Channel.js +56 -0
- package/dist/tempo/session/precompile/Channel.js.map +1 -0
- package/dist/tempo/session/precompile/Protocol.d.ts +308 -0
- package/dist/tempo/session/precompile/Protocol.d.ts.map +1 -0
- package/dist/tempo/session/precompile/Protocol.js +264 -0
- package/dist/tempo/session/precompile/Protocol.js.map +1 -0
- package/dist/tempo/session/precompile/Voucher.d.ts +40 -0
- package/dist/tempo/session/precompile/Voucher.d.ts.map +1 -0
- package/dist/tempo/session/precompile/Voucher.js +126 -0
- package/dist/tempo/session/precompile/Voucher.js.map +1 -0
- package/dist/tempo/session/precompile/escrow.abi.d.ts +522 -0
- package/dist/tempo/session/precompile/escrow.abi.d.ts.map +1 -0
- package/dist/tempo/session/precompile/escrow.abi.js +224 -0
- package/dist/tempo/session/precompile/escrow.abi.js.map +1 -0
- package/dist/tempo/session/precompile/index.d.ts +24 -0
- package/dist/tempo/session/precompile/index.d.ts.map +1 -0
- package/dist/tempo/session/precompile/index.js +22 -0
- package/dist/tempo/session/precompile/index.js.map +1 -0
- package/dist/tempo/session/server/ChannelOps.d.ts +56 -0
- package/dist/tempo/session/server/ChannelOps.d.ts.map +1 -0
- package/dist/tempo/session/server/ChannelOps.js +91 -0
- package/dist/tempo/session/server/ChannelOps.js.map +1 -0
- package/dist/tempo/session/server/ChannelStore.d.ts +347 -0
- package/dist/tempo/session/server/ChannelStore.d.ts.map +1 -0
- package/dist/tempo/session/server/ChannelStore.js +404 -0
- package/dist/tempo/session/server/ChannelStore.js.map +1 -0
- package/dist/tempo/session/server/CredentialVerification.d.ts +85 -0
- package/dist/tempo/session/server/CredentialVerification.d.ts.map +1 -0
- package/dist/tempo/session/server/CredentialVerification.js +494 -0
- package/dist/tempo/session/server/CredentialVerification.js.map +1 -0
- package/dist/tempo/session/server/MeteredStream.d.ts +40 -0
- package/dist/tempo/session/server/MeteredStream.d.ts.map +1 -0
- package/dist/tempo/session/server/MeteredStream.js +42 -0
- package/dist/tempo/session/server/MeteredStream.js.map +1 -0
- package/dist/tempo/session/server/RequestState.d.ts +208 -0
- package/dist/tempo/session/server/RequestState.d.ts.map +1 -0
- package/dist/tempo/session/server/RequestState.js +252 -0
- package/dist/tempo/session/server/RequestState.js.map +1 -0
- package/dist/tempo/session/server/Session.d.ts +169 -0
- package/dist/tempo/session/server/Session.d.ts.map +1 -0
- package/dist/tempo/session/server/Session.js +351 -0
- package/dist/tempo/session/server/Session.js.map +1 -0
- package/dist/tempo/session/server/Settlement.d.ts +185 -0
- package/dist/tempo/session/server/Settlement.d.ts.map +1 -0
- package/dist/tempo/session/server/Settlement.js +250 -0
- package/dist/tempo/session/server/Settlement.js.map +1 -0
- package/dist/tempo/session/{Sse.d.ts → server/Sse.d.ts} +9 -56
- package/dist/tempo/session/server/Sse.d.ts.map +1 -0
- package/dist/tempo/session/server/Sse.js +184 -0
- package/dist/tempo/session/server/Sse.js.map +1 -0
- package/dist/tempo/session/server/Transports.d.ts +89 -0
- package/dist/tempo/session/server/Transports.d.ts.map +1 -0
- package/dist/tempo/session/server/Transports.js +149 -0
- package/dist/tempo/session/server/Transports.js.map +1 -0
- package/dist/tempo/session/server/Ws.d.ts +48 -0
- package/dist/tempo/session/server/Ws.d.ts.map +1 -0
- package/dist/tempo/session/server/Ws.js +244 -0
- package/dist/tempo/session/server/Ws.js.map +1 -0
- package/dist/tempo/session/server/index.d.ts +4 -0
- package/dist/tempo/session/server/index.d.ts.map +1 -0
- package/dist/tempo/session/server/index.js +2 -0
- package/dist/tempo/session/server/index.js.map +1 -0
- package/package.json +6 -1
- package/src/Challenge.ts +9 -7
- package/src/Constants.ts +58 -0
- package/src/Credential.ts +5 -4
- package/src/Method.ts +46 -5
- package/src/Receipt.ts +3 -2
- package/src/cli/cli.test.ts +23 -28
- package/src/cli/cli.ts +23 -10
- package/src/cli/mcp.test.ts +21 -7
- package/src/cli/plugins/tempo.ts +21 -8
- package/src/cli/utils.test.ts +25 -1
- package/src/cli/utils.ts +10 -0
- package/src/client/Methods.ts +5 -2
- package/src/client/Mppx.test-d.ts +10 -0
- package/src/client/Mppx.test.ts +75 -0
- package/src/client/Transport.ts +4 -5
- package/src/client/index.ts +11 -1
- package/src/client/internal/Fetch.test.ts +29 -4
- package/src/client/internal/Fetch.ts +17 -5
- package/src/env.d.ts +1 -1
- package/src/index.ts +1 -0
- package/src/internal/AcceptPayment.test.ts +61 -0
- package/src/internal/AcceptPayment.ts +21 -14
- package/src/mcp-sdk/client/McpClient.integration.test.ts +8 -7
- package/src/mcp-sdk/client/McpClient.test-d.ts +7 -0
- package/src/mcp-sdk/client/McpClient.ts +99 -67
- package/src/mcp-sdk/client/McpClient.unit.test.ts +131 -0
- package/src/middlewares/elysia.test.ts +8 -4
- package/src/middlewares/express.test.ts +8 -4
- package/src/middlewares/hono.test.ts +4 -4
- package/src/middlewares/nextjs.test.ts +8 -4
- package/src/proxy/Proxy.test.ts +8 -8
- package/src/server/Mppx.test-d.ts +54 -0
- package/src/server/Mppx.test.ts +200 -7
- package/src/server/Mppx.ts +487 -406
- package/src/server/Response.ts +2 -1
- package/src/server/Transport.ts +4 -3
- package/src/server/index.ts +1 -0
- package/src/stripe/client/Charge.test.ts +20 -5
- package/src/stripe/client/Charge.ts +6 -2
- package/src/stripe/server/Charge.test.ts +114 -1
- package/src/stripe/server/Charge.ts +13 -2
- package/src/stripe/server/internal/html.gen.ts +1 -1
- package/src/tempo/AccessKeyAuthorization.test.ts +4 -94
- package/src/tempo/Methods.test.ts +45 -17
- package/src/tempo/Methods.ts +22 -0
- package/src/tempo/PublicExports.test-d.ts +105 -0
- package/src/tempo/client/Charge.test.ts +85 -0
- package/src/tempo/client/Charge.ts +19 -2
- package/src/tempo/client/Methods.ts +18 -6
- package/src/tempo/client/index.ts +15 -4
- package/src/tempo/index.ts +1 -0
- package/src/tempo/internal/fee-payer.test.ts +241 -17
- package/src/tempo/internal/fee-payer.ts +150 -4
- package/src/tempo/internal/fee-token.test.ts +14 -9
- package/src/tempo/legacy/AccessKeyAuthorization.test.ts +162 -0
- package/src/tempo/legacy/README.md +9 -0
- package/src/tempo/{client → legacy/client}/ChannelOps.test.ts +6 -7
- package/src/tempo/{client → legacy/client}/ChannelOps.ts +22 -9
- package/src/tempo/{client → legacy/client}/Session.test.ts +51 -9
- package/src/tempo/{client → legacy/client}/Session.ts +25 -11
- package/src/tempo/{client → legacy/client}/SessionManager.test.ts +81 -9
- package/src/tempo/{client → legacy/client}/SessionManager.ts +41 -20
- package/src/tempo/legacy/client/index.ts +6 -0
- package/src/tempo/legacy/index.ts +6 -0
- package/src/tempo/{server → legacy/server}/Session.test.ts +45 -45
- package/src/tempo/{server → legacy/server}/Session.ts +32 -23
- package/src/tempo/legacy/server/index.ts +4 -0
- package/src/tempo/{session → legacy/session}/Chain.test.ts +3 -4
- package/src/tempo/{session → legacy/session}/Chain.ts +94 -63
- package/src/tempo/{session → legacy/session}/Channel.ts +1 -0
- package/src/tempo/legacy/session/ChannelStore.test.ts +58 -0
- package/src/tempo/legacy/session/ChannelStore.ts +39 -0
- package/src/tempo/legacy/session/Types.ts +91 -0
- package/src/tempo/{session → legacy/session}/Voucher.ts +12 -8
- package/src/tempo/{session → legacy/session}/escrow.abi.ts +1 -0
- package/src/tempo/legacy/session/index.ts +8 -0
- package/src/tempo/server/AtomicStore.test-d.ts +16 -11
- package/src/tempo/server/Charge.test.ts +92 -14
- package/src/tempo/server/Charge.ts +18 -16
- package/src/tempo/server/Methods.ts +54 -8
- package/src/tempo/server/Sse.test.ts +2 -2
- package/src/tempo/server/index.ts +6 -5
- package/src/tempo/server/internal/html.gen.ts +1 -1
- package/src/tempo/server/internal/request-body.test.ts +37 -4
- package/src/tempo/server/internal/request-body.ts +25 -6
- package/src/tempo/server/internal/transport.test.ts +4 -4
- package/src/tempo/server/internal/transport.ts +19 -10
- package/src/tempo/session/Snapshot.test.ts +41 -0
- package/src/tempo/session/Snapshot.ts +74 -0
- package/src/tempo/session/client/ChannelOps.test.ts +163 -0
- package/src/tempo/session/client/ChannelOps.ts +344 -0
- package/src/tempo/session/client/CredentialState.test.ts +645 -0
- package/src/tempo/session/client/CredentialState.ts +814 -0
- package/src/tempo/session/client/ReceiptCoordinator.ts +95 -0
- package/src/tempo/session/client/Runtime.test.ts +1092 -0
- package/src/tempo/session/client/Runtime.ts +986 -0
- package/src/tempo/session/client/Session.test.ts +734 -0
- package/src/tempo/session/client/Session.ts +97 -0
- package/src/tempo/session/client/SessionManager.test.ts +1308 -0
- package/src/tempo/session/client/SessionManager.ts +845 -0
- package/src/tempo/session/client/Transports.test.ts +837 -0
- package/src/tempo/session/client/Transports.ts +1292 -0
- package/src/tempo/session/client/index.ts +37 -0
- package/src/tempo/session/index.ts +7 -8
- package/src/tempo/session/precompile/Chain.integration.test.ts +321 -0
- package/src/tempo/session/precompile/Chain.test.ts +1258 -0
- package/src/tempo/session/precompile/Chain.ts +979 -0
- package/src/tempo/session/precompile/Channel.test.ts +138 -0
- package/src/tempo/session/precompile/Channel.ts +103 -0
- package/src/tempo/session/precompile/Protocol.test.ts +358 -0
- package/src/tempo/session/precompile/Protocol.ts +520 -0
- package/src/tempo/session/precompile/Voucher.test.ts +316 -0
- package/src/tempo/session/precompile/Voucher.ts +160 -0
- package/src/tempo/session/precompile/escrow.abi.ts +226 -0
- package/src/tempo/session/precompile/index.ts +33 -0
- package/src/tempo/session/server/ChannelOps.test.ts +129 -0
- package/src/tempo/session/server/ChannelOps.ts +157 -0
- package/src/tempo/session/{ChannelStore.test.ts → server/ChannelStore.test.ts} +536 -29
- package/src/tempo/session/server/ChannelStore.ts +835 -0
- package/src/tempo/session/server/CredentialVerification.test.ts +146 -0
- package/src/tempo/session/server/CredentialVerification.ts +710 -0
- package/src/tempo/session/server/MeteredStream.ts +88 -0
- package/src/tempo/session/server/RequestState.test.ts +531 -0
- package/src/tempo/session/server/RequestState.ts +499 -0
- package/src/tempo/session/server/Session.integration.test.ts +444 -0
- package/src/tempo/session/server/Session.test.ts +3253 -0
- package/src/tempo/session/server/Session.ts +543 -0
- package/src/tempo/session/server/Settlement.test.ts +242 -0
- package/src/tempo/session/server/Settlement.ts +470 -0
- package/src/tempo/session/{Sse.test.ts → server/Sse.test.ts} +37 -3
- package/src/tempo/session/server/Sse.ts +256 -0
- package/src/tempo/session/server/Transports.test.ts +346 -0
- package/src/tempo/session/server/Transports.ts +255 -0
- package/src/tempo/session/{Ws.test.ts → server/Ws.test.ts} +4 -4
- package/src/tempo/session/server/Ws.ts +384 -0
- package/src/tempo/session/server/index.ts +8 -0
- package/dist/tempo/client/ChannelOps.d.ts.map +0 -1
- package/dist/tempo/client/ChannelOps.js.map +0 -1
- package/dist/tempo/client/Session.d.ts.map +0 -1
- package/dist/tempo/client/Session.js.map +0 -1
- package/dist/tempo/client/SessionManager.d.ts.map +0 -1
- package/dist/tempo/client/SessionManager.js.map +0 -1
- package/dist/tempo/server/Session.d.ts.map +0 -1
- package/dist/tempo/server/Session.js.map +0 -1
- package/dist/tempo/session/Chain.d.ts.map +0 -1
- package/dist/tempo/session/Chain.js.map +0 -1
- package/dist/tempo/session/Channel.d.ts.map +0 -1
- package/dist/tempo/session/Channel.js.map +0 -1
- package/dist/tempo/session/ChannelStore.d.ts +0 -117
- package/dist/tempo/session/ChannelStore.d.ts.map +0 -1
- package/dist/tempo/session/ChannelStore.js +0 -172
- package/dist/tempo/session/ChannelStore.js.map +0 -1
- package/dist/tempo/session/Receipt.d.ts +0 -22
- package/dist/tempo/session/Receipt.d.ts.map +0 -1
- package/dist/tempo/session/Receipt.js +0 -34
- package/dist/tempo/session/Receipt.js.map +0 -1
- package/dist/tempo/session/Sse.d.ts.map +0 -1
- package/dist/tempo/session/Sse.js +0 -363
- package/dist/tempo/session/Sse.js.map +0 -1
- package/dist/tempo/session/Types.d.ts +0 -78
- package/dist/tempo/session/Types.d.ts.map +0 -1
- package/dist/tempo/session/Types.js.map +0 -1
- package/dist/tempo/session/Voucher.d.ts.map +0 -1
- package/dist/tempo/session/Voucher.js.map +0 -1
- package/dist/tempo/session/Ws.d.ts +0 -87
- package/dist/tempo/session/Ws.d.ts.map +0 -1
- package/dist/tempo/session/Ws.js +0 -443
- package/dist/tempo/session/Ws.js.map +0 -1
- package/dist/tempo/session/escrow.abi.js.map +0 -1
- package/src/tempo/session/ChannelStore.ts +0 -308
- package/src/tempo/session/Receipt.test.ts +0 -89
- package/src/tempo/session/Receipt.ts +0 -46
- package/src/tempo/session/Sse.ts +0 -462
- package/src/tempo/session/Types.ts +0 -86
- package/src/tempo/session/Ws.ts +0 -576
- /package/dist/tempo/{session → legacy/session}/Channel.js +0 -0
- /package/dist/tempo/{session → legacy/session}/Types.js +0 -0
- /package/src/tempo/{session → legacy/session}/Channel.test.ts +0 -0
- /package/src/tempo/{session → legacy/session}/Voucher.test.ts +0 -0
- /package/src/tempo/session/{Sse.fuzz.test.ts → server/Sse.fuzz.test.ts} +0 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { type Address, createClient, custom, type Hex } from 'viem'
|
|
2
|
+
import {
|
|
3
|
+
Account as TempoAccount,
|
|
4
|
+
KeyAuthorizationManager,
|
|
5
|
+
Secp256k1,
|
|
6
|
+
Transaction,
|
|
7
|
+
} from 'viem/tempo'
|
|
8
|
+
import { beforeAll, describe, expect, test } from 'vp/test'
|
|
9
|
+
import { tempoNetwork } from '~test/config.js'
|
|
10
|
+
import { deployEscrow, openChannel } from '~test/tempo/legacy/session.js'
|
|
11
|
+
import { asset as currency, chain, http } from '~test/tempo/viem.js'
|
|
12
|
+
|
|
13
|
+
import { createOpenPayload } from './client/ChannelOps.js'
|
|
14
|
+
import { closeOnChain, settleOnChain } from './session/Chain.js'
|
|
15
|
+
import { signVoucher } from './session/Voucher.js'
|
|
16
|
+
|
|
17
|
+
const rootAccount = TempoAccount.fromSecp256k1(
|
|
18
|
+
'0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',
|
|
19
|
+
)
|
|
20
|
+
const recipient = '0x2222222222222222222222222222222222222222' as Address
|
|
21
|
+
const isLocalnet = tempoNetwork === 'localnet'
|
|
22
|
+
|
|
23
|
+
async function createAccessKeyClient() {
|
|
24
|
+
const keyAuthorizationManager = KeyAuthorizationManager.memory()
|
|
25
|
+
const accessKey = TempoAccount.fromSecp256k1(Secp256k1.randomPrivateKey(), {
|
|
26
|
+
access: rootAccount,
|
|
27
|
+
keyAuthorizationManager,
|
|
28
|
+
})
|
|
29
|
+
const keyAuthorization = await rootAccount.signKeyAuthorization(
|
|
30
|
+
{
|
|
31
|
+
accessKeyAddress: accessKey.accessKeyAddress,
|
|
32
|
+
keyType: accessKey.keyType,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
chainId: BigInt(chain.id),
|
|
36
|
+
},
|
|
37
|
+
)
|
|
38
|
+
await keyAuthorizationManager.set(
|
|
39
|
+
{
|
|
40
|
+
accessKey: accessKey.accessKeyAddress,
|
|
41
|
+
address: rootAccount.address,
|
|
42
|
+
chainId: chain.id,
|
|
43
|
+
},
|
|
44
|
+
keyAuthorization,
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
const signedTransactions: Transaction.TransactionSerializedTempo[] = []
|
|
48
|
+
const rpcClient = createClient({ chain, transport: http() })
|
|
49
|
+
|
|
50
|
+
const client = createClient({
|
|
51
|
+
account: accessKey,
|
|
52
|
+
chain,
|
|
53
|
+
transport: custom({
|
|
54
|
+
async request({ method, params }: { method: string; params?: readonly unknown[] }) {
|
|
55
|
+
if (method === 'eth_sendRawTransaction' || method === 'eth_sendRawTransactionSync')
|
|
56
|
+
signedTransactions.push(params?.[0] as Transaction.TransactionSerializedTempo)
|
|
57
|
+
return rpcClient.request({ method, params } as never)
|
|
58
|
+
},
|
|
59
|
+
}),
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
return { accessKey, client, keyAuthorization, signedTransactions }
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function expectTransactionKeyAuthorization(
|
|
66
|
+
serializedTransaction: Hex,
|
|
67
|
+
keyAuthorization: Awaited<ReturnType<typeof rootAccount.signKeyAuthorization>>,
|
|
68
|
+
) {
|
|
69
|
+
const transaction = Transaction.deserialize(
|
|
70
|
+
serializedTransaction as Transaction.TransactionSerializedTempo,
|
|
71
|
+
)
|
|
72
|
+
expect(transaction.keyAuthorization).toEqual(keyAuthorization)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async function createChannelForPayee(payee: Address, escrowContract: Address) {
|
|
76
|
+
const payer = rootAccount
|
|
77
|
+
const { channelId } = await openChannel({
|
|
78
|
+
deposit: 10_000_000n,
|
|
79
|
+
escrow: escrowContract,
|
|
80
|
+
payee,
|
|
81
|
+
payer,
|
|
82
|
+
salt: Secp256k1.randomPrivateKey(),
|
|
83
|
+
token: currency,
|
|
84
|
+
})
|
|
85
|
+
const cumulativeAmount = 1_000_000n
|
|
86
|
+
const signature = await signVoucher(
|
|
87
|
+
createClient({ account: payer, chain, transport: http() }),
|
|
88
|
+
payer,
|
|
89
|
+
{ channelId, cumulativeAmount },
|
|
90
|
+
escrowContract,
|
|
91
|
+
chain.id,
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
return { channelId, cumulativeAmount, escrowContract, signature }
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
describe.runIf(isLocalnet)('legacy Tempo session access-key authorization attachment', () => {
|
|
98
|
+
let escrowContract: Address
|
|
99
|
+
|
|
100
|
+
beforeAll(async () => {
|
|
101
|
+
escrowContract = await deployEscrow()
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
test('open signs a prepared transaction with keyAuthorization', async () => {
|
|
105
|
+
const { accessKey, client, keyAuthorization } = await createAccessKeyClient()
|
|
106
|
+
|
|
107
|
+
const { payload } = await createOpenPayload(client, accessKey, {
|
|
108
|
+
chainId: chain.id,
|
|
109
|
+
currency,
|
|
110
|
+
deposit: 5_000_000n,
|
|
111
|
+
escrowContract,
|
|
112
|
+
initialAmount: 1_000_000n,
|
|
113
|
+
payee: recipient,
|
|
114
|
+
})
|
|
115
|
+
|
|
116
|
+
expect(payload.action).toBe('open')
|
|
117
|
+
if (payload.action !== 'open') throw new Error('unexpected payload action')
|
|
118
|
+
expectTransactionKeyAuthorization(payload.transaction, keyAuthorization)
|
|
119
|
+
})
|
|
120
|
+
|
|
121
|
+
test('settle sends a prepared transaction with keyAuthorization', async () => {
|
|
122
|
+
const { accessKey, client, keyAuthorization, signedTransactions } =
|
|
123
|
+
await createAccessKeyClient()
|
|
124
|
+
const channel = await createChannelForPayee(rootAccount.address, escrowContract)
|
|
125
|
+
|
|
126
|
+
const hash = await settleOnChain(
|
|
127
|
+
client,
|
|
128
|
+
channel.escrowContract,
|
|
129
|
+
{
|
|
130
|
+
channelId: channel.channelId,
|
|
131
|
+
cumulativeAmount: channel.cumulativeAmount,
|
|
132
|
+
signature: channel.signature,
|
|
133
|
+
},
|
|
134
|
+
{ account: accessKey },
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
expect(hash).toMatch(/^0x[0-9a-f]{64}$/)
|
|
138
|
+
expect(signedTransactions).toHaveLength(1)
|
|
139
|
+
expectTransactionKeyAuthorization(signedTransactions[0]!, keyAuthorization)
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
test('close sends a prepared transaction with keyAuthorization', async () => {
|
|
143
|
+
const { accessKey, client, keyAuthorization, signedTransactions } =
|
|
144
|
+
await createAccessKeyClient()
|
|
145
|
+
const channel = await createChannelForPayee(rootAccount.address, escrowContract)
|
|
146
|
+
|
|
147
|
+
const hash = await closeOnChain(
|
|
148
|
+
client,
|
|
149
|
+
channel.escrowContract,
|
|
150
|
+
{
|
|
151
|
+
channelId: channel.channelId,
|
|
152
|
+
cumulativeAmount: channel.cumulativeAmount,
|
|
153
|
+
signature: channel.signature,
|
|
154
|
+
},
|
|
155
|
+
{ account: accessKey },
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
expect(hash).toMatch(/^0x[0-9a-f]{64}$/)
|
|
159
|
+
expect(signedTransactions).toHaveLength(1)
|
|
160
|
+
expectTransactionKeyAuthorization(signedTransactions[0]!, keyAuthorization)
|
|
161
|
+
})
|
|
162
|
+
})
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Tempo Legacy Session
|
|
2
|
+
|
|
3
|
+
This directory contains the legacy smart-contract-backed `tempo/session`
|
|
4
|
+
implementation.
|
|
5
|
+
|
|
6
|
+
The default `tempo.session` implementation is TIP-1034 precompile-backed and
|
|
7
|
+
lives under `src/tempo/session/precompile`. Legacy code may import shared transport and
|
|
8
|
+
accounting helpers from `src/tempo/session`, but legacy chain, channel, voucher,
|
|
9
|
+
client, and server implementations should stay inside this directory.
|
|
@@ -4,18 +4,16 @@ import { type Address, createClient, decodeFunctionData } from 'viem'
|
|
|
4
4
|
import { privateKeyToAccount } from 'viem/accounts'
|
|
5
5
|
import { Account as TempoAccount, Addresses, Transaction } from 'viem/tempo'
|
|
6
6
|
import { beforeAll, describe, expect, test } from 'vp/test'
|
|
7
|
-
import {
|
|
8
|
-
import { deployEscrow, openChannel } from '~test/tempo/session.js'
|
|
7
|
+
import { tempoNetwork } from '~test/config.js'
|
|
8
|
+
import { deployEscrow, openChannel } from '~test/tempo/legacy/session.js'
|
|
9
9
|
import { accounts, asset, chain, client, fundAccount, http } from '~test/tempo/viem.js'
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
import type { Challenge } from '../../Challenge.js'
|
|
14
|
-
import * as Credential from '../../Credential.js'
|
|
11
|
+
import type { Challenge } from '../../../Challenge.js'
|
|
12
|
+
import * as Credential from '../../../Credential.js'
|
|
15
13
|
import {
|
|
16
14
|
chainId as chainIdDefaults,
|
|
17
15
|
escrowContract as escrowContractDefaults,
|
|
18
|
-
} from '
|
|
16
|
+
} from '../../internal/defaults.js'
|
|
19
17
|
import { escrowAbi } from '../session/Chain.js'
|
|
20
18
|
import { verifyVoucher } from '../session/Voucher.js'
|
|
21
19
|
import {
|
|
@@ -40,6 +38,7 @@ const localClient = createClient({
|
|
|
40
38
|
const channelId = '0x0000000000000000000000000000000000000000000000000000000000000001' as Hex.Hex
|
|
41
39
|
const escrowContract = '0x1234567890abcdef1234567890abcdef12345678' as Address
|
|
42
40
|
const chainId = 42431
|
|
41
|
+
const isLocalnet = tempoNetwork === 'localnet'
|
|
43
42
|
|
|
44
43
|
function makeChallenge(overrides?: Partial<Challenge>): Challenge {
|
|
45
44
|
return {
|
|
@@ -16,21 +16,28 @@ import {
|
|
|
16
16
|
import { prepareTransactionRequest, signTransaction } from 'viem/actions'
|
|
17
17
|
import { Abis } from 'viem/tempo'
|
|
18
18
|
|
|
19
|
-
import type { Challenge } from '
|
|
20
|
-
import * as Credential from '
|
|
21
|
-
import { getAccountSignerAddress } from '
|
|
22
|
-
import * as defaults from '
|
|
19
|
+
import type { Challenge } from '../../../Challenge.js'
|
|
20
|
+
import * as Credential from '../../../Credential.js'
|
|
21
|
+
import { getAccountSignerAddress } from '../../internal/account.js'
|
|
22
|
+
import * as defaults from '../../internal/defaults.js'
|
|
23
23
|
import { escrowAbi, getOnChainChannel } from '../session/Chain.js'
|
|
24
24
|
import * as Channel from '../session/Channel.js'
|
|
25
|
-
import type {
|
|
25
|
+
import type { LegacySessionCredentialPayload } from '../session/Types.js'
|
|
26
26
|
import { signVoucher } from '../session/Voucher.js'
|
|
27
27
|
|
|
28
|
+
/** Cached channel metadata used by the legacy auto-driving session client. */
|
|
28
29
|
export type ChannelEntry = {
|
|
30
|
+
/** Legacy contract-backed channel ID. */
|
|
29
31
|
channelId: Hex.Hex
|
|
32
|
+
/** Salt used to derive the channel ID. */
|
|
30
33
|
salt: Hex.Hex
|
|
34
|
+
/** Highest cumulative voucher amount locally authorized. */
|
|
31
35
|
cumulativeAmount: bigint
|
|
36
|
+
/** Escrow contract backing this channel. */
|
|
32
37
|
escrowContract: Address
|
|
38
|
+
/** Chain ID used for channel ID and voucher domain separation. */
|
|
33
39
|
chainId: number
|
|
40
|
+
/** Whether the client considers the channel reusable. */
|
|
34
41
|
opened: boolean
|
|
35
42
|
}
|
|
36
43
|
|
|
@@ -41,11 +48,13 @@ function resolveVoucherSigner(
|
|
|
41
48
|
return voucherSigner ?? account
|
|
42
49
|
}
|
|
43
50
|
|
|
51
|
+
/** Resolves the chain ID embedded in a legacy session challenge. */
|
|
44
52
|
export function resolveChainId(challenge: Challenge): number {
|
|
45
53
|
const md = challenge.request.methodDetails as { chainId?: number } | undefined
|
|
46
54
|
return md?.chainId ?? 0
|
|
47
55
|
}
|
|
48
56
|
|
|
57
|
+
/** Resolves the legacy escrow contract from local override, challenge hint, or defaults. */
|
|
49
58
|
export function resolveEscrow(
|
|
50
59
|
challenge: { request: { methodDetails?: unknown } },
|
|
51
60
|
chainId: number,
|
|
@@ -64,9 +73,10 @@ export function resolveEscrow(
|
|
|
64
73
|
return escrow
|
|
65
74
|
}
|
|
66
75
|
|
|
76
|
+
/** Serializes a legacy session credential with a payer DID source. */
|
|
67
77
|
export function serializeCredential(
|
|
68
78
|
challenge: Challenge,
|
|
69
|
-
payload:
|
|
79
|
+
payload: LegacySessionCredentialPayload,
|
|
70
80
|
chainId: number,
|
|
71
81
|
account: viem_Account,
|
|
72
82
|
): string {
|
|
@@ -77,6 +87,7 @@ export function serializeCredential(
|
|
|
77
87
|
})
|
|
78
88
|
}
|
|
79
89
|
|
|
90
|
+
/** Creates a legacy cumulative voucher credential payload. */
|
|
80
91
|
export async function createVoucherPayload(
|
|
81
92
|
client: viem_Client,
|
|
82
93
|
account: viem_Account,
|
|
@@ -85,7 +96,7 @@ export async function createVoucherPayload(
|
|
|
85
96
|
escrowContract: Address,
|
|
86
97
|
chainId: number,
|
|
87
98
|
voucherSigner?: viem_Account | undefined,
|
|
88
|
-
): Promise<
|
|
99
|
+
): Promise<LegacySessionCredentialPayload> {
|
|
89
100
|
const signer = resolveVoucherSigner(account, voucherSigner)
|
|
90
101
|
const signature = await signVoucher(
|
|
91
102
|
client,
|
|
@@ -103,6 +114,7 @@ export async function createVoucherPayload(
|
|
|
103
114
|
}
|
|
104
115
|
}
|
|
105
116
|
|
|
117
|
+
/** Creates a legacy cooperative close credential payload. */
|
|
106
118
|
export async function createClosePayload(
|
|
107
119
|
client: viem_Client,
|
|
108
120
|
account: viem_Account,
|
|
@@ -111,7 +123,7 @@ export async function createClosePayload(
|
|
|
111
123
|
escrowContract: Address,
|
|
112
124
|
chainId: number,
|
|
113
125
|
voucherSigner?: viem_Account | undefined,
|
|
114
|
-
): Promise<
|
|
126
|
+
): Promise<LegacySessionCredentialPayload> {
|
|
115
127
|
const signer = resolveVoucherSigner(account, voucherSigner)
|
|
116
128
|
const signature = await signVoucher(
|
|
117
129
|
client,
|
|
@@ -129,6 +141,7 @@ export async function createClosePayload(
|
|
|
129
141
|
}
|
|
130
142
|
}
|
|
131
143
|
|
|
144
|
+
/** Creates a legacy open transaction credential payload and local channel entry. */
|
|
132
145
|
export async function createOpenPayload(
|
|
133
146
|
client: viem_Client,
|
|
134
147
|
account: viem_Account,
|
|
@@ -142,7 +155,7 @@ export async function createOpenPayload(
|
|
|
142
155
|
chainId: number
|
|
143
156
|
feePayer?: boolean | undefined
|
|
144
157
|
},
|
|
145
|
-
): Promise<{ entry: ChannelEntry; payload:
|
|
158
|
+
): Promise<{ entry: ChannelEntry; payload: LegacySessionCredentialPayload }> {
|
|
146
159
|
const { escrowContract, payee, currency, deposit, initialAmount, chainId, feePayer } = options
|
|
147
160
|
const voucherSigner = resolveVoucherSigner(account, options.voucherSigner)
|
|
148
161
|
const authorizedSigner = getAccountSignerAddress(voucherSigner)
|
|
@@ -3,22 +3,21 @@ import { type Address, createClient, decodeFunctionData, erc20Abi, type Hex, htt
|
|
|
3
3
|
import { privateKeyToAccount } from 'viem/accounts'
|
|
4
4
|
import { Account as TempoAccount, Addresses, Transaction, WebCryptoP256 } from 'viem/tempo'
|
|
5
5
|
import { beforeAll, describe, expect, test } from 'vp/test'
|
|
6
|
-
import {
|
|
7
|
-
import { deployEscrow, openChannel } from '~test/tempo/session.js'
|
|
6
|
+
import { tempoNetwork } from '~test/config.js'
|
|
7
|
+
import { deployEscrow, openChannel } from '~test/tempo/legacy/session.js'
|
|
8
8
|
import { accounts, asset, chain, client, fundAccount } from '~test/tempo/viem.js'
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
import * as
|
|
13
|
-
import
|
|
14
|
-
import { chainId, escrowContract as escrowContractDefaults } from '../internal/defaults.js'
|
|
10
|
+
import * as Challenge from '../../../Challenge.js'
|
|
11
|
+
import * as Constants from '../../../Constants.js'
|
|
12
|
+
import * as Credential from '../../../Credential.js'
|
|
13
|
+
import { chainId, escrowContract as escrowContractDefaults } from '../../internal/defaults.js'
|
|
15
14
|
import { escrowAbi } from '../session/Chain.js'
|
|
16
|
-
import type {
|
|
15
|
+
import type { LegacySessionCredentialPayload } from '../session/Types.js'
|
|
17
16
|
import { verifyVoucher } from '../session/Voucher.js'
|
|
18
17
|
import { session } from './Session.js'
|
|
19
18
|
|
|
20
19
|
function deserializePayload(result: string) {
|
|
21
|
-
const cred = Credential.deserialize<
|
|
20
|
+
const cred = Credential.deserialize<LegacySessionCredentialPayload>(result)
|
|
22
21
|
return cred
|
|
23
22
|
}
|
|
24
23
|
|
|
@@ -33,6 +32,7 @@ const pureClient = createClient({
|
|
|
33
32
|
const escrowAddress = escrowContractDefaults[chainId.testnet] as Address
|
|
34
33
|
const recipient = '0x2222222222222222222222222222222222222222' as Address
|
|
35
34
|
const currency = '0x3333333333333333333333333333333333333333' as Address
|
|
35
|
+
const isLocalnet = tempoNetwork === 'localnet'
|
|
36
36
|
|
|
37
37
|
function makeChallenge(overrides?: Record<string, unknown>) {
|
|
38
38
|
return Challenge.from({
|
|
@@ -55,6 +55,48 @@ function makeChallenge(overrides?: Record<string, unknown>) {
|
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
describe('session (pure)', () => {
|
|
58
|
+
test('handles legacy and unmarked session challenges', () => {
|
|
59
|
+
const method = session({
|
|
60
|
+
getClient: () => pureClient,
|
|
61
|
+
account: pureAccount,
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
expect(method.canHandleChallenge?.({ challenge: makeChallenge() })).toBe(true)
|
|
65
|
+
expect(
|
|
66
|
+
method.canHandleChallenge?.({
|
|
67
|
+
challenge: makeChallenge({
|
|
68
|
+
methodDetails: {
|
|
69
|
+
chainId: 42431,
|
|
70
|
+
escrowContract: escrowAddress,
|
|
71
|
+
sessionProtocol: Constants.SessionProtocols.v1,
|
|
72
|
+
},
|
|
73
|
+
}),
|
|
74
|
+
}),
|
|
75
|
+
).toBe(true)
|
|
76
|
+
expect(
|
|
77
|
+
method.canHandleChallenge?.({
|
|
78
|
+
challenge: makeChallenge({
|
|
79
|
+
methodDetails: {
|
|
80
|
+
chainId: 42431,
|
|
81
|
+
escrowContract: escrowAddress,
|
|
82
|
+
sessionProtocol: Constants.SessionProtocols.v2,
|
|
83
|
+
},
|
|
84
|
+
}),
|
|
85
|
+
}),
|
|
86
|
+
).toBe(false)
|
|
87
|
+
expect(
|
|
88
|
+
method.canHandleChallenge?.({
|
|
89
|
+
challenge: makeChallenge({
|
|
90
|
+
methodDetails: {
|
|
91
|
+
chainId: 42431,
|
|
92
|
+
escrowContract: escrowAddress,
|
|
93
|
+
sessionProtocol: 'future' as never,
|
|
94
|
+
},
|
|
95
|
+
}),
|
|
96
|
+
}),
|
|
97
|
+
).toBe(false)
|
|
98
|
+
})
|
|
99
|
+
|
|
58
100
|
describe('error: no action and no deposit/maxDeposit', () => {
|
|
59
101
|
test('throws when neither configured', async () => {
|
|
60
102
|
const method = session({
|
|
@@ -2,15 +2,16 @@ import type { Hex } from 'ox'
|
|
|
2
2
|
import { type Address, parseUnits, type Account as viem_Account } from 'viem'
|
|
3
3
|
import { tempo as tempo_chain } from 'viem/tempo/chains'
|
|
4
4
|
|
|
5
|
-
import type * as Challenge from '
|
|
6
|
-
import * as
|
|
7
|
-
import * as
|
|
8
|
-
import * as
|
|
9
|
-
import * as
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
import * as
|
|
13
|
-
import
|
|
5
|
+
import type * as Challenge from '../../../Challenge.js'
|
|
6
|
+
import * as Constants from '../../../Constants.js'
|
|
7
|
+
import * as Method from '../../../Method.js'
|
|
8
|
+
import * as Account from '../../../viem/Account.js'
|
|
9
|
+
import * as Client from '../../../viem/Client.js'
|
|
10
|
+
import * as z from '../../../zod.js'
|
|
11
|
+
import { getAccountSignerAddress } from '../../internal/account.js'
|
|
12
|
+
import * as defaults from '../../internal/defaults.js'
|
|
13
|
+
import * as Methods from '../../Methods.js'
|
|
14
|
+
import type { LegacySessionCredentialPayload } from '../session/Types.js'
|
|
14
15
|
import { signVoucher } from '../session/Voucher.js'
|
|
15
16
|
import {
|
|
16
17
|
type ChannelEntry,
|
|
@@ -21,6 +22,7 @@ import {
|
|
|
21
22
|
tryRecoverChannel,
|
|
22
23
|
} from './ChannelOps.js'
|
|
23
24
|
|
|
25
|
+
/** Runtime schema for legacy low-level session credential context. */
|
|
24
26
|
export const sessionContextSchema = z.object({
|
|
25
27
|
account: z.optional(z.custom<Account.getResolver.Parameters['account']>()),
|
|
26
28
|
action: z.optional(z.enum(['open', 'topUp', 'voucher', 'close'])),
|
|
@@ -33,6 +35,7 @@ export const sessionContextSchema = z.object({
|
|
|
33
35
|
depositRaw: z.optional(z.string()),
|
|
34
36
|
})
|
|
35
37
|
|
|
38
|
+
/** Context accepted by the legacy low-level session client method. */
|
|
36
39
|
export type SessionContext = z.infer<typeof sessionContextSchema>
|
|
37
40
|
|
|
38
41
|
/**
|
|
@@ -172,7 +175,7 @@ export function session(parameters: session.Parameters = {}) {
|
|
|
172
175
|
}
|
|
173
176
|
}
|
|
174
177
|
|
|
175
|
-
let payload:
|
|
178
|
+
let payload: LegacySessionCredentialPayload
|
|
176
179
|
|
|
177
180
|
if (entry?.opened) {
|
|
178
181
|
entry.cumulativeAmount += amount
|
|
@@ -236,7 +239,7 @@ export function session(parameters: session.Parameters = {}) {
|
|
|
236
239
|
const escrowContract = resolveEscrowCached(challenge, chainId, channelId)
|
|
237
240
|
escrowContractMap.set(channelId, escrowContract)
|
|
238
241
|
|
|
239
|
-
let payload:
|
|
242
|
+
let payload: LegacySessionCredentialPayload
|
|
240
243
|
|
|
241
244
|
switch (action) {
|
|
242
245
|
case 'open': {
|
|
@@ -335,6 +338,16 @@ export function session(parameters: session.Parameters = {}) {
|
|
|
335
338
|
}
|
|
336
339
|
|
|
337
340
|
return Method.toClient(Methods.session, {
|
|
341
|
+
canHandleChallenge({ challenge }) {
|
|
342
|
+
const sessionProtocolMarker = Constants.getMethodDetail(
|
|
343
|
+
challenge.request.methodDetails,
|
|
344
|
+
Constants.MethodDetailKeys.sessionProtocol,
|
|
345
|
+
)
|
|
346
|
+
return (
|
|
347
|
+
sessionProtocolMarker === undefined ||
|
|
348
|
+
sessionProtocolMarker === Constants.SessionProtocols.v1
|
|
349
|
+
)
|
|
350
|
+
},
|
|
338
351
|
context: sessionContextSchema,
|
|
339
352
|
|
|
340
353
|
async createCredential({ challenge, context }) {
|
|
@@ -354,6 +367,7 @@ export function session(parameters: session.Parameters = {}) {
|
|
|
354
367
|
})
|
|
355
368
|
}
|
|
356
369
|
|
|
370
|
+
/** Type helpers for the legacy low-level session client method. */
|
|
357
371
|
export declare namespace session {
|
|
358
372
|
type Parameters = Account.getResolver.Parameters &
|
|
359
373
|
Client.getResolver.Parameters & {
|
|
@@ -3,14 +3,11 @@ import { privateKeyToAccount } from 'viem/accounts'
|
|
|
3
3
|
import { Account as TempoAccount } from 'viem/tempo'
|
|
4
4
|
import { describe, expect, test, vi } from 'vp/test'
|
|
5
5
|
|
|
6
|
-
import * as Challenge from '
|
|
7
|
-
import * as PaymentCredential from '
|
|
8
|
-
import {
|
|
9
|
-
import
|
|
10
|
-
|
|
11
|
-
SessionCredentialPayload,
|
|
12
|
-
SessionReceipt,
|
|
13
|
-
} from '../session/Types.js'
|
|
6
|
+
import * as Challenge from '../../../Challenge.js'
|
|
7
|
+
import * as PaymentCredential from '../../../Credential.js'
|
|
8
|
+
import type { NeedVoucherEvent, SessionReceipt } from '../../session/precompile/Protocol.js'
|
|
9
|
+
import { formatNeedVoucherEvent, parseEvent } from '../../session/precompile/Protocol.js'
|
|
10
|
+
import type { LegacySessionCredentialPayload } from '../session/Types.js'
|
|
14
11
|
import { sessionManager } from './SessionManager.js'
|
|
15
12
|
|
|
16
13
|
const channelId = '0x0000000000000000000000000000000000000000000000000000000000000001' as Hex
|
|
@@ -140,7 +137,8 @@ describe('Session', () => {
|
|
|
140
137
|
expect(response.status).toBe(200)
|
|
141
138
|
expect(authorization).toBeDefined()
|
|
142
139
|
if (!authorization) throw new Error('missing authorization header')
|
|
143
|
-
const credential =
|
|
140
|
+
const credential =
|
|
141
|
+
PaymentCredential.deserialize<LegacySessionCredentialPayload>(authorization)
|
|
144
142
|
expect(credential.payload.action).toBe('open')
|
|
145
143
|
if (credential.payload.action !== 'open') throw new Error('unexpected action')
|
|
146
144
|
expect(credential.payload.authorizedSigner).toBe(voucherSigner.accessKeyAddress)
|
|
@@ -273,6 +271,80 @@ describe('Session', () => {
|
|
|
273
271
|
})
|
|
274
272
|
|
|
275
273
|
describe('.sse() event parsing', () => {
|
|
274
|
+
test('sends SSE Accept header on voucher POST updates', async () => {
|
|
275
|
+
vi.resetModules()
|
|
276
|
+
vi.doMock('viem/actions', () => ({
|
|
277
|
+
prepareTransactionRequest: vi.fn(async () => ({})),
|
|
278
|
+
sendCallsSync: vi.fn(),
|
|
279
|
+
signTransaction: vi.fn(async () => '0xdeadbeef'),
|
|
280
|
+
signTypedData: vi.fn(),
|
|
281
|
+
}))
|
|
282
|
+
|
|
283
|
+
try {
|
|
284
|
+
const { sessionManager: sessionManagerWithMocks } = await import('./SessionManager.js')
|
|
285
|
+
const account = privateKeyToAccount(
|
|
286
|
+
'0x0000000000000000000000000000000000000000000000000000000000000001',
|
|
287
|
+
)
|
|
288
|
+
const voucherSigner = TempoAccount.fromSecp256k1(
|
|
289
|
+
'0x0000000000000000000000000000000000000000000000000000000000000002',
|
|
290
|
+
{ access: account },
|
|
291
|
+
)
|
|
292
|
+
const client = createClient({
|
|
293
|
+
account,
|
|
294
|
+
transport: http('http://127.0.0.1'),
|
|
295
|
+
})
|
|
296
|
+
const challenge = makeChallenge({
|
|
297
|
+
recipient: '0x742d35cc6634c0532925a3b844bc9e7595f8fe00',
|
|
298
|
+
methodDetails: {
|
|
299
|
+
escrowContract: '0x9d136eea063ede5418a6bc7beaff009bbb6cfa70',
|
|
300
|
+
chainId: 4217,
|
|
301
|
+
},
|
|
302
|
+
})
|
|
303
|
+
const needVoucher: NeedVoucherEvent = {
|
|
304
|
+
channelId,
|
|
305
|
+
requiredCumulative: '2000000',
|
|
306
|
+
acceptedCumulative: '1000000',
|
|
307
|
+
deposit: '10000000',
|
|
308
|
+
}
|
|
309
|
+
const mockFetch = vi
|
|
310
|
+
.fn()
|
|
311
|
+
.mockResolvedValueOnce(make402Response(challenge))
|
|
312
|
+
.mockResolvedValueOnce(
|
|
313
|
+
makeSseResponse([
|
|
314
|
+
formatNeedVoucherEvent(needVoucher),
|
|
315
|
+
'event: message\ndata: chunk\n\n',
|
|
316
|
+
]),
|
|
317
|
+
)
|
|
318
|
+
.mockResolvedValueOnce(makeOkResponse())
|
|
319
|
+
|
|
320
|
+
const s = sessionManagerWithMocks({
|
|
321
|
+
account,
|
|
322
|
+
client,
|
|
323
|
+
fetch: mockFetch as typeof globalThis.fetch,
|
|
324
|
+
maxDeposit: '10',
|
|
325
|
+
voucherSigner,
|
|
326
|
+
})
|
|
327
|
+
|
|
328
|
+
const iterable = await s.sse('https://api.example.com/stream')
|
|
329
|
+
|
|
330
|
+
const messages: string[] = []
|
|
331
|
+
for await (const msg of iterable) {
|
|
332
|
+
messages.push(msg)
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
const voucherRequest = mockFetch.mock.calls[2]![1] as RequestInit
|
|
336
|
+
const voucherHeaders = new Headers(voucherRequest.headers)
|
|
337
|
+
|
|
338
|
+
expect(messages).toEqual(['chunk'])
|
|
339
|
+
expect(voucherRequest.method).toBe('POST')
|
|
340
|
+
expect(voucherHeaders.get('accept')).toBe('text/event-stream')
|
|
341
|
+
expect(voucherHeaders.get('authorization')).toBeTruthy()
|
|
342
|
+
} finally {
|
|
343
|
+
vi.doUnmock('viem/actions')
|
|
344
|
+
vi.resetModules()
|
|
345
|
+
}
|
|
346
|
+
})
|
|
347
|
+
|
|
276
348
|
test('yields only message data from SSE stream', async () => {
|
|
277
349
|
const events = [
|
|
278
350
|
'event: message\ndata: chunk1\n\n',
|