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,244 @@
|
|
|
1
|
+
import * as Constants from '../../../Constants.js';
|
|
2
|
+
import * as Credential from '../../../Credential.js';
|
|
3
|
+
import { createSessionReceipt, deserializeSessionReceipt, formatApplicationMessage, formatCloseReadyMessage, formatErrorMessage, formatNeedVoucherMessage, formatReceiptMessage, parseMessage, readSessionChallengeAmount, requireSessionCredentialContext, } from '../precompile/Protocol.js';
|
|
4
|
+
import * as ChannelStore from './ChannelStore.js';
|
|
5
|
+
import { meterIterable } from './MeteredStream.js';
|
|
6
|
+
import { send, subscribe, toText } from './Transports.js';
|
|
7
|
+
/** Public WebSocket payment frame helpers. */
|
|
8
|
+
export { formatApplicationMessage, formatAuthorizationMessage, formatCloseReadyMessage, formatCloseRequestMessage, formatErrorMessage, formatNeedVoucherMessage, formatReceiptMessage, parseMessage, } from '../precompile/Protocol.js';
|
|
9
|
+
/**
|
|
10
|
+
* Bridge a WebSocket connection to a Tempo session payment flow.
|
|
11
|
+
*
|
|
12
|
+
* Credential verification is performed by routing each in-band authorization
|
|
13
|
+
* frame through `route` as a **synthetic `POST` request** that carries only
|
|
14
|
+
* the `Authorization` header. The synthetic request does not include cookies,
|
|
15
|
+
* bodies, query parameters, or other headers from the original WebSocket
|
|
16
|
+
* upgrade request. Do not wrap `route` with middleware that depends on
|
|
17
|
+
* HTTP-specific context beyond the `Authorization` header.
|
|
18
|
+
*/
|
|
19
|
+
export async function serve(options) {
|
|
20
|
+
const { amount: expectedAmount, generate, pollIntervalMs = 100, route, socket, store: rawStore, url, } = options;
|
|
21
|
+
const store = 'getChannel' in rawStore ? rawStore : ChannelStore.fromStore(rawStore);
|
|
22
|
+
const requestUrl = normalizeHttpUrl(url);
|
|
23
|
+
const maxQueuedPaymentMessages = 32;
|
|
24
|
+
const abortController = new AbortController();
|
|
25
|
+
const runtime = {
|
|
26
|
+
closed: false,
|
|
27
|
+
closeReadySent: false,
|
|
28
|
+
closeRequestHandled: false,
|
|
29
|
+
closeRequested: false,
|
|
30
|
+
streamStarted: false,
|
|
31
|
+
streamTask: null,
|
|
32
|
+
streamContext: null,
|
|
33
|
+
action: Promise.resolve(),
|
|
34
|
+
queuedActions: 0,
|
|
35
|
+
};
|
|
36
|
+
const close = async (code = 1000, reason) => {
|
|
37
|
+
if (runtime.closed)
|
|
38
|
+
return;
|
|
39
|
+
runtime.closed = true;
|
|
40
|
+
abortController.abort();
|
|
41
|
+
unsubscribe();
|
|
42
|
+
await Promise.resolve(socket.close(code, reason));
|
|
43
|
+
};
|
|
44
|
+
const sendCloseReady = async () => {
|
|
45
|
+
if (runtime.closeReadySent || !runtime.streamContext || runtime.closed)
|
|
46
|
+
return;
|
|
47
|
+
runtime.closeReadySent = true;
|
|
48
|
+
const channel = await store.getChannel(runtime.streamContext.channelId);
|
|
49
|
+
if (!channel)
|
|
50
|
+
throw new Error('channel not found');
|
|
51
|
+
const receipt = createSessionReceipt({
|
|
52
|
+
challengeId: runtime.streamContext.challengeId,
|
|
53
|
+
channelId: runtime.streamContext.channelId,
|
|
54
|
+
acceptedCumulative: channel.highestVoucherAmount,
|
|
55
|
+
spent: channel.spent,
|
|
56
|
+
units: channel.units,
|
|
57
|
+
});
|
|
58
|
+
await send(socket, formatCloseReadyMessage(receipt));
|
|
59
|
+
};
|
|
60
|
+
const runStream = async (context) => {
|
|
61
|
+
try {
|
|
62
|
+
for await (const value of meterIterable({
|
|
63
|
+
store,
|
|
64
|
+
channelId: context.channelId,
|
|
65
|
+
tickCost: context.tickCost,
|
|
66
|
+
generate,
|
|
67
|
+
pollIntervalMs,
|
|
68
|
+
signal: abortController.signal,
|
|
69
|
+
emitNeedVoucher: (message) => send(socket, message),
|
|
70
|
+
formatNeedVoucher: formatNeedVoucherMessage,
|
|
71
|
+
})) {
|
|
72
|
+
if (abortController.signal.aborted)
|
|
73
|
+
break;
|
|
74
|
+
await send(socket, formatApplicationMessage(value));
|
|
75
|
+
}
|
|
76
|
+
if (!abortController.signal.aborted)
|
|
77
|
+
await sendCloseReady();
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
if (!abortController.signal.aborted) {
|
|
81
|
+
await send(socket, formatErrorMessage({
|
|
82
|
+
message: error instanceof Error ? error.message : 'websocket session failed',
|
|
83
|
+
status: 500,
|
|
84
|
+
}));
|
|
85
|
+
await close(1011, 'websocket session failed');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
runtime.streamTask = null;
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
const requestClose = async () => {
|
|
93
|
+
if (runtime.closed)
|
|
94
|
+
return;
|
|
95
|
+
if (runtime.closeRequestHandled)
|
|
96
|
+
return;
|
|
97
|
+
runtime.closeRequestHandled = true;
|
|
98
|
+
runtime.closeRequested = true;
|
|
99
|
+
abortController.abort();
|
|
100
|
+
await runtime.streamTask?.catch(() => { });
|
|
101
|
+
await sendCloseReady();
|
|
102
|
+
};
|
|
103
|
+
const processAuthorization = async (authorization) => {
|
|
104
|
+
if (runtime.closed)
|
|
105
|
+
return;
|
|
106
|
+
const credential = Credential.deserialize(authorization);
|
|
107
|
+
const payload = requireSessionCredentialContext(credential.payload);
|
|
108
|
+
if (payload.action === 'close')
|
|
109
|
+
runtime.closeRequested = true;
|
|
110
|
+
if (expectedAmount && credential.challenge.request.amount !== expectedAmount) {
|
|
111
|
+
await send(socket, formatErrorMessage({
|
|
112
|
+
message: 'credential amount does not match this endpoint',
|
|
113
|
+
status: 402,
|
|
114
|
+
}));
|
|
115
|
+
await close(1008, 'credential amount does not match this endpoint');
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const authorizationResult = await authorizePaymentFrame({ authorization, requestUrl, route });
|
|
119
|
+
if (authorizationResult.status === 'rejected') {
|
|
120
|
+
await send(socket, formatErrorMessage({
|
|
121
|
+
message: authorizationResult.message,
|
|
122
|
+
status: authorizationResult.responseStatus,
|
|
123
|
+
}));
|
|
124
|
+
await close(1008, authorizationResult.message);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const { receipt } = authorizationResult;
|
|
128
|
+
await send(socket, formatReceiptMessage(receipt));
|
|
129
|
+
if (payload.action === 'close') {
|
|
130
|
+
await close(1000, 'payment session closed');
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (payload.action === 'topUp')
|
|
134
|
+
return;
|
|
135
|
+
if (runtime.streamStarted || runtime.closeRequested)
|
|
136
|
+
return;
|
|
137
|
+
runtime.streamStarted = true;
|
|
138
|
+
runtime.streamContext = {
|
|
139
|
+
challengeId: credential.challenge.id,
|
|
140
|
+
channelId: payload.channelId,
|
|
141
|
+
tickCost: readSessionChallengeAmount(credential.challenge),
|
|
142
|
+
};
|
|
143
|
+
// Defer the first application frame until after the client receives the
|
|
144
|
+
// auth receipt and has a chance to install its own message listeners.
|
|
145
|
+
setTimeout(() => {
|
|
146
|
+
if (runtime.closeRequested || runtime.closed || !runtime.streamContext)
|
|
147
|
+
return;
|
|
148
|
+
runtime.streamTask = runStream(runtime.streamContext);
|
|
149
|
+
}, 0);
|
|
150
|
+
};
|
|
151
|
+
const onMessage = (payload) => {
|
|
152
|
+
if (runtime.closed)
|
|
153
|
+
return;
|
|
154
|
+
const raw = toText(payload);
|
|
155
|
+
if (!raw)
|
|
156
|
+
return;
|
|
157
|
+
const message = parseMessage(raw);
|
|
158
|
+
if (!message)
|
|
159
|
+
return;
|
|
160
|
+
if (message.mpp === 'payment-close-request') {
|
|
161
|
+
runtime.closeRequested = true;
|
|
162
|
+
abortController.abort();
|
|
163
|
+
}
|
|
164
|
+
const work = message.mpp === 'authorization'
|
|
165
|
+
? () => processAuthorization(message.authorization)
|
|
166
|
+
: message.mpp === 'payment-close-request'
|
|
167
|
+
? () => requestClose()
|
|
168
|
+
: null;
|
|
169
|
+
if (!work)
|
|
170
|
+
return;
|
|
171
|
+
if (runtime.queuedActions >= maxQueuedPaymentMessages) {
|
|
172
|
+
void send(socket, formatErrorMessage({
|
|
173
|
+
message: 'too many queued payment messages',
|
|
174
|
+
status: 429,
|
|
175
|
+
})).catch(() => { });
|
|
176
|
+
void close(1008, 'too many queued payment messages');
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
runtime.queuedActions++;
|
|
180
|
+
runtime.action = runtime.action
|
|
181
|
+
.then(async () => {
|
|
182
|
+
try {
|
|
183
|
+
if (runtime.closed)
|
|
184
|
+
return;
|
|
185
|
+
await work();
|
|
186
|
+
}
|
|
187
|
+
finally {
|
|
188
|
+
runtime.queuedActions--;
|
|
189
|
+
}
|
|
190
|
+
})
|
|
191
|
+
.catch(async (error) => {
|
|
192
|
+
if (!runtime.closed) {
|
|
193
|
+
await send(socket, formatErrorMessage({
|
|
194
|
+
message: error instanceof Error ? error.message : 'invalid payment message',
|
|
195
|
+
status: 400,
|
|
196
|
+
}));
|
|
197
|
+
await close(1008, 'invalid payment message');
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
};
|
|
201
|
+
const onClose = () => {
|
|
202
|
+
if (runtime.closed)
|
|
203
|
+
return;
|
|
204
|
+
runtime.closed = true;
|
|
205
|
+
abortController.abort();
|
|
206
|
+
unsubscribe();
|
|
207
|
+
};
|
|
208
|
+
const unsubscribe = subscribe(socket, {
|
|
209
|
+
close: onClose,
|
|
210
|
+
error: onClose,
|
|
211
|
+
message: onMessage,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
function normalizeHttpUrl(value) {
|
|
215
|
+
const url = new URL(value.toString());
|
|
216
|
+
if (url.protocol === 'ws:')
|
|
217
|
+
url.protocol = 'http:';
|
|
218
|
+
if (url.protocol === 'wss:')
|
|
219
|
+
url.protocol = 'https:';
|
|
220
|
+
return url.toString();
|
|
221
|
+
}
|
|
222
|
+
/** Verifies a WebSocket authorization frame and returns either a receipt or a payment error. */
|
|
223
|
+
async function authorizePaymentFrame(parameters) {
|
|
224
|
+
const result = await parameters.route(new Request(parameters.requestUrl, {
|
|
225
|
+
method: 'POST',
|
|
226
|
+
headers: { [Constants.Headers.authorization]: parameters.authorization },
|
|
227
|
+
}));
|
|
228
|
+
if (result.status === 402) {
|
|
229
|
+
const response = result.challenge;
|
|
230
|
+
return {
|
|
231
|
+
status: 'rejected',
|
|
232
|
+
message: (await response.text().catch(() => '')) ||
|
|
233
|
+
response.statusText ||
|
|
234
|
+
'payment verification failed',
|
|
235
|
+
responseStatus: response.status,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
const response = result.withReceipt(new Response(null, { status: 204 }));
|
|
239
|
+
const receiptHeader = response.headers.get(Constants.Headers.paymentReceipt);
|
|
240
|
+
if (!receiptHeader)
|
|
241
|
+
throw new Error('management response missing Payment-Receipt header');
|
|
242
|
+
return { status: 'accepted', receipt: deserializeSessionReceipt(receiptHeader) };
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=Ws.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Ws.js","sourceRoot":"","sources":["../../../../src/tempo/session/server/Ws.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { charge, session, settle, settleBatch } from './Session.js';
|
|
2
|
+
/** Server-side automatic settlement schedule. */
|
|
3
|
+
export type { ResolveSessionChannelId, ResolveSessionChannelIdParameters, SessionChannelIdRequest, SettlementSchedule, } from './Session.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tempo/session/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AACnE,iDAAiD;AACjD,YAAY,EACV,uBAAuB,EACvB,iCAAiC,EACjC,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/tempo/session/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mppx",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.7.0",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"license": "MIT",
|
|
7
|
+
"homepage": "https://github.com/wevm/mppx#readme",
|
|
8
|
+
"bugs": {
|
|
9
|
+
"url": "https://github.com/wevm/mppx/issues"
|
|
10
|
+
},
|
|
7
11
|
"files": [
|
|
8
12
|
"CHANGELOG.md",
|
|
9
13
|
"dist",
|
|
@@ -143,8 +147,9 @@
|
|
|
143
147
|
}
|
|
144
148
|
},
|
|
145
149
|
"dependencies": {
|
|
146
|
-
"
|
|
147
|
-
"
|
|
150
|
+
"@stripe/stripe-js": "9.7.0",
|
|
151
|
+
"incur": "^0.4.8",
|
|
152
|
+
"ox": "0.14.27",
|
|
148
153
|
"zod": "^4.4.3"
|
|
149
154
|
},
|
|
150
155
|
"repository": {
|
package/src/Challenge.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Base64, Bytes, Hash } from 'ox'
|
|
2
2
|
|
|
3
|
+
import * as Constants from './Constants.js'
|
|
3
4
|
import { constantTimeEqual } from './internal/constantTimeEqual.js'
|
|
4
5
|
import type { OneOf } from './internal/types.js'
|
|
5
6
|
import type * as Method from './Method.js'
|
|
@@ -309,7 +310,7 @@ export function serialize(challenge: Challenge): string {
|
|
|
309
310
|
else if (challenge.meta !== undefined)
|
|
310
311
|
parts.push(authParam('opaque', PaymentRequest.serialize(challenge.meta)))
|
|
311
312
|
|
|
312
|
-
return
|
|
313
|
+
return `${Constants.Schemes.payment} ${parts.join(', ')}`
|
|
313
314
|
}
|
|
314
315
|
|
|
315
316
|
/** @internal */
|
|
@@ -361,7 +362,7 @@ export function deserialize<const methods extends readonly Method.Method[] | und
|
|
|
361
362
|
|
|
362
363
|
/** @internal Extracts the `Payment` scheme from a WWW-Authenticate value that may contain multiple schemes. */
|
|
363
364
|
function extractPaymentAuthParams(header: string): string | null {
|
|
364
|
-
const token =
|
|
365
|
+
const token = Constants.Schemes.payment
|
|
365
366
|
let inQuotes = false
|
|
366
367
|
let escaped = false
|
|
367
368
|
|
|
@@ -493,8 +494,8 @@ export function fromHeaders<const methods extends readonly Method.Method[] | und
|
|
|
493
494
|
headers: Headers,
|
|
494
495
|
options?: from.Options<methods>,
|
|
495
496
|
): from.ReturnType<from.Parameters, methods> {
|
|
496
|
-
const header = headers.get(
|
|
497
|
-
if (!header) throw new Error(
|
|
497
|
+
const header = headers.get(Constants.Headers.wwwAuthenticate)
|
|
498
|
+
if (!header) throw new Error(`Missing ${Constants.Headers.wwwAuthenticate} header.`)
|
|
498
499
|
return deserialize(header, options)
|
|
499
500
|
}
|
|
500
501
|
|
|
@@ -564,8 +565,8 @@ export function fromResponseList<
|
|
|
564
565
|
export function fromHeadersList<
|
|
565
566
|
const methods extends readonly Method.Method[] | undefined = undefined,
|
|
566
567
|
>(headers: Headers, options?: from.Options<methods>): from.ReturnType<from.Parameters, methods>[] {
|
|
567
|
-
const header = headers.get(
|
|
568
|
-
if (!header) throw new Error(
|
|
568
|
+
const header = headers.get(Constants.Headers.wwwAuthenticate)
|
|
569
|
+
if (!header) throw new Error(`Missing ${Constants.Headers.wwwAuthenticate} header.`)
|
|
569
570
|
return deserializeList(header, options)
|
|
570
571
|
}
|
|
571
572
|
|
|
@@ -582,7 +583,8 @@ export function deserializeList<
|
|
|
582
583
|
>(value: string, options?: from.Options<methods>): from.ReturnType<from.Parameters, methods>[] {
|
|
583
584
|
// Find the start index of each `Payment ` scheme prefix.
|
|
584
585
|
const starts: number[] = []
|
|
585
|
-
|
|
586
|
+
const schemePattern = new RegExp(`${Constants.Schemes.payment}\\s+`, 'gi')
|
|
587
|
+
for (const match of value.matchAll(schemePattern)) {
|
|
586
588
|
starts.push(match.index!)
|
|
587
589
|
}
|
|
588
590
|
if (starts.length === 0) throw new Error('No Payment schemes found.')
|
package/src/Constants.ts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/** HTTP header names used by the Payment authentication scheme. */
|
|
2
|
+
export const Headers = {
|
|
3
|
+
acceptPayment: 'Accept-Payment',
|
|
4
|
+
authorization: 'Authorization',
|
|
5
|
+
paymentReceipt: 'Payment-Receipt',
|
|
6
|
+
paymentSession: 'Payment-Session',
|
|
7
|
+
paymentSessionSnapshot: 'Payment-Session-Snapshot',
|
|
8
|
+
wwwAuthenticate: 'WWW-Authenticate',
|
|
9
|
+
} as const
|
|
10
|
+
|
|
11
|
+
/** Authentication scheme names used by mppx transports. */
|
|
12
|
+
export const Schemes = {
|
|
13
|
+
payment: 'Payment',
|
|
14
|
+
} as const
|
|
15
|
+
|
|
16
|
+
/** Payment method names used by built-in mppx methods. */
|
|
17
|
+
export const Methods = {
|
|
18
|
+
evm: 'evm',
|
|
19
|
+
stripe: 'stripe',
|
|
20
|
+
tempo: 'tempo',
|
|
21
|
+
} as const
|
|
22
|
+
|
|
23
|
+
/** Payment intent names used by built-in mppx methods. */
|
|
24
|
+
export const Intents = {
|
|
25
|
+
charge: 'charge',
|
|
26
|
+
session: 'session',
|
|
27
|
+
subscription: 'subscription',
|
|
28
|
+
} as const
|
|
29
|
+
|
|
30
|
+
/** Method detail object keys used by built-in methods. */
|
|
31
|
+
export const MethodDetailKeys = {
|
|
32
|
+
sessionProtocol: 'sessionProtocol',
|
|
33
|
+
sessionSnapshot: 'sessionSnapshot',
|
|
34
|
+
} as const
|
|
35
|
+
|
|
36
|
+
/** Tempo session protocol versions advertised under `request.methodDetails`. */
|
|
37
|
+
export const SessionProtocols = {
|
|
38
|
+
/** Legacy contract-backed Tempo session protocol. */
|
|
39
|
+
v1: 'v1',
|
|
40
|
+
/** TIP-1034 precompile-backed Tempo session protocol. */
|
|
41
|
+
v2: 'v2',
|
|
42
|
+
} as const
|
|
43
|
+
|
|
44
|
+
/** Known Tempo session protocol version markers. */
|
|
45
|
+
export type SessionProtocol = (typeof SessionProtocols)[keyof typeof SessionProtocols]
|
|
46
|
+
|
|
47
|
+
type MethodDetailKey = (typeof MethodDetailKeys)[keyof typeof MethodDetailKeys]
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Reads a typed method detail value from a challenge request.
|
|
51
|
+
*/
|
|
52
|
+
export function getMethodDetail<Value>(
|
|
53
|
+
methodDetails: unknown,
|
|
54
|
+
key: MethodDetailKey,
|
|
55
|
+
): Value | undefined {
|
|
56
|
+
if (!methodDetails || typeof methodDetails !== 'object') return undefined
|
|
57
|
+
return (methodDetails as Record<string, Value | undefined>)[key]
|
|
58
|
+
}
|
package/src/Credential.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Base64 } from 'ox'
|
|
2
2
|
|
|
3
3
|
import * as Challenge from './Challenge.js'
|
|
4
|
+
import * as Constants from './Constants.js'
|
|
4
5
|
import * as PaymentRequest from './PaymentRequest.js'
|
|
5
6
|
|
|
6
7
|
/**
|
|
@@ -58,7 +59,7 @@ export class InvalidCredentialEncodingError extends Error {
|
|
|
58
59
|
* ```
|
|
59
60
|
*/
|
|
60
61
|
export function deserialize<payload = unknown>(value: string): Credential<payload> {
|
|
61
|
-
const prefixMatch = value.match(
|
|
62
|
+
const prefixMatch = value.match(new RegExp(`^${Constants.Schemes.payment}\\s+(.+)$`, 'i'))
|
|
62
63
|
if (!prefixMatch?.[1]) throw new MissingPaymentSchemeError()
|
|
63
64
|
try {
|
|
64
65
|
const json = Base64.toString(prefixMatch[1])
|
|
@@ -163,7 +164,7 @@ export declare namespace from {
|
|
|
163
164
|
* ```
|
|
164
165
|
*/
|
|
165
166
|
export function fromRequest<payload = unknown>(request: Request): Credential<payload> {
|
|
166
|
-
const header = request.headers.get(
|
|
167
|
+
const header = request.headers.get(Constants.Headers.authorization)
|
|
167
168
|
if (!header) throw new MissingAuthorizationHeaderError()
|
|
168
169
|
const payment = extractPaymentScheme(header)
|
|
169
170
|
if (!payment) throw new MissingPaymentSchemeError()
|
|
@@ -200,7 +201,7 @@ export function serialize(credential: Credential): string {
|
|
|
200
201
|
}
|
|
201
202
|
const json = JSON.stringify(wire)
|
|
202
203
|
const encoded = Base64.fromString(json, { pad: false, url: true })
|
|
203
|
-
return
|
|
204
|
+
return `${Constants.Schemes.payment} ${encoded}`
|
|
204
205
|
}
|
|
205
206
|
|
|
206
207
|
/**
|
|
@@ -212,5 +213,5 @@ export function serialize(credential: Credential): string {
|
|
|
212
213
|
*/
|
|
213
214
|
export function extractPaymentScheme(header: string): string | null {
|
|
214
215
|
const schemes = header.split(',').map((s) => s.trim())
|
|
215
|
-
return schemes.find((s) =>
|
|
216
|
+
return schemes.find((s) => new RegExp(`^${Constants.Schemes.payment}\\s+`, 'i').test(s)) ?? null
|
|
216
217
|
}
|
package/src/Method.ts
CHANGED
|
@@ -59,6 +59,7 @@ export type Client<
|
|
|
59
59
|
method extends Method = Method,
|
|
60
60
|
context extends z.ZodMiniType | undefined = z.ZodMiniType | undefined,
|
|
61
61
|
> = method & {
|
|
62
|
+
canHandleChallenge?: CanHandleChallengeFn | undefined
|
|
62
63
|
context?: context
|
|
63
64
|
createCredential: CreateCredentialFn<
|
|
64
65
|
method,
|
|
@@ -130,18 +131,21 @@ export type Server<
|
|
|
130
131
|
defaults extends ExactPartial<z.input<method['schema']['request']>> = {},
|
|
131
132
|
transportOverride = undefined,
|
|
132
133
|
extensions extends object = {},
|
|
134
|
+
alias extends string | undefined = string | undefined,
|
|
133
135
|
> = method & {
|
|
136
|
+
alias?: alias | undefined
|
|
134
137
|
authorize?: AuthorizeFn<method> | undefined
|
|
135
138
|
defaults?: defaults | undefined
|
|
136
139
|
extensions?: extensions | undefined
|
|
137
140
|
html?: Html.Options | undefined
|
|
141
|
+
preflight?: PreflightFn<method> | undefined
|
|
138
142
|
request?: RequestFn<method> | undefined
|
|
139
143
|
respond?: RespondFn<method> | undefined
|
|
140
144
|
stableBinding?: StableBindingFn<method> | undefined
|
|
141
145
|
transport?: transportOverride | undefined
|
|
142
146
|
verify: VerifyFn<method>
|
|
143
147
|
}
|
|
144
|
-
export type AnyServer = Server<any, any, any, any>
|
|
148
|
+
export type AnyServer = Server<any, any, any, any, any>
|
|
145
149
|
|
|
146
150
|
/** Credential creation function for a single method. */
|
|
147
151
|
export type CreateCredentialFn<method extends Method, context = unknown> = (
|
|
@@ -154,6 +158,9 @@ export type CreateCredentialFn<method extends Method, context = unknown> = (
|
|
|
154
158
|
} & ([keyof context] extends [never] ? unknown : { context: context }),
|
|
155
159
|
) => Promise<string>
|
|
156
160
|
|
|
161
|
+
/** Predicate used when multiple client implementations share a wire method/intent. */
|
|
162
|
+
export type CanHandleChallengeFn = (parameters: { challenge: Challenge.Challenge }) => boolean
|
|
163
|
+
|
|
157
164
|
/** Request transform function for a single method. */
|
|
158
165
|
export type RequestFn<method extends Method> = (
|
|
159
166
|
options: RequestContext<method>,
|
|
@@ -188,6 +195,22 @@ export type AuthorizeResult = {
|
|
|
188
195
|
response?: globalThis.Response | undefined
|
|
189
196
|
}
|
|
190
197
|
|
|
198
|
+
/**
|
|
199
|
+
* Optional HTTP preflight hook for method-specific management requests.
|
|
200
|
+
*
|
|
201
|
+
* Called before the normal challenge/verification path. Returning a response
|
|
202
|
+
* fully handles the request.
|
|
203
|
+
*/
|
|
204
|
+
export type PreflightFn<method extends Method> = (parameters: {
|
|
205
|
+
capturedRequest?: CapturedRequest | undefined
|
|
206
|
+
credential: Credential.Credential | null
|
|
207
|
+
expires?: string | undefined
|
|
208
|
+
input: globalThis.Request
|
|
209
|
+
options: z.input<method['schema']['request']>
|
|
210
|
+
realm: string
|
|
211
|
+
secretKey: string
|
|
212
|
+
}) => MaybePromise<globalThis.Response | undefined>
|
|
213
|
+
|
|
191
214
|
/**
|
|
192
215
|
* Produces the stable request fields used to bind credentials to a route.
|
|
193
216
|
*
|
|
@@ -252,9 +275,10 @@ export function toClient<
|
|
|
252
275
|
const method extends Method,
|
|
253
276
|
const context extends z.ZodMiniType | undefined = undefined,
|
|
254
277
|
>(method: method, options: toClient.Options<method, context>): Client<method, context> {
|
|
255
|
-
const { context, createCredential } = options
|
|
278
|
+
const { canHandleChallenge, context, createCredential } = options
|
|
256
279
|
return {
|
|
257
280
|
...method,
|
|
281
|
+
canHandleChallenge,
|
|
258
282
|
context,
|
|
259
283
|
createCredential,
|
|
260
284
|
} as Client<method, context>
|
|
@@ -262,6 +286,7 @@ export function toClient<
|
|
|
262
286
|
|
|
263
287
|
export declare namespace toClient {
|
|
264
288
|
type Options<method extends Method, context extends z.ZodMiniType | undefined = undefined> = {
|
|
289
|
+
canHandleChallenge?: CanHandleChallengeFn | undefined
|
|
265
290
|
context?: context
|
|
266
291
|
createCredential: CreateCredentialFn<
|
|
267
292
|
method,
|
|
@@ -291,15 +316,24 @@ export function toServer<
|
|
|
291
316
|
const defaults extends RequestDefaults<method> = {},
|
|
292
317
|
const transportOverride extends Transport.AnyTransport | undefined = undefined,
|
|
293
318
|
const extensions extends object = {},
|
|
319
|
+
const options extends toServer.Options<
|
|
320
|
+
method,
|
|
321
|
+
defaults,
|
|
322
|
+
transportOverride,
|
|
323
|
+
extensions,
|
|
324
|
+
string | undefined
|
|
325
|
+
> = toServer.Options<method, defaults, transportOverride, extensions, string | undefined>,
|
|
294
326
|
>(
|
|
295
327
|
method: method,
|
|
296
|
-
options:
|
|
297
|
-
): Server<method, defaults, transportOverride, extensions
|
|
328
|
+
options: options,
|
|
329
|
+
): Server<method, defaults, transportOverride, extensions, toServer.Alias<options>> {
|
|
298
330
|
const {
|
|
331
|
+
alias,
|
|
299
332
|
authorize,
|
|
300
333
|
defaults,
|
|
301
334
|
extensions,
|
|
302
335
|
html,
|
|
336
|
+
preflight,
|
|
303
337
|
request,
|
|
304
338
|
respond,
|
|
305
339
|
stableBinding,
|
|
@@ -308,29 +342,36 @@ export function toServer<
|
|
|
308
342
|
} = options
|
|
309
343
|
return {
|
|
310
344
|
...method,
|
|
345
|
+
alias,
|
|
311
346
|
authorize,
|
|
312
347
|
defaults,
|
|
313
348
|
extensions,
|
|
314
349
|
html,
|
|
350
|
+
preflight,
|
|
315
351
|
request,
|
|
316
352
|
respond,
|
|
317
353
|
stableBinding,
|
|
318
354
|
transport,
|
|
319
355
|
verify,
|
|
320
|
-
} as Server<method, defaults, transportOverride, extensions
|
|
356
|
+
} as Server<method, defaults, transportOverride, extensions, toServer.Alias<options>>
|
|
321
357
|
}
|
|
322
358
|
|
|
323
359
|
export declare namespace toServer {
|
|
360
|
+
type Alias<options> = options extends { alias: infer alias extends string } ? alias : undefined
|
|
361
|
+
|
|
324
362
|
type Options<
|
|
325
363
|
method extends Method,
|
|
326
364
|
defaults extends RequestDefaults<method> = {},
|
|
327
365
|
transportOverride extends Transport.AnyTransport | undefined = undefined,
|
|
328
366
|
extensions extends object = {},
|
|
367
|
+
alias extends string | undefined = undefined,
|
|
329
368
|
> = {
|
|
369
|
+
alias?: alias | undefined
|
|
330
370
|
authorize?: AuthorizeFn<method> | undefined
|
|
331
371
|
defaults?: defaults | undefined
|
|
332
372
|
extensions?: extensions | undefined
|
|
333
373
|
html?: Html.Options | undefined
|
|
374
|
+
preflight?: PreflightFn<method> | undefined
|
|
334
375
|
request?: RequestFn<method> | undefined
|
|
335
376
|
respond?: RespondFn<method> | undefined
|
|
336
377
|
stableBinding?: StableBindingFn<method> | undefined
|
package/src/Receipt.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Base64 } from 'ox'
|
|
2
2
|
|
|
3
|
+
import * as Constants from './Constants.js'
|
|
3
4
|
import * as z from './zod.js'
|
|
4
5
|
|
|
5
6
|
/**
|
|
@@ -126,7 +127,7 @@ export function serialize(receipt: Receipt): string {
|
|
|
126
127
|
* ```
|
|
127
128
|
*/
|
|
128
129
|
export function fromResponse(response: Response): Receipt {
|
|
129
|
-
const header = response.headers.get(
|
|
130
|
-
if (!header) throw new Error(
|
|
130
|
+
const header = response.headers.get(Constants.Headers.paymentReceipt)
|
|
131
|
+
if (!header) throw new Error(`Missing ${Constants.Headers.paymentReceipt} header.`)
|
|
131
132
|
return deserialize(header)
|
|
132
133
|
}
|