mppx 0.8.14 → 0.8.17
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 +57 -0
- package/dist/Challenge.d.ts.map +1 -1
- package/dist/Challenge.js +40 -35
- package/dist/Challenge.js.map +1 -1
- package/dist/Constants.d.ts +17 -17
- package/dist/Constants.d.ts.map +1 -1
- package/dist/Credential.d.ts.map +1 -1
- package/dist/Errors.d.ts +3 -3
- package/dist/Errors.d.ts.map +1 -1
- package/dist/Errors.js.map +1 -1
- package/dist/Method.d.ts +35 -5
- package/dist/Method.d.ts.map +1 -1
- package/dist/Method.js +7 -22
- package/dist/Method.js.map +1 -1
- package/dist/Store.d.ts +19 -0
- package/dist/Store.d.ts.map +1 -1
- package/dist/Store.js +43 -0
- package/dist/Store.js.map +1 -1
- package/dist/attestation/Client.d.ts +17 -0
- package/dist/attestation/Client.d.ts.map +1 -0
- package/dist/attestation/Client.js +28 -0
- package/dist/attestation/Client.js.map +1 -0
- package/dist/attestation/Constants.d.ts +15 -0
- package/dist/attestation/Constants.d.ts.map +1 -0
- package/dist/attestation/Constants.js +15 -0
- package/dist/attestation/Constants.js.map +1 -0
- package/dist/attestation/Server.d.ts +4 -0
- package/dist/attestation/Server.d.ts.map +1 -0
- package/dist/attestation/Server.js +8 -0
- package/dist/attestation/Server.js.map +1 -0
- package/dist/attestation/Types.d.ts +76 -0
- package/dist/attestation/Types.d.ts.map +1 -0
- package/dist/attestation/Types.js +2 -0
- package/dist/attestation/Types.js.map +1 -0
- package/dist/attestation/index.d.ts +6 -0
- package/dist/attestation/index.d.ts.map +1 -0
- package/dist/attestation/index.js +6 -0
- package/dist/attestation/index.js.map +1 -0
- package/dist/attestation/internal/HttpMessageSignature.d.ts +73 -0
- package/dist/attestation/internal/HttpMessageSignature.d.ts.map +1 -0
- package/dist/attestation/internal/HttpMessageSignature.js +320 -0
- package/dist/attestation/internal/HttpMessageSignature.js.map +1 -0
- package/dist/attestation/internal/SigningContext.d.ts +4 -0
- package/dist/attestation/internal/SigningContext.d.ts.map +1 -0
- package/dist/attestation/internal/SigningContext.js +11 -0
- package/dist/attestation/internal/SigningContext.js.map +1 -0
- package/dist/cli/account.d.ts +14 -14
- package/dist/cli/account.d.ts.map +1 -1
- package/dist/cli/cli.d.ts +6 -6
- package/dist/cli/cli.d.ts.map +1 -1
- package/dist/cli/cli.js +1 -0
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/plugins/tempo.js.map +1 -1
- package/dist/cli/sessions/commands.d.ts +4 -4
- package/dist/cli/sessions/commands.d.ts.map +1 -1
- package/dist/cli/sessions/commands.js.map +1 -1
- package/dist/cli/sessions/store.d.ts.map +1 -1
- package/dist/cli/sessions/store.js.map +1 -1
- package/dist/cli/utils.d.ts +1 -1
- package/dist/cli/utils.d.ts.map +1 -1
- package/dist/cli/utils.js.map +1 -1
- package/dist/cli/validate/discovery.js.map +1 -1
- package/dist/cli/validate/index.d.ts +3 -3
- package/dist/cli/validate/index.d.ts.map +1 -1
- package/dist/cli/validate/payment.d.ts.map +1 -1
- package/dist/cli/validate/payment.js +18 -4
- package/dist/cli/validate/payment.js.map +1 -1
- package/dist/client/Mppx.d.ts +3 -0
- package/dist/client/Mppx.d.ts.map +1 -1
- package/dist/client/Mppx.js +13 -5
- package/dist/client/Mppx.js.map +1 -1
- package/dist/client/Transport.d.ts +3 -5
- package/dist/client/Transport.d.ts.map +1 -1
- package/dist/client/Transport.js +1 -17
- package/dist/client/Transport.js.map +1 -1
- package/dist/client/internal/Fetch.d.ts.map +1 -1
- package/dist/client/internal/Fetch.js +92 -13
- package/dist/client/internal/Fetch.js.map +1 -1
- package/dist/client/internal/MethodChallenge.d.ts +2 -0
- package/dist/client/internal/MethodChallenge.d.ts.map +1 -1
- package/dist/client/internal/MethodChallenge.js +4 -0
- package/dist/client/internal/MethodChallenge.js.map +1 -1
- package/dist/client/internal/MethodResponse.d.ts +15 -0
- package/dist/client/internal/MethodResponse.d.ts.map +1 -1
- package/dist/client/internal/MethodResponse.js +10 -0
- package/dist/client/internal/MethodResponse.js.map +1 -1
- package/dist/client/node.js.map +1 -1
- package/dist/discovery/OpenApi.d.ts +3 -5
- package/dist/discovery/OpenApi.d.ts.map +1 -1
- package/dist/discovery/OpenApi.js +13 -34
- package/dist/discovery/OpenApi.js.map +1 -1
- package/dist/discovery/internal/Metadata.d.ts +20 -0
- package/dist/discovery/internal/Metadata.d.ts.map +1 -0
- package/dist/discovery/internal/Metadata.js +36 -0
- package/dist/discovery/internal/Metadata.js.map +1 -0
- package/dist/evm/Methods.d.ts +11 -11
- package/dist/evm/Methods.d.ts.map +1 -1
- package/dist/evm/Types.d.ts +17 -17
- package/dist/evm/Types.d.ts.map +1 -1
- package/dist/evm/client/Charge.d.ts +11 -11
- package/dist/evm/client/Methods.d.ts +11 -11
- package/dist/evm/server/Charge.d.ts +1 -1
- package/dist/evm/server/Charge.d.ts.map +1 -1
- package/dist/evm/server/Charge.js +2 -0
- package/dist/evm/server/Charge.js.map +1 -1
- package/dist/evm/server/Methods.d.ts +11 -11
- package/dist/internal/HeaderCodec.d.ts +2 -2
- package/dist/internal/HeaderCodec.d.ts.map +1 -1
- package/dist/internal/types.d.ts +6 -0
- package/dist/internal/types.d.ts.map +1 -1
- package/dist/middlewares/elysia.js.map +1 -1
- package/dist/middlewares/express.js.map +1 -1
- package/dist/middlewares/hono.js.map +1 -1
- package/dist/middlewares/nextjs.js.map +1 -1
- package/dist/proxy/Proxy.d.ts +2 -0
- package/dist/proxy/Proxy.d.ts.map +1 -1
- package/dist/proxy/Proxy.js +117 -9
- package/dist/proxy/Proxy.js.map +1 -1
- package/dist/proxy/Service.d.ts +36 -1
- package/dist/proxy/Service.d.ts.map +1 -1
- package/dist/proxy/Service.js +9 -8
- package/dist/proxy/Service.js.map +1 -1
- package/dist/proxy/services/anthropic.d.ts.map +1 -1
- package/dist/proxy/services/anthropic.js +1 -0
- package/dist/proxy/services/anthropic.js.map +1 -1
- package/dist/proxy/services/openai.d.ts.map +1 -1
- package/dist/proxy/services/openai.js +1 -0
- package/dist/proxy/services/openai.js.map +1 -1
- package/dist/proxy/services/stripe.d.ts.map +1 -1
- package/dist/proxy/services/stripe.js +1 -0
- package/dist/proxy/services/stripe.js.map +1 -1
- package/dist/server/Mppx.d.ts +75 -13
- package/dist/server/Mppx.d.ts.map +1 -1
- package/dist/server/Mppx.js +201 -23
- package/dist/server/Mppx.js.map +1 -1
- package/dist/server/internal/html/config.d.ts +9 -9
- package/dist/server/internal/html/config.d.ts.map +1 -1
- package/dist/server/internal/html/constants.d.ts +17 -17
- package/dist/server/internal/html/constants.d.ts.map +1 -1
- package/dist/stripe/Methods.d.ts +10 -10
- package/dist/stripe/Methods.d.ts.map +1 -1
- package/dist/stripe/client/Charge.d.ts +10 -10
- package/dist/stripe/client/Methods.d.ts +10 -10
- package/dist/stripe/internal/constants.d.ts +1 -1
- package/dist/stripe/internal/constants.js +1 -1
- package/dist/stripe/internal/types.d.ts +1 -0
- package/dist/stripe/internal/types.d.ts.map +1 -1
- package/dist/stripe/server/Charge.d.ts +11 -11
- package/dist/stripe/server/Charge.d.ts.map +1 -1
- package/dist/stripe/server/Charge.js +49 -1
- package/dist/stripe/server/Charge.js.map +1 -1
- package/dist/stripe/server/Methods.d.ts +137 -48
- package/dist/stripe/server/Methods.d.ts.map +1 -1
- package/dist/stripe/server/Methods.js +259 -4
- package/dist/stripe/server/Methods.js.map +1 -1
- package/dist/stripe/server/internal/deposit-address.d.ts +13 -0
- package/dist/stripe/server/internal/deposit-address.d.ts.map +1 -0
- package/dist/stripe/server/internal/deposit-address.js +28 -0
- package/dist/stripe/server/internal/deposit-address.js.map +1 -0
- 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/stripe/server/internal/record-payment.d.ts +15 -0
- package/dist/stripe/server/internal/record-payment.d.ts.map +1 -0
- package/dist/stripe/server/internal/record-payment.js +42 -0
- package/dist/stripe/server/internal/record-payment.js.map +1 -0
- package/dist/stripe/server/internal/request.d.ts +25 -0
- package/dist/stripe/server/internal/request.d.ts.map +1 -0
- package/dist/stripe/server/internal/request.js +29 -0
- package/dist/stripe/server/internal/request.js.map +1 -0
- package/dist/tap/Constants.d.ts +28 -0
- package/dist/tap/Constants.d.ts.map +1 -0
- package/dist/tap/Constants.js +32 -0
- package/dist/tap/Constants.js.map +1 -0
- package/dist/tap/Types.d.ts +11 -0
- package/dist/tap/Types.d.ts.map +1 -0
- package/dist/tap/Types.js +2 -0
- package/dist/tap/Types.js.map +1 -0
- package/dist/tap/client/index.d.ts +26 -0
- package/dist/tap/client/index.d.ts.map +1 -0
- package/dist/tap/client/index.js +33 -0
- package/dist/tap/client/index.js.map +1 -0
- package/dist/tap/index.d.ts +5 -0
- package/dist/tap/index.d.ts.map +1 -0
- package/dist/tap/index.js +5 -0
- package/dist/tap/index.js.map +1 -0
- package/dist/tap/server/index.d.ts +20 -0
- package/dist/tap/server/index.d.ts.map +1 -0
- package/dist/tap/server/index.js +36 -0
- package/dist/tap/server/index.js.map +1 -0
- package/dist/tempo/Attribution.d.ts +1 -1
- package/dist/tempo/Methods.d.ts +60 -60
- package/dist/tempo/Methods.d.ts.map +1 -1
- package/dist/tempo/Proof.d.ts +16 -16
- package/dist/tempo/client/Charge.d.ts +19 -19
- package/dist/tempo/client/Charge.d.ts.map +1 -1
- package/dist/tempo/client/Charge.js +1 -7
- package/dist/tempo/client/Charge.js.map +1 -1
- package/dist/tempo/client/Methods.d.ts +38 -38
- package/dist/tempo/client/Methods.js.map +1 -1
- package/dist/tempo/client/Subscription.d.ts +23 -23
- package/dist/tempo/client/Subscription.js.map +1 -1
- package/dist/tempo/internal/address.d.ts +2 -1
- package/dist/tempo/internal/address.d.ts.map +1 -1
- package/dist/tempo/internal/address.js +3 -1
- package/dist/tempo/internal/address.js.map +1 -1
- package/dist/tempo/internal/auto-swap.d.ts.map +1 -1
- package/dist/tempo/internal/auto-swap.js +4 -19
- package/dist/tempo/internal/auto-swap.js.map +1 -1
- package/dist/tempo/internal/defaults.d.ts +6 -6
- package/dist/tempo/internal/defaults.d.ts.map +1 -1
- package/dist/tempo/internal/fee-payer.d.ts +12 -12
- package/dist/tempo/internal/fee-payer.d.ts.map +1 -1
- package/dist/tempo/internal/fee-payer.js.map +1 -1
- package/dist/tempo/internal/proof.d.ts +17 -17
- package/dist/tempo/internal/proof.d.ts.map +1 -1
- package/dist/tempo/legacy/client/Session.d.ts +20 -20
- package/dist/tempo/legacy/client/Session.js.map +1 -1
- package/dist/tempo/legacy/client/SessionManager.js.map +1 -1
- package/dist/tempo/legacy/index.d.ts +1 -3
- package/dist/tempo/legacy/index.d.ts.map +1 -1
- package/dist/tempo/legacy/index.js +1 -3
- package/dist/tempo/legacy/index.js.map +1 -1
- package/dist/tempo/legacy/session/escrow.abi.d.ts +374 -374
- package/dist/tempo/legacy/session/escrow.abi.d.ts.map +1 -1
- package/dist/tempo/server/Charge.d.ts +34 -12
- package/dist/tempo/server/Charge.d.ts.map +1 -1
- package/dist/tempo/server/Charge.js +44 -39
- package/dist/tempo/server/Charge.js.map +1 -1
- package/dist/tempo/server/Methods.d.ts +37 -52
- package/dist/tempo/server/Methods.d.ts.map +1 -1
- package/dist/tempo/server/Methods.js +0 -14
- package/dist/tempo/server/Methods.js.map +1 -1
- package/dist/tempo/server/Relay.d.ts +14 -5
- package/dist/tempo/server/Relay.d.ts.map +1 -1
- package/dist/tempo/server/Relay.js +6 -4
- package/dist/tempo/server/Relay.js.map +1 -1
- package/dist/tempo/server/SponsorBudget.d.ts.map +1 -1
- package/dist/tempo/server/SponsorBudget.js +7 -1
- package/dist/tempo/server/SponsorBudget.js.map +1 -1
- package/dist/tempo/server/Subscription.d.ts +25 -25
- package/dist/tempo/server/Subscription.d.ts.map +1 -1
- package/dist/tempo/server/Subscription.js +2 -0
- package/dist/tempo/server/Subscription.js.map +1 -1
- package/dist/tempo/server/index.d.ts +1 -1
- package/dist/tempo/server/index.d.ts.map +1 -1
- package/dist/tempo/server/index.js +1 -1
- 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/transport.d.ts +2 -0
- package/dist/tempo/server/internal/transport.d.ts.map +1 -1
- package/dist/tempo/server/internal/transport.js +9 -2
- package/dist/tempo/server/internal/transport.js.map +1 -1
- package/dist/tempo/session/client/ChannelOps.js.map +1 -1
- package/dist/tempo/session/client/CredentialState.d.ts +1 -1
- package/dist/tempo/session/client/CredentialState.js.map +1 -1
- package/dist/tempo/session/client/ReceiptCoordinator.js.map +1 -1
- package/dist/tempo/session/client/Runtime.js.map +1 -1
- package/dist/tempo/session/client/Session.d.ts +19 -19
- package/dist/tempo/session/client/Session.d.ts.map +1 -1
- package/dist/tempo/session/client/Session.js +128 -14
- package/dist/tempo/session/client/Session.js.map +1 -1
- package/dist/tempo/session/client/SessionManager.d.ts.map +1 -1
- package/dist/tempo/session/client/SessionManager.js +62 -20
- package/dist/tempo/session/client/SessionManager.js.map +1 -1
- package/dist/tempo/session/client/Transports.d.ts +9 -1
- package/dist/tempo/session/client/Transports.d.ts.map +1 -1
- package/dist/tempo/session/client/Transports.js +36 -13
- package/dist/tempo/session/client/Transports.js.map +1 -1
- package/dist/tempo/session/precompile/Chain.d.ts +27 -0
- package/dist/tempo/session/precompile/Chain.d.ts.map +1 -1
- package/dist/tempo/session/precompile/Chain.js +68 -7
- package/dist/tempo/session/precompile/Chain.js.map +1 -1
- package/dist/tempo/session/precompile/Protocol.js.map +1 -1
- package/dist/tempo/session/precompile/Voucher.d.ts +4 -4
- package/dist/tempo/session/precompile/Voucher.d.ts.map +1 -1
- package/dist/tempo/session/precompile/escrow.abi.d.ts +306 -306
- package/dist/tempo/session/precompile/escrow.abi.d.ts.map +1 -1
- package/dist/tempo/session/server/ChannelStore.d.ts +9 -0
- package/dist/tempo/session/server/ChannelStore.d.ts.map +1 -1
- package/dist/tempo/session/server/ChannelStore.js +16 -8
- package/dist/tempo/session/server/ChannelStore.js.map +1 -1
- package/dist/tempo/session/server/CredentialVerification.d.ts +30 -13
- package/dist/tempo/session/server/CredentialVerification.d.ts.map +1 -1
- package/dist/tempo/session/server/CredentialVerification.js +207 -13
- package/dist/tempo/session/server/CredentialVerification.js.map +1 -1
- package/dist/tempo/session/server/MeteredStream.d.ts +3 -0
- package/dist/tempo/session/server/MeteredStream.d.ts.map +1 -1
- package/dist/tempo/session/server/MeteredStream.js +3 -1
- package/dist/tempo/session/server/MeteredStream.js.map +1 -1
- package/dist/tempo/session/server/Session.d.ts +32 -21
- package/dist/tempo/session/server/Session.d.ts.map +1 -1
- package/dist/tempo/session/server/Session.js +116 -53
- package/dist/tempo/session/server/Session.js.map +1 -1
- package/dist/tempo/session/server/Sse.d.ts +3 -1
- package/dist/tempo/session/server/Sse.d.ts.map +1 -1
- package/dist/tempo/session/server/Sse.js +2 -1
- package/dist/tempo/session/server/Sse.js.map +1 -1
- package/dist/tempo/session/server/Transports.d.ts +1 -1
- package/dist/tempo/session/server/Transports.d.ts.map +1 -1
- package/dist/tempo/session/server/Transports.js +1 -0
- package/dist/tempo/session/server/Transports.js.map +1 -1
- package/dist/tempo/session/server/Ws.d.ts +6 -1
- package/dist/tempo/session/server/Ws.d.ts.map +1 -1
- package/dist/tempo/session/server/Ws.js +4 -0
- package/dist/tempo/session/server/Ws.js.map +1 -1
- package/dist/tempo/subscription/KeyAuthorization.d.ts +38 -866
- package/dist/tempo/subscription/KeyAuthorization.d.ts.map +1 -1
- package/dist/tempo/subscription/KeyAuthorization.js +14 -3
- package/dist/tempo/subscription/KeyAuthorization.js.map +1 -1
- package/dist/viem/Account.d.ts.map +1 -1
- package/dist/viem/Account.js.map +1 -1
- package/dist/viem/Client.d.ts.map +1 -1
- package/dist/viem/Client.js +6 -1
- package/dist/viem/Client.js.map +1 -1
- package/dist/web-bot-auth/Constants.d.ts +20 -0
- package/dist/web-bot-auth/Constants.d.ts.map +1 -0
- package/dist/web-bot-auth/Constants.js +24 -0
- package/dist/web-bot-auth/Constants.js.map +1 -0
- package/dist/web-bot-auth/Types.d.ts +10 -0
- package/dist/web-bot-auth/Types.d.ts.map +1 -0
- package/dist/web-bot-auth/Types.js +2 -0
- package/dist/web-bot-auth/Types.js.map +1 -0
- package/dist/web-bot-auth/client/index.d.ts +29 -0
- package/dist/web-bot-auth/client/index.d.ts.map +1 -0
- package/dist/web-bot-auth/client/index.js +64 -0
- package/dist/web-bot-auth/client/index.js.map +1 -0
- package/dist/web-bot-auth/index.d.ts +7 -0
- package/dist/web-bot-auth/index.d.ts.map +1 -0
- package/dist/web-bot-auth/index.js +7 -0
- package/dist/web-bot-auth/index.js.map +1 -0
- package/dist/web-bot-auth/internal/JwkThumbprint.d.ts +5 -0
- package/dist/web-bot-auth/internal/JwkThumbprint.d.ts.map +1 -0
- package/dist/web-bot-auth/internal/JwkThumbprint.js +20 -0
- package/dist/web-bot-auth/internal/JwkThumbprint.js.map +1 -0
- package/dist/web-bot-auth/internal/SignatureAgent.d.ts +3 -0
- package/dist/web-bot-auth/internal/SignatureAgent.d.ts.map +1 -0
- package/dist/web-bot-auth/internal/SignatureAgent.js +18 -0
- package/dist/web-bot-auth/internal/SignatureAgent.js.map +1 -0
- package/dist/web-bot-auth/server/index.d.ts +35 -0
- package/dist/web-bot-auth/server/index.d.ts.map +1 -0
- package/dist/web-bot-auth/server/index.js +88 -0
- package/dist/web-bot-auth/server/index.js.map +1 -0
- package/dist/x402/Assets.d.ts.map +1 -1
- package/dist/x402/Types.d.ts +6 -6
- package/dist/x402/Types.d.ts.map +1 -1
- package/dist/x402/server/EvmCharge.d.ts.map +1 -1
- package/dist/x402/server/EvmCharge.js +32 -20
- package/dist/x402/server/EvmCharge.js.map +1 -1
- package/package.json +20 -4
- package/src/Challenge.fuzz.test.ts +80 -47
- package/src/Challenge.test.ts +65 -0
- package/src/Challenge.ts +39 -35
- package/src/Method.ts +82 -68
- package/src/Store.test-d.ts +16 -0
- package/src/Store.test.ts +50 -0
- package/src/Store.ts +68 -0
- package/src/attestation/Attestation.integration.test.ts +208 -0
- package/src/attestation/Client.test.ts +83 -0
- package/src/attestation/Client.ts +34 -0
- package/src/attestation/Constants.ts +15 -0
- package/src/attestation/Server.test.ts +60 -0
- package/src/attestation/Server.ts +12 -0
- package/src/attestation/Types.test-d.ts +54 -0
- package/src/attestation/Types.ts +77 -0
- package/src/attestation/index.ts +5 -0
- package/src/attestation/internal/HttpMessageSignature.test.ts +101 -0
- package/src/attestation/internal/HttpMessageSignature.ts +429 -0
- package/src/attestation/internal/SigningContext.ts +13 -0
- package/src/bin.js +2 -0
- package/src/cli/cli.ts +1 -0
- package/src/cli/validate/payment.ts +18 -4
- package/src/cli/validate.test.ts +16 -0
- package/src/client/Mppx.test-d.ts +17 -0
- package/src/client/Mppx.test.ts +14 -14
- package/src/client/Mppx.ts +25 -4
- package/src/client/Transport.test.ts +12 -45
- package/src/client/Transport.ts +3 -24
- package/src/client/internal/Fetch.test.ts +77 -0
- package/src/client/internal/Fetch.ts +112 -14
- package/src/client/internal/MethodChallenge.ts +5 -0
- package/src/client/internal/MethodResponse.ts +28 -0
- package/src/discovery/OpenApi.test.ts +170 -0
- package/src/discovery/OpenApi.ts +16 -48
- package/src/discovery/internal/Metadata.ts +51 -0
- package/src/evm/server/Charge.ts +6 -1
- package/src/internal/AcceptPayment.test.ts +12 -8
- package/src/internal/types.ts +9 -0
- package/src/mcp/client/McpClient.integration.test.ts +19 -32
- package/src/middlewares/elysia.test.ts +2 -12
- package/src/middlewares/express.test.ts +2 -12
- package/src/middlewares/hono.test.ts +6 -9
- package/src/middlewares/nextjs.test.ts +2 -12
- package/src/proxy/Proxy.test.ts +26 -19
- package/src/proxy/Proxy.ts +147 -9
- package/src/proxy/Proxy.upstreamError.test.ts +364 -0
- package/src/proxy/Service.test.ts +73 -3
- package/src/proxy/Service.ts +50 -23
- package/src/proxy/services/anthropic.ts +1 -0
- package/src/proxy/services/hooks.test-d.ts +14 -0
- package/src/proxy/services/hooks.test.ts +44 -0
- package/src/proxy/services/openai.ts +1 -0
- package/src/proxy/services/stripe.ts +1 -0
- package/src/server/Methods.test-d.ts +88 -0
- package/src/server/Methods.test.ts +69 -0
- package/src/server/Mppx.test-d.ts +141 -7
- package/src/server/Mppx.test.ts +1017 -119
- package/src/server/Mppx.ts +350 -54
- package/src/stripe/internal/constants.ts +1 -1
- package/src/stripe/internal/types.ts +1 -0
- package/src/stripe/server/Charge.test-d.ts +16 -1
- package/src/stripe/server/Charge.test.ts +79 -0
- package/src/stripe/server/Charge.ts +54 -1
- package/src/stripe/server/Methods.test-d.ts +157 -0
- package/src/stripe/server/Methods.test.ts +403 -0
- package/src/stripe/server/Methods.ts +423 -6
- package/src/stripe/server/internal/deposit-address.ts +57 -0
- package/src/stripe/server/internal/html/node_modules/.bin/mppx +3 -3
- package/src/stripe/server/internal/html/package.json +1 -1
- package/src/stripe/server/internal/html.gen.ts +1 -1
- package/src/stripe/server/internal/record-payment.ts +66 -0
- package/src/stripe/server/internal/request.ts +49 -0
- package/src/tap/Constants.ts +32 -0
- package/src/tap/Tap.test.ts +125 -0
- package/src/tap/Types.ts +11 -0
- package/src/tap/client/index.ts +54 -0
- package/src/tap/index.ts +4 -0
- package/src/tap/server/index.ts +48 -0
- package/src/tempo/PublicExports.test-d.ts +3 -3
- package/src/tempo/client/Charge.ts +1 -19
- package/src/tempo/internal/address.test.ts +42 -0
- package/src/tempo/internal/address.ts +3 -3
- package/src/tempo/internal/auto-swap.test.ts +4 -4
- package/src/tempo/internal/auto-swap.ts +7 -50
- package/src/tempo/legacy/README.md +5 -5
- package/src/tempo/legacy/index.ts +1 -3
- package/src/tempo/server/AtomicStore.test-d.ts +13 -0
- package/src/tempo/server/Charge.test.ts +19 -84
- package/src/tempo/server/Charge.ts +92 -56
- package/src/tempo/server/Methods.ts +0 -20
- package/src/tempo/server/Relay.test.ts +161 -7
- package/src/tempo/server/Relay.ts +15 -6
- package/src/tempo/server/SponsorBudget.test.ts +29 -0
- package/src/tempo/server/SponsorBudget.ts +7 -1
- package/src/tempo/server/Subscription.ts +4 -1
- package/src/tempo/server/index.ts +1 -1
- package/src/tempo/server/internal/html/node_modules/.bin/mppx +3 -3
- 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/transport.test.ts +22 -3
- package/src/tempo/server/internal/transport.ts +15 -3
- package/src/tempo/session/README.md +119 -0
- package/src/tempo/session/client/Session.test.ts +299 -33
- package/src/tempo/session/client/Session.ts +152 -16
- package/src/tempo/session/client/SessionManager.test.ts +216 -9
- package/src/tempo/session/client/SessionManager.ts +63 -17
- package/src/tempo/session/client/Transports.test.ts +22 -0
- package/src/tempo/session/client/Transports.ts +58 -22
- package/src/tempo/session/precompile/Chain.ts +131 -11
- package/src/tempo/session/server/ChannelStore.ts +33 -12
- package/src/tempo/session/server/CredentialVerification.test.ts +4 -4
- package/src/tempo/session/server/CredentialVerification.ts +340 -28
- package/src/tempo/session/server/MeteredStream.ts +5 -1
- package/src/tempo/session/server/Session.test.ts +483 -36
- package/src/tempo/session/server/Session.ts +159 -60
- package/src/tempo/session/server/Sse.test.ts +77 -0
- package/src/tempo/session/server/Sse.ts +8 -1
- package/src/tempo/session/server/Transports.ts +2 -1
- package/src/tempo/session/server/Ws.test.ts +171 -0
- package/src/tempo/session/server/Ws.ts +10 -1
- package/src/tempo/subscription/KeyAuthorization.test.ts +70 -1
- package/src/tempo/subscription/KeyAuthorization.ts +14 -3
- package/src/viem/Client.test.ts +18 -1
- package/src/viem/Client.ts +7 -1
- package/src/web-bot-auth/Constants.ts +24 -0
- package/src/web-bot-auth/Types.ts +9 -0
- package/src/web-bot-auth/WebBotAuth.test.ts +182 -0
- package/src/web-bot-auth/client/index.ts +84 -0
- package/src/web-bot-auth/index.ts +6 -0
- package/src/web-bot-auth/internal/JwkThumbprint.ts +21 -0
- package/src/web-bot-auth/internal/SignatureAgent.ts +18 -0
- package/src/web-bot-auth/server/index.ts +113 -0
- package/src/x402/Exact.e2e.test.ts +121 -81
- package/src/x402/Exact.localnet.test.ts +1 -1
- package/src/x402/server/EvmCharge.ts +35 -19
- package/dist/tempo/legacy/server/Session.d.ts +0 -208
- package/dist/tempo/legacy/server/Session.d.ts.map +0 -1
- package/dist/tempo/legacy/server/Session.js +0 -698
- package/dist/tempo/legacy/server/Session.js.map +0 -1
- package/dist/tempo/legacy/server/index.d.ts +0 -5
- package/dist/tempo/legacy/server/index.d.ts.map +0 -1
- package/dist/tempo/legacy/server/index.js +0 -5
- package/dist/tempo/legacy/server/index.js.map +0 -1
- package/dist/tempo/legacy/session/ChannelStore.d.ts +0 -22
- package/dist/tempo/legacy/session/ChannelStore.d.ts.map +0 -1
- package/dist/tempo/legacy/session/ChannelStore.js +0 -6
- package/dist/tempo/legacy/session/ChannelStore.js.map +0 -1
- package/src/tempo/legacy/server/Defaults.test-d.ts +0 -9
- package/src/tempo/legacy/server/Session.test.ts +0 -6370
- package/src/tempo/legacy/server/Session.ts +0 -1024
- package/src/tempo/legacy/server/index.ts +0 -4
- package/src/tempo/legacy/session/ChannelStore.test.ts +0 -58
- package/src/tempo/legacy/session/ChannelStore.ts +0 -39
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as Challenge from '../Challenge.js'
|
|
1
2
|
import * as Method from '../Method.js'
|
|
2
3
|
import * as Mppx from '../server/Mppx.js'
|
|
3
4
|
import * as z from '../zod.js'
|
|
@@ -56,6 +57,8 @@ const subscribe = Method.toServer(
|
|
|
56
57
|
credential: { payload: z.object({ signature: z.string() }) },
|
|
57
58
|
request: z.object({
|
|
58
59
|
amount: z.string(),
|
|
60
|
+
interval: z.string(),
|
|
61
|
+
recipient: z.string(),
|
|
59
62
|
}),
|
|
60
63
|
},
|
|
61
64
|
}),
|
|
@@ -69,6 +72,38 @@ const subscribe = Method.toServer(
|
|
|
69
72
|
},
|
|
70
73
|
)
|
|
71
74
|
|
|
75
|
+
const transformedCharge = Method.toServer(
|
|
76
|
+
Method.from({
|
|
77
|
+
intent: 'charge',
|
|
78
|
+
name: 'transformed',
|
|
79
|
+
schema: {
|
|
80
|
+
credential: { payload: z.object({ signature: z.string() }) },
|
|
81
|
+
request: z.pipe(
|
|
82
|
+
z.object({
|
|
83
|
+
amount: z.string(),
|
|
84
|
+
asset: z.string(),
|
|
85
|
+
decimals: z.number(),
|
|
86
|
+
recipient: z.string(),
|
|
87
|
+
}),
|
|
88
|
+
z.transform(({ amount, asset, decimals, recipient }) => ({
|
|
89
|
+
amount: String(Number(amount) * 10 ** decimals),
|
|
90
|
+
currency: asset,
|
|
91
|
+
methodDetails: { decimals },
|
|
92
|
+
recipient,
|
|
93
|
+
})),
|
|
94
|
+
),
|
|
95
|
+
},
|
|
96
|
+
}),
|
|
97
|
+
{
|
|
98
|
+
verify: async () => ({
|
|
99
|
+
method: 'transformed',
|
|
100
|
+
reference: '',
|
|
101
|
+
status: 'success' as const,
|
|
102
|
+
timestamp: '',
|
|
103
|
+
}),
|
|
104
|
+
},
|
|
105
|
+
)
|
|
106
|
+
|
|
72
107
|
function createMppx<const methods extends Mppx.Methods>(methods: methods) {
|
|
73
108
|
return Mppx.create({
|
|
74
109
|
methods,
|
|
@@ -169,6 +204,7 @@ describe('generate', () => {
|
|
|
169
204
|
{
|
|
170
205
|
"amount": "50",
|
|
171
206
|
"currency": "usd",
|
|
207
|
+
"description": "Search credits",
|
|
172
208
|
"intent": "charge",
|
|
173
209
|
"method": "tempo",
|
|
174
210
|
"recipient": "0x1",
|
|
@@ -182,6 +218,140 @@ describe('generate', () => {
|
|
|
182
218
|
`)
|
|
183
219
|
})
|
|
184
220
|
|
|
221
|
+
test('matches handler discovery to its canonical runtime challenge', async () => {
|
|
222
|
+
const mppx = createMppx([transformedCharge])
|
|
223
|
+
const handler = mppx.charge({
|
|
224
|
+
amount: '2',
|
|
225
|
+
asset: '0xUSDC',
|
|
226
|
+
decimals: 6,
|
|
227
|
+
description: 'Canonical price',
|
|
228
|
+
recipient: '0x1',
|
|
229
|
+
})
|
|
230
|
+
|
|
231
|
+
const doc = generate(mppx, {
|
|
232
|
+
routes: [{ handler, method: 'post', path: '/api/resource' }],
|
|
233
|
+
}) as any
|
|
234
|
+
const result = await handler(new Request('https://example.com/api/resource'))
|
|
235
|
+
if (result.status !== 402) throw new Error('Expected payment challenge')
|
|
236
|
+
const challenge = Challenge.fromResponse(result.challenge)
|
|
237
|
+
|
|
238
|
+
expect(doc.paths['/api/resource'].post['x-payment-info'].offers[0]).toEqual({
|
|
239
|
+
amount: challenge.request.amount,
|
|
240
|
+
currency: challenge.request.currency,
|
|
241
|
+
description: challenge.description,
|
|
242
|
+
intent: challenge.intent,
|
|
243
|
+
method: challenge.method,
|
|
244
|
+
recipient: challenge.request.recipient,
|
|
245
|
+
})
|
|
246
|
+
})
|
|
247
|
+
|
|
248
|
+
test('applies method schema transforms to legacy route discovery', () => {
|
|
249
|
+
const mppx = createMppx([transformedCharge])
|
|
250
|
+
const doc = generate(mppx, {
|
|
251
|
+
routes: [
|
|
252
|
+
{
|
|
253
|
+
intent: 'charge',
|
|
254
|
+
method: 'post',
|
|
255
|
+
options: {
|
|
256
|
+
amount: '2',
|
|
257
|
+
asset: '0xUSDC',
|
|
258
|
+
decimals: 6,
|
|
259
|
+
description: 'Canonical price',
|
|
260
|
+
recipient: '0x1',
|
|
261
|
+
},
|
|
262
|
+
path: '/api/resource',
|
|
263
|
+
},
|
|
264
|
+
],
|
|
265
|
+
}) as any
|
|
266
|
+
|
|
267
|
+
expect(doc.paths['/api/resource'].post['x-payment-info'].offers[0]).toEqual({
|
|
268
|
+
amount: '2000000',
|
|
269
|
+
currency: '0xUSDC',
|
|
270
|
+
description: 'Canonical price',
|
|
271
|
+
intent: 'charge',
|
|
272
|
+
method: 'transformed',
|
|
273
|
+
recipient: '0x1',
|
|
274
|
+
})
|
|
275
|
+
})
|
|
276
|
+
|
|
277
|
+
test('derives only explicitly composed payment offers from a handler', () => {
|
|
278
|
+
const mppx = createMppx([charge, session])
|
|
279
|
+
const handler = mppx.compose(
|
|
280
|
+
['tempo/charge', { amount: '50', currency: '0xUSDC', description: 'USDC', recipient: '0x1' }],
|
|
281
|
+
[
|
|
282
|
+
'tempo/charge',
|
|
283
|
+
{ amount: '50', currency: '0xNANOUSD', description: 'NANOUSD', recipient: '0x1' },
|
|
284
|
+
],
|
|
285
|
+
)
|
|
286
|
+
|
|
287
|
+
const doc = generate(mppx, {
|
|
288
|
+
routes: [{ handler, method: 'post', path: '/api/search' }],
|
|
289
|
+
}) as any
|
|
290
|
+
|
|
291
|
+
expect(doc.paths['/api/search'].post['x-payment-info'].offers).toEqual([
|
|
292
|
+
{
|
|
293
|
+
amount: '50',
|
|
294
|
+
currency: '0xUSDC',
|
|
295
|
+
description: 'USDC',
|
|
296
|
+
intent: 'charge',
|
|
297
|
+
method: 'tempo',
|
|
298
|
+
recipient: '0x1',
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
amount: '50',
|
|
302
|
+
currency: '0xNANOUSD',
|
|
303
|
+
description: 'NANOUSD',
|
|
304
|
+
intent: 'charge',
|
|
305
|
+
method: 'tempo',
|
|
306
|
+
recipient: '0x1',
|
|
307
|
+
},
|
|
308
|
+
])
|
|
309
|
+
})
|
|
310
|
+
|
|
311
|
+
test('keeps nested composed discovery in runtime challenge order', async () => {
|
|
312
|
+
const mppx = createMppx([charge])
|
|
313
|
+
const handler = Mppx.compose(
|
|
314
|
+
mppx.charge({
|
|
315
|
+
amount: '1',
|
|
316
|
+
currency: '0xUSDC',
|
|
317
|
+
description: 'USDC',
|
|
318
|
+
recipient: '0x1',
|
|
319
|
+
}),
|
|
320
|
+
Mppx.compose(
|
|
321
|
+
mppx.charge({
|
|
322
|
+
amount: '2',
|
|
323
|
+
currency: '0xNANOUSD',
|
|
324
|
+
description: 'NANOUSD',
|
|
325
|
+
recipient: '0x1',
|
|
326
|
+
}),
|
|
327
|
+
mppx.charge({
|
|
328
|
+
amount: '3',
|
|
329
|
+
currency: 'usd',
|
|
330
|
+
description: 'Card',
|
|
331
|
+
recipient: '0x1',
|
|
332
|
+
}),
|
|
333
|
+
),
|
|
334
|
+
)
|
|
335
|
+
|
|
336
|
+
const doc = generate(mppx, {
|
|
337
|
+
routes: [{ handler, method: 'post', path: '/api/search' }],
|
|
338
|
+
}) as any
|
|
339
|
+
const result = await handler(new Request('https://example.com/api/search'))
|
|
340
|
+
if (result.status !== 402) throw new Error('Expected payment challenge')
|
|
341
|
+
|
|
342
|
+
const discovered = doc.paths['/api/search'].post['x-payment-info'].offers
|
|
343
|
+
const challenged = Challenge.fromResponseList(result.challenge).map((challenge) => ({
|
|
344
|
+
amount: challenge.request.amount,
|
|
345
|
+
currency: challenge.request.currency,
|
|
346
|
+
description: challenge.description,
|
|
347
|
+
intent: challenge.intent,
|
|
348
|
+
method: challenge.method,
|
|
349
|
+
recipient: challenge.request.recipient,
|
|
350
|
+
}))
|
|
351
|
+
|
|
352
|
+
expect(discovered).toEqual(challenged)
|
|
353
|
+
})
|
|
354
|
+
|
|
185
355
|
test('handles null amount for session intent', () => {
|
|
186
356
|
const mppx = createMppx([session])
|
|
187
357
|
const doc = generate(mppx, {
|
package/src/discovery/OpenApi.ts
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import type * as Method from '../Method.js'
|
|
2
|
+
import * as PaymentRequest from '../PaymentRequest.js'
|
|
2
3
|
import { PaymentInfo, type ServiceInfo } from './Discovery.js'
|
|
4
|
+
import * as Metadata from './internal/Metadata.js'
|
|
3
5
|
|
|
6
|
+
/** Payment handler carrying metadata used to generate discovery documents. */
|
|
4
7
|
export type DiscoveryHandler = ((...args: any[]) => unknown) & {
|
|
5
|
-
_internal?:
|
|
6
|
-
_canonicalRequest: Record<string, unknown>
|
|
7
|
-
intent: string
|
|
8
|
-
name: string
|
|
9
|
-
}
|
|
8
|
+
_internal?: Metadata.Metadata
|
|
10
9
|
}
|
|
11
10
|
|
|
12
11
|
export type LegacyRouteConfig = {
|
|
@@ -151,11 +150,9 @@ function resolveRoute(
|
|
|
151
150
|
return {
|
|
152
151
|
method: route.method,
|
|
153
152
|
path: route.path,
|
|
154
|
-
payment:
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
method: internal.name,
|
|
158
|
-
}),
|
|
153
|
+
payment: {
|
|
154
|
+
offers: Metadata.offers(internal).map(Metadata.paymentOffer),
|
|
155
|
+
},
|
|
159
156
|
...(route.requestBody ? { requestBody: route.requestBody } : {}),
|
|
160
157
|
...(route.summary ? { summary: route.summary } : {}),
|
|
161
158
|
}
|
|
@@ -168,52 +165,23 @@ function resolveRoute(
|
|
|
168
165
|
)
|
|
169
166
|
}
|
|
170
167
|
|
|
168
|
+
const { description, ...options } = route.options
|
|
169
|
+
const metadata: Metadata.Offer = {
|
|
170
|
+
_canonicalRequest: PaymentRequest.fromMethod(mi, options as never),
|
|
171
|
+
...(typeof description === 'string' ? { description } : {}),
|
|
172
|
+
intent: mi.intent,
|
|
173
|
+
name: mi.name,
|
|
174
|
+
}
|
|
175
|
+
|
|
171
176
|
return {
|
|
172
177
|
method: route.method,
|
|
173
178
|
path: route.path,
|
|
174
|
-
payment:
|
|
175
|
-
canonicalRequest: route.options,
|
|
176
|
-
intent: mi.intent,
|
|
177
|
-
method: mi.name,
|
|
178
|
-
}),
|
|
179
|
+
payment: Metadata.paymentOffer(metadata),
|
|
179
180
|
...(route.requestBody ? { requestBody: route.requestBody } : {}),
|
|
180
181
|
...(route.summary ? { summary: route.summary } : {}),
|
|
181
182
|
}
|
|
182
183
|
}
|
|
183
184
|
|
|
184
|
-
function paymentInfoFromCanonical(route: {
|
|
185
|
-
canonicalRequest: Record<string, unknown>
|
|
186
|
-
intent: string
|
|
187
|
-
method: string
|
|
188
|
-
}) {
|
|
189
|
-
const { canonicalRequest, intent, method } = route
|
|
190
|
-
const methodDetails = (canonicalRequest.methodDetails ?? {}) as Record<string, unknown>
|
|
191
|
-
|
|
192
|
-
const amount = pickString(canonicalRequest.amount) ?? pickString(methodDetails.amount) ?? null
|
|
193
|
-
const currency = pickString(canonicalRequest.currency) ?? pickString(methodDetails.currency)
|
|
194
|
-
const description = pickString(canonicalRequest.description)
|
|
195
|
-
|
|
196
|
-
const base: Record<string, unknown> = {
|
|
197
|
-
amount,
|
|
198
|
-
...(currency ? { currency } : {}),
|
|
199
|
-
...(description ? { description } : {}),
|
|
200
|
-
intent,
|
|
201
|
-
method,
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// Forward any extra canonical params that aren't already covered.
|
|
205
|
-
const reserved = new Set(['amount', 'currency', 'description', 'methodDetails'])
|
|
206
|
-
for (const [key, value] of Object.entries(canonicalRequest)) {
|
|
207
|
-
if (!reserved.has(key) && value !== undefined) base[key] = value
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
return base
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
function pickString(value: unknown) {
|
|
214
|
-
return typeof value === 'string' ? value : undefined
|
|
215
|
-
}
|
|
216
|
-
|
|
217
185
|
function withBasePath(basePath: string | undefined, path: string) {
|
|
218
186
|
if (!basePath) return path
|
|
219
187
|
const normalizedBasePath = basePath.startsWith('/') ? basePath : `/${basePath}`
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/** Metadata retained by one explicitly configured payment handler. */
|
|
2
|
+
export type Offer = {
|
|
3
|
+
_canonicalRequest: Record<string, unknown>
|
|
4
|
+
description?: string | undefined
|
|
5
|
+
intent: string
|
|
6
|
+
name: string
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/** Metadata retained by a single or composed payment handler. */
|
|
10
|
+
export type Metadata = Offer | { offers: readonly Offer[] }
|
|
11
|
+
|
|
12
|
+
/** Returns every explicitly configured offer from discovery metadata. */
|
|
13
|
+
export function offers(metadata: Metadata): readonly Offer[] {
|
|
14
|
+
if (isComposed(metadata)) return metadata.offers
|
|
15
|
+
return [metadata]
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Converts configured handler metadata into a discovery payment offer. */
|
|
19
|
+
export function paymentOffer(metadata: Offer): Record<string, unknown> {
|
|
20
|
+
const { _canonicalRequest: request, intent, name: method } = metadata
|
|
21
|
+
const methodDetails = (request.methodDetails ?? {}) as Record<string, unknown>
|
|
22
|
+
|
|
23
|
+
const amount = pickString(request.amount) ?? pickString(methodDetails.amount) ?? null
|
|
24
|
+
const currency = pickString(request.currency) ?? pickString(methodDetails.currency)
|
|
25
|
+
const description = pickString(metadata.description) ?? pickString(request.description)
|
|
26
|
+
|
|
27
|
+
const offer: Record<string, unknown> = {
|
|
28
|
+
amount,
|
|
29
|
+
...(currency ? { currency } : {}),
|
|
30
|
+
...(description ? { description } : {}),
|
|
31
|
+
intent,
|
|
32
|
+
method,
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Preserve extension fields emitted by method request schemas.
|
|
36
|
+
const reserved = new Set(['amount', 'currency', 'description', 'methodDetails'])
|
|
37
|
+
for (const [key, value] of Object.entries(request)) {
|
|
38
|
+
if (!reserved.has(key) && value !== undefined) offer[key] = value
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return offer
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Returns whether metadata represents a composed handler. */
|
|
45
|
+
export function isComposed(metadata: Metadata): metadata is Extract<Metadata, { offers: unknown }> {
|
|
46
|
+
return 'offers' in metadata && !('_canonicalRequest' in metadata)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function pickString(value: unknown) {
|
|
50
|
+
return typeof value === 'string' ? value : undefined
|
|
51
|
+
}
|
package/src/evm/server/Charge.ts
CHANGED
|
@@ -24,6 +24,8 @@ export function charge(parameters: charge.NativeConfig): Method.AnyServer {
|
|
|
24
24
|
const transport = httpTransport(paths)
|
|
25
25
|
|
|
26
26
|
return Method.toServer<typeof Methods.charge, charge.Defaults, typeof transport>(Methods.charge, {
|
|
27
|
+
canOffer: parameters.canOffer,
|
|
28
|
+
onPaymentSuccess: parameters.onPaymentSuccess,
|
|
27
29
|
defaults: {
|
|
28
30
|
chainId: config.chainId,
|
|
29
31
|
currency: config.currency,
|
|
@@ -107,7 +109,10 @@ export declare namespace charge {
|
|
|
107
109
|
type Parameters = NativeConfig
|
|
108
110
|
type Native = Method.Server<typeof Methods.charge, Defaults>
|
|
109
111
|
|
|
110
|
-
type NativeConfig = BaseConfig &
|
|
112
|
+
type NativeConfig = BaseConfig &
|
|
113
|
+
CurrencyConfig &
|
|
114
|
+
RecipientConfig &
|
|
115
|
+
Method.ComposableHooks<typeof Methods.charge>
|
|
111
116
|
|
|
112
117
|
type BaseConfig = {
|
|
113
118
|
/** EIP-3009 token domain metadata. Required for raw addresses and viem tokens; inferred for known assets. */
|
|
@@ -226,21 +226,21 @@ describe('AcceptPayment', () => {
|
|
|
226
226
|
test('selectChallengeCandidates supports duplicate method keys with challenge predicates', () => {
|
|
227
227
|
const challenges = [
|
|
228
228
|
{
|
|
229
|
-
id: '
|
|
229
|
+
id: 'primary',
|
|
230
230
|
intent: 'session',
|
|
231
231
|
method: 'tempo',
|
|
232
232
|
realm: 'test',
|
|
233
|
-
request: { methodDetails: { sessionProtocol: '
|
|
233
|
+
request: { methodDetails: { sessionProtocol: 'primary' } },
|
|
234
234
|
},
|
|
235
235
|
{
|
|
236
|
-
id: '
|
|
236
|
+
id: 'fallback',
|
|
237
237
|
intent: 'session',
|
|
238
238
|
method: 'tempo',
|
|
239
239
|
realm: 'test',
|
|
240
|
-
request: { methodDetails: { sessionProtocol: '
|
|
240
|
+
request: { methodDetails: { sessionProtocol: 'fallback' } },
|
|
241
241
|
},
|
|
242
242
|
{
|
|
243
|
-
id: '
|
|
243
|
+
id: 'unmarked',
|
|
244
244
|
intent: 'session',
|
|
245
245
|
method: 'tempo',
|
|
246
246
|
realm: 'test',
|
|
@@ -257,7 +257,7 @@ describe('AcceptPayment', () => {
|
|
|
257
257
|
challenge: AcceptPayment.ChallengeCandidate['challenge']
|
|
258
258
|
}) =>
|
|
259
259
|
(challenge.request.methodDetails as { sessionProtocol?: string } | undefined)
|
|
260
|
-
?.sessionProtocol === '
|
|
260
|
+
?.sessionProtocol === 'primary',
|
|
261
261
|
},
|
|
262
262
|
{
|
|
263
263
|
name: 'tempo',
|
|
@@ -270,7 +270,7 @@ describe('AcceptPayment', () => {
|
|
|
270
270
|
const sessionProtocol = (
|
|
271
271
|
challenge.request.methodDetails as { sessionProtocol?: string } | undefined
|
|
272
272
|
)?.sessionProtocol
|
|
273
|
-
return sessionProtocol === undefined || sessionProtocol === '
|
|
273
|
+
return sessionProtocol === undefined || sessionProtocol === 'fallback'
|
|
274
274
|
},
|
|
275
275
|
},
|
|
276
276
|
] as const
|
|
@@ -281,7 +281,11 @@ describe('AcceptPayment', () => {
|
|
|
281
281
|
AcceptPayment.parse('tempo/session'),
|
|
282
282
|
)
|
|
283
283
|
|
|
284
|
-
expect(candidates.map(({ challenge }) => challenge.id)).toEqual([
|
|
284
|
+
expect(candidates.map(({ challenge }) => challenge.id)).toEqual([
|
|
285
|
+
'primary',
|
|
286
|
+
'fallback',
|
|
287
|
+
'unmarked',
|
|
288
|
+
])
|
|
285
289
|
})
|
|
286
290
|
|
|
287
291
|
test('selectChallenge honors a specific opt-out over a broader wildcard', () => {
|
package/src/internal/types.ts
CHANGED
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
// https://twitter.com/mattpocockuk/status/1622730173446557697?s=20&t=NdpAcmEFXY01xkqU3KO0Mg
|
|
3
3
|
export type Compute<type> = { [key in keyof type]: type[key] } & unknown
|
|
4
4
|
|
|
5
|
+
/** Recursively makes every property of a value readonly. */
|
|
6
|
+
export type DeepReadonly<type> = type extends (...args: infer _arguments) => infer _return
|
|
7
|
+
? type
|
|
8
|
+
: type extends readonly unknown[]
|
|
9
|
+
? { readonly [key in keyof type]: DeepReadonly<type[key]> }
|
|
10
|
+
: type extends object
|
|
11
|
+
? { readonly [key in keyof type]: DeepReadonly<type[key]> }
|
|
12
|
+
: type
|
|
13
|
+
|
|
5
14
|
declare const symbol: unique symbol
|
|
6
15
|
|
|
7
16
|
/**
|
|
@@ -6,20 +6,22 @@ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/
|
|
|
6
6
|
import { createMcpExpressApp } from '@modelcontextprotocol/sdk/server/express.js'
|
|
7
7
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
|
|
8
8
|
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'
|
|
9
|
-
import {
|
|
9
|
+
import { session as tempo_session_client, tempo as tempo_client } from 'mppx/client'
|
|
10
10
|
import { Mppx as Mppx_server, tempo as tempo_server } from 'mppx/server'
|
|
11
11
|
import type { Address } from 'viem'
|
|
12
12
|
import { readContract } from 'viem/actions'
|
|
13
13
|
import { Actions, Addresses } from 'viem/tempo'
|
|
14
14
|
import { beforeAll, describe, expect, test } from 'vp/test'
|
|
15
15
|
import { tempoNetwork } from '~test/config.js'
|
|
16
|
-
import { deployEscrow, signTopUpChannel } from '~test/tempo/legacy/session.js'
|
|
17
16
|
import { accounts, asset, client as testClient, fundAccount } from '~test/tempo/viem.js'
|
|
18
17
|
|
|
19
18
|
import * as Credential from '../../Credential.js'
|
|
20
19
|
import * as core_Mcp from '../../Mcp.js'
|
|
21
20
|
import * as Store from '../../Store.js'
|
|
22
|
-
import type {
|
|
21
|
+
import type {
|
|
22
|
+
SessionCredentialPayload,
|
|
23
|
+
SessionReceipt,
|
|
24
|
+
} from '../../tempo/session/precompile/Protocol.js'
|
|
23
25
|
import * as ChannelStore from '../../tempo/session/server/ChannelStore.js'
|
|
24
26
|
import * as McpServer_transport from '../server/Transport.js'
|
|
25
27
|
import * as McpClient from './McpClient.js'
|
|
@@ -31,21 +33,11 @@ const doubleSessionAmountRaw = chargeAmountRaw * 2n
|
|
|
31
33
|
const topUpAmountRaw = chargeAmountRaw * 3n
|
|
32
34
|
const isLocalnet = tempoNetwork === 'localnet'
|
|
33
35
|
|
|
34
|
-
let escrowContract: Address
|
|
35
|
-
|
|
36
|
-
// TODO: Remove once the minimum viem version is >=2.54.0, which uses client-first Tempo call builders.
|
|
37
36
|
function tokenGetBalanceCall(parameters: { account: Address; token: Address }) {
|
|
38
|
-
|
|
39
|
-
length: number
|
|
40
|
-
(parameters: { account: Address; token: Address }): unknown
|
|
41
|
-
(client: unknown, parameters: { account: Address; token: Address }): unknown
|
|
42
|
-
}
|
|
43
|
-
if (call.length >= 2) return call(testClient, parameters)
|
|
44
|
-
return call(parameters)
|
|
37
|
+
return Actions.token.getBalance.call(testClient, parameters)
|
|
45
38
|
}
|
|
46
39
|
|
|
47
40
|
beforeAll(async () => {
|
|
48
|
-
escrowContract = await deployEscrow()
|
|
49
41
|
await fundAccount({ address: accounts[4].address, token: Addresses.pathUsd })
|
|
50
42
|
await fundAccount({ address: accounts[4].address, token: asset })
|
|
51
43
|
await fundAccount({ address: accounts[2].address, token: Addresses.pathUsd })
|
|
@@ -171,6 +163,7 @@ describe.runIf(isLocalnet)('McpClient.wrap integration', () => {
|
|
|
171
163
|
action: 'voucher',
|
|
172
164
|
channelId: openReceipt!.channelId,
|
|
173
165
|
cumulativeAmountRaw: replayedCumulativeRaw,
|
|
166
|
+
descriptor: credentialDescriptor(openCredential),
|
|
174
167
|
},
|
|
175
168
|
})
|
|
176
169
|
const firstVoucher = await callToolWithCredential(
|
|
@@ -236,7 +229,7 @@ describe.runIf(isLocalnet)('McpClient.wrap integration', () => {
|
|
|
236
229
|
{
|
|
237
230
|
name: 'session intent can top up a live MCP channel and continue metering on the same channel',
|
|
238
231
|
sessionFeePayer: true,
|
|
239
|
-
sessionMaxDeposit: '
|
|
232
|
+
sessionMaxDeposit: '5',
|
|
240
233
|
async run(harness: Harness) {
|
|
241
234
|
const openChallenge = await getPaymentChallenge(harness.sdkClient, 'session_tool')
|
|
242
235
|
const openCredential = await harness.sessionMethod.createCredential({
|
|
@@ -269,14 +262,6 @@ describe.runIf(isLocalnet)('McpClient.wrap integration', () => {
|
|
|
269
262
|
expect(meteredReceipt?.channelId).toBe(openReceipt?.channelId)
|
|
270
263
|
expect(meteredReceipt?.acceptedCumulative).toBe((chargeAmountRaw * 2n).toString())
|
|
271
264
|
|
|
272
|
-
const { serializedTransaction } = await signTopUpChannel({
|
|
273
|
-
escrow: escrowContract,
|
|
274
|
-
feePayer: true,
|
|
275
|
-
payer: accounts[2],
|
|
276
|
-
channelId: openReceipt!.channelId,
|
|
277
|
-
token: asset,
|
|
278
|
-
amount: topUpAmountRaw,
|
|
279
|
-
})
|
|
280
265
|
const topUpChallenge = await getPaymentChallenge(harness.sdkClient, 'session_tool')
|
|
281
266
|
const topUpCredential = await harness.sessionMethod.createCredential({
|
|
282
267
|
challenge: topUpChallenge,
|
|
@@ -284,7 +269,7 @@ describe.runIf(isLocalnet)('McpClient.wrap integration', () => {
|
|
|
284
269
|
action: 'topUp',
|
|
285
270
|
additionalDepositRaw: topUpAmountRaw.toString(),
|
|
286
271
|
channelId: openReceipt!.channelId,
|
|
287
|
-
|
|
272
|
+
descriptor: credentialDescriptor(openCredential),
|
|
288
273
|
},
|
|
289
274
|
})
|
|
290
275
|
const toppedUp = await callToolWithCredential(
|
|
@@ -317,7 +302,7 @@ describe.runIf(isLocalnet)('McpClient.wrap integration', () => {
|
|
|
317
302
|
expect(resumedReceipt?.acceptedCumulative).toBe((chargeAmountRaw * 3n).toString())
|
|
318
303
|
|
|
319
304
|
const channel = await harness.sessionStore.getChannel(openReceipt!.channelId)
|
|
320
|
-
expect(channel?.deposit).toBe(chargeAmountRaw *
|
|
305
|
+
expect(channel?.deposit).toBe(chargeAmountRaw * 5n + topUpAmountRaw)
|
|
321
306
|
expect(channel?.highestVoucherAmount).toBe(chargeAmountRaw * 3n)
|
|
322
307
|
expect(channel?.spent).toBeGreaterThanOrEqual(BigInt(topUpReceipt!.spent))
|
|
323
308
|
expect(channel?.units).toBeGreaterThanOrEqual(topUpReceipt?.units ?? 0)
|
|
@@ -362,6 +347,7 @@ describe.runIf(isLocalnet)('McpClient.wrap integration', () => {
|
|
|
362
347
|
action: 'close',
|
|
363
348
|
channelId: openReceipt!.channelId,
|
|
364
349
|
cumulativeAmountRaw: (chargeAmountRaw * 2n).toString(),
|
|
350
|
+
descriptor: credentialDescriptor(openCredential),
|
|
365
351
|
},
|
|
366
352
|
})
|
|
367
353
|
const closed = await callToolWithCredential(
|
|
@@ -452,7 +438,6 @@ type Harness = {
|
|
|
452
438
|
|
|
453
439
|
async function createHarness(options?: {
|
|
454
440
|
sessionFeePayer?: boolean | undefined
|
|
455
|
-
sessionDeposit?: string | undefined
|
|
456
441
|
sessionMaxDeposit?: string | undefined
|
|
457
442
|
}): Promise<Harness> {
|
|
458
443
|
const sessionBackingStore = Store.memory()
|
|
@@ -463,11 +448,8 @@ async function createHarness(options?: {
|
|
|
463
448
|
})
|
|
464
449
|
const sessionMethod = tempo_session_client({
|
|
465
450
|
account: accounts[2],
|
|
466
|
-
escrowContract,
|
|
467
451
|
getClient: () => testClient,
|
|
468
|
-
...(options?.sessionMaxDeposit
|
|
469
|
-
? { maxDeposit: options.sessionMaxDeposit }
|
|
470
|
-
: { deposit: options?.sessionDeposit ?? '5' }),
|
|
452
|
+
...(options?.sessionMaxDeposit ? { maxDeposit: options.sessionMaxDeposit } : {}),
|
|
471
453
|
})
|
|
472
454
|
|
|
473
455
|
const payment = Mppx_server.create({
|
|
@@ -477,10 +459,9 @@ async function createHarness(options?: {
|
|
|
477
459
|
currency: asset,
|
|
478
460
|
getClient: () => testClient,
|
|
479
461
|
}),
|
|
480
|
-
tempo_server.
|
|
462
|
+
tempo_server.session({
|
|
481
463
|
account: accounts[0],
|
|
482
464
|
currency: asset,
|
|
483
|
-
escrowContract,
|
|
484
465
|
getClient: () => testClient,
|
|
485
466
|
store: sessionBackingStore,
|
|
486
467
|
...(options?.sessionFeePayer ? { feePayer: accounts[4] } : {}),
|
|
@@ -578,6 +559,12 @@ async function createHarness(options?: {
|
|
|
578
559
|
}
|
|
579
560
|
}
|
|
580
561
|
|
|
562
|
+
function credentialDescriptor(serializedCredential: string) {
|
|
563
|
+
const payload = Credential.deserialize<SessionCredentialPayload>(serializedCredential).payload
|
|
564
|
+
if (!payload.descriptor) throw new Error('Session credential is missing its channel descriptor.')
|
|
565
|
+
return payload.descriptor
|
|
566
|
+
}
|
|
567
|
+
|
|
581
568
|
async function getPaymentChallenge(client: Client, toolName: string): Promise<SessionChallenge> {
|
|
582
569
|
try {
|
|
583
570
|
await client.callTool({ name: toolName, arguments: {} })
|
|
@@ -2,18 +2,12 @@ import * as http from 'node:http'
|
|
|
2
2
|
|
|
3
3
|
import { Elysia } from 'elysia'
|
|
4
4
|
import { Receipt } from 'mppx'
|
|
5
|
-
import {
|
|
6
|
-
Mppx as Mppx_client,
|
|
7
|
-
sessionLegacy as sessionIntent,
|
|
8
|
-
tempo as tempo_client,
|
|
9
|
-
} from 'mppx/client'
|
|
5
|
+
import { Mppx as Mppx_client, session as sessionIntent, tempo as tempo_client } from 'mppx/client'
|
|
10
6
|
import { Mppx, discovery, payment } from 'mppx/elysia'
|
|
11
7
|
import { tempo as tempo_server } from 'mppx/server'
|
|
12
|
-
import type { Address } from 'viem'
|
|
13
8
|
import { Addresses } from 'viem/tempo'
|
|
14
9
|
import { beforeAll, describe, expect, test } from 'vp/test'
|
|
15
10
|
import * as TestHttp from '~test/Http.js'
|
|
16
|
-
import { deployEscrow } from '~test/tempo/legacy/session.js'
|
|
17
11
|
import { accounts, asset, client, fundAccount } from '~test/tempo/viem.js'
|
|
18
12
|
|
|
19
13
|
function createServer(app: Elysia<any, any, any, any, any, any, any>) {
|
|
@@ -201,16 +195,13 @@ describe('charge', () => {
|
|
|
201
195
|
})
|
|
202
196
|
|
|
203
197
|
describe('session', () => {
|
|
204
|
-
let escrowContract: Address
|
|
205
|
-
|
|
206
198
|
function createSessionHarness(feePayer: boolean) {
|
|
207
199
|
const mppx = Mppx.create({
|
|
208
200
|
methods: [
|
|
209
|
-
tempo_server.
|
|
201
|
+
tempo_server.session({
|
|
210
202
|
getClient: () => client,
|
|
211
203
|
account: accounts[0],
|
|
212
204
|
currency: asset,
|
|
213
|
-
escrowContract,
|
|
214
205
|
...(feePayer ? { feePayer: accounts[1] } : {}),
|
|
215
206
|
} as any),
|
|
216
207
|
],
|
|
@@ -232,7 +223,6 @@ describe('session', () => {
|
|
|
232
223
|
}
|
|
233
224
|
|
|
234
225
|
beforeAll(async () => {
|
|
235
|
-
escrowContract = await deployEscrow()
|
|
236
226
|
await fundAccount({ address: accounts[1].address, token: Addresses.pathUsd })
|
|
237
227
|
await fundAccount({ address: accounts[1].address, token: asset })
|
|
238
228
|
await fundAccount({ address: accounts[2].address, token: Addresses.pathUsd })
|
|
@@ -1,17 +1,11 @@
|
|
|
1
1
|
import express from 'express'
|
|
2
2
|
import { Receipt } from 'mppx'
|
|
3
|
-
import {
|
|
4
|
-
Mppx as Mppx_client,
|
|
5
|
-
sessionLegacy as sessionIntent,
|
|
6
|
-
tempo as tempo_client,
|
|
7
|
-
} from 'mppx/client'
|
|
3
|
+
import { Mppx as Mppx_client, session as sessionIntent, tempo as tempo_client } from 'mppx/client'
|
|
8
4
|
import { Mppx, discovery, payment } from 'mppx/express'
|
|
9
5
|
import { Mppx as Mppx_server, tempo as tempo_server } from 'mppx/server'
|
|
10
|
-
import type { Address } from 'viem'
|
|
11
6
|
import { Addresses } from 'viem/tempo'
|
|
12
7
|
import { beforeAll, describe, expect, test } from 'vp/test'
|
|
13
8
|
import * as Http from '~test/Http.js'
|
|
14
|
-
import { deployEscrow } from '~test/tempo/legacy/session.js'
|
|
15
9
|
import { accounts, asset, client, fundAccount } from '~test/tempo/viem.js'
|
|
16
10
|
|
|
17
11
|
function createServer(app: express.Express) {
|
|
@@ -195,16 +189,13 @@ describe('payment', () => {
|
|
|
195
189
|
})
|
|
196
190
|
|
|
197
191
|
describe('session', () => {
|
|
198
|
-
let escrowContract: Address
|
|
199
|
-
|
|
200
192
|
function createSessionHarness(feePayer: boolean) {
|
|
201
193
|
const mppx = Mppx.create({
|
|
202
194
|
methods: [
|
|
203
|
-
tempo_server.
|
|
195
|
+
tempo_server.session({
|
|
204
196
|
getClient: () => client,
|
|
205
197
|
account: accounts[0],
|
|
206
198
|
currency: asset,
|
|
207
|
-
escrowContract,
|
|
208
199
|
...(feePayer ? { feePayer: accounts[1] } : {}),
|
|
209
200
|
} as any),
|
|
210
201
|
],
|
|
@@ -226,7 +217,6 @@ describe('session', () => {
|
|
|
226
217
|
}
|
|
227
218
|
|
|
228
219
|
beforeAll(async () => {
|
|
229
|
-
escrowContract = await deployEscrow()
|
|
230
220
|
await fundAccount({ address: accounts[1].address, token: Addresses.pathUsd })
|
|
231
221
|
await fundAccount({ address: accounts[1].address, token: asset })
|
|
232
222
|
await fundAccount({ address: accounts[2].address, token: Addresses.pathUsd })
|