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
|
@@ -0,0 +1,543 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-side TIP-1034 precompile session payment method for request/response flows.
|
|
3
|
+
*
|
|
4
|
+
* Handles the full TIP20EscrowChannel lifecycle (open, voucher, top-up, close)
|
|
5
|
+
* and one-shot settlement. Each incoming request carries a session credential
|
|
6
|
+
* with a cumulative voucher that the server validates and records.
|
|
7
|
+
*/
|
|
8
|
+
import { isAddress, type Address, type Hex } from 'viem'
|
|
9
|
+
import { tempo as tempo_chain } from 'viem/chains'
|
|
10
|
+
|
|
11
|
+
import * as Challenge from '../../../Challenge.js'
|
|
12
|
+
import * as Constants from '../../../Constants.js'
|
|
13
|
+
import * as Credential from '../../../Credential.js'
|
|
14
|
+
import * as Errors from '../../../Errors.js'
|
|
15
|
+
import * as Expires from '../../../Expires.js'
|
|
16
|
+
import type { MaybePromise } from '../../../internal/types.js'
|
|
17
|
+
import type { LooseOmit, NoExtraKeys } from '../../../internal/types.js'
|
|
18
|
+
import * as Method from '../../../Method.js'
|
|
19
|
+
import * as Store from '../../../Store.js'
|
|
20
|
+
import * as Client from '../../../viem/Client.js'
|
|
21
|
+
import * as Account from '../../internal/account.js'
|
|
22
|
+
import * as defaults from '../../internal/defaults.js'
|
|
23
|
+
import * as FeePayer from '../../internal/fee-payer.js'
|
|
24
|
+
import type * as types from '../../internal/types.js'
|
|
25
|
+
import * as Methods from '../../Methods.js'
|
|
26
|
+
import * as ChargeServer from '../../server/Charge.js'
|
|
27
|
+
import * as Transport from '../../server/internal/transport.js'
|
|
28
|
+
import { tip20ChannelEscrow } from '../precompile/Protocol.js'
|
|
29
|
+
import {
|
|
30
|
+
deserializeSnapshot as deserializeSessionSnapshot,
|
|
31
|
+
serializeSnapshot as serializeSessionSnapshot,
|
|
32
|
+
} from '../Snapshot.js'
|
|
33
|
+
import * as ChannelStore from './ChannelStore.js'
|
|
34
|
+
import { verifyCredentialPayload } from './CredentialVerification.js'
|
|
35
|
+
import { requireSessionCredentialPayload } from './CredentialVerification.js'
|
|
36
|
+
import {
|
|
37
|
+
type ResolveSessionChannelId,
|
|
38
|
+
resolveCredentialVerificationContext,
|
|
39
|
+
resolveSessionChannelId,
|
|
40
|
+
resolveSessionSnapshot,
|
|
41
|
+
resolveSessionPaymentRequest,
|
|
42
|
+
type SessionPaymentRequestInput,
|
|
43
|
+
} from './RequestState.js'
|
|
44
|
+
import { respondToSessionCredential } from './RequestState.js'
|
|
45
|
+
import { applyVerifiedHttpAccounting, chargeSessionChannel } from './Settlement.js'
|
|
46
|
+
import { maybeSettleScheduled } from './Settlement.js'
|
|
47
|
+
import { resolveSettlementSchedule, type SettlementSchedule } from './Settlement.js'
|
|
48
|
+
|
|
49
|
+
/** Server-side automatic settlement schedule. */
|
|
50
|
+
export type { SettlementSchedule } from './Settlement.js'
|
|
51
|
+
/** Server-side hook types for request-identity channel bootstrap. */
|
|
52
|
+
export type {
|
|
53
|
+
ResolveSessionChannelId,
|
|
54
|
+
ResolveSessionChannelIdParameters,
|
|
55
|
+
SessionChannelIdRequest,
|
|
56
|
+
} from './RequestState.js'
|
|
57
|
+
export { settle, settleBatch } from './Settlement.js'
|
|
58
|
+
|
|
59
|
+
type SessionDefaultValues = {
|
|
60
|
+
amount: session.Parameters['amount']
|
|
61
|
+
currency: session.Parameters['currency']
|
|
62
|
+
decimals: number
|
|
63
|
+
operator: session.Parameters['operator']
|
|
64
|
+
recipient: Address | undefined
|
|
65
|
+
suggestedDeposit: session.Parameters['suggestedDeposit']
|
|
66
|
+
unitType: session.Parameters['unitType']
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function deriveServerDefaults<const parameters extends session.Parameters>(
|
|
70
|
+
values: SessionDefaultValues,
|
|
71
|
+
): session.DeriveDefaults<parameters> {
|
|
72
|
+
// `Method.toServer()` models defaults from request input fields. Tempo session
|
|
73
|
+
// defaults are assembled after account/currency resolution, so keep the
|
|
74
|
+
// unavoidable generic bridge in one place instead of the control-flow body.
|
|
75
|
+
return values as unknown as session.DeriveDefaults<parameters>
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function deriveTransport<const parameters extends session.Parameters>(
|
|
79
|
+
transport: Transport.Sse | undefined,
|
|
80
|
+
): parameters['sse'] extends false | undefined ? undefined : Transport.Sse {
|
|
81
|
+
return transport as parameters['sse'] extends false | undefined ? undefined : Transport.Sse
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
type BootstrapCharge = ReturnType<typeof ChargeServer.charge>
|
|
85
|
+
|
|
86
|
+
type BootstrapPreflightParameters = {
|
|
87
|
+
capturedRequest?: Method.CapturedRequest | undefined
|
|
88
|
+
charge: BootstrapCharge
|
|
89
|
+
credential: Credential.Credential | null
|
|
90
|
+
decimals: number
|
|
91
|
+
defaultRecipient?: Address | undefined
|
|
92
|
+
expires?: string | undefined
|
|
93
|
+
getClient(parameters: {
|
|
94
|
+
chainId?: number | undefined
|
|
95
|
+
}): MaybePromise<{ chain?: { id?: number | undefined } | undefined }>
|
|
96
|
+
input: Request
|
|
97
|
+
parameterChainId?: number | undefined
|
|
98
|
+
parameterEscrowContract?: Address | undefined
|
|
99
|
+
paymentRequest: SessionPaymentRequestInput
|
|
100
|
+
realm: string
|
|
101
|
+
resolveChannelId?: ResolveSessionChannelId | undefined
|
|
102
|
+
secretKey: string
|
|
103
|
+
store: ChannelStore.ChannelStore
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
type BootstrapChargeRequest = {
|
|
107
|
+
amount: '0'
|
|
108
|
+
chainId?: number | undefined
|
|
109
|
+
currency: string
|
|
110
|
+
decimals: number
|
|
111
|
+
recipient?: string | undefined
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
async function resolveBootstrapChargeRequest(
|
|
115
|
+
parameters: Pick<
|
|
116
|
+
BootstrapPreflightParameters,
|
|
117
|
+
'decimals' | 'defaultRecipient' | 'getClient' | 'parameterChainId' | 'paymentRequest'
|
|
118
|
+
>,
|
|
119
|
+
): Promise<BootstrapChargeRequest> {
|
|
120
|
+
const { decimals, defaultRecipient, getClient, parameterChainId, paymentRequest } = parameters
|
|
121
|
+
const chainId = paymentRequest.chainId ?? parameterChainId ?? (await getClient({})).chain?.id
|
|
122
|
+
return {
|
|
123
|
+
amount: '0',
|
|
124
|
+
...(chainId !== undefined ? { chainId } : {}),
|
|
125
|
+
currency: paymentRequest.currency,
|
|
126
|
+
decimals,
|
|
127
|
+
recipient: paymentRequest.recipient ?? defaultRecipient,
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function isBootstrapChargeCredential(credential: Credential.Credential | null) {
|
|
132
|
+
return (
|
|
133
|
+
credential?.challenge.method === Constants.Methods.tempo &&
|
|
134
|
+
credential.challenge.intent === Constants.Intents.charge
|
|
135
|
+
)
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function createBootstrapChallenge(parameters: {
|
|
139
|
+
expires?: string | undefined
|
|
140
|
+
realm: string
|
|
141
|
+
request: BootstrapChargeRequest
|
|
142
|
+
secretKey: string
|
|
143
|
+
}) {
|
|
144
|
+
return Challenge.fromMethod(Methods.charge, {
|
|
145
|
+
expires: parameters.expires,
|
|
146
|
+
realm: parameters.realm,
|
|
147
|
+
request: parameters.request,
|
|
148
|
+
secretKey: parameters.secretKey,
|
|
149
|
+
})
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function respondBootstrapChallenge(challenge: Challenge.Challenge, error?: Errors.PaymentError) {
|
|
153
|
+
const headers = new Headers({
|
|
154
|
+
[Constants.Headers.wwwAuthenticate]: Challenge.serialize(challenge),
|
|
155
|
+
'Cache-Control': 'no-store',
|
|
156
|
+
})
|
|
157
|
+
if (!error) return new Response(null, { status: 402, headers })
|
|
158
|
+
headers.set('Content-Type', 'application/problem+json')
|
|
159
|
+
return new Response(JSON.stringify(error.toProblemDetails(challenge.id)), {
|
|
160
|
+
status: error.status,
|
|
161
|
+
headers,
|
|
162
|
+
})
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function assertBootstrapChallengeMatches(
|
|
166
|
+
expected: Challenge.Challenge,
|
|
167
|
+
actual: Challenge.Challenge,
|
|
168
|
+
) {
|
|
169
|
+
if (actual.method !== Constants.Methods.tempo || actual.intent !== Constants.Intents.charge)
|
|
170
|
+
throw new Errors.InvalidChallengeError({ id: actual.id, reason: 'not a bootstrap challenge' })
|
|
171
|
+
if (!sameRequestValue(expected.request.amount, actual.request.amount))
|
|
172
|
+
throw new Errors.InvalidChallengeError({ id: actual.id, reason: 'bootstrap amount mismatch' })
|
|
173
|
+
if (!sameRequestValue(expected.request.currency, actual.request.currency))
|
|
174
|
+
throw new Errors.InvalidChallengeError({ id: actual.id, reason: 'bootstrap currency mismatch' })
|
|
175
|
+
if (!sameRequestValue(expected.request.recipient, actual.request.recipient))
|
|
176
|
+
throw new Errors.InvalidChallengeError({
|
|
177
|
+
id: actual.id,
|
|
178
|
+
reason: 'bootstrap recipient mismatch',
|
|
179
|
+
})
|
|
180
|
+
const expectedChainId = readMethodDetail(expected.request, 'chainId')
|
|
181
|
+
const actualChainId = readMethodDetail(actual.request, 'chainId')
|
|
182
|
+
if (!sameRequestValue(expectedChainId, actualChainId))
|
|
183
|
+
throw new Errors.InvalidChallengeError({ id: actual.id, reason: 'bootstrap chain mismatch' })
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function readMethodDetail(request: unknown, key: string) {
|
|
187
|
+
if (!request || typeof request !== 'object') return undefined
|
|
188
|
+
const methodDetails = (request as { methodDetails?: unknown }).methodDetails
|
|
189
|
+
if (!methodDetails || typeof methodDetails !== 'object') return undefined
|
|
190
|
+
return (methodDetails as Record<string, unknown>)[key]
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function sameRequestValue(a: unknown, b: unknown) {
|
|
194
|
+
return a === b || (a === undefined && b === undefined)
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function readBootstrapAddress(value: unknown, label: string): Address {
|
|
198
|
+
if (typeof value === 'string' && isAddress(value, { strict: false })) return value
|
|
199
|
+
throw new Errors.VerificationFailedError({ reason: `missing bootstrap ${label}` })
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function resolveBootstrapEscrowContract(
|
|
203
|
+
paymentRequest: SessionPaymentRequestInput,
|
|
204
|
+
parameterEscrowContract?: Address | undefined,
|
|
205
|
+
): Address {
|
|
206
|
+
const requestEscrow = (paymentRequest as { escrowContract?: unknown }).escrowContract
|
|
207
|
+
if (requestEscrow === undefined) return parameterEscrowContract ?? tip20ChannelEscrow
|
|
208
|
+
return readBootstrapAddress(requestEscrow, 'escrowContract')
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function readBootstrapChainId(value: unknown): number {
|
|
212
|
+
if (typeof value === 'number') return value
|
|
213
|
+
throw new Errors.VerificationFailedError({ reason: 'missing bootstrap chainId' })
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
async function verifyBootstrapCredential(parameters: {
|
|
217
|
+
challenge: Challenge.Challenge
|
|
218
|
+
charge: BootstrapCharge
|
|
219
|
+
credential: Credential.Credential
|
|
220
|
+
rawRequest: BootstrapChargeRequest
|
|
221
|
+
secretKey: string
|
|
222
|
+
}) {
|
|
223
|
+
const { challenge, charge, credential, rawRequest, secretKey } = parameters
|
|
224
|
+
if (!Challenge.verify(credential.challenge, { secretKey }))
|
|
225
|
+
throw new Errors.InvalidChallengeError({
|
|
226
|
+
id: credential.challenge.id,
|
|
227
|
+
reason: 'challenge was not issued by this server',
|
|
228
|
+
})
|
|
229
|
+
Expires.assert(credential.challenge.expires, credential.challenge.id)
|
|
230
|
+
assertBootstrapChallengeMatches(challenge, credential.challenge)
|
|
231
|
+
return charge.verify({
|
|
232
|
+
credential: {
|
|
233
|
+
...credential,
|
|
234
|
+
payload: Methods.charge.schema.credential.payload.parse(credential.payload),
|
|
235
|
+
} as never,
|
|
236
|
+
request: rawRequest,
|
|
237
|
+
})
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
async function handleBootstrapPreflight(
|
|
241
|
+
parameters: BootstrapPreflightParameters,
|
|
242
|
+
): Promise<Response | undefined> {
|
|
243
|
+
const request = await resolveBootstrapChargeRequest(parameters)
|
|
244
|
+
const challenge = createBootstrapChallenge({
|
|
245
|
+
expires: parameters.expires,
|
|
246
|
+
realm: parameters.realm,
|
|
247
|
+
request,
|
|
248
|
+
secretKey: parameters.secretKey,
|
|
249
|
+
})
|
|
250
|
+
|
|
251
|
+
if (!parameters.credential) return respondBootstrapChallenge(challenge)
|
|
252
|
+
if (!isBootstrapChargeCredential(parameters.credential)) return undefined
|
|
253
|
+
|
|
254
|
+
try {
|
|
255
|
+
await verifyBootstrapCredential({
|
|
256
|
+
challenge,
|
|
257
|
+
charge: parameters.charge,
|
|
258
|
+
credential: parameters.credential,
|
|
259
|
+
rawRequest: request,
|
|
260
|
+
secretKey: parameters.secretKey,
|
|
261
|
+
})
|
|
262
|
+
} catch (error) {
|
|
263
|
+
return respondBootstrapChallenge(
|
|
264
|
+
challenge,
|
|
265
|
+
error instanceof Errors.PaymentError ? error : new Errors.VerificationFailedError(),
|
|
266
|
+
)
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
const channelId = await resolveSessionChannelId({
|
|
270
|
+
capturedRequest: parameters.capturedRequest,
|
|
271
|
+
credential: parameters.credential,
|
|
272
|
+
request: parameters.paymentRequest,
|
|
273
|
+
resolveChannelId: parameters.resolveChannelId,
|
|
274
|
+
source: parameters.credential.source,
|
|
275
|
+
store: parameters.store,
|
|
276
|
+
})
|
|
277
|
+
const snapshot = await resolveSessionSnapshot({
|
|
278
|
+
amount: 0n,
|
|
279
|
+
channelId,
|
|
280
|
+
expected: {
|
|
281
|
+
chainId: readBootstrapChainId(request.chainId),
|
|
282
|
+
currency: readBootstrapAddress(request.currency, 'currency'),
|
|
283
|
+
escrowContract: resolveBootstrapEscrowContract(
|
|
284
|
+
parameters.paymentRequest,
|
|
285
|
+
parameters.parameterEscrowContract,
|
|
286
|
+
),
|
|
287
|
+
recipient: readBootstrapAddress(request.recipient, 'recipient'),
|
|
288
|
+
},
|
|
289
|
+
store: parameters.store,
|
|
290
|
+
})
|
|
291
|
+
const headers = new Headers({ 'Cache-Control': 'no-store' })
|
|
292
|
+
if (snapshot) {
|
|
293
|
+
headers.set(Constants.Headers.paymentSession, snapshot.channelId)
|
|
294
|
+
headers.set(Constants.Headers.paymentSessionSnapshot, serializeSessionSnapshot(snapshot))
|
|
295
|
+
}
|
|
296
|
+
return new Response(null, { status: 204, headers })
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/** Creates a server-side TIP20EscrowChannel precompile session payment method. */
|
|
300
|
+
export function session<const parameters extends session.Parameters>(
|
|
301
|
+
p?: NoExtraKeys<parameters, session.Parameters>,
|
|
302
|
+
) {
|
|
303
|
+
const parameters = p as parameters
|
|
304
|
+
const {
|
|
305
|
+
amount,
|
|
306
|
+
channelStateTtl = 5_000,
|
|
307
|
+
currency = defaults.resolveCurrency(parameters),
|
|
308
|
+
decimals = defaults.decimals,
|
|
309
|
+
operator,
|
|
310
|
+
store: rawStore = Store.memory(),
|
|
311
|
+
suggestedDeposit,
|
|
312
|
+
unitType,
|
|
313
|
+
} = parameters
|
|
314
|
+
const settlementSchedule = resolveSettlementSchedule(parameters.settlementSchedule, decimals)
|
|
315
|
+
|
|
316
|
+
const store = ChannelStore.fromStore(rawStore)
|
|
317
|
+
const lastOnChainVerified = new Map<Hex, number>()
|
|
318
|
+
const { account, feePayer, recipient } = Account.resolve(parameters)
|
|
319
|
+
const getClient = Client.getResolver({
|
|
320
|
+
chain: tempo_chain,
|
|
321
|
+
getClient: parameters.getClient,
|
|
322
|
+
rpcUrl: defaults.rpcUrl,
|
|
323
|
+
})
|
|
324
|
+
const bootstrapCharge = ChargeServer.charge({
|
|
325
|
+
account,
|
|
326
|
+
chainId: parameters.chainId,
|
|
327
|
+
currency,
|
|
328
|
+
decimals,
|
|
329
|
+
getClient: parameters.getClient,
|
|
330
|
+
recipient,
|
|
331
|
+
store: rawStore,
|
|
332
|
+
})
|
|
333
|
+
|
|
334
|
+
type Transport = parameters['sse'] extends false | undefined ? undefined : Transport.Sse
|
|
335
|
+
const transport = parameters.sse
|
|
336
|
+
? Transport.sse({
|
|
337
|
+
store,
|
|
338
|
+
...(typeof parameters.sse === 'object' ? parameters.sse : undefined),
|
|
339
|
+
})
|
|
340
|
+
: undefined
|
|
341
|
+
|
|
342
|
+
type Defaults = session.DeriveDefaults<parameters>
|
|
343
|
+
return Method.toServer<typeof Methods.session, Defaults, Transport>(Methods.session, {
|
|
344
|
+
defaults: deriveServerDefaults<parameters>({
|
|
345
|
+
amount,
|
|
346
|
+
currency,
|
|
347
|
+
decimals,
|
|
348
|
+
operator,
|
|
349
|
+
recipient,
|
|
350
|
+
suggestedDeposit,
|
|
351
|
+
unitType,
|
|
352
|
+
}),
|
|
353
|
+
|
|
354
|
+
transport: deriveTransport<parameters>(transport),
|
|
355
|
+
|
|
356
|
+
preflight: parameters.bootstrap
|
|
357
|
+
? async ({ capturedRequest, credential, expires, input, options, realm, secretKey }) => {
|
|
358
|
+
if (input.method !== 'HEAD') return undefined
|
|
359
|
+
return handleBootstrapPreflight({
|
|
360
|
+
capturedRequest,
|
|
361
|
+
credential,
|
|
362
|
+
input,
|
|
363
|
+
charge: bootstrapCharge,
|
|
364
|
+
decimals,
|
|
365
|
+
defaultRecipient: recipient,
|
|
366
|
+
expires,
|
|
367
|
+
getClient,
|
|
368
|
+
parameterChainId: parameters.chainId,
|
|
369
|
+
parameterEscrowContract: parameters.escrowContract,
|
|
370
|
+
paymentRequest: options,
|
|
371
|
+
realm,
|
|
372
|
+
resolveChannelId: parameters.resolveChannelId,
|
|
373
|
+
secretKey,
|
|
374
|
+
store,
|
|
375
|
+
})
|
|
376
|
+
}
|
|
377
|
+
: undefined,
|
|
378
|
+
|
|
379
|
+
async request({ capturedRequest, credential, request }) {
|
|
380
|
+
const resolvedRequest = await resolveSessionPaymentRequest({
|
|
381
|
+
capturedRequest,
|
|
382
|
+
credential,
|
|
383
|
+
decimals,
|
|
384
|
+
defaultFeePayer: feePayer,
|
|
385
|
+
getClient,
|
|
386
|
+
parameterChainId: parameters.chainId,
|
|
387
|
+
parameterEscrowContract: parameters.escrowContract,
|
|
388
|
+
parameterFeePayer: parameters.feePayer,
|
|
389
|
+
request,
|
|
390
|
+
resolveChannelId: parameters.resolveChannelId,
|
|
391
|
+
store,
|
|
392
|
+
})
|
|
393
|
+
return {
|
|
394
|
+
...resolvedRequest,
|
|
395
|
+
sessionProtocol: Constants.SessionProtocols.v2,
|
|
396
|
+
}
|
|
397
|
+
},
|
|
398
|
+
|
|
399
|
+
async verify({ credential, envelope, request }) {
|
|
400
|
+
const { challenge } = credential
|
|
401
|
+
const payload = requireSessionCredentialPayload(credential.payload)
|
|
402
|
+
const context = await resolveCredentialVerificationContext({
|
|
403
|
+
decimals,
|
|
404
|
+
feePayer,
|
|
405
|
+
getClient,
|
|
406
|
+
minVoucherDelta: parameters.minVoucherDelta,
|
|
407
|
+
request,
|
|
408
|
+
})
|
|
409
|
+
|
|
410
|
+
const sessionReceipt = await verifyCredentialPayload({
|
|
411
|
+
account,
|
|
412
|
+
challenge,
|
|
413
|
+
channelStateTtl,
|
|
414
|
+
chainId: context.chainId,
|
|
415
|
+
client: context.client,
|
|
416
|
+
escrow: context.escrow,
|
|
417
|
+
expectedOperator: context.methodDetails.operator,
|
|
418
|
+
feePayer: context.feePayer,
|
|
419
|
+
feePayerPolicy: parameters.feePayerPolicy,
|
|
420
|
+
feeToken: parameters.feeToken,
|
|
421
|
+
lastOnChainVerified,
|
|
422
|
+
minVoucherDelta: context.minVoucherDelta,
|
|
423
|
+
payload,
|
|
424
|
+
store,
|
|
425
|
+
})
|
|
426
|
+
|
|
427
|
+
return applyVerifiedHttpAccounting({
|
|
428
|
+
capturedRequest: envelope?.capturedRequest,
|
|
429
|
+
payloadAction: payload.action,
|
|
430
|
+
receipt: sessionReceipt,
|
|
431
|
+
getRequestAmount: () => BigInt(context.request.amount ?? challenge.request.amount),
|
|
432
|
+
sseEnabled: Boolean(parameters.sse),
|
|
433
|
+
markPrepaidReceipt: Transport.markPrepaidSessionTick,
|
|
434
|
+
charge: (channelId, requestAmount) =>
|
|
435
|
+
chargeSessionChannel({ store, channelId, amount: requestAmount }),
|
|
436
|
+
settleCharged: (channel) =>
|
|
437
|
+
maybeSettleScheduled({
|
|
438
|
+
account,
|
|
439
|
+
client: context.client,
|
|
440
|
+
feePayer: context.feePayer,
|
|
441
|
+
feePayerPolicy: parameters.feePayerPolicy,
|
|
442
|
+
feeToken: parameters.feeToken,
|
|
443
|
+
schedule: settlementSchedule,
|
|
444
|
+
store,
|
|
445
|
+
channel,
|
|
446
|
+
}),
|
|
447
|
+
})
|
|
448
|
+
},
|
|
449
|
+
|
|
450
|
+
// This hook acts as a gate: when it returns a Response, `withReceipt()`
|
|
451
|
+
// in Mppx.ts short-circuits and returns that response directly without
|
|
452
|
+
// invoking the user's route handler. When it returns undefined, the
|
|
453
|
+
// user's handler runs normally and serves content.
|
|
454
|
+
//
|
|
455
|
+
// close and topUp are always gated (204) — they are pure management.
|
|
456
|
+
//
|
|
457
|
+
// open and voucher share the same captured-request classifier used
|
|
458
|
+
// during verification. Non-billable requests are treated as management
|
|
459
|
+
// updates; billable requests fall through to the application handler.
|
|
460
|
+
respond({ credential, envelope, input }) {
|
|
461
|
+
return respondToSessionCredential({
|
|
462
|
+
capturedRequest: envelope?.capturedRequest,
|
|
463
|
+
input,
|
|
464
|
+
payload: credential.payload,
|
|
465
|
+
})
|
|
466
|
+
},
|
|
467
|
+
})
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
export namespace session {
|
|
471
|
+
export const serializeSnapshot = serializeSessionSnapshot
|
|
472
|
+
export const deserializeSnapshot = deserializeSessionSnapshot
|
|
473
|
+
|
|
474
|
+
/** Request defaults inferred from the Tempo session method schema. */
|
|
475
|
+
export type Defaults = LooseOmit<
|
|
476
|
+
Method.RequestDefaults<typeof Methods.session>,
|
|
477
|
+
'escrowContract' | 'feePayer' | 'recipient'
|
|
478
|
+
>
|
|
479
|
+
|
|
480
|
+
/** Partial fee-sponsor policy used for server-submitted session transactions. */
|
|
481
|
+
export type FeePayerPolicy = Partial<FeePayer.Policy>
|
|
482
|
+
|
|
483
|
+
/** Parameters accepted by the TIP-1034 server session payment method. */
|
|
484
|
+
export type Parameters = {
|
|
485
|
+
/** TTL in milliseconds for cached on-chain channel state. After this duration, the server re-queries on-chain state during voucher handling to detect forced close requests. @default 5_000 */
|
|
486
|
+
channelStateTtl?: number | undefined
|
|
487
|
+
/** Override the fee-sponsor policy used for sponsored open/topUp transactions and server-driven close transactions. */
|
|
488
|
+
feePayerPolicy?: FeePayerPolicy | undefined
|
|
489
|
+
/** Minimum voucher delta to accept (numeric string, default: "0"). */
|
|
490
|
+
minVoucherDelta?: string | undefined
|
|
491
|
+
/** Resolve a reusable channel ID from request identity when no credential/request channel ID is present. */
|
|
492
|
+
resolveChannelId?: ResolveSessionChannelId | undefined
|
|
493
|
+
/** Enables same-route HEAD bootstrap using a zero-amount identity proof. */
|
|
494
|
+
bootstrap?: boolean | undefined
|
|
495
|
+
/**
|
|
496
|
+
* Atomic store backend for channel state.
|
|
497
|
+
*
|
|
498
|
+
* Session mutations must be linearizable across instances so spent,
|
|
499
|
+
* highest-voucher, top-up, and close/finalization updates cannot race.
|
|
500
|
+
* Use `Store.memory()` for tests or local single-process usage.
|
|
501
|
+
*/
|
|
502
|
+
store?: Store.AtomicStore | undefined
|
|
503
|
+
/** Enable SSE streaming. Pass `true` for defaults or an options object to configure SSE. */
|
|
504
|
+
sse?: boolean | Transport.sse.Options | undefined
|
|
505
|
+
/** Tempo chain ID used for TIP-1034 channel escrow challenges. Defaults to the resolved client chain ID. Pass the Tempo testnet chain ID here instead of using legacy session's `testnet` boolean. */
|
|
506
|
+
chainId?: number | undefined
|
|
507
|
+
/** TIP20EscrowChannel precompile address override. */
|
|
508
|
+
escrowContract?: Address | undefined
|
|
509
|
+
/** Server-owned automatic settlement cadence. Clients do not receive or control this schedule. */
|
|
510
|
+
settlementSchedule?: SettlementSchedule | undefined
|
|
511
|
+
|
|
512
|
+
/** Optional fee token used for server-driven close transactions. */
|
|
513
|
+
feeToken?: Address | undefined
|
|
514
|
+
} & Account.resolve.Parameters &
|
|
515
|
+
Client.getResolver.Parameters &
|
|
516
|
+
Defaults
|
|
517
|
+
|
|
518
|
+
/** Defaults derived from `session()` parameters for handler type inference. */
|
|
519
|
+
export type DeriveDefaults<parameters extends Parameters> = types.DeriveDefaults<
|
|
520
|
+
parameters,
|
|
521
|
+
Defaults
|
|
522
|
+
> & {
|
|
523
|
+
decimals: number
|
|
524
|
+
escrowContract: Address
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
/**
|
|
529
|
+
* Charge against a precompile-backed channel's balance.
|
|
530
|
+
*
|
|
531
|
+
* Exported so consumers can deduct from a channel outside the `session()`
|
|
532
|
+
* handler.
|
|
533
|
+
*
|
|
534
|
+
* Delegates to the shared `deductFromChannel` atomic helper and translates
|
|
535
|
+
* failure modes into typed errors (`InsufficientBalanceError`, `ChannelClosedError`).
|
|
536
|
+
*/
|
|
537
|
+
export async function charge(
|
|
538
|
+
store: ChannelStore.ChannelStore,
|
|
539
|
+
channelId: Hex,
|
|
540
|
+
amount: bigint,
|
|
541
|
+
): Promise<ChannelStore.State> {
|
|
542
|
+
return chargeSessionChannel({ store, channelId, amount })
|
|
543
|
+
}
|