@x402/core
Advanced tools
| type PaymentRequirementsV1 = { | ||
| scheme: string; | ||
| network: Network; | ||
| maxAmountRequired: string; | ||
| resource: string; | ||
| description: string; | ||
| mimeType: string; | ||
| outputSchema: Record<string, unknown>; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| extra: Record<string, unknown>; | ||
| }; | ||
| type PaymentRequiredV1 = { | ||
| x402Version: 1; | ||
| error?: string; | ||
| accepts: PaymentRequirementsV1[]; | ||
| }; | ||
| type PaymentPayloadV1 = { | ||
| x402Version: 1; | ||
| scheme: string; | ||
| network: Network; | ||
| payload: Record<string, unknown>; | ||
| }; | ||
| type VerifyRequestV1 = { | ||
| paymentPayload: PaymentPayloadV1; | ||
| paymentRequirements: PaymentRequirementsV1; | ||
| }; | ||
| type SettleRequestV1 = { | ||
| paymentPayload: PaymentPayloadV1; | ||
| paymentRequirements: PaymentRequirementsV1; | ||
| }; | ||
| type SettleResponseV1 = { | ||
| success: boolean; | ||
| errorReason?: string; | ||
| errorMessage?: string; | ||
| payer?: string; | ||
| transaction: string; | ||
| network: Network; | ||
| }; | ||
| type SupportedResponseV1 = { | ||
| kinds: { | ||
| x402Version: number; | ||
| scheme: string; | ||
| network: Network; | ||
| extra?: Record<string, unknown>; | ||
| }[]; | ||
| }; | ||
| interface FacilitatorConfig { | ||
| url?: string; | ||
| createAuthHeaders?: () => Promise<{ | ||
| verify: Record<string, string>; | ||
| settle: Record<string, string>; | ||
| supported: Record<string, string>; | ||
| }>; | ||
| } | ||
| /** | ||
| * Interface for facilitator clients | ||
| * Can be implemented for HTTP-based or local facilitators | ||
| */ | ||
| interface FacilitatorClient { | ||
| /** | ||
| * Verify a payment with the facilitator | ||
| * | ||
| * @param paymentPayload - The payment to verify | ||
| * @param paymentRequirements - The requirements to verify against | ||
| * @returns Verification response | ||
| */ | ||
| verify(paymentPayload: PaymentPayload, paymentRequirements: PaymentRequirements): Promise<VerifyResponse>; | ||
| /** | ||
| * Settle a payment with the facilitator | ||
| * | ||
| * @param paymentPayload - The payment to settle | ||
| * @param paymentRequirements - The requirements for settlement | ||
| * @returns Settlement response | ||
| */ | ||
| settle(paymentPayload: PaymentPayload, paymentRequirements: PaymentRequirements): Promise<SettleResponse>; | ||
| /** | ||
| * Get supported payment kinds and extensions from the facilitator | ||
| * | ||
| * @returns Supported payment kinds and extensions | ||
| */ | ||
| getSupported(): Promise<SupportedResponse>; | ||
| } | ||
| /** | ||
| * HTTP-based client for interacting with x402 facilitator services | ||
| * Handles HTTP communication with facilitator endpoints | ||
| */ | ||
| declare class HTTPFacilitatorClient implements FacilitatorClient { | ||
| readonly url: string; | ||
| private readonly _createAuthHeaders?; | ||
| /** | ||
| * Creates a new HTTPFacilitatorClient instance. | ||
| * | ||
| * @param config - Configuration options for the facilitator client | ||
| */ | ||
| constructor(config?: FacilitatorConfig); | ||
| /** | ||
| * Verify a payment with the facilitator | ||
| * | ||
| * @param paymentPayload - The payment to verify | ||
| * @param paymentRequirements - The requirements to verify against | ||
| * @returns Verification response | ||
| */ | ||
| verify(paymentPayload: PaymentPayload, paymentRequirements: PaymentRequirements): Promise<VerifyResponse>; | ||
| /** | ||
| * Settle a payment with the facilitator | ||
| * | ||
| * @param paymentPayload - The payment to settle | ||
| * @param paymentRequirements - The requirements for settlement | ||
| * @returns Settlement response | ||
| */ | ||
| settle(paymentPayload: PaymentPayload, paymentRequirements: PaymentRequirements): Promise<SettleResponse>; | ||
| /** | ||
| * Get supported payment kinds and extensions from the facilitator | ||
| * | ||
| * @returns Supported payment kinds and extensions | ||
| */ | ||
| getSupported(): Promise<SupportedResponse>; | ||
| /** | ||
| * Creates authentication headers for a specific path. | ||
| * | ||
| * @param path - The path to create authentication headers for (e.g., "verify", "settle", "supported") | ||
| * @returns An object containing the authentication headers for the specified path | ||
| */ | ||
| createAuthHeaders(path: string): Promise<{ | ||
| headers: Record<string, string>; | ||
| }>; | ||
| /** | ||
| * Helper to convert objects to JSON-safe format. | ||
| * Handles BigInt and other non-JSON types. | ||
| * | ||
| * @param obj - The object to convert | ||
| * @returns The JSON-safe representation of the object | ||
| */ | ||
| private toJsonSafe; | ||
| } | ||
| /** | ||
| * Configuration for a protected resource | ||
| * Only contains payment-specific configuration, not resource metadata | ||
| */ | ||
| interface ResourceConfig { | ||
| scheme: string; | ||
| payTo: string; | ||
| price: Price; | ||
| network: Network; | ||
| maxTimeoutSeconds?: number; | ||
| extra?: Record<string, unknown>; | ||
| } | ||
| /** | ||
| * Resource information for PaymentRequired response | ||
| */ | ||
| interface ResourceInfo$1 { | ||
| url: string; | ||
| description: string; | ||
| mimeType: string; | ||
| } | ||
| /** | ||
| * Lifecycle Hook Context Interfaces | ||
| */ | ||
| interface PaymentRequiredContext { | ||
| requirements: PaymentRequirements[]; | ||
| resourceInfo: ResourceInfo$1; | ||
| error?: string; | ||
| paymentRequiredResponse: PaymentRequired; | ||
| } | ||
| interface VerifyContext { | ||
| paymentPayload: PaymentPayload; | ||
| requirements: PaymentRequirements; | ||
| } | ||
| interface VerifyResultContext extends VerifyContext { | ||
| result: VerifyResponse; | ||
| } | ||
| interface VerifyFailureContext extends VerifyContext { | ||
| error: Error; | ||
| } | ||
| interface SettleContext { | ||
| paymentPayload: PaymentPayload; | ||
| requirements: PaymentRequirements; | ||
| } | ||
| interface SettleResultContext extends SettleContext { | ||
| result: SettleResponse; | ||
| } | ||
| interface SettleFailureContext extends SettleContext { | ||
| error: Error; | ||
| } | ||
| /** | ||
| * Lifecycle Hook Type Definitions | ||
| */ | ||
| type BeforeVerifyHook = (context: VerifyContext) => Promise<void | { | ||
| abort: true; | ||
| reason: string; | ||
| message?: string; | ||
| }>; | ||
| type AfterVerifyHook = (context: VerifyResultContext) => Promise<void>; | ||
| type OnVerifyFailureHook = (context: VerifyFailureContext) => Promise<void | { | ||
| recovered: true; | ||
| result: VerifyResponse; | ||
| }>; | ||
| type BeforeSettleHook = (context: SettleContext) => Promise<void | { | ||
| abort: true; | ||
| reason: string; | ||
| message?: string; | ||
| }>; | ||
| type AfterSettleHook = (context: SettleResultContext) => Promise<void>; | ||
| type OnSettleFailureHook = (context: SettleFailureContext) => Promise<void | { | ||
| recovered: true; | ||
| result: SettleResponse; | ||
| }>; | ||
| /** | ||
| * Core x402 protocol server for resource protection | ||
| * Transport-agnostic implementation of the x402 payment protocol | ||
| */ | ||
| declare class x402ResourceServer { | ||
| private facilitatorClients; | ||
| private registeredServerSchemes; | ||
| private supportedResponsesMap; | ||
| private facilitatorClientsMap; | ||
| private registeredExtensions; | ||
| private beforeVerifyHooks; | ||
| private afterVerifyHooks; | ||
| private onVerifyFailureHooks; | ||
| private beforeSettleHooks; | ||
| private afterSettleHooks; | ||
| private onSettleFailureHooks; | ||
| /** | ||
| * Creates a new x402ResourceServer instance. | ||
| * | ||
| * @param facilitatorClients - Optional facilitator client(s) for payment processing | ||
| */ | ||
| constructor(facilitatorClients?: FacilitatorClient | FacilitatorClient[]); | ||
| /** | ||
| * Register a scheme/network server implementation. | ||
| * | ||
| * @param network - The network identifier | ||
| * @param server - The scheme/network server implementation | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| register(network: Network, server: SchemeNetworkServer): x402ResourceServer; | ||
| /** | ||
| * Check if a scheme is registered for a given network. | ||
| * | ||
| * @param network - The network identifier | ||
| * @param scheme - The payment scheme name | ||
| * @returns True if the scheme is registered for the network, false otherwise | ||
| */ | ||
| hasRegisteredScheme(network: Network, scheme: string): boolean; | ||
| /** | ||
| * Registers a resource service extension that can enrich extension declarations. | ||
| * | ||
| * @param extension - The extension to register | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| registerExtension(extension: ResourceServerExtension): this; | ||
| /** | ||
| * Check if an extension is registered. | ||
| * | ||
| * @param key - The extension key | ||
| * @returns True if the extension is registered | ||
| */ | ||
| hasExtension(key: string): boolean; | ||
| /** | ||
| * Get all registered extensions. | ||
| * | ||
| * @returns Array of registered extensions | ||
| */ | ||
| getExtensions(): ResourceServerExtension[]; | ||
| /** | ||
| * Enriches declared extensions using registered extension hooks. | ||
| * | ||
| * @param declaredExtensions - Extensions declared on the route | ||
| * @param transportContext - Transport-specific context (HTTP, A2A, MCP, etc.) | ||
| * @returns Enriched extensions map | ||
| */ | ||
| enrichExtensions(declaredExtensions: Record<string, unknown>, transportContext: unknown): Record<string, unknown>; | ||
| /** | ||
| * Register a hook to execute before payment verification. | ||
| * Can abort verification by returning { abort: true, reason: string } | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| onBeforeVerify(hook: BeforeVerifyHook): x402ResourceServer; | ||
| /** | ||
| * Register a hook to execute after successful payment verification. | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| onAfterVerify(hook: AfterVerifyHook): x402ResourceServer; | ||
| /** | ||
| * Register a hook to execute when payment verification fails. | ||
| * Can recover from failure by returning { recovered: true, result: VerifyResponse } | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| onVerifyFailure(hook: OnVerifyFailureHook): x402ResourceServer; | ||
| /** | ||
| * Register a hook to execute before payment settlement. | ||
| * Can abort settlement by returning { abort: true, reason: string } | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| onBeforeSettle(hook: BeforeSettleHook): x402ResourceServer; | ||
| /** | ||
| * Register a hook to execute after successful payment settlement. | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| onAfterSettle(hook: AfterSettleHook): x402ResourceServer; | ||
| /** | ||
| * Register a hook to execute when payment settlement fails. | ||
| * Can recover from failure by returning { recovered: true, result: SettleResponse } | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| onSettleFailure(hook: OnSettleFailureHook): x402ResourceServer; | ||
| /** | ||
| * Initialize by fetching supported kinds from all facilitators | ||
| * Creates mappings for supported responses and facilitator clients | ||
| * Earlier facilitators in the array get precedence | ||
| */ | ||
| initialize(): Promise<void>; | ||
| /** | ||
| * Get supported kind for a specific version, network, and scheme | ||
| * | ||
| * @param x402Version - The x402 version | ||
| * @param network - The network identifier | ||
| * @param scheme - The payment scheme | ||
| * @returns The supported kind or undefined if not found | ||
| */ | ||
| getSupportedKind(x402Version: number, network: Network, scheme: string): SupportedKind | undefined; | ||
| /** | ||
| * Get facilitator extensions for a specific version, network, and scheme | ||
| * | ||
| * @param x402Version - The x402 version | ||
| * @param network - The network identifier | ||
| * @param scheme - The payment scheme | ||
| * @returns The facilitator extensions or empty array if not found | ||
| */ | ||
| getFacilitatorExtensions(x402Version: number, network: Network, scheme: string): string[]; | ||
| /** | ||
| * Build payment requirements for a protected resource | ||
| * | ||
| * @param resourceConfig - Configuration for the protected resource | ||
| * @returns Array of payment requirements | ||
| */ | ||
| buildPaymentRequirements(resourceConfig: ResourceConfig): Promise<PaymentRequirements[]>; | ||
| /** | ||
| * Build payment requirements from multiple payment options | ||
| * This method handles resolving dynamic payTo/price functions and builds requirements for each option | ||
| * | ||
| * @param paymentOptions - Array of payment options to convert | ||
| * @param context - HTTP request context for resolving dynamic functions | ||
| * @returns Array of payment requirements (one per option) | ||
| */ | ||
| buildPaymentRequirementsFromOptions<TContext = unknown>(paymentOptions: Array<{ | ||
| scheme: string; | ||
| payTo: string | ((context: TContext) => string | Promise<string>); | ||
| price: Price | ((context: TContext) => Price | Promise<Price>); | ||
| network: Network; | ||
| maxTimeoutSeconds?: number; | ||
| }>, context: TContext): Promise<PaymentRequirements[]>; | ||
| /** | ||
| * Create a payment required response | ||
| * | ||
| * @param requirements - Payment requirements | ||
| * @param resourceInfo - Resource information | ||
| * @param error - Error message | ||
| * @param extensions - Optional declared extensions (for per-key enrichment) | ||
| * @returns Payment required response object | ||
| */ | ||
| createPaymentRequiredResponse(requirements: PaymentRequirements[], resourceInfo: ResourceInfo$1, error?: string, extensions?: Record<string, unknown>): Promise<PaymentRequired>; | ||
| /** | ||
| * Verify a payment against requirements | ||
| * | ||
| * @param paymentPayload - The payment payload to verify | ||
| * @param requirements - The payment requirements | ||
| * @returns Verification response | ||
| */ | ||
| verifyPayment(paymentPayload: PaymentPayload, requirements: PaymentRequirements): Promise<VerifyResponse>; | ||
| /** | ||
| * Settle a verified payment | ||
| * | ||
| * @param paymentPayload - The payment payload to settle | ||
| * @param requirements - The payment requirements | ||
| * @param declaredExtensions - Optional declared extensions (for per-key enrichment) | ||
| * @returns Settlement response | ||
| */ | ||
| settlePayment(paymentPayload: PaymentPayload, requirements: PaymentRequirements, declaredExtensions?: Record<string, unknown>): Promise<SettleResponse>; | ||
| /** | ||
| * Find matching payment requirements for a payment | ||
| * | ||
| * @param availableRequirements - Array of available payment requirements | ||
| * @param paymentPayload - The payment payload | ||
| * @returns Matching payment requirements or undefined | ||
| */ | ||
| findMatchingRequirements(availableRequirements: PaymentRequirements[], paymentPayload: PaymentPayload): PaymentRequirements | undefined; | ||
| /** | ||
| * Process a payment request | ||
| * | ||
| * @param paymentPayload - Optional payment payload if provided | ||
| * @param resourceConfig - Configuration for the protected resource | ||
| * @param resourceInfo - Information about the resource being accessed | ||
| * @param extensions - Optional extensions to include in the response | ||
| * @returns Processing result | ||
| */ | ||
| processPaymentRequest(paymentPayload: PaymentPayload | null, resourceConfig: ResourceConfig, resourceInfo: ResourceInfo$1, extensions?: Record<string, unknown>): Promise<{ | ||
| success: boolean; | ||
| requiresPayment?: PaymentRequired; | ||
| verificationResult?: VerifyResponse; | ||
| settlementResult?: SettleResponse; | ||
| error?: string; | ||
| }>; | ||
| /** | ||
| * Get facilitator client for a specific version, network, and scheme | ||
| * | ||
| * @param x402Version - The x402 version | ||
| * @param network - The network identifier | ||
| * @param scheme - The payment scheme | ||
| * @returns The facilitator client or undefined if not found | ||
| */ | ||
| private getFacilitatorClient; | ||
| } | ||
| interface ResourceServerExtension { | ||
| key: string; | ||
| /** | ||
| * Enrich extension declaration with extension-specific data. | ||
| * | ||
| * @param declaration - Extension declaration from route config | ||
| * @param transportContext - Transport-specific context (HTTP, A2A, MCP, etc.) | ||
| * @returns Enriched extension declaration | ||
| */ | ||
| enrichDeclaration?: (declaration: unknown, transportContext: unknown) => unknown; | ||
| /** | ||
| * Called when generating a 402 PaymentRequired response. | ||
| * Return extension data to add to extensions[key], or undefined to skip. | ||
| * | ||
| * @param declaration - Extension declaration from route config | ||
| * @param context - PaymentRequired context containing response and requirements | ||
| * @returns Extension data to add to response.extensions[key] | ||
| */ | ||
| enrichPaymentRequiredResponse?: (declaration: unknown, context: PaymentRequiredContext) => Promise<unknown>; | ||
| /** | ||
| * Called after successful payment settlement. | ||
| * Return extension data to add to response.extensions[key], or undefined to skip. | ||
| * | ||
| * @param declaration - Extension declaration from route config | ||
| * @param context - Settlement result context containing payment payload, requirements, and result | ||
| * @returns Extension data to add to response.extensions[key] | ||
| */ | ||
| enrichSettlementResponse?: (declaration: unknown, context: SettleResultContext) => Promise<unknown>; | ||
| } | ||
| type Network = `${string}:${string}`; | ||
| type Money = string | number; | ||
| type AssetAmount = { | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown>; | ||
| }; | ||
| type Price = Money | AssetAmount; | ||
| interface ResourceInfo { | ||
| url: string; | ||
| description: string; | ||
| mimeType: string; | ||
| } | ||
| type PaymentRequirements = { | ||
| scheme: string; | ||
| network: Network; | ||
| asset: string; | ||
| amount: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| extra: Record<string, unknown>; | ||
| }; | ||
| type PaymentRequired = { | ||
| x402Version: number; | ||
| error?: string; | ||
| resource: ResourceInfo; | ||
| accepts: PaymentRequirements[]; | ||
| extensions?: Record<string, unknown>; | ||
| }; | ||
| type PaymentPayload = { | ||
| x402Version: number; | ||
| resource: ResourceInfo; | ||
| accepted: PaymentRequirements; | ||
| payload: Record<string, unknown>; | ||
| extensions?: Record<string, unknown>; | ||
| }; | ||
| type VerifyRequest = { | ||
| paymentPayload: PaymentPayload; | ||
| paymentRequirements: PaymentRequirements; | ||
| }; | ||
| type VerifyResponse = { | ||
| isValid: boolean; | ||
| invalidReason?: string; | ||
| invalidMessage?: string; | ||
| payer?: string; | ||
| extensions?: Record<string, unknown>; | ||
| }; | ||
| type SettleRequest = { | ||
| paymentPayload: PaymentPayload; | ||
| paymentRequirements: PaymentRequirements; | ||
| }; | ||
| type SettleResponse = { | ||
| success: boolean; | ||
| errorReason?: string; | ||
| errorMessage?: string; | ||
| payer?: string; | ||
| transaction: string; | ||
| network: Network; | ||
| extensions?: Record<string, unknown>; | ||
| }; | ||
| type SupportedKind = { | ||
| x402Version: number; | ||
| scheme: string; | ||
| network: Network; | ||
| extra?: Record<string, unknown>; | ||
| }; | ||
| type SupportedResponse = { | ||
| kinds: SupportedKind[]; | ||
| extensions: string[]; | ||
| signers: Record<string, string[]>; | ||
| }; | ||
| /** | ||
| * Error thrown when payment verification fails. | ||
| */ | ||
| declare class VerifyError extends Error { | ||
| readonly invalidReason?: string; | ||
| readonly invalidMessage?: string; | ||
| readonly payer?: string; | ||
| readonly statusCode: number; | ||
| /** | ||
| * Creates a VerifyError from a failed verification response. | ||
| * | ||
| * @param statusCode - HTTP status code from the facilitator | ||
| * @param response - The verify response containing error details | ||
| */ | ||
| constructor(statusCode: number, response: VerifyResponse); | ||
| } | ||
| /** | ||
| * Error thrown when payment settlement fails. | ||
| */ | ||
| declare class SettleError extends Error { | ||
| readonly errorReason?: string; | ||
| readonly errorMessage?: string; | ||
| readonly payer?: string; | ||
| readonly transaction: string; | ||
| readonly network: Network; | ||
| readonly statusCode: number; | ||
| /** | ||
| * Creates a SettleError from a failed settlement response. | ||
| * | ||
| * @param statusCode - HTTP status code from the facilitator | ||
| * @param response - The settle response containing error details | ||
| */ | ||
| constructor(statusCode: number, response: SettleResponse); | ||
| } | ||
| /** | ||
| * Money parser function that converts a numeric amount to an AssetAmount | ||
| * Receives the amount as a decimal number (e.g., 1.50 for $1.50) | ||
| * Returns null to indicate "cannot handle this amount", causing fallback to next parser | ||
| * Always returns a Promise for consistency - use async/await | ||
| * | ||
| * @param amount - The decimal amount (e.g., 1.50) | ||
| * @param network - The network identifier for context | ||
| * @returns AssetAmount or null to try next parser | ||
| */ | ||
| type MoneyParser = (amount: number, network: Network) => Promise<AssetAmount | null>; | ||
| /** | ||
| * Result of createPaymentPayload - the core payload fields. | ||
| * Contains the x402 version and the scheme-specific payload data. | ||
| */ | ||
| type PaymentPayloadResult = Pick<PaymentPayload, "x402Version" | "payload">; | ||
| interface SchemeNetworkClient { | ||
| readonly scheme: string; | ||
| createPaymentPayload(x402Version: number, paymentRequirements: PaymentRequirements): Promise<PaymentPayloadResult>; | ||
| } | ||
| interface SchemeNetworkFacilitator { | ||
| readonly scheme: string; | ||
| /** | ||
| * CAIP family pattern that this facilitator supports. | ||
| * Used to group signers by blockchain family in the supported response. | ||
| * | ||
| * @example | ||
| * // EVM facilitators | ||
| * readonly caipFamily = "eip155:*"; | ||
| * | ||
| * @example | ||
| * // SVM facilitators | ||
| * readonly caipFamily = "solana:*"; | ||
| */ | ||
| readonly caipFamily: string; | ||
| /** | ||
| * Get mechanism-specific extra data needed for the supported kinds endpoint. | ||
| * This method is called when building the facilitator's supported response. | ||
| * | ||
| * @param network - The network identifier for context | ||
| * @returns Extra data object or undefined if no extra data is needed | ||
| * | ||
| * @example | ||
| * // EVM schemes return undefined (no extra data needed) | ||
| * getExtra(network: Network): undefined { | ||
| * return undefined; | ||
| * } | ||
| * | ||
| * @example | ||
| * // SVM schemes return feePayer address | ||
| * getExtra(network: Network): Record<string, unknown> | undefined { | ||
| * return { feePayer: this.signer.address }; | ||
| * } | ||
| */ | ||
| getExtra(network: Network): Record<string, unknown> | undefined; | ||
| /** | ||
| * Get signer addresses used by this facilitator for a given network. | ||
| * These are included in the supported response to help clients understand | ||
| * which addresses might sign/pay for transactions. | ||
| * | ||
| * Supports multiple addresses for load balancing, key rotation, and high availability. | ||
| * | ||
| * @param network - The network identifier | ||
| * @returns Array of signer addresses (wallet addresses, fee payer addresses, etc.) | ||
| * | ||
| * @example | ||
| * // EVM facilitator | ||
| * getSigners(network: string): string[] { | ||
| * return [...this.signer.getAddresses()]; | ||
| * } | ||
| * | ||
| * @example | ||
| * // SVM facilitator | ||
| * getSigners(network: string): string[] { | ||
| * return [...this.signer.getAddresses()]; | ||
| * } | ||
| */ | ||
| getSigners(network: string): string[]; | ||
| verify(payload: PaymentPayload, requirements: PaymentRequirements): Promise<VerifyResponse>; | ||
| settle(payload: PaymentPayload, requirements: PaymentRequirements): Promise<SettleResponse>; | ||
| } | ||
| interface SchemeNetworkServer { | ||
| readonly scheme: string; | ||
| /** | ||
| * Convert a user-friendly price to the scheme's specific amount and asset format | ||
| * Always returns a Promise for consistency | ||
| * | ||
| * @param price - User-friendly price (e.g., "$0.10", "0.10", { amount: "100000", asset: "USDC" }) | ||
| * @param network - The network identifier for context | ||
| * @returns Promise that resolves to the converted amount, asset identifier, and any extra metadata | ||
| * | ||
| * @example | ||
| * // For EVM networks with USDC: | ||
| * await parsePrice("$0.10", "eip155:8453") => { amount: "100000", asset: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913" } | ||
| * | ||
| * // For custom schemes: | ||
| * await parsePrice("10 points", "custom:network") => { amount: "10", asset: "points" } | ||
| */ | ||
| parsePrice(price: Price, network: Network): Promise<AssetAmount>; | ||
| /** | ||
| * Build payment requirements for this scheme/network combination | ||
| * | ||
| * @param paymentRequirements - Base payment requirements with amount/asset already set | ||
| * @param supportedKind - The supported kind from facilitator's /supported endpoint | ||
| * @param supportedKind.x402Version - The x402 version | ||
| * @param supportedKind.scheme - The payment scheme | ||
| * @param supportedKind.network - The network identifier | ||
| * @param supportedKind.extra - Optional extra metadata | ||
| * @param facilitatorExtensions - Extensions supported by the facilitator | ||
| * @returns Enhanced payment requirements ready to be sent to clients | ||
| */ | ||
| enhancePaymentRequirements(paymentRequirements: PaymentRequirements, supportedKind: { | ||
| x402Version: number; | ||
| scheme: string; | ||
| network: Network; | ||
| extra?: Record<string, unknown>; | ||
| }, facilitatorExtensions: string[]): Promise<PaymentRequirements>; | ||
| } | ||
| export { type AssetAmount as A, type VerifyRequest as B, type FacilitatorClient as F, HTTPFacilitatorClient as H, type Money as M, type Network as N, type PaymentPayload as P, type ResourceConfig as R, type SettleResponse as S, type VerifyResponse as V, type PaymentRequirements as a, type SchemeNetworkFacilitator as b, type PaymentRequired as c, type FacilitatorConfig as d, type SchemeNetworkClient as e, type ResourceInfo$1 as f, type SettleResultContext as g, type Price as h, type PaymentPayloadV1 as i, type PaymentRequiredV1 as j, type PaymentRequirementsV1 as k, type SettleRequestV1 as l, type SettleResponseV1 as m, type SupportedResponseV1 as n, type VerifyRequestV1 as o, type MoneyParser as p, type PaymentPayloadResult as q, type PaymentRequiredContext as r, type ResourceInfo as s, type ResourceServerExtension as t, type SchemeNetworkServer as u, SettleError as v, type SettleRequest as w, x402ResourceServer as x, type SupportedResponse as y, VerifyError as z }; |
| import { z } from 'zod'; | ||
| export { z } from 'zod'; | ||
| /** | ||
| * Non-empty string schema - a string with at least one character. | ||
| * Used for required string fields that cannot be empty. | ||
| */ | ||
| declare const NonEmptyString: z.ZodString; | ||
| type NonEmptyString = z.infer<typeof NonEmptyString>; | ||
| /** | ||
| * Any record schema - an object with unknown keys and values. | ||
| * Used for scheme-specific payloads and other extensible objects. | ||
| */ | ||
| declare const Any: z.ZodRecord<z.ZodString, z.ZodUnknown>; | ||
| type Any = z.infer<typeof Any>; | ||
| /** | ||
| * Optional any record schema - an optional object with unknown keys and values. | ||
| * Used for optional extension fields like `extra` and `extensions`. | ||
| */ | ||
| declare const OptionalAny: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| type OptionalAny = z.infer<typeof OptionalAny>; | ||
| /** | ||
| * Network identifier schema for V1 - loose validation. | ||
| * V1 accepts any non-empty string for backwards compatibility. | ||
| */ | ||
| declare const NetworkSchemaV1: z.ZodString; | ||
| type NetworkV1 = z.infer<typeof NetworkSchemaV1>; | ||
| /** | ||
| * Network identifier schema for V2 - CAIP-2 format validation. | ||
| * V2 requires minimum length of 3 and a colon separator (e.g., "eip155:84532", "solana:devnet"). | ||
| */ | ||
| declare const NetworkSchemaV2: z.ZodEffects<z.ZodString, string, string>; | ||
| type NetworkV2 = z.infer<typeof NetworkSchemaV2>; | ||
| /** | ||
| * Union network schema - accepts either V1 or V2 format. | ||
| */ | ||
| declare const NetworkSchema: z.ZodUnion<[z.ZodString, z.ZodEffects<z.ZodString, string, string>]>; | ||
| type Network = z.infer<typeof NetworkSchema>; | ||
| /** | ||
| * ResourceInfo schema for V2 - describes the protected resource. | ||
| */ | ||
| declare const ResourceInfoSchema: z.ZodObject<{ | ||
| url: z.ZodString; | ||
| description: z.ZodOptional<z.ZodString>; | ||
| mimeType: z.ZodOptional<z.ZodString>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| }, { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| }>; | ||
| type ResourceInfo = z.infer<typeof ResourceInfoSchema>; | ||
| /** | ||
| * PaymentRequirements schema for V1. | ||
| * V1 includes resource info directly in the requirements object. | ||
| */ | ||
| declare const PaymentRequirementsV1Schema: z.ZodObject<{ | ||
| scheme: z.ZodString; | ||
| network: z.ZodString; | ||
| maxAmountRequired: z.ZodString; | ||
| resource: z.ZodString; | ||
| description: z.ZodString; | ||
| mimeType: z.ZodOptional<z.ZodString>; | ||
| outputSchema: z.ZodNullable<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>; | ||
| payTo: z.ZodString; | ||
| maxTimeoutSeconds: z.ZodNumber; | ||
| asset: z.ZodString; | ||
| extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| description: string; | ||
| scheme: string; | ||
| network: string; | ||
| maxAmountRequired: string; | ||
| resource: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| mimeType?: string | undefined; | ||
| outputSchema?: Record<string, unknown> | null | undefined; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }, { | ||
| description: string; | ||
| scheme: string; | ||
| network: string; | ||
| maxAmountRequired: string; | ||
| resource: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| mimeType?: string | undefined; | ||
| outputSchema?: Record<string, unknown> | null | undefined; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }>; | ||
| type PaymentRequirementsV1 = z.infer<typeof PaymentRequirementsV1Schema>; | ||
| /** | ||
| * PaymentRequired (402 response) schema for V1. | ||
| * Contains payment requirements when a resource requires payment. | ||
| */ | ||
| declare const PaymentRequiredV1Schema: z.ZodObject<{ | ||
| x402Version: z.ZodLiteral<1>; | ||
| error: z.ZodOptional<z.ZodString>; | ||
| accepts: z.ZodArray<z.ZodObject<{ | ||
| scheme: z.ZodString; | ||
| network: z.ZodString; | ||
| maxAmountRequired: z.ZodString; | ||
| resource: z.ZodString; | ||
| description: z.ZodString; | ||
| mimeType: z.ZodOptional<z.ZodString>; | ||
| outputSchema: z.ZodNullable<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>; | ||
| payTo: z.ZodString; | ||
| maxTimeoutSeconds: z.ZodNumber; | ||
| asset: z.ZodString; | ||
| extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| description: string; | ||
| scheme: string; | ||
| network: string; | ||
| maxAmountRequired: string; | ||
| resource: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| mimeType?: string | undefined; | ||
| outputSchema?: Record<string, unknown> | null | undefined; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }, { | ||
| description: string; | ||
| scheme: string; | ||
| network: string; | ||
| maxAmountRequired: string; | ||
| resource: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| mimeType?: string | undefined; | ||
| outputSchema?: Record<string, unknown> | null | undefined; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }>, "many">; | ||
| }, "strip", z.ZodTypeAny, { | ||
| x402Version: 1; | ||
| accepts: { | ||
| description: string; | ||
| scheme: string; | ||
| network: string; | ||
| maxAmountRequired: string; | ||
| resource: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| mimeType?: string | undefined; | ||
| outputSchema?: Record<string, unknown> | null | undefined; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }[]; | ||
| error?: string | undefined; | ||
| }, { | ||
| x402Version: 1; | ||
| accepts: { | ||
| description: string; | ||
| scheme: string; | ||
| network: string; | ||
| maxAmountRequired: string; | ||
| resource: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| mimeType?: string | undefined; | ||
| outputSchema?: Record<string, unknown> | null | undefined; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }[]; | ||
| error?: string | undefined; | ||
| }>; | ||
| type PaymentRequiredV1 = z.infer<typeof PaymentRequiredV1Schema>; | ||
| /** | ||
| * PaymentPayload schema for V1. | ||
| * Contains the payment data sent by the client. | ||
| */ | ||
| declare const PaymentPayloadV1Schema: z.ZodObject<{ | ||
| x402Version: z.ZodLiteral<1>; | ||
| scheme: z.ZodString; | ||
| network: z.ZodString; | ||
| payload: z.ZodRecord<z.ZodString, z.ZodUnknown>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| scheme: string; | ||
| network: string; | ||
| x402Version: 1; | ||
| payload: Record<string, unknown>; | ||
| }, { | ||
| scheme: string; | ||
| network: string; | ||
| x402Version: 1; | ||
| payload: Record<string, unknown>; | ||
| }>; | ||
| type PaymentPayloadV1 = z.infer<typeof PaymentPayloadV1Schema>; | ||
| /** | ||
| * PaymentRequirements schema for V2. | ||
| * V2 uses "amount" instead of "maxAmountRequired" and doesn't include resource info. | ||
| */ | ||
| declare const PaymentRequirementsV2Schema: z.ZodObject<{ | ||
| scheme: z.ZodString; | ||
| network: z.ZodEffects<z.ZodString, string, string>; | ||
| amount: z.ZodString; | ||
| asset: z.ZodString; | ||
| payTo: z.ZodString; | ||
| maxTimeoutSeconds: z.ZodNumber; | ||
| extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }, { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }>; | ||
| type PaymentRequirementsV2 = z.infer<typeof PaymentRequirementsV2Schema>; | ||
| /** | ||
| * PaymentRequired (402 response) schema for V2. | ||
| * Contains payment requirements when a resource requires payment. | ||
| */ | ||
| declare const PaymentRequiredV2Schema: z.ZodObject<{ | ||
| x402Version: z.ZodLiteral<2>; | ||
| error: z.ZodOptional<z.ZodString>; | ||
| resource: z.ZodObject<{ | ||
| url: z.ZodString; | ||
| description: z.ZodOptional<z.ZodString>; | ||
| mimeType: z.ZodOptional<z.ZodString>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| }, { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| }>; | ||
| accepts: z.ZodArray<z.ZodObject<{ | ||
| scheme: z.ZodString; | ||
| network: z.ZodEffects<z.ZodString, string, string>; | ||
| amount: z.ZodString; | ||
| asset: z.ZodString; | ||
| payTo: z.ZodString; | ||
| maxTimeoutSeconds: z.ZodNumber; | ||
| extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }, { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }>, "many">; | ||
| extensions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| resource: { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| }; | ||
| x402Version: 2; | ||
| accepts: { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }[]; | ||
| error?: string | undefined; | ||
| extensions?: Record<string, unknown> | undefined; | ||
| }, { | ||
| resource: { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| }; | ||
| x402Version: 2; | ||
| accepts: { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }[]; | ||
| error?: string | undefined; | ||
| extensions?: Record<string, unknown> | undefined; | ||
| }>; | ||
| type PaymentRequiredV2 = z.infer<typeof PaymentRequiredV2Schema>; | ||
| /** | ||
| * PaymentPayload schema for V2. | ||
| * Contains the payment data sent by the client. | ||
| */ | ||
| declare const PaymentPayloadV2Schema: z.ZodObject<{ | ||
| x402Version: z.ZodLiteral<2>; | ||
| resource: z.ZodOptional<z.ZodObject<{ | ||
| url: z.ZodString; | ||
| description: z.ZodOptional<z.ZodString>; | ||
| mimeType: z.ZodOptional<z.ZodString>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| }, { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| }>>; | ||
| accepted: z.ZodObject<{ | ||
| scheme: z.ZodString; | ||
| network: z.ZodEffects<z.ZodString, string, string>; | ||
| amount: z.ZodString; | ||
| asset: z.ZodString; | ||
| payTo: z.ZodString; | ||
| maxTimeoutSeconds: z.ZodNumber; | ||
| extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }, { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }>; | ||
| payload: z.ZodRecord<z.ZodString, z.ZodUnknown>; | ||
| extensions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| x402Version: 2; | ||
| payload: Record<string, unknown>; | ||
| accepted: { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }; | ||
| resource?: { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| } | undefined; | ||
| extensions?: Record<string, unknown> | undefined; | ||
| }, { | ||
| x402Version: 2; | ||
| payload: Record<string, unknown>; | ||
| accepted: { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }; | ||
| resource?: { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| } | undefined; | ||
| extensions?: Record<string, unknown> | undefined; | ||
| }>; | ||
| type PaymentPayloadV2 = z.infer<typeof PaymentPayloadV2Schema>; | ||
| /** | ||
| * PaymentRequirements union schema - accepts either V1 or V2 format. | ||
| * Use this when you need to handle both versions. | ||
| */ | ||
| declare const PaymentRequirementsSchema: z.ZodUnion<[z.ZodObject<{ | ||
| scheme: z.ZodString; | ||
| network: z.ZodString; | ||
| maxAmountRequired: z.ZodString; | ||
| resource: z.ZodString; | ||
| description: z.ZodString; | ||
| mimeType: z.ZodOptional<z.ZodString>; | ||
| outputSchema: z.ZodNullable<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>; | ||
| payTo: z.ZodString; | ||
| maxTimeoutSeconds: z.ZodNumber; | ||
| asset: z.ZodString; | ||
| extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| description: string; | ||
| scheme: string; | ||
| network: string; | ||
| maxAmountRequired: string; | ||
| resource: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| mimeType?: string | undefined; | ||
| outputSchema?: Record<string, unknown> | null | undefined; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }, { | ||
| description: string; | ||
| scheme: string; | ||
| network: string; | ||
| maxAmountRequired: string; | ||
| resource: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| mimeType?: string | undefined; | ||
| outputSchema?: Record<string, unknown> | null | undefined; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }>, z.ZodObject<{ | ||
| scheme: z.ZodString; | ||
| network: z.ZodEffects<z.ZodString, string, string>; | ||
| amount: z.ZodString; | ||
| asset: z.ZodString; | ||
| payTo: z.ZodString; | ||
| maxTimeoutSeconds: z.ZodNumber; | ||
| extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }, { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }>]>; | ||
| type PaymentRequirements = z.infer<typeof PaymentRequirementsSchema>; | ||
| /** | ||
| * PaymentRequired union schema - accepts either V1 or V2 format. | ||
| * Uses discriminated union on x402Version for efficient parsing. | ||
| */ | ||
| declare const PaymentRequiredSchema: z.ZodDiscriminatedUnion<"x402Version", [z.ZodObject<{ | ||
| x402Version: z.ZodLiteral<1>; | ||
| error: z.ZodOptional<z.ZodString>; | ||
| accepts: z.ZodArray<z.ZodObject<{ | ||
| scheme: z.ZodString; | ||
| network: z.ZodString; | ||
| maxAmountRequired: z.ZodString; | ||
| resource: z.ZodString; | ||
| description: z.ZodString; | ||
| mimeType: z.ZodOptional<z.ZodString>; | ||
| outputSchema: z.ZodNullable<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>; | ||
| payTo: z.ZodString; | ||
| maxTimeoutSeconds: z.ZodNumber; | ||
| asset: z.ZodString; | ||
| extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| description: string; | ||
| scheme: string; | ||
| network: string; | ||
| maxAmountRequired: string; | ||
| resource: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| mimeType?: string | undefined; | ||
| outputSchema?: Record<string, unknown> | null | undefined; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }, { | ||
| description: string; | ||
| scheme: string; | ||
| network: string; | ||
| maxAmountRequired: string; | ||
| resource: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| mimeType?: string | undefined; | ||
| outputSchema?: Record<string, unknown> | null | undefined; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }>, "many">; | ||
| }, "strip", z.ZodTypeAny, { | ||
| x402Version: 1; | ||
| accepts: { | ||
| description: string; | ||
| scheme: string; | ||
| network: string; | ||
| maxAmountRequired: string; | ||
| resource: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| mimeType?: string | undefined; | ||
| outputSchema?: Record<string, unknown> | null | undefined; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }[]; | ||
| error?: string | undefined; | ||
| }, { | ||
| x402Version: 1; | ||
| accepts: { | ||
| description: string; | ||
| scheme: string; | ||
| network: string; | ||
| maxAmountRequired: string; | ||
| resource: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| mimeType?: string | undefined; | ||
| outputSchema?: Record<string, unknown> | null | undefined; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }[]; | ||
| error?: string | undefined; | ||
| }>, z.ZodObject<{ | ||
| x402Version: z.ZodLiteral<2>; | ||
| error: z.ZodOptional<z.ZodString>; | ||
| resource: z.ZodObject<{ | ||
| url: z.ZodString; | ||
| description: z.ZodOptional<z.ZodString>; | ||
| mimeType: z.ZodOptional<z.ZodString>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| }, { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| }>; | ||
| accepts: z.ZodArray<z.ZodObject<{ | ||
| scheme: z.ZodString; | ||
| network: z.ZodEffects<z.ZodString, string, string>; | ||
| amount: z.ZodString; | ||
| asset: z.ZodString; | ||
| payTo: z.ZodString; | ||
| maxTimeoutSeconds: z.ZodNumber; | ||
| extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }, { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }>, "many">; | ||
| extensions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| resource: { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| }; | ||
| x402Version: 2; | ||
| accepts: { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }[]; | ||
| error?: string | undefined; | ||
| extensions?: Record<string, unknown> | undefined; | ||
| }, { | ||
| resource: { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| }; | ||
| x402Version: 2; | ||
| accepts: { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }[]; | ||
| error?: string | undefined; | ||
| extensions?: Record<string, unknown> | undefined; | ||
| }>]>; | ||
| type PaymentRequired = z.infer<typeof PaymentRequiredSchema>; | ||
| /** | ||
| * PaymentPayload union schema - accepts either V1 or V2 format. | ||
| * Uses discriminated union on x402Version for efficient parsing. | ||
| */ | ||
| declare const PaymentPayloadSchema: z.ZodDiscriminatedUnion<"x402Version", [z.ZodObject<{ | ||
| x402Version: z.ZodLiteral<1>; | ||
| scheme: z.ZodString; | ||
| network: z.ZodString; | ||
| payload: z.ZodRecord<z.ZodString, z.ZodUnknown>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| scheme: string; | ||
| network: string; | ||
| x402Version: 1; | ||
| payload: Record<string, unknown>; | ||
| }, { | ||
| scheme: string; | ||
| network: string; | ||
| x402Version: 1; | ||
| payload: Record<string, unknown>; | ||
| }>, z.ZodObject<{ | ||
| x402Version: z.ZodLiteral<2>; | ||
| resource: z.ZodOptional<z.ZodObject<{ | ||
| url: z.ZodString; | ||
| description: z.ZodOptional<z.ZodString>; | ||
| mimeType: z.ZodOptional<z.ZodString>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| }, { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| }>>; | ||
| accepted: z.ZodObject<{ | ||
| scheme: z.ZodString; | ||
| network: z.ZodEffects<z.ZodString, string, string>; | ||
| amount: z.ZodString; | ||
| asset: z.ZodString; | ||
| payTo: z.ZodString; | ||
| maxTimeoutSeconds: z.ZodNumber; | ||
| extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }, { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }>; | ||
| payload: z.ZodRecord<z.ZodString, z.ZodUnknown>; | ||
| extensions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| x402Version: 2; | ||
| payload: Record<string, unknown>; | ||
| accepted: { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }; | ||
| resource?: { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| } | undefined; | ||
| extensions?: Record<string, unknown> | undefined; | ||
| }, { | ||
| x402Version: 2; | ||
| payload: Record<string, unknown>; | ||
| accepted: { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }; | ||
| resource?: { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| } | undefined; | ||
| extensions?: Record<string, unknown> | undefined; | ||
| }>]>; | ||
| type PaymentPayload = z.infer<typeof PaymentPayloadSchema>; | ||
| /** | ||
| * Validates a PaymentRequired object (V1 or V2). | ||
| * | ||
| * @param value - The value to validate | ||
| * @returns A result object with success status and data or error | ||
| */ | ||
| declare function parsePaymentRequired(value: unknown): z.SafeParseReturnType<unknown, PaymentRequired>; | ||
| /** | ||
| * Validates a PaymentRequired object and throws on error. | ||
| * | ||
| * @param value - The value to validate | ||
| * @returns The validated PaymentRequired | ||
| * @throws ZodError if validation fails | ||
| */ | ||
| declare function validatePaymentRequired(value: unknown): PaymentRequired; | ||
| /** | ||
| * Type guard for PaymentRequired (V1 or V2). | ||
| * | ||
| * @param value - The value to check | ||
| * @returns True if the value is a valid PaymentRequired | ||
| */ | ||
| declare function isPaymentRequired(value: unknown): value is PaymentRequired; | ||
| /** | ||
| * Validates a PaymentRequirements object (V1 or V2). | ||
| * | ||
| * @param value - The value to validate | ||
| * @returns A result object with success status and data or error | ||
| */ | ||
| declare function parsePaymentRequirements(value: unknown): z.SafeParseReturnType<unknown, PaymentRequirements>; | ||
| /** | ||
| * Validates a PaymentRequirements object and throws on error. | ||
| * | ||
| * @param value - The value to validate | ||
| * @returns The validated PaymentRequirements | ||
| * @throws ZodError if validation fails | ||
| */ | ||
| declare function validatePaymentRequirements(value: unknown): PaymentRequirements; | ||
| /** | ||
| * Type guard for PaymentRequirements (V1 or V2). | ||
| * | ||
| * @param value - The value to check | ||
| * @returns True if the value is a valid PaymentRequirements | ||
| */ | ||
| declare function isPaymentRequirements(value: unknown): value is PaymentRequirements; | ||
| /** | ||
| * Validates a PaymentPayload object (V1 or V2). | ||
| * | ||
| * @param value - The value to validate | ||
| * @returns A result object with success status and data or error | ||
| */ | ||
| declare function parsePaymentPayload(value: unknown): z.SafeParseReturnType<unknown, PaymentPayload>; | ||
| /** | ||
| * Validates a PaymentPayload object and throws on error. | ||
| * | ||
| * @param value - The value to validate | ||
| * @returns The validated PaymentPayload | ||
| * @throws ZodError if validation fails | ||
| */ | ||
| declare function validatePaymentPayload(value: unknown): PaymentPayload; | ||
| /** | ||
| * Type guard for PaymentPayload (V1 or V2). | ||
| * | ||
| * @param value - The value to check | ||
| * @returns True if the value is a valid PaymentPayload | ||
| */ | ||
| declare function isPaymentPayload(value: unknown): value is PaymentPayload; | ||
| /** | ||
| * Type guard for PaymentRequiredV1. | ||
| * | ||
| * @param value - The value to check | ||
| * @returns True if the value is a valid PaymentRequiredV1 | ||
| */ | ||
| declare function isPaymentRequiredV1(value: unknown): value is PaymentRequiredV1; | ||
| /** | ||
| * Type guard for PaymentRequiredV2. | ||
| * | ||
| * @param value - The value to check | ||
| * @returns True if the value is a valid PaymentRequiredV2 | ||
| */ | ||
| declare function isPaymentRequiredV2(value: unknown): value is PaymentRequiredV2; | ||
| /** | ||
| * Type guard for PaymentRequirementsV1. | ||
| * | ||
| * @param value - The value to check | ||
| * @returns True if the value is a valid PaymentRequirementsV1 | ||
| */ | ||
| declare function isPaymentRequirementsV1(value: unknown): value is PaymentRequirementsV1; | ||
| /** | ||
| * Type guard for PaymentRequirementsV2. | ||
| * | ||
| * @param value - The value to check | ||
| * @returns True if the value is a valid PaymentRequirementsV2 | ||
| */ | ||
| declare function isPaymentRequirementsV2(value: unknown): value is PaymentRequirementsV2; | ||
| /** | ||
| * Type guard for PaymentPayloadV1. | ||
| * | ||
| * @param value - The value to check | ||
| * @returns True if the value is a valid PaymentPayloadV1 | ||
| */ | ||
| declare function isPaymentPayloadV1(value: unknown): value is PaymentPayloadV1; | ||
| /** | ||
| * Type guard for PaymentPayloadV2. | ||
| * | ||
| * @param value - The value to check | ||
| * @returns True if the value is a valid PaymentPayloadV2 | ||
| */ | ||
| declare function isPaymentPayloadV2(value: unknown): value is PaymentPayloadV2; | ||
| export { Any, type Network, NetworkSchema, NetworkSchemaV1, NetworkSchemaV2, type NetworkV1, type NetworkV2, NonEmptyString, OptionalAny, type PaymentPayload, PaymentPayloadSchema, type PaymentPayloadV1, PaymentPayloadV1Schema, type PaymentPayloadV2, PaymentPayloadV2Schema, type PaymentRequired, PaymentRequiredSchema, type PaymentRequiredV1, PaymentRequiredV1Schema, type PaymentRequiredV2, PaymentRequiredV2Schema, type PaymentRequirements, PaymentRequirementsSchema, type PaymentRequirementsV1, PaymentRequirementsV1Schema, type PaymentRequirementsV2, PaymentRequirementsV2Schema, type ResourceInfo, ResourceInfoSchema, isPaymentPayload, isPaymentPayloadV1, isPaymentPayloadV2, isPaymentRequired, isPaymentRequiredV1, isPaymentRequiredV2, isPaymentRequirements, isPaymentRequirementsV1, isPaymentRequirementsV2, parsePaymentPayload, parsePaymentRequired, parsePaymentRequirements, validatePaymentPayload, validatePaymentRequired, validatePaymentRequirements }; |
| "use strict"; | ||
| var __defProp = Object.defineProperty; | ||
| var __getOwnPropDesc = Object.getOwnPropertyDescriptor; | ||
| var __getOwnPropNames = Object.getOwnPropertyNames; | ||
| var __hasOwnProp = Object.prototype.hasOwnProperty; | ||
| var __export = (target, all) => { | ||
| for (var name in all) | ||
| __defProp(target, name, { get: all[name], enumerable: true }); | ||
| }; | ||
| var __copyProps = (to, from, except, desc) => { | ||
| if (from && typeof from === "object" || typeof from === "function") { | ||
| for (let key of __getOwnPropNames(from)) | ||
| if (!__hasOwnProp.call(to, key) && key !== except) | ||
| __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); | ||
| } | ||
| return to; | ||
| }; | ||
| var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); | ||
| // src/schemas/index.ts | ||
| var schemas_exports = {}; | ||
| __export(schemas_exports, { | ||
| Any: () => Any, | ||
| NetworkSchema: () => NetworkSchema, | ||
| NetworkSchemaV1: () => NetworkSchemaV1, | ||
| NetworkSchemaV2: () => NetworkSchemaV2, | ||
| NonEmptyString: () => NonEmptyString, | ||
| OptionalAny: () => OptionalAny, | ||
| PaymentPayloadSchema: () => PaymentPayloadSchema, | ||
| PaymentPayloadV1Schema: () => PaymentPayloadV1Schema, | ||
| PaymentPayloadV2Schema: () => PaymentPayloadV2Schema, | ||
| PaymentRequiredSchema: () => PaymentRequiredSchema, | ||
| PaymentRequiredV1Schema: () => PaymentRequiredV1Schema, | ||
| PaymentRequiredV2Schema: () => PaymentRequiredV2Schema, | ||
| PaymentRequirementsSchema: () => PaymentRequirementsSchema, | ||
| PaymentRequirementsV1Schema: () => PaymentRequirementsV1Schema, | ||
| PaymentRequirementsV2Schema: () => PaymentRequirementsV2Schema, | ||
| ResourceInfoSchema: () => ResourceInfoSchema, | ||
| isPaymentPayload: () => isPaymentPayload, | ||
| isPaymentPayloadV1: () => isPaymentPayloadV1, | ||
| isPaymentPayloadV2: () => isPaymentPayloadV2, | ||
| isPaymentRequired: () => isPaymentRequired, | ||
| isPaymentRequiredV1: () => isPaymentRequiredV1, | ||
| isPaymentRequiredV2: () => isPaymentRequiredV2, | ||
| isPaymentRequirements: () => isPaymentRequirements, | ||
| isPaymentRequirementsV1: () => isPaymentRequirementsV1, | ||
| isPaymentRequirementsV2: () => isPaymentRequirementsV2, | ||
| parsePaymentPayload: () => parsePaymentPayload, | ||
| parsePaymentRequired: () => parsePaymentRequired, | ||
| parsePaymentRequirements: () => parsePaymentRequirements, | ||
| validatePaymentPayload: () => validatePaymentPayload, | ||
| validatePaymentRequired: () => validatePaymentRequired, | ||
| validatePaymentRequirements: () => validatePaymentRequirements, | ||
| z: () => import_zod2.z | ||
| }); | ||
| module.exports = __toCommonJS(schemas_exports); | ||
| var import_zod = require("zod"); | ||
| var import_zod2 = require("zod"); | ||
| var NonEmptyString = import_zod.z.string().min(1); | ||
| var Any = import_zod.z.record(import_zod.z.unknown()); | ||
| var OptionalAny = import_zod.z.record(import_zod.z.unknown()).optional(); | ||
| var NetworkSchemaV1 = NonEmptyString; | ||
| var NetworkSchemaV2 = import_zod.z.string().min(3).refine((val) => val.includes(":"), { | ||
| message: "Network must be in CAIP-2 format (e.g., 'eip155:84532')" | ||
| }); | ||
| var NetworkSchema = import_zod.z.union([NetworkSchemaV1, NetworkSchemaV2]); | ||
| var ResourceInfoSchema = import_zod.z.object({ | ||
| url: NonEmptyString, | ||
| description: import_zod.z.string().optional(), | ||
| mimeType: import_zod.z.string().optional() | ||
| }); | ||
| var PaymentRequirementsV1Schema = import_zod.z.object({ | ||
| scheme: NonEmptyString, | ||
| network: NetworkSchemaV1, | ||
| maxAmountRequired: NonEmptyString, | ||
| resource: NonEmptyString, | ||
| // URL string in V1 | ||
| description: import_zod.z.string(), | ||
| mimeType: import_zod.z.string().optional(), | ||
| outputSchema: Any.optional().nullable(), | ||
| payTo: NonEmptyString, | ||
| maxTimeoutSeconds: import_zod.z.number().positive(), | ||
| asset: NonEmptyString, | ||
| extra: OptionalAny | ||
| }); | ||
| var PaymentRequiredV1Schema = import_zod.z.object({ | ||
| x402Version: import_zod.z.literal(1), | ||
| error: import_zod.z.string().optional(), | ||
| accepts: import_zod.z.array(PaymentRequirementsV1Schema).min(1) | ||
| }); | ||
| var PaymentPayloadV1Schema = import_zod.z.object({ | ||
| x402Version: import_zod.z.literal(1), | ||
| scheme: NonEmptyString, | ||
| network: NetworkSchemaV1, | ||
| payload: Any | ||
| }); | ||
| var PaymentRequirementsV2Schema = import_zod.z.object({ | ||
| scheme: NonEmptyString, | ||
| network: NetworkSchemaV2, | ||
| amount: NonEmptyString, | ||
| asset: NonEmptyString, | ||
| payTo: NonEmptyString, | ||
| maxTimeoutSeconds: import_zod.z.number().positive(), | ||
| extra: OptionalAny | ||
| }); | ||
| var PaymentRequiredV2Schema = import_zod.z.object({ | ||
| x402Version: import_zod.z.literal(2), | ||
| error: import_zod.z.string().optional(), | ||
| resource: ResourceInfoSchema, | ||
| accepts: import_zod.z.array(PaymentRequirementsV2Schema).min(1), | ||
| extensions: OptionalAny | ||
| }); | ||
| var PaymentPayloadV2Schema = import_zod.z.object({ | ||
| x402Version: import_zod.z.literal(2), | ||
| resource: ResourceInfoSchema.optional(), | ||
| accepted: PaymentRequirementsV2Schema, | ||
| payload: Any, | ||
| extensions: OptionalAny | ||
| }); | ||
| var PaymentRequirementsSchema = import_zod.z.union([ | ||
| PaymentRequirementsV1Schema, | ||
| PaymentRequirementsV2Schema | ||
| ]); | ||
| var PaymentRequiredSchema = import_zod.z.discriminatedUnion("x402Version", [ | ||
| PaymentRequiredV1Schema, | ||
| PaymentRequiredV2Schema | ||
| ]); | ||
| var PaymentPayloadSchema = import_zod.z.discriminatedUnion("x402Version", [ | ||
| PaymentPayloadV1Schema, | ||
| PaymentPayloadV2Schema | ||
| ]); | ||
| function parsePaymentRequired(value) { | ||
| return PaymentRequiredSchema.safeParse(value); | ||
| } | ||
| function validatePaymentRequired(value) { | ||
| return PaymentRequiredSchema.parse(value); | ||
| } | ||
| function isPaymentRequired(value) { | ||
| return PaymentRequiredSchema.safeParse(value).success; | ||
| } | ||
| function parsePaymentRequirements(value) { | ||
| return PaymentRequirementsSchema.safeParse(value); | ||
| } | ||
| function validatePaymentRequirements(value) { | ||
| return PaymentRequirementsSchema.parse(value); | ||
| } | ||
| function isPaymentRequirements(value) { | ||
| return PaymentRequirementsSchema.safeParse(value).success; | ||
| } | ||
| function parsePaymentPayload(value) { | ||
| return PaymentPayloadSchema.safeParse(value); | ||
| } | ||
| function validatePaymentPayload(value) { | ||
| return PaymentPayloadSchema.parse(value); | ||
| } | ||
| function isPaymentPayload(value) { | ||
| return PaymentPayloadSchema.safeParse(value).success; | ||
| } | ||
| function isPaymentRequiredV1(value) { | ||
| return PaymentRequiredV1Schema.safeParse(value).success; | ||
| } | ||
| function isPaymentRequiredV2(value) { | ||
| return PaymentRequiredV2Schema.safeParse(value).success; | ||
| } | ||
| function isPaymentRequirementsV1(value) { | ||
| return PaymentRequirementsV1Schema.safeParse(value).success; | ||
| } | ||
| function isPaymentRequirementsV2(value) { | ||
| return PaymentRequirementsV2Schema.safeParse(value).success; | ||
| } | ||
| function isPaymentPayloadV1(value) { | ||
| return PaymentPayloadV1Schema.safeParse(value).success; | ||
| } | ||
| function isPaymentPayloadV2(value) { | ||
| return PaymentPayloadV2Schema.safeParse(value).success; | ||
| } | ||
| // Annotate the CommonJS export names for ESM import in node: | ||
| 0 && (module.exports = { | ||
| Any, | ||
| NetworkSchema, | ||
| NetworkSchemaV1, | ||
| NetworkSchemaV2, | ||
| NonEmptyString, | ||
| OptionalAny, | ||
| PaymentPayloadSchema, | ||
| PaymentPayloadV1Schema, | ||
| PaymentPayloadV2Schema, | ||
| PaymentRequiredSchema, | ||
| PaymentRequiredV1Schema, | ||
| PaymentRequiredV2Schema, | ||
| PaymentRequirementsSchema, | ||
| PaymentRequirementsV1Schema, | ||
| PaymentRequirementsV2Schema, | ||
| ResourceInfoSchema, | ||
| isPaymentPayload, | ||
| isPaymentPayloadV1, | ||
| isPaymentPayloadV2, | ||
| isPaymentRequired, | ||
| isPaymentRequiredV1, | ||
| isPaymentRequiredV2, | ||
| isPaymentRequirements, | ||
| isPaymentRequirementsV1, | ||
| isPaymentRequirementsV2, | ||
| parsePaymentPayload, | ||
| parsePaymentRequired, | ||
| parsePaymentRequirements, | ||
| validatePaymentPayload, | ||
| validatePaymentRequired, | ||
| validatePaymentRequirements, | ||
| z | ||
| }); | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"sources":["../../../src/schemas/index.ts"],"sourcesContent":["import { z } from \"zod\";\n\n// ============================================================================\n// Reusable Primitive Schemas\n// ============================================================================\n\n/**\n * Non-empty string schema - a string with at least one character.\n * Used for required string fields that cannot be empty.\n */\nexport const NonEmptyString = z.string().min(1);\nexport type NonEmptyString = z.infer<typeof NonEmptyString>;\n\n/**\n * Any record schema - an object with unknown keys and values.\n * Used for scheme-specific payloads and other extensible objects.\n */\nexport const Any = z.record(z.unknown());\nexport type Any = z.infer<typeof Any>;\n\n/**\n * Optional any record schema - an optional object with unknown keys and values.\n * Used for optional extension fields like `extra` and `extensions`.\n */\nexport const OptionalAny = z.record(z.unknown()).optional();\nexport type OptionalAny = z.infer<typeof OptionalAny>;\n\n// ============================================================================\n// Network Schemas\n// ============================================================================\n\n/**\n * Network identifier schema for V1 - loose validation.\n * V1 accepts any non-empty string for backwards compatibility.\n */\nexport const NetworkSchemaV1 = NonEmptyString;\nexport type NetworkV1 = z.infer<typeof NetworkSchemaV1>;\n\n/**\n * Network identifier schema for V2 - CAIP-2 format validation.\n * V2 requires minimum length of 3 and a colon separator (e.g., \"eip155:84532\", \"solana:devnet\").\n */\nexport const NetworkSchemaV2 = z\n .string()\n .min(3)\n .refine(val => val.includes(\":\"), {\n message: \"Network must be in CAIP-2 format (e.g., 'eip155:84532')\",\n });\nexport type NetworkV2 = z.infer<typeof NetworkSchemaV2>;\n\n/**\n * Union network schema - accepts either V1 or V2 format.\n */\nexport const NetworkSchema = z.union([NetworkSchemaV1, NetworkSchemaV2]);\nexport type Network = z.infer<typeof NetworkSchema>;\n\n// ============================================================================\n// Shared Schemas\n// ============================================================================\n\n/**\n * ResourceInfo schema for V2 - describes the protected resource.\n */\nexport const ResourceInfoSchema = z.object({\n url: NonEmptyString,\n description: z.string().optional(),\n mimeType: z.string().optional(),\n});\nexport type ResourceInfo = z.infer<typeof ResourceInfoSchema>;\n\n// ============================================================================\n// V1 Schemas\n// ============================================================================\n\n/**\n * PaymentRequirements schema for V1.\n * V1 includes resource info directly in the requirements object.\n */\nexport const PaymentRequirementsV1Schema = z.object({\n scheme: NonEmptyString,\n network: NetworkSchemaV1,\n maxAmountRequired: NonEmptyString,\n resource: NonEmptyString, // URL string in V1\n description: z.string(),\n mimeType: z.string().optional(),\n outputSchema: Any.optional().nullable(),\n payTo: NonEmptyString,\n maxTimeoutSeconds: z.number().positive(),\n asset: NonEmptyString,\n extra: OptionalAny,\n});\nexport type PaymentRequirementsV1 = z.infer<typeof PaymentRequirementsV1Schema>;\n\n/**\n * PaymentRequired (402 response) schema for V1.\n * Contains payment requirements when a resource requires payment.\n */\nexport const PaymentRequiredV1Schema = z.object({\n x402Version: z.literal(1),\n error: z.string().optional(),\n accepts: z.array(PaymentRequirementsV1Schema).min(1),\n});\nexport type PaymentRequiredV1 = z.infer<typeof PaymentRequiredV1Schema>;\n\n/**\n * PaymentPayload schema for V1.\n * Contains the payment data sent by the client.\n */\nexport const PaymentPayloadV1Schema = z.object({\n x402Version: z.literal(1),\n scheme: NonEmptyString,\n network: NetworkSchemaV1,\n payload: Any,\n});\nexport type PaymentPayloadV1 = z.infer<typeof PaymentPayloadV1Schema>;\n\n// ============================================================================\n// V2 Schemas\n// ============================================================================\n\n/**\n * PaymentRequirements schema for V2.\n * V2 uses \"amount\" instead of \"maxAmountRequired\" and doesn't include resource info.\n */\nexport const PaymentRequirementsV2Schema = z.object({\n scheme: NonEmptyString,\n network: NetworkSchemaV2,\n amount: NonEmptyString,\n asset: NonEmptyString,\n payTo: NonEmptyString,\n maxTimeoutSeconds: z.number().positive(),\n extra: OptionalAny,\n});\nexport type PaymentRequirementsV2 = z.infer<typeof PaymentRequirementsV2Schema>;\n\n/**\n * PaymentRequired (402 response) schema for V2.\n * Contains payment requirements when a resource requires payment.\n */\nexport const PaymentRequiredV2Schema = z.object({\n x402Version: z.literal(2),\n error: z.string().optional(),\n resource: ResourceInfoSchema,\n accepts: z.array(PaymentRequirementsV2Schema).min(1),\n extensions: OptionalAny,\n});\nexport type PaymentRequiredV2 = z.infer<typeof PaymentRequiredV2Schema>;\n\n/**\n * PaymentPayload schema for V2.\n * Contains the payment data sent by the client.\n */\nexport const PaymentPayloadV2Schema = z.object({\n x402Version: z.literal(2),\n resource: ResourceInfoSchema.optional(),\n accepted: PaymentRequirementsV2Schema,\n payload: Any,\n extensions: OptionalAny,\n});\nexport type PaymentPayloadV2 = z.infer<typeof PaymentPayloadV2Schema>;\n\n// ============================================================================\n// Union Schemas (V1 | V2)\n// ============================================================================\n\n/**\n * PaymentRequirements union schema - accepts either V1 or V2 format.\n * Use this when you need to handle both versions.\n */\nexport const PaymentRequirementsSchema = z.union([\n PaymentRequirementsV1Schema,\n PaymentRequirementsV2Schema,\n]);\nexport type PaymentRequirements = z.infer<typeof PaymentRequirementsSchema>;\n\n/**\n * PaymentRequired union schema - accepts either V1 or V2 format.\n * Uses discriminated union on x402Version for efficient parsing.\n */\nexport const PaymentRequiredSchema = z.discriminatedUnion(\"x402Version\", [\n PaymentRequiredV1Schema,\n PaymentRequiredV2Schema,\n]);\nexport type PaymentRequired = z.infer<typeof PaymentRequiredSchema>;\n\n/**\n * PaymentPayload union schema - accepts either V1 or V2 format.\n * Uses discriminated union on x402Version for efficient parsing.\n */\nexport const PaymentPayloadSchema = z.discriminatedUnion(\"x402Version\", [\n PaymentPayloadV1Schema,\n PaymentPayloadV2Schema,\n]);\nexport type PaymentPayload = z.infer<typeof PaymentPayloadSchema>;\n\n// ============================================================================\n// Validation Functions\n// ============================================================================\n\n/**\n * Validates a PaymentRequired object (V1 or V2).\n *\n * @param value - The value to validate\n * @returns A result object with success status and data or error\n */\nexport function parsePaymentRequired(\n value: unknown,\n): z.SafeParseReturnType<unknown, PaymentRequired> {\n return PaymentRequiredSchema.safeParse(value);\n}\n\n/**\n * Validates a PaymentRequired object and throws on error.\n *\n * @param value - The value to validate\n * @returns The validated PaymentRequired\n * @throws ZodError if validation fails\n */\nexport function validatePaymentRequired(value: unknown): PaymentRequired {\n return PaymentRequiredSchema.parse(value);\n}\n\n/**\n * Type guard for PaymentRequired (V1 or V2).\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentRequired\n */\nexport function isPaymentRequired(value: unknown): value is PaymentRequired {\n return PaymentRequiredSchema.safeParse(value).success;\n}\n\n/**\n * Validates a PaymentRequirements object (V1 or V2).\n *\n * @param value - The value to validate\n * @returns A result object with success status and data or error\n */\nexport function parsePaymentRequirements(\n value: unknown,\n): z.SafeParseReturnType<unknown, PaymentRequirements> {\n return PaymentRequirementsSchema.safeParse(value);\n}\n\n/**\n * Validates a PaymentRequirements object and throws on error.\n *\n * @param value - The value to validate\n * @returns The validated PaymentRequirements\n * @throws ZodError if validation fails\n */\nexport function validatePaymentRequirements(value: unknown): PaymentRequirements {\n return PaymentRequirementsSchema.parse(value);\n}\n\n/**\n * Type guard for PaymentRequirements (V1 or V2).\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentRequirements\n */\nexport function isPaymentRequirements(value: unknown): value is PaymentRequirements {\n return PaymentRequirementsSchema.safeParse(value).success;\n}\n\n/**\n * Validates a PaymentPayload object (V1 or V2).\n *\n * @param value - The value to validate\n * @returns A result object with success status and data or error\n */\nexport function parsePaymentPayload(\n value: unknown,\n): z.SafeParseReturnType<unknown, PaymentPayload> {\n return PaymentPayloadSchema.safeParse(value);\n}\n\n/**\n * Validates a PaymentPayload object and throws on error.\n *\n * @param value - The value to validate\n * @returns The validated PaymentPayload\n * @throws ZodError if validation fails\n */\nexport function validatePaymentPayload(value: unknown): PaymentPayload {\n return PaymentPayloadSchema.parse(value);\n}\n\n/**\n * Type guard for PaymentPayload (V1 or V2).\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentPayload\n */\nexport function isPaymentPayload(value: unknown): value is PaymentPayload {\n return PaymentPayloadSchema.safeParse(value).success;\n}\n\n// ============================================================================\n// Version-Specific Type Guards\n// ============================================================================\n\n/**\n * Type guard for PaymentRequiredV1.\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentRequiredV1\n */\nexport function isPaymentRequiredV1(value: unknown): value is PaymentRequiredV1 {\n return PaymentRequiredV1Schema.safeParse(value).success;\n}\n\n/**\n * Type guard for PaymentRequiredV2.\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentRequiredV2\n */\nexport function isPaymentRequiredV2(value: unknown): value is PaymentRequiredV2 {\n return PaymentRequiredV2Schema.safeParse(value).success;\n}\n\n/**\n * Type guard for PaymentRequirementsV1.\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentRequirementsV1\n */\nexport function isPaymentRequirementsV1(value: unknown): value is PaymentRequirementsV1 {\n return PaymentRequirementsV1Schema.safeParse(value).success;\n}\n\n/**\n * Type guard for PaymentRequirementsV2.\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentRequirementsV2\n */\nexport function isPaymentRequirementsV2(value: unknown): value is PaymentRequirementsV2 {\n return PaymentRequirementsV2Schema.safeParse(value).success;\n}\n\n/**\n * Type guard for PaymentPayloadV1.\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentPayloadV1\n */\nexport function isPaymentPayloadV1(value: unknown): value is PaymentPayloadV1 {\n return PaymentPayloadV1Schema.safeParse(value).success;\n}\n\n/**\n * Type guard for PaymentPayloadV2.\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentPayloadV2\n */\nexport function isPaymentPayloadV2(value: unknown): value is PaymentPayloadV2 {\n return PaymentPayloadV2Schema.safeParse(value).success;\n}\n\n// ============================================================================\n// Re-export zod for convenience\n// ============================================================================\n\nexport { z } from \"zod\";\n"],"mappings":"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","names":["import_zod"]} |
| import { h as Price, N as Network, P as PaymentPayload, a as PaymentRequirements, c as PaymentRequired, S as SettleResponse, x as x402ResourceServer } from './mechanisms-CP6q1k8-.js'; | ||
| /** | ||
| * Framework-agnostic HTTP adapter interface | ||
| * Implementations provide framework-specific HTTP operations | ||
| */ | ||
| interface HTTPAdapter { | ||
| getHeader(name: string): string | undefined; | ||
| getMethod(): string; | ||
| getPath(): string; | ||
| getUrl(): string; | ||
| getAcceptHeader(): string; | ||
| getUserAgent(): string; | ||
| /** | ||
| * Get query parameters from the request URL | ||
| * | ||
| * @returns Record of query parameter key-value pairs | ||
| */ | ||
| getQueryParams?(): Record<string, string | string[]>; | ||
| /** | ||
| * Get a specific query parameter by name | ||
| * | ||
| * @param name - The query parameter name | ||
| * @returns The query parameter value(s) or undefined | ||
| */ | ||
| getQueryParam?(name: string): string | string[] | undefined; | ||
| /** | ||
| * Get the parsed request body | ||
| * Framework adapters should parse JSON/form data appropriately | ||
| * | ||
| * @returns The parsed request body | ||
| */ | ||
| getBody?(): unknown; | ||
| } | ||
| /** | ||
| * Paywall configuration for HTML responses | ||
| */ | ||
| interface PaywallConfig { | ||
| appName?: string; | ||
| appLogo?: string; | ||
| sessionTokenEndpoint?: string; | ||
| currentUrl?: string; | ||
| testnet?: boolean; | ||
| } | ||
| /** | ||
| * Paywall provider interface for generating HTML | ||
| */ | ||
| interface PaywallProvider { | ||
| generateHtml(paymentRequired: PaymentRequired, config?: PaywallConfig): string; | ||
| } | ||
| /** | ||
| * Dynamic payTo function that receives HTTP request context | ||
| */ | ||
| type DynamicPayTo = (context: HTTPRequestContext) => string | Promise<string>; | ||
| /** | ||
| * Dynamic price function that receives HTTP request context | ||
| */ | ||
| type DynamicPrice = (context: HTTPRequestContext) => Price | Promise<Price>; | ||
| /** | ||
| * Result of the unpaid response callback containing content type and body. | ||
| */ | ||
| interface UnpaidResponseResult { | ||
| /** | ||
| * The content type for the response (e.g., 'application/json', 'text/plain'). | ||
| */ | ||
| contentType: string; | ||
| /** | ||
| * The response body to include in the 402 response. | ||
| */ | ||
| body: unknown; | ||
| } | ||
| /** | ||
| * Dynamic function to generate a custom response for unpaid requests. | ||
| * Receives the HTTP request context and returns the content type and body to include in the 402 response. | ||
| */ | ||
| type UnpaidResponseBody = (context: HTTPRequestContext) => UnpaidResponseResult | Promise<UnpaidResponseResult>; | ||
| /** | ||
| * A single payment option for a route | ||
| * Represents one way a client can pay for access to the resource | ||
| */ | ||
| interface PaymentOption { | ||
| scheme: string; | ||
| payTo: string | DynamicPayTo; | ||
| price: Price | DynamicPrice; | ||
| network: Network; | ||
| maxTimeoutSeconds?: number; | ||
| extra?: Record<string, unknown>; | ||
| } | ||
| /** | ||
| * Route configuration for HTTP endpoints | ||
| * | ||
| * The 'accepts' field defines payment options for the route. | ||
| * Can be a single PaymentOption or an array of PaymentOptions for multiple payment methods. | ||
| */ | ||
| interface RouteConfig { | ||
| accepts: PaymentOption | PaymentOption[]; | ||
| resource?: string; | ||
| description?: string; | ||
| mimeType?: string; | ||
| customPaywallHtml?: string; | ||
| /** | ||
| * Optional callback to generate a custom response for unpaid API requests. | ||
| * This allows servers to return preview data, error messages, or other content | ||
| * when a request lacks payment. | ||
| * | ||
| * For browser requests (Accept: text/html), the paywall HTML takes precedence. | ||
| * This callback is only used for API clients. | ||
| * | ||
| * If not provided, defaults to { contentType: 'application/json', body: {} }. | ||
| * | ||
| * @param context - The HTTP request context | ||
| * @returns An object containing both contentType and body for the 402 response | ||
| */ | ||
| unpaidResponseBody?: UnpaidResponseBody; | ||
| extensions?: Record<string, unknown>; | ||
| } | ||
| /** | ||
| * Routes configuration - maps path patterns to route configs | ||
| */ | ||
| type RoutesConfig = Record<string, RouteConfig> | RouteConfig; | ||
| /** | ||
| * Hook that runs on every request to a protected route, before payment processing. | ||
| * Can grant access without payment, deny the request, or continue to payment flow. | ||
| * | ||
| * @returns | ||
| * - `void` - Continue to payment processing (default behavior) | ||
| * - `{ grantAccess: true }` - Grant access without requiring payment | ||
| * - `{ abort: true; reason: string }` - Deny the request (returns 403) | ||
| */ | ||
| type ProtectedRequestHook = (context: HTTPRequestContext, routeConfig: RouteConfig) => Promise<void | { | ||
| grantAccess: true; | ||
| } | { | ||
| abort: true; | ||
| reason: string; | ||
| }>; | ||
| /** | ||
| * Compiled route for efficient matching | ||
| */ | ||
| interface CompiledRoute { | ||
| verb: string; | ||
| regex: RegExp; | ||
| config: RouteConfig; | ||
| } | ||
| /** | ||
| * HTTP request context that encapsulates all request data | ||
| */ | ||
| interface HTTPRequestContext { | ||
| adapter: HTTPAdapter; | ||
| path: string; | ||
| method: string; | ||
| paymentHeader?: string; | ||
| } | ||
| /** | ||
| * HTTP response instructions for the framework middleware | ||
| */ | ||
| interface HTTPResponseInstructions { | ||
| status: number; | ||
| headers: Record<string, string>; | ||
| body?: unknown; | ||
| isHtml?: boolean; | ||
| } | ||
| /** | ||
| * Result of processing an HTTP request for payment | ||
| */ | ||
| type HTTPProcessResult = { | ||
| type: "no-payment-required"; | ||
| } | { | ||
| type: "payment-verified"; | ||
| paymentPayload: PaymentPayload; | ||
| paymentRequirements: PaymentRequirements; | ||
| declaredExtensions?: Record<string, unknown>; | ||
| } | { | ||
| type: "payment-error"; | ||
| response: HTTPResponseInstructions; | ||
| }; | ||
| /** | ||
| * Result of processSettlement | ||
| */ | ||
| type ProcessSettleSuccessResponse = SettleResponse & { | ||
| success: true; | ||
| headers: Record<string, string>; | ||
| requirements: PaymentRequirements; | ||
| }; | ||
| type ProcessSettleFailureResponse = SettleResponse & { | ||
| success: false; | ||
| errorReason: string; | ||
| errorMessage?: string; | ||
| }; | ||
| type ProcessSettleResultResponse = ProcessSettleSuccessResponse | ProcessSettleFailureResponse; | ||
| /** | ||
| * Represents a validation error for a specific route's payment configuration. | ||
| */ | ||
| interface RouteValidationError { | ||
| /** The route pattern (e.g., "GET /api/weather") */ | ||
| routePattern: string; | ||
| /** The payment scheme that failed validation */ | ||
| scheme: string; | ||
| /** The network that failed validation */ | ||
| network: Network; | ||
| /** The type of validation failure */ | ||
| reason: "missing_scheme" | "missing_facilitator"; | ||
| /** Human-readable error message */ | ||
| message: string; | ||
| } | ||
| /** | ||
| * Error thrown when route configuration validation fails. | ||
| */ | ||
| declare class RouteConfigurationError extends Error { | ||
| /** The validation errors that caused this exception */ | ||
| readonly errors: RouteValidationError[]; | ||
| /** | ||
| * Creates a new RouteConfigurationError with the given validation errors. | ||
| * | ||
| * @param errors - The validation errors that caused this exception. | ||
| */ | ||
| constructor(errors: RouteValidationError[]); | ||
| } | ||
| /** | ||
| * HTTP-enhanced x402 resource server | ||
| * Provides framework-agnostic HTTP protocol handling | ||
| */ | ||
| declare class x402HTTPResourceServer { | ||
| private ResourceServer; | ||
| private compiledRoutes; | ||
| private routesConfig; | ||
| private paywallProvider?; | ||
| private protectedRequestHooks; | ||
| /** | ||
| * Creates a new x402HTTPResourceServer instance. | ||
| * | ||
| * @param ResourceServer - The core x402ResourceServer instance to use | ||
| * @param routes - Route configuration for payment-protected endpoints | ||
| */ | ||
| constructor(ResourceServer: x402ResourceServer, routes: RoutesConfig); | ||
| /** | ||
| * Get the underlying x402ResourceServer instance. | ||
| * | ||
| * @returns The underlying x402ResourceServer instance | ||
| */ | ||
| get server(): x402ResourceServer; | ||
| /** | ||
| * Get the routes configuration. | ||
| * | ||
| * @returns The routes configuration | ||
| */ | ||
| get routes(): RoutesConfig; | ||
| /** | ||
| * Initialize the HTTP resource server. | ||
| * | ||
| * This method initializes the underlying resource server (fetching facilitator support) | ||
| * and then validates that all route payment configurations have corresponding | ||
| * registered schemes and facilitator support. | ||
| * | ||
| * @throws RouteConfigurationError if any route's payment options don't have | ||
| * corresponding registered schemes or facilitator support | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const httpServer = new x402HTTPResourceServer(server, routes); | ||
| * await httpServer.initialize(); | ||
| * ``` | ||
| */ | ||
| initialize(): Promise<void>; | ||
| /** | ||
| * Register a custom paywall provider for generating HTML | ||
| * | ||
| * @param provider - PaywallProvider instance | ||
| * @returns This service instance for chaining | ||
| */ | ||
| registerPaywallProvider(provider: PaywallProvider): this; | ||
| /** | ||
| * Register a hook that runs on every request to a protected route, before payment processing. | ||
| * Hooks are executed in order of registration. The first hook to return a non-void result wins. | ||
| * | ||
| * @param hook - The request hook function | ||
| * @returns The x402HTTPResourceServer instance for chaining | ||
| */ | ||
| onProtectedRequest(hook: ProtectedRequestHook): this; | ||
| /** | ||
| * Process HTTP request and return response instructions | ||
| * This is the main entry point for framework middleware | ||
| * | ||
| * @param context - HTTP request context | ||
| * @param paywallConfig - Optional paywall configuration | ||
| * @returns Process result indicating next action for middleware | ||
| */ | ||
| processHTTPRequest(context: HTTPRequestContext, paywallConfig?: PaywallConfig): Promise<HTTPProcessResult>; | ||
| /** | ||
| * Process settlement after successful response | ||
| * | ||
| * @param paymentPayload - The verified payment payload | ||
| * @param requirements - The matching payment requirements | ||
| * @param declaredExtensions - Optional declared extensions (for per-key enrichment) | ||
| * @returns ProcessSettleResultResponse - SettleResponse with headers if success or errorReason if failure | ||
| */ | ||
| processSettlement(paymentPayload: PaymentPayload, requirements: PaymentRequirements, declaredExtensions?: Record<string, unknown>): Promise<ProcessSettleResultResponse>; | ||
| /** | ||
| * Check if a request requires payment based on route configuration | ||
| * | ||
| * @param context - HTTP request context | ||
| * @returns True if the route requires payment, false otherwise | ||
| */ | ||
| requiresPayment(context: HTTPRequestContext): boolean; | ||
| /** | ||
| * Normalizes a RouteConfig's accepts field into an array of PaymentOptions | ||
| * Handles both single PaymentOption and array formats | ||
| * | ||
| * @param routeConfig - Route configuration | ||
| * @returns Array of payment options | ||
| */ | ||
| private normalizePaymentOptions; | ||
| /** | ||
| * Validates that all payment options in routes have corresponding registered schemes | ||
| * and facilitator support. | ||
| * | ||
| * @returns Array of validation errors (empty if all routes are valid) | ||
| */ | ||
| private validateRouteConfiguration; | ||
| /** | ||
| * Get route configuration for a request | ||
| * | ||
| * @param path - Request path | ||
| * @param method - HTTP method | ||
| * @returns Route configuration or undefined if no match | ||
| */ | ||
| private getRouteConfig; | ||
| /** | ||
| * Extract payment from HTTP headers (handles v1 and v2) | ||
| * | ||
| * @param adapter - HTTP adapter | ||
| * @returns Decoded payment payload or null | ||
| */ | ||
| private extractPayment; | ||
| /** | ||
| * Check if request is from a web browser | ||
| * | ||
| * @param adapter - HTTP adapter | ||
| * @returns True if request appears to be from a browser | ||
| */ | ||
| private isWebBrowser; | ||
| /** | ||
| * Create HTTP response instructions from payment required | ||
| * | ||
| * @param paymentRequired - Payment requirements | ||
| * @param isWebBrowser - Whether request is from browser | ||
| * @param paywallConfig - Paywall configuration | ||
| * @param customHtml - Custom HTML template | ||
| * @param unpaidResponse - Optional custom response (content type and body) for unpaid API requests | ||
| * @returns Response instructions | ||
| */ | ||
| private createHTTPResponse; | ||
| /** | ||
| * Create HTTP payment required response (v1 puts in body, v2 puts in header) | ||
| * | ||
| * @param paymentRequired - Payment required object | ||
| * @returns Headers and body for the HTTP response | ||
| */ | ||
| private createHTTPPaymentRequiredResponse; | ||
| /** | ||
| * Create settlement response headers | ||
| * | ||
| * @param settleResponse - Settlement response | ||
| * @returns Headers to add to response | ||
| */ | ||
| private createSettlementHeaders; | ||
| /** | ||
| * Parse route pattern into verb and regex | ||
| * | ||
| * @param pattern - Route pattern like "GET /api/*" or "/api/[id]" | ||
| * @returns Parsed pattern with verb and regex | ||
| */ | ||
| private parseRoutePattern; | ||
| /** | ||
| * Normalize path for matching | ||
| * | ||
| * @param path - Raw path from request | ||
| * @returns Normalized path | ||
| */ | ||
| private normalizePath; | ||
| /** | ||
| * Generate paywall HTML for browser requests | ||
| * | ||
| * @param paymentRequired - Payment required response | ||
| * @param paywallConfig - Optional paywall configuration | ||
| * @param customHtml - Optional custom HTML template | ||
| * @returns HTML string | ||
| */ | ||
| private generatePaywallHTML; | ||
| /** | ||
| * Extract display amount from payment requirements. | ||
| * | ||
| * @param paymentRequired - The payment required object | ||
| * @returns The display amount in decimal format | ||
| */ | ||
| private getDisplayAmount; | ||
| } | ||
| export { type CompiledRoute as C, type DynamicPayTo as D, type HTTPAdapter as H, type PaymentOption as P, type RouteConfig as R, type UnpaidResponseBody as U, type DynamicPrice as a, type HTTPProcessResult as b, type HTTPRequestContext as c, type HTTPResponseInstructions as d, type PaywallConfig as e, type PaywallProvider as f, type ProcessSettleFailureResponse as g, type ProcessSettleResultResponse as h, type ProcessSettleSuccessResponse as i, type ProtectedRequestHook as j, RouteConfigurationError as k, type RouteValidationError as l, type RoutesConfig as m, type UnpaidResponseResult as n, x402HTTPResourceServer as x }; |
| import { | ||
| x402Version | ||
| } from "./chunk-VE37GDG2.mjs"; | ||
| import { | ||
| SettleError, | ||
| VerifyError | ||
| } from "./chunk-L2RJI3BI.mjs"; | ||
| import { | ||
| Base64EncodedRegex, | ||
| safeBase64Decode, | ||
| safeBase64Encode | ||
| } from "./chunk-TDLQZ6MP.mjs"; | ||
| import { | ||
| __require | ||
| } from "./chunk-BJTO5JO5.mjs"; | ||
| // src/http/x402HTTPResourceServer.ts | ||
| var RouteConfigurationError = class extends Error { | ||
| /** | ||
| * Creates a new RouteConfigurationError with the given validation errors. | ||
| * | ||
| * @param errors - The validation errors that caused this exception. | ||
| */ | ||
| constructor(errors) { | ||
| const message = `x402 Route Configuration Errors: | ||
| ${errors.map((e) => ` - ${e.message}`).join("\n")}`; | ||
| super(message); | ||
| this.name = "RouteConfigurationError"; | ||
| this.errors = errors; | ||
| } | ||
| }; | ||
| var x402HTTPResourceServer = class { | ||
| /** | ||
| * Creates a new x402HTTPResourceServer instance. | ||
| * | ||
| * @param ResourceServer - The core x402ResourceServer instance to use | ||
| * @param routes - Route configuration for payment-protected endpoints | ||
| */ | ||
| constructor(ResourceServer, routes) { | ||
| this.compiledRoutes = []; | ||
| this.protectedRequestHooks = []; | ||
| this.ResourceServer = ResourceServer; | ||
| this.routesConfig = routes; | ||
| const normalizedRoutes = typeof routes === "object" && !("accepts" in routes) ? routes : { "*": routes }; | ||
| for (const [pattern, config] of Object.entries(normalizedRoutes)) { | ||
| const parsed = this.parseRoutePattern(pattern); | ||
| this.compiledRoutes.push({ | ||
| verb: parsed.verb, | ||
| regex: parsed.regex, | ||
| config | ||
| }); | ||
| } | ||
| } | ||
| /** | ||
| * Get the underlying x402ResourceServer instance. | ||
| * | ||
| * @returns The underlying x402ResourceServer instance | ||
| */ | ||
| get server() { | ||
| return this.ResourceServer; | ||
| } | ||
| /** | ||
| * Get the routes configuration. | ||
| * | ||
| * @returns The routes configuration | ||
| */ | ||
| get routes() { | ||
| return this.routesConfig; | ||
| } | ||
| /** | ||
| * Initialize the HTTP resource server. | ||
| * | ||
| * This method initializes the underlying resource server (fetching facilitator support) | ||
| * and then validates that all route payment configurations have corresponding | ||
| * registered schemes and facilitator support. | ||
| * | ||
| * @throws RouteConfigurationError if any route's payment options don't have | ||
| * corresponding registered schemes or facilitator support | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const httpServer = new x402HTTPResourceServer(server, routes); | ||
| * await httpServer.initialize(); | ||
| * ``` | ||
| */ | ||
| async initialize() { | ||
| await this.ResourceServer.initialize(); | ||
| const errors = this.validateRouteConfiguration(); | ||
| if (errors.length > 0) { | ||
| throw new RouteConfigurationError(errors); | ||
| } | ||
| } | ||
| /** | ||
| * Register a custom paywall provider for generating HTML | ||
| * | ||
| * @param provider - PaywallProvider instance | ||
| * @returns This service instance for chaining | ||
| */ | ||
| registerPaywallProvider(provider) { | ||
| this.paywallProvider = provider; | ||
| return this; | ||
| } | ||
| /** | ||
| * Register a hook that runs on every request to a protected route, before payment processing. | ||
| * Hooks are executed in order of registration. The first hook to return a non-void result wins. | ||
| * | ||
| * @param hook - The request hook function | ||
| * @returns The x402HTTPResourceServer instance for chaining | ||
| */ | ||
| onProtectedRequest(hook) { | ||
| this.protectedRequestHooks.push(hook); | ||
| return this; | ||
| } | ||
| /** | ||
| * Process HTTP request and return response instructions | ||
| * This is the main entry point for framework middleware | ||
| * | ||
| * @param context - HTTP request context | ||
| * @param paywallConfig - Optional paywall configuration | ||
| * @returns Process result indicating next action for middleware | ||
| */ | ||
| async processHTTPRequest(context, paywallConfig) { | ||
| const { adapter, path, method } = context; | ||
| const routeConfig = this.getRouteConfig(path, method); | ||
| if (!routeConfig) { | ||
| return { type: "no-payment-required" }; | ||
| } | ||
| for (const hook of this.protectedRequestHooks) { | ||
| const result = await hook(context, routeConfig); | ||
| if (result && "grantAccess" in result) { | ||
| return { type: "no-payment-required" }; | ||
| } | ||
| if (result && "abort" in result) { | ||
| return { | ||
| type: "payment-error", | ||
| response: { | ||
| status: 403, | ||
| headers: { "Content-Type": "application/json" }, | ||
| body: { error: result.reason } | ||
| } | ||
| }; | ||
| } | ||
| } | ||
| const paymentOptions = this.normalizePaymentOptions(routeConfig); | ||
| const paymentPayload = this.extractPayment(adapter); | ||
| const resourceInfo = { | ||
| url: routeConfig.resource || context.adapter.getUrl(), | ||
| description: routeConfig.description || "", | ||
| mimeType: routeConfig.mimeType || "" | ||
| }; | ||
| let requirements = await this.ResourceServer.buildPaymentRequirementsFromOptions( | ||
| paymentOptions, | ||
| context | ||
| ); | ||
| let extensions = routeConfig.extensions; | ||
| if (extensions) { | ||
| extensions = this.ResourceServer.enrichExtensions(extensions, context); | ||
| } | ||
| const paymentRequired = await this.ResourceServer.createPaymentRequiredResponse( | ||
| requirements, | ||
| resourceInfo, | ||
| !paymentPayload ? "Payment required" : void 0, | ||
| extensions | ||
| ); | ||
| if (!paymentPayload) { | ||
| const unpaidBody = routeConfig.unpaidResponseBody ? await routeConfig.unpaidResponseBody(context) : void 0; | ||
| return { | ||
| type: "payment-error", | ||
| response: this.createHTTPResponse( | ||
| paymentRequired, | ||
| this.isWebBrowser(adapter), | ||
| paywallConfig, | ||
| routeConfig.customPaywallHtml, | ||
| unpaidBody | ||
| ) | ||
| }; | ||
| } | ||
| try { | ||
| const matchingRequirements = this.ResourceServer.findMatchingRequirements( | ||
| paymentRequired.accepts, | ||
| paymentPayload | ||
| ); | ||
| if (!matchingRequirements) { | ||
| const errorResponse = await this.ResourceServer.createPaymentRequiredResponse( | ||
| requirements, | ||
| resourceInfo, | ||
| "No matching payment requirements", | ||
| routeConfig.extensions | ||
| ); | ||
| return { | ||
| type: "payment-error", | ||
| response: this.createHTTPResponse(errorResponse, false, paywallConfig) | ||
| }; | ||
| } | ||
| const verifyResult = await this.ResourceServer.verifyPayment( | ||
| paymentPayload, | ||
| matchingRequirements | ||
| ); | ||
| if (!verifyResult.isValid) { | ||
| const errorResponse = await this.ResourceServer.createPaymentRequiredResponse( | ||
| requirements, | ||
| resourceInfo, | ||
| verifyResult.invalidReason, | ||
| routeConfig.extensions | ||
| ); | ||
| return { | ||
| type: "payment-error", | ||
| response: this.createHTTPResponse(errorResponse, false, paywallConfig) | ||
| }; | ||
| } | ||
| return { | ||
| type: "payment-verified", | ||
| paymentPayload, | ||
| paymentRequirements: matchingRequirements, | ||
| declaredExtensions: routeConfig.extensions | ||
| }; | ||
| } catch (error) { | ||
| const errorResponse = await this.ResourceServer.createPaymentRequiredResponse( | ||
| requirements, | ||
| resourceInfo, | ||
| error instanceof Error ? error.message : "Payment verification failed", | ||
| routeConfig.extensions | ||
| ); | ||
| return { | ||
| type: "payment-error", | ||
| response: this.createHTTPResponse(errorResponse, false, paywallConfig) | ||
| }; | ||
| } | ||
| } | ||
| /** | ||
| * Process settlement after successful response | ||
| * | ||
| * @param paymentPayload - The verified payment payload | ||
| * @param requirements - The matching payment requirements | ||
| * @param declaredExtensions - Optional declared extensions (for per-key enrichment) | ||
| * @returns ProcessSettleResultResponse - SettleResponse with headers if success or errorReason if failure | ||
| */ | ||
| async processSettlement(paymentPayload, requirements, declaredExtensions) { | ||
| try { | ||
| const settleResponse = await this.ResourceServer.settlePayment( | ||
| paymentPayload, | ||
| requirements, | ||
| declaredExtensions | ||
| ); | ||
| if (!settleResponse.success) { | ||
| return { | ||
| ...settleResponse, | ||
| success: false, | ||
| errorReason: settleResponse.errorReason || "Settlement failed", | ||
| errorMessage: settleResponse.errorMessage || settleResponse.errorReason || "Settlement failed" | ||
| }; | ||
| } | ||
| return { | ||
| ...settleResponse, | ||
| success: true, | ||
| headers: this.createSettlementHeaders(settleResponse), | ||
| requirements | ||
| }; | ||
| } catch (error) { | ||
| if (error instanceof SettleError) { | ||
| return { | ||
| success: false, | ||
| errorReason: error.errorReason || error.message, | ||
| errorMessage: error.errorMessage || error.errorReason || error.message, | ||
| payer: error.payer, | ||
| network: error.network, | ||
| transaction: error.transaction | ||
| }; | ||
| } | ||
| return { | ||
| success: false, | ||
| errorReason: error instanceof Error ? error.message : "Settlement failed", | ||
| errorMessage: error instanceof Error ? error.message : "Settlement failed", | ||
| network: requirements.network, | ||
| transaction: "" | ||
| }; | ||
| } | ||
| } | ||
| /** | ||
| * Check if a request requires payment based on route configuration | ||
| * | ||
| * @param context - HTTP request context | ||
| * @returns True if the route requires payment, false otherwise | ||
| */ | ||
| requiresPayment(context) { | ||
| const routeConfig = this.getRouteConfig(context.path, context.method); | ||
| return routeConfig !== void 0; | ||
| } | ||
| /** | ||
| * Normalizes a RouteConfig's accepts field into an array of PaymentOptions | ||
| * Handles both single PaymentOption and array formats | ||
| * | ||
| * @param routeConfig - Route configuration | ||
| * @returns Array of payment options | ||
| */ | ||
| normalizePaymentOptions(routeConfig) { | ||
| return Array.isArray(routeConfig.accepts) ? routeConfig.accepts : [routeConfig.accepts]; | ||
| } | ||
| /** | ||
| * Validates that all payment options in routes have corresponding registered schemes | ||
| * and facilitator support. | ||
| * | ||
| * @returns Array of validation errors (empty if all routes are valid) | ||
| */ | ||
| validateRouteConfiguration() { | ||
| const errors = []; | ||
| const normalizedRoutes = typeof this.routesConfig === "object" && !("accepts" in this.routesConfig) ? Object.entries(this.routesConfig) : [["*", this.routesConfig]]; | ||
| for (const [pattern, config] of normalizedRoutes) { | ||
| const paymentOptions = this.normalizePaymentOptions(config); | ||
| for (const option of paymentOptions) { | ||
| if (!this.ResourceServer.hasRegisteredScheme(option.network, option.scheme)) { | ||
| errors.push({ | ||
| routePattern: pattern, | ||
| scheme: option.scheme, | ||
| network: option.network, | ||
| reason: "missing_scheme", | ||
| message: `Route "${pattern}": No scheme implementation registered for "${option.scheme}" on network "${option.network}"` | ||
| }); | ||
| continue; | ||
| } | ||
| const supportedKind = this.ResourceServer.getSupportedKind( | ||
| x402Version, | ||
| option.network, | ||
| option.scheme | ||
| ); | ||
| if (!supportedKind) { | ||
| errors.push({ | ||
| routePattern: pattern, | ||
| scheme: option.scheme, | ||
| network: option.network, | ||
| reason: "missing_facilitator", | ||
| message: `Route "${pattern}": Facilitator does not support scheme "${option.scheme}" on network "${option.network}"` | ||
| }); | ||
| } | ||
| } | ||
| } | ||
| return errors; | ||
| } | ||
| /** | ||
| * Get route configuration for a request | ||
| * | ||
| * @param path - Request path | ||
| * @param method - HTTP method | ||
| * @returns Route configuration or undefined if no match | ||
| */ | ||
| getRouteConfig(path, method) { | ||
| const normalizedPath = this.normalizePath(path); | ||
| const upperMethod = method.toUpperCase(); | ||
| const matchingRoute = this.compiledRoutes.find( | ||
| (route) => route.regex.test(normalizedPath) && (route.verb === "*" || route.verb === upperMethod) | ||
| ); | ||
| return matchingRoute?.config; | ||
| } | ||
| /** | ||
| * Extract payment from HTTP headers (handles v1 and v2) | ||
| * | ||
| * @param adapter - HTTP adapter | ||
| * @returns Decoded payment payload or null | ||
| */ | ||
| extractPayment(adapter) { | ||
| const header = adapter.getHeader("payment-signature") || adapter.getHeader("PAYMENT-SIGNATURE"); | ||
| if (header) { | ||
| try { | ||
| return decodePaymentSignatureHeader(header); | ||
| } catch (error) { | ||
| console.warn("Failed to decode PAYMENT-SIGNATURE header:", error); | ||
| } | ||
| } | ||
| return null; | ||
| } | ||
| /** | ||
| * Check if request is from a web browser | ||
| * | ||
| * @param adapter - HTTP adapter | ||
| * @returns True if request appears to be from a browser | ||
| */ | ||
| isWebBrowser(adapter) { | ||
| const accept = adapter.getAcceptHeader(); | ||
| const userAgent = adapter.getUserAgent(); | ||
| return accept.includes("text/html") && userAgent.includes("Mozilla"); | ||
| } | ||
| /** | ||
| * Create HTTP response instructions from payment required | ||
| * | ||
| * @param paymentRequired - Payment requirements | ||
| * @param isWebBrowser - Whether request is from browser | ||
| * @param paywallConfig - Paywall configuration | ||
| * @param customHtml - Custom HTML template | ||
| * @param unpaidResponse - Optional custom response (content type and body) for unpaid API requests | ||
| * @returns Response instructions | ||
| */ | ||
| createHTTPResponse(paymentRequired, isWebBrowser, paywallConfig, customHtml, unpaidResponse) { | ||
| const status = paymentRequired.error === "permit2_allowance_required" ? 412 : 402; | ||
| if (isWebBrowser) { | ||
| const html = this.generatePaywallHTML(paymentRequired, paywallConfig, customHtml); | ||
| return { | ||
| status, | ||
| headers: { "Content-Type": "text/html" }, | ||
| body: html, | ||
| isHtml: true | ||
| }; | ||
| } | ||
| const response = this.createHTTPPaymentRequiredResponse(paymentRequired); | ||
| const contentType = unpaidResponse ? unpaidResponse.contentType : "application/json"; | ||
| const body = unpaidResponse ? unpaidResponse.body : {}; | ||
| return { | ||
| status, | ||
| headers: { | ||
| "Content-Type": contentType, | ||
| ...response.headers | ||
| }, | ||
| body | ||
| }; | ||
| } | ||
| /** | ||
| * Create HTTP payment required response (v1 puts in body, v2 puts in header) | ||
| * | ||
| * @param paymentRequired - Payment required object | ||
| * @returns Headers and body for the HTTP response | ||
| */ | ||
| createHTTPPaymentRequiredResponse(paymentRequired) { | ||
| return { | ||
| headers: { | ||
| "PAYMENT-REQUIRED": encodePaymentRequiredHeader(paymentRequired) | ||
| } | ||
| }; | ||
| } | ||
| /** | ||
| * Create settlement response headers | ||
| * | ||
| * @param settleResponse - Settlement response | ||
| * @returns Headers to add to response | ||
| */ | ||
| createSettlementHeaders(settleResponse) { | ||
| const encoded = encodePaymentResponseHeader(settleResponse); | ||
| return { "PAYMENT-RESPONSE": encoded }; | ||
| } | ||
| /** | ||
| * Parse route pattern into verb and regex | ||
| * | ||
| * @param pattern - Route pattern like "GET /api/*" or "/api/[id]" | ||
| * @returns Parsed pattern with verb and regex | ||
| */ | ||
| parseRoutePattern(pattern) { | ||
| const [verb, path] = pattern.includes(" ") ? pattern.split(/\s+/) : ["*", pattern]; | ||
| const regex = new RegExp( | ||
| `^${path.replace(/[$()+.?^{|}]/g, "\\$&").replace(/\*/g, ".*?").replace(/\[([^\]]+)\]/g, "[^/]+").replace(/\//g, "\\/")}$`, | ||
| "i" | ||
| ); | ||
| return { verb: verb.toUpperCase(), regex }; | ||
| } | ||
| /** | ||
| * Normalize path for matching | ||
| * | ||
| * @param path - Raw path from request | ||
| * @returns Normalized path | ||
| */ | ||
| normalizePath(path) { | ||
| const pathWithoutQuery = path.split(/[?#]/)[0]; | ||
| let decodedOrRawPath; | ||
| try { | ||
| decodedOrRawPath = decodeURIComponent(pathWithoutQuery); | ||
| } catch { | ||
| decodedOrRawPath = pathWithoutQuery; | ||
| } | ||
| return decodedOrRawPath.replace(/\\/g, "/").replace(/\/+/g, "/").replace(/(.+?)\/+$/, "$1"); | ||
| } | ||
| /** | ||
| * Generate paywall HTML for browser requests | ||
| * | ||
| * @param paymentRequired - Payment required response | ||
| * @param paywallConfig - Optional paywall configuration | ||
| * @param customHtml - Optional custom HTML template | ||
| * @returns HTML string | ||
| */ | ||
| generatePaywallHTML(paymentRequired, paywallConfig, customHtml) { | ||
| if (customHtml) { | ||
| return customHtml; | ||
| } | ||
| if (this.paywallProvider) { | ||
| return this.paywallProvider.generateHtml(paymentRequired, paywallConfig); | ||
| } | ||
| try { | ||
| const paywall = __require("@x402/paywall"); | ||
| const displayAmount2 = this.getDisplayAmount(paymentRequired); | ||
| const resource2 = paymentRequired.resource; | ||
| return paywall.getPaywallHtml({ | ||
| amount: displayAmount2, | ||
| paymentRequired, | ||
| currentUrl: resource2?.url || paywallConfig?.currentUrl || "", | ||
| testnet: paywallConfig?.testnet ?? true, | ||
| appName: paywallConfig?.appName, | ||
| appLogo: paywallConfig?.appLogo, | ||
| sessionTokenEndpoint: paywallConfig?.sessionTokenEndpoint | ||
| }); | ||
| } catch { | ||
| } | ||
| const resource = paymentRequired.resource; | ||
| const displayAmount = this.getDisplayAmount(paymentRequired); | ||
| return ` | ||
| <!DOCTYPE html> | ||
| <html> | ||
| <head> | ||
| <title>Payment Required</title> | ||
| <meta charset="UTF-8"> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||
| </head> | ||
| <body> | ||
| <div style="max-width: 600px; margin: 50px auto; padding: 20px; font-family: system-ui, -apple-system, sans-serif;"> | ||
| ${paywallConfig?.appLogo ? `<img src="${paywallConfig.appLogo}" alt="${paywallConfig.appName || "App"}" style="max-width: 200px; margin-bottom: 20px;">` : ""} | ||
| <h1>Payment Required</h1> | ||
| ${resource ? `<p><strong>Resource:</strong> ${resource.description || resource.url}</p>` : ""} | ||
| <p><strong>Amount:</strong> $${displayAmount.toFixed(2)} USDC</p> | ||
| <div id="payment-widget" | ||
| data-requirements='${JSON.stringify(paymentRequired)}' | ||
| data-app-name="${paywallConfig?.appName || ""}" | ||
| data-testnet="${paywallConfig?.testnet || false}"> | ||
| <!-- Install @x402/paywall for full wallet integration --> | ||
| <p style="margin-top: 2rem; padding: 1rem; background: #fef3c7; border-radius: 0.5rem;"> | ||
| <strong>Note:</strong> Install <code>@x402/paywall</code> for full wallet connection and payment UI. | ||
| </p> | ||
| </div> | ||
| </div> | ||
| </body> | ||
| </html> | ||
| `; | ||
| } | ||
| /** | ||
| * Extract display amount from payment requirements. | ||
| * | ||
| * @param paymentRequired - The payment required object | ||
| * @returns The display amount in decimal format | ||
| */ | ||
| getDisplayAmount(paymentRequired) { | ||
| const accepts = paymentRequired.accepts; | ||
| if (accepts && accepts.length > 0) { | ||
| const firstReq = accepts[0]; | ||
| if ("amount" in firstReq) { | ||
| return parseFloat(firstReq.amount) / 1e6; | ||
| } | ||
| } | ||
| return 0; | ||
| } | ||
| }; | ||
| // src/http/httpFacilitatorClient.ts | ||
| var DEFAULT_FACILITATOR_URL = "https://x402.org/facilitator"; | ||
| var HTTPFacilitatorClient = class { | ||
| /** | ||
| * Creates a new HTTPFacilitatorClient instance. | ||
| * | ||
| * @param config - Configuration options for the facilitator client | ||
| */ | ||
| constructor(config) { | ||
| this.url = config?.url || DEFAULT_FACILITATOR_URL; | ||
| this._createAuthHeaders = config?.createAuthHeaders; | ||
| } | ||
| /** | ||
| * Verify a payment with the facilitator | ||
| * | ||
| * @param paymentPayload - The payment to verify | ||
| * @param paymentRequirements - The requirements to verify against | ||
| * @returns Verification response | ||
| */ | ||
| async verify(paymentPayload, paymentRequirements) { | ||
| let headers = { | ||
| "Content-Type": "application/json" | ||
| }; | ||
| if (this._createAuthHeaders) { | ||
| const authHeaders = await this.createAuthHeaders("verify"); | ||
| headers = { ...headers, ...authHeaders.headers }; | ||
| } | ||
| const response = await fetch(`${this.url}/verify`, { | ||
| method: "POST", | ||
| headers, | ||
| body: JSON.stringify({ | ||
| x402Version: paymentPayload.x402Version, | ||
| paymentPayload: this.toJsonSafe(paymentPayload), | ||
| paymentRequirements: this.toJsonSafe(paymentRequirements) | ||
| }) | ||
| }); | ||
| const data = await response.json(); | ||
| if (typeof data === "object" && data !== null && "isValid" in data) { | ||
| const verifyResponse = data; | ||
| if (!response.ok) { | ||
| throw new VerifyError(response.status, verifyResponse); | ||
| } | ||
| return verifyResponse; | ||
| } | ||
| throw new Error(`Facilitator verify failed (${response.status}): ${JSON.stringify(data)}`); | ||
| } | ||
| /** | ||
| * Settle a payment with the facilitator | ||
| * | ||
| * @param paymentPayload - The payment to settle | ||
| * @param paymentRequirements - The requirements for settlement | ||
| * @returns Settlement response | ||
| */ | ||
| async settle(paymentPayload, paymentRequirements) { | ||
| let headers = { | ||
| "Content-Type": "application/json" | ||
| }; | ||
| if (this._createAuthHeaders) { | ||
| const authHeaders = await this.createAuthHeaders("settle"); | ||
| headers = { ...headers, ...authHeaders.headers }; | ||
| } | ||
| const response = await fetch(`${this.url}/settle`, { | ||
| method: "POST", | ||
| headers, | ||
| body: JSON.stringify({ | ||
| x402Version: paymentPayload.x402Version, | ||
| paymentPayload: this.toJsonSafe(paymentPayload), | ||
| paymentRequirements: this.toJsonSafe(paymentRequirements) | ||
| }) | ||
| }); | ||
| const data = await response.json(); | ||
| if (typeof data === "object" && data !== null && "success" in data) { | ||
| const settleResponse = data; | ||
| if (!response.ok) { | ||
| throw new SettleError(response.status, settleResponse); | ||
| } | ||
| return settleResponse; | ||
| } | ||
| throw new Error(`Facilitator settle failed (${response.status}): ${JSON.stringify(data)}`); | ||
| } | ||
| /** | ||
| * Get supported payment kinds and extensions from the facilitator | ||
| * | ||
| * @returns Supported payment kinds and extensions | ||
| */ | ||
| async getSupported() { | ||
| let headers = { | ||
| "Content-Type": "application/json" | ||
| }; | ||
| if (this._createAuthHeaders) { | ||
| const authHeaders = await this.createAuthHeaders("supported"); | ||
| headers = { ...headers, ...authHeaders.headers }; | ||
| } | ||
| const response = await fetch(`${this.url}/supported`, { | ||
| method: "GET", | ||
| headers | ||
| }); | ||
| if (!response.ok) { | ||
| const errorText = await response.text().catch(() => response.statusText); | ||
| throw new Error(`Facilitator getSupported failed (${response.status}): ${errorText}`); | ||
| } | ||
| return await response.json(); | ||
| } | ||
| /** | ||
| * Creates authentication headers for a specific path. | ||
| * | ||
| * @param path - The path to create authentication headers for (e.g., "verify", "settle", "supported") | ||
| * @returns An object containing the authentication headers for the specified path | ||
| */ | ||
| async createAuthHeaders(path) { | ||
| if (this._createAuthHeaders) { | ||
| const authHeaders = await this._createAuthHeaders(); | ||
| return { | ||
| headers: authHeaders[path] ?? {} | ||
| }; | ||
| } | ||
| return { | ||
| headers: {} | ||
| }; | ||
| } | ||
| /** | ||
| * Helper to convert objects to JSON-safe format. | ||
| * Handles BigInt and other non-JSON types. | ||
| * | ||
| * @param obj - The object to convert | ||
| * @returns The JSON-safe representation of the object | ||
| */ | ||
| toJsonSafe(obj) { | ||
| return JSON.parse( | ||
| JSON.stringify(obj, (_, value) => typeof value === "bigint" ? value.toString() : value) | ||
| ); | ||
| } | ||
| }; | ||
| // src/http/x402HTTPClient.ts | ||
| var x402HTTPClient = class { | ||
| /** | ||
| * Creates a new x402HTTPClient instance. | ||
| * | ||
| * @param client - The underlying x402Client for payment logic | ||
| */ | ||
| constructor(client) { | ||
| this.client = client; | ||
| this.paymentRequiredHooks = []; | ||
| } | ||
| /** | ||
| * Register a hook to handle 402 responses before payment. | ||
| * Hooks run in order; first to return headers wins. | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns This instance for chaining | ||
| */ | ||
| onPaymentRequired(hook) { | ||
| this.paymentRequiredHooks.push(hook); | ||
| return this; | ||
| } | ||
| /** | ||
| * Run hooks and return headers if any hook provides them. | ||
| * | ||
| * @param paymentRequired - The payment required response from the server | ||
| * @returns Headers to use for retry, or null to proceed to payment | ||
| */ | ||
| async handlePaymentRequired(paymentRequired) { | ||
| for (const hook of this.paymentRequiredHooks) { | ||
| const result = await hook({ paymentRequired }); | ||
| if (result?.headers) { | ||
| return result.headers; | ||
| } | ||
| } | ||
| return null; | ||
| } | ||
| /** | ||
| * Encodes a payment payload into appropriate HTTP headers based on version. | ||
| * | ||
| * @param paymentPayload - The payment payload to encode | ||
| * @returns HTTP headers containing the encoded payment signature | ||
| */ | ||
| encodePaymentSignatureHeader(paymentPayload) { | ||
| switch (paymentPayload.x402Version) { | ||
| case 2: | ||
| return { | ||
| "PAYMENT-SIGNATURE": encodePaymentSignatureHeader(paymentPayload) | ||
| }; | ||
| case 1: | ||
| return { | ||
| "X-PAYMENT": encodePaymentSignatureHeader(paymentPayload) | ||
| }; | ||
| default: | ||
| throw new Error( | ||
| `Unsupported x402 version: ${paymentPayload.x402Version}` | ||
| ); | ||
| } | ||
| } | ||
| /** | ||
| * Extracts payment required information from HTTP response. | ||
| * | ||
| * @param getHeader - Function to retrieve header value by name (case-insensitive) | ||
| * @param body - Optional response body for v1 compatibility | ||
| * @returns The payment required object | ||
| */ | ||
| getPaymentRequiredResponse(getHeader, body) { | ||
| const paymentRequired = getHeader("PAYMENT-REQUIRED"); | ||
| if (paymentRequired) { | ||
| return decodePaymentRequiredHeader(paymentRequired); | ||
| } | ||
| if (body && body instanceof Object && "x402Version" in body && body.x402Version === 1) { | ||
| return body; | ||
| } | ||
| throw new Error("Invalid payment required response"); | ||
| } | ||
| /** | ||
| * Extracts payment settlement response from HTTP headers. | ||
| * | ||
| * @param getHeader - Function to retrieve header value by name (case-insensitive) | ||
| * @returns The settlement response object | ||
| */ | ||
| getPaymentSettleResponse(getHeader) { | ||
| const paymentResponse = getHeader("PAYMENT-RESPONSE"); | ||
| if (paymentResponse) { | ||
| return decodePaymentResponseHeader(paymentResponse); | ||
| } | ||
| const xPaymentResponse = getHeader("X-PAYMENT-RESPONSE"); | ||
| if (xPaymentResponse) { | ||
| return decodePaymentResponseHeader(xPaymentResponse); | ||
| } | ||
| throw new Error("Payment response header not found"); | ||
| } | ||
| /** | ||
| * Creates a payment payload for the given payment requirements. | ||
| * Delegates to the underlying x402Client. | ||
| * | ||
| * @param paymentRequired - The payment required response from the server | ||
| * @returns Promise resolving to the payment payload | ||
| */ | ||
| async createPaymentPayload(paymentRequired) { | ||
| return this.client.createPaymentPayload(paymentRequired); | ||
| } | ||
| }; | ||
| // src/http/index.ts | ||
| function encodePaymentSignatureHeader(paymentPayload) { | ||
| return safeBase64Encode(JSON.stringify(paymentPayload)); | ||
| } | ||
| function decodePaymentSignatureHeader(paymentSignatureHeader) { | ||
| if (!Base64EncodedRegex.test(paymentSignatureHeader)) { | ||
| throw new Error("Invalid payment signature header"); | ||
| } | ||
| return JSON.parse(safeBase64Decode(paymentSignatureHeader)); | ||
| } | ||
| function encodePaymentRequiredHeader(paymentRequired) { | ||
| return safeBase64Encode(JSON.stringify(paymentRequired)); | ||
| } | ||
| function decodePaymentRequiredHeader(paymentRequiredHeader) { | ||
| if (!Base64EncodedRegex.test(paymentRequiredHeader)) { | ||
| throw new Error("Invalid payment required header"); | ||
| } | ||
| return JSON.parse(safeBase64Decode(paymentRequiredHeader)); | ||
| } | ||
| function encodePaymentResponseHeader(paymentResponse) { | ||
| return safeBase64Encode(JSON.stringify(paymentResponse)); | ||
| } | ||
| function decodePaymentResponseHeader(paymentResponseHeader) { | ||
| if (!Base64EncodedRegex.test(paymentResponseHeader)) { | ||
| throw new Error("Invalid payment response header"); | ||
| } | ||
| return JSON.parse(safeBase64Decode(paymentResponseHeader)); | ||
| } | ||
| export { | ||
| RouteConfigurationError, | ||
| x402HTTPResourceServer, | ||
| HTTPFacilitatorClient, | ||
| encodePaymentSignatureHeader, | ||
| decodePaymentSignatureHeader, | ||
| encodePaymentRequiredHeader, | ||
| decodePaymentRequiredHeader, | ||
| encodePaymentResponseHeader, | ||
| decodePaymentResponseHeader, | ||
| x402HTTPClient | ||
| }; | ||
| //# sourceMappingURL=chunk-CWIHZ5RE.mjs.map |
| {"version":3,"sources":["../../src/http/x402HTTPResourceServer.ts","../../src/http/httpFacilitatorClient.ts","../../src/http/x402HTTPClient.ts","../../src/http/index.ts"],"sourcesContent":["import { x402ResourceServer } from \"../server\";\nimport {\n decodePaymentSignatureHeader,\n encodePaymentRequiredHeader,\n encodePaymentResponseHeader,\n} from \".\";\nimport {\n PaymentPayload,\n PaymentRequired,\n SettleResponse,\n SettleError,\n Price,\n Network,\n PaymentRequirements,\n} from \"../types\";\nimport { x402Version } from \"..\";\n\n/**\n * Framework-agnostic HTTP adapter interface\n * Implementations provide framework-specific HTTP operations\n */\nexport interface HTTPAdapter {\n getHeader(name: string): string | undefined;\n getMethod(): string;\n getPath(): string;\n getUrl(): string;\n getAcceptHeader(): string;\n getUserAgent(): string;\n\n /**\n * Get query parameters from the request URL\n *\n * @returns Record of query parameter key-value pairs\n */\n getQueryParams?(): Record<string, string | string[]>;\n\n /**\n * Get a specific query parameter by name\n *\n * @param name - The query parameter name\n * @returns The query parameter value(s) or undefined\n */\n getQueryParam?(name: string): string | string[] | undefined;\n\n /**\n * Get the parsed request body\n * Framework adapters should parse JSON/form data appropriately\n *\n * @returns The parsed request body\n */\n getBody?(): unknown;\n}\n\n/**\n * Paywall configuration for HTML responses\n */\nexport interface PaywallConfig {\n appName?: string;\n appLogo?: string;\n sessionTokenEndpoint?: string;\n currentUrl?: string;\n testnet?: boolean;\n}\n\n/**\n * Paywall provider interface for generating HTML\n */\nexport interface PaywallProvider {\n generateHtml(paymentRequired: PaymentRequired, config?: PaywallConfig): string;\n}\n\n/**\n * Dynamic payTo function that receives HTTP request context\n */\nexport type DynamicPayTo = (context: HTTPRequestContext) => string | Promise<string>;\n\n/**\n * Dynamic price function that receives HTTP request context\n */\nexport type DynamicPrice = (context: HTTPRequestContext) => Price | Promise<Price>;\n\n/**\n * Result of the unpaid response callback containing content type and body.\n */\nexport interface UnpaidResponseResult {\n /**\n * The content type for the response (e.g., 'application/json', 'text/plain').\n */\n contentType: string;\n\n /**\n * The response body to include in the 402 response.\n */\n body: unknown;\n}\n\n/**\n * Dynamic function to generate a custom response for unpaid requests.\n * Receives the HTTP request context and returns the content type and body to include in the 402 response.\n */\nexport type UnpaidResponseBody = (\n context: HTTPRequestContext,\n) => UnpaidResponseResult | Promise<UnpaidResponseResult>;\n\n/**\n * A single payment option for a route\n * Represents one way a client can pay for access to the resource\n */\nexport interface PaymentOption {\n scheme: string;\n payTo: string | DynamicPayTo;\n price: Price | DynamicPrice;\n network: Network;\n maxTimeoutSeconds?: number;\n extra?: Record<string, unknown>;\n}\n\n/**\n * Route configuration for HTTP endpoints\n *\n * The 'accepts' field defines payment options for the route.\n * Can be a single PaymentOption or an array of PaymentOptions for multiple payment methods.\n */\nexport interface RouteConfig {\n // Payment option(s): single or array\n accepts: PaymentOption | PaymentOption[];\n\n // HTTP-specific metadata\n resource?: string;\n description?: string;\n mimeType?: string;\n customPaywallHtml?: string;\n\n /**\n * Optional callback to generate a custom response for unpaid API requests.\n * This allows servers to return preview data, error messages, or other content\n * when a request lacks payment.\n *\n * For browser requests (Accept: text/html), the paywall HTML takes precedence.\n * This callback is only used for API clients.\n *\n * If not provided, defaults to { contentType: 'application/json', body: {} }.\n *\n * @param context - The HTTP request context\n * @returns An object containing both contentType and body for the 402 response\n */\n unpaidResponseBody?: UnpaidResponseBody;\n\n // Extensions\n extensions?: Record<string, unknown>;\n}\n\n/**\n * Routes configuration - maps path patterns to route configs\n */\nexport type RoutesConfig = Record<string, RouteConfig> | RouteConfig;\n\n/**\n * Hook that runs on every request to a protected route, before payment processing.\n * Can grant access without payment, deny the request, or continue to payment flow.\n *\n * @returns\n * - `void` - Continue to payment processing (default behavior)\n * - `{ grantAccess: true }` - Grant access without requiring payment\n * - `{ abort: true; reason: string }` - Deny the request (returns 403)\n */\nexport type ProtectedRequestHook = (\n context: HTTPRequestContext,\n routeConfig: RouteConfig,\n) => Promise<void | { grantAccess: true } | { abort: true; reason: string }>;\n\n/**\n * Compiled route for efficient matching\n */\nexport interface CompiledRoute {\n verb: string;\n regex: RegExp;\n config: RouteConfig;\n}\n\n/**\n * HTTP request context that encapsulates all request data\n */\nexport interface HTTPRequestContext {\n adapter: HTTPAdapter;\n path: string;\n method: string;\n paymentHeader?: string;\n}\n\n/**\n * HTTP response instructions for the framework middleware\n */\nexport interface HTTPResponseInstructions {\n status: number;\n headers: Record<string, string>;\n body?: unknown; // e.g. Paywall for web browser requests, but could be any other type\n isHtml?: boolean; // e.g. if body is a paywall, then isHtml is true\n}\n\n/**\n * Result of processing an HTTP request for payment\n */\nexport type HTTPProcessResult =\n | { type: \"no-payment-required\" }\n | {\n type: \"payment-verified\";\n paymentPayload: PaymentPayload;\n paymentRequirements: PaymentRequirements;\n declaredExtensions?: Record<string, unknown>;\n }\n | { type: \"payment-error\"; response: HTTPResponseInstructions };\n\n/**\n * Result of processSettlement\n */\nexport type ProcessSettleSuccessResponse = SettleResponse & {\n success: true;\n headers: Record<string, string>;\n requirements: PaymentRequirements;\n};\n\nexport type ProcessSettleFailureResponse = SettleResponse & {\n success: false;\n errorReason: string;\n errorMessage?: string;\n};\n\nexport type ProcessSettleResultResponse =\n | ProcessSettleSuccessResponse\n | ProcessSettleFailureResponse;\n\n/**\n * Represents a validation error for a specific route's payment configuration.\n */\nexport interface RouteValidationError {\n /** The route pattern (e.g., \"GET /api/weather\") */\n routePattern: string;\n /** The payment scheme that failed validation */\n scheme: string;\n /** The network that failed validation */\n network: Network;\n /** The type of validation failure */\n reason: \"missing_scheme\" | \"missing_facilitator\";\n /** Human-readable error message */\n message: string;\n}\n\n/**\n * Error thrown when route configuration validation fails.\n */\nexport class RouteConfigurationError extends Error {\n /** The validation errors that caused this exception */\n public readonly errors: RouteValidationError[];\n\n /**\n * Creates a new RouteConfigurationError with the given validation errors.\n *\n * @param errors - The validation errors that caused this exception.\n */\n constructor(errors: RouteValidationError[]) {\n const message = `x402 Route Configuration Errors:\\n${errors.map(e => ` - ${e.message}`).join(\"\\n\")}`;\n super(message);\n this.name = \"RouteConfigurationError\";\n this.errors = errors;\n }\n}\n\n/**\n * HTTP-enhanced x402 resource server\n * Provides framework-agnostic HTTP protocol handling\n */\nexport class x402HTTPResourceServer {\n private ResourceServer: x402ResourceServer;\n private compiledRoutes: CompiledRoute[] = [];\n private routesConfig: RoutesConfig;\n private paywallProvider?: PaywallProvider;\n private protectedRequestHooks: ProtectedRequestHook[] = [];\n\n /**\n * Creates a new x402HTTPResourceServer instance.\n *\n * @param ResourceServer - The core x402ResourceServer instance to use\n * @param routes - Route configuration for payment-protected endpoints\n */\n constructor(ResourceServer: x402ResourceServer, routes: RoutesConfig) {\n this.ResourceServer = ResourceServer;\n this.routesConfig = routes;\n\n // Handle both single route and multiple routes\n const normalizedRoutes =\n typeof routes === \"object\" && !(\"accepts\" in routes)\n ? (routes as Record<string, RouteConfig>)\n : { \"*\": routes as RouteConfig };\n\n for (const [pattern, config] of Object.entries(normalizedRoutes)) {\n const parsed = this.parseRoutePattern(pattern);\n this.compiledRoutes.push({\n verb: parsed.verb,\n regex: parsed.regex,\n config,\n });\n }\n }\n\n /**\n * Get the underlying x402ResourceServer instance.\n *\n * @returns The underlying x402ResourceServer instance\n */\n get server(): x402ResourceServer {\n return this.ResourceServer;\n }\n\n /**\n * Get the routes configuration.\n *\n * @returns The routes configuration\n */\n get routes(): RoutesConfig {\n return this.routesConfig;\n }\n\n /**\n * Initialize the HTTP resource server.\n *\n * This method initializes the underlying resource server (fetching facilitator support)\n * and then validates that all route payment configurations have corresponding\n * registered schemes and facilitator support.\n *\n * @throws RouteConfigurationError if any route's payment options don't have\n * corresponding registered schemes or facilitator support\n *\n * @example\n * ```typescript\n * const httpServer = new x402HTTPResourceServer(server, routes);\n * await httpServer.initialize();\n * ```\n */\n async initialize(): Promise<void> {\n // First, initialize the underlying resource server (fetches facilitator support)\n await this.ResourceServer.initialize();\n\n // Then validate route configuration\n const errors = this.validateRouteConfiguration();\n if (errors.length > 0) {\n throw new RouteConfigurationError(errors);\n }\n }\n\n /**\n * Register a custom paywall provider for generating HTML\n *\n * @param provider - PaywallProvider instance\n * @returns This service instance for chaining\n */\n registerPaywallProvider(provider: PaywallProvider): this {\n this.paywallProvider = provider;\n return this;\n }\n\n /**\n * Register a hook that runs on every request to a protected route, before payment processing.\n * Hooks are executed in order of registration. The first hook to return a non-void result wins.\n *\n * @param hook - The request hook function\n * @returns The x402HTTPResourceServer instance for chaining\n */\n onProtectedRequest(hook: ProtectedRequestHook): this {\n this.protectedRequestHooks.push(hook);\n return this;\n }\n\n /**\n * Process HTTP request and return response instructions\n * This is the main entry point for framework middleware\n *\n * @param context - HTTP request context\n * @param paywallConfig - Optional paywall configuration\n * @returns Process result indicating next action for middleware\n */\n async processHTTPRequest(\n context: HTTPRequestContext,\n paywallConfig?: PaywallConfig,\n ): Promise<HTTPProcessResult> {\n const { adapter, path, method } = context;\n\n // Find matching route\n const routeConfig = this.getRouteConfig(path, method);\n if (!routeConfig) {\n return { type: \"no-payment-required\" }; // No payment required for this route\n }\n\n // Execute request hooks before any payment processing\n for (const hook of this.protectedRequestHooks) {\n const result = await hook(context, routeConfig);\n if (result && \"grantAccess\" in result) {\n return { type: \"no-payment-required\" };\n }\n if (result && \"abort\" in result) {\n return {\n type: \"payment-error\",\n response: {\n status: 403,\n headers: { \"Content-Type\": \"application/json\" },\n body: { error: result.reason },\n },\n };\n }\n }\n\n // Normalize accepts field to array of payment options\n const paymentOptions = this.normalizePaymentOptions(routeConfig);\n\n // Check for payment header (v1 or v2)\n const paymentPayload = this.extractPayment(adapter);\n\n // Create resource info, using config override if provided\n const resourceInfo = {\n url: routeConfig.resource || context.adapter.getUrl(),\n description: routeConfig.description || \"\",\n mimeType: routeConfig.mimeType || \"\",\n };\n\n // Build requirements from all payment options\n // (this method handles resolving dynamic functions internally)\n let requirements = await this.ResourceServer.buildPaymentRequirementsFromOptions(\n paymentOptions,\n context,\n );\n\n let extensions = routeConfig.extensions;\n if (extensions) {\n extensions = this.ResourceServer.enrichExtensions(extensions, context);\n }\n\n // createPaymentRequiredResponse already handles extension enrichment in the core layer\n const paymentRequired = await this.ResourceServer.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n !paymentPayload ? \"Payment required\" : undefined,\n extensions,\n );\n\n // If no payment provided\n if (!paymentPayload) {\n // Resolve custom unpaid response body if provided\n const unpaidBody = routeConfig.unpaidResponseBody\n ? await routeConfig.unpaidResponseBody(context)\n : undefined;\n\n return {\n type: \"payment-error\",\n response: this.createHTTPResponse(\n paymentRequired,\n this.isWebBrowser(adapter),\n paywallConfig,\n routeConfig.customPaywallHtml,\n unpaidBody,\n ),\n };\n }\n\n // Verify payment\n try {\n const matchingRequirements = this.ResourceServer.findMatchingRequirements(\n paymentRequired.accepts,\n paymentPayload,\n );\n\n if (!matchingRequirements) {\n const errorResponse = await this.ResourceServer.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n \"No matching payment requirements\",\n routeConfig.extensions,\n );\n return {\n type: \"payment-error\",\n response: this.createHTTPResponse(errorResponse, false, paywallConfig),\n };\n }\n\n const verifyResult = await this.ResourceServer.verifyPayment(\n paymentPayload,\n matchingRequirements,\n );\n\n if (!verifyResult.isValid) {\n const errorResponse = await this.ResourceServer.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n verifyResult.invalidReason,\n routeConfig.extensions,\n );\n return {\n type: \"payment-error\",\n response: this.createHTTPResponse(errorResponse, false, paywallConfig),\n };\n }\n\n // Payment is valid, return data needed for settlement\n return {\n type: \"payment-verified\",\n paymentPayload,\n paymentRequirements: matchingRequirements,\n declaredExtensions: routeConfig.extensions,\n };\n } catch (error) {\n const errorResponse = await this.ResourceServer.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n error instanceof Error ? error.message : \"Payment verification failed\",\n routeConfig.extensions,\n );\n return {\n type: \"payment-error\",\n response: this.createHTTPResponse(errorResponse, false, paywallConfig),\n };\n }\n }\n\n /**\n * Process settlement after successful response\n *\n * @param paymentPayload - The verified payment payload\n * @param requirements - The matching payment requirements\n * @param declaredExtensions - Optional declared extensions (for per-key enrichment)\n * @returns ProcessSettleResultResponse - SettleResponse with headers if success or errorReason if failure\n */\n async processSettlement(\n paymentPayload: PaymentPayload,\n requirements: PaymentRequirements,\n declaredExtensions?: Record<string, unknown>,\n ): Promise<ProcessSettleResultResponse> {\n try {\n const settleResponse = await this.ResourceServer.settlePayment(\n paymentPayload,\n requirements,\n declaredExtensions,\n );\n\n if (!settleResponse.success) {\n return {\n ...settleResponse,\n success: false,\n errorReason: settleResponse.errorReason || \"Settlement failed\",\n errorMessage:\n settleResponse.errorMessage || settleResponse.errorReason || \"Settlement failed\",\n };\n }\n\n return {\n ...settleResponse,\n success: true,\n headers: this.createSettlementHeaders(settleResponse),\n requirements,\n };\n } catch (error) {\n if (error instanceof SettleError) {\n return {\n success: false,\n errorReason: error.errorReason || error.message,\n errorMessage: error.errorMessage || error.errorReason || error.message,\n payer: error.payer,\n network: error.network,\n transaction: error.transaction,\n };\n }\n return {\n success: false,\n errorReason: error instanceof Error ? error.message : \"Settlement failed\",\n errorMessage: error instanceof Error ? error.message : \"Settlement failed\",\n network: requirements.network as Network,\n transaction: \"\",\n };\n }\n }\n\n /**\n * Check if a request requires payment based on route configuration\n *\n * @param context - HTTP request context\n * @returns True if the route requires payment, false otherwise\n */\n requiresPayment(context: HTTPRequestContext): boolean {\n const routeConfig = this.getRouteConfig(context.path, context.method);\n return routeConfig !== undefined;\n }\n\n /**\n * Normalizes a RouteConfig's accepts field into an array of PaymentOptions\n * Handles both single PaymentOption and array formats\n *\n * @param routeConfig - Route configuration\n * @returns Array of payment options\n */\n private normalizePaymentOptions(routeConfig: RouteConfig): PaymentOption[] {\n return Array.isArray(routeConfig.accepts) ? routeConfig.accepts : [routeConfig.accepts];\n }\n\n /**\n * Validates that all payment options in routes have corresponding registered schemes\n * and facilitator support.\n *\n * @returns Array of validation errors (empty if all routes are valid)\n */\n private validateRouteConfiguration(): RouteValidationError[] {\n const errors: RouteValidationError[] = [];\n\n // Normalize routes to array of [pattern, config] pairs\n const normalizedRoutes =\n typeof this.routesConfig === \"object\" && !(\"accepts\" in this.routesConfig)\n ? Object.entries(this.routesConfig as Record<string, RouteConfig>)\n : [[\"*\", this.routesConfig as RouteConfig] as [string, RouteConfig]];\n\n for (const [pattern, config] of normalizedRoutes) {\n const paymentOptions = this.normalizePaymentOptions(config);\n\n for (const option of paymentOptions) {\n // Check 1: Is scheme registered?\n if (!this.ResourceServer.hasRegisteredScheme(option.network, option.scheme)) {\n errors.push({\n routePattern: pattern,\n scheme: option.scheme,\n network: option.network,\n reason: \"missing_scheme\",\n message: `Route \"${pattern}\": No scheme implementation registered for \"${option.scheme}\" on network \"${option.network}\"`,\n });\n // Skip facilitator check if scheme isn't registered\n continue;\n }\n\n // Check 2: Does facilitator support this scheme/network combination?\n const supportedKind = this.ResourceServer.getSupportedKind(\n x402Version,\n option.network,\n option.scheme,\n );\n\n if (!supportedKind) {\n errors.push({\n routePattern: pattern,\n scheme: option.scheme,\n network: option.network,\n reason: \"missing_facilitator\",\n message: `Route \"${pattern}\": Facilitator does not support scheme \"${option.scheme}\" on network \"${option.network}\"`,\n });\n }\n }\n }\n\n return errors;\n }\n\n /**\n * Get route configuration for a request\n *\n * @param path - Request path\n * @param method - HTTP method\n * @returns Route configuration or undefined if no match\n */\n private getRouteConfig(path: string, method: string): RouteConfig | undefined {\n const normalizedPath = this.normalizePath(path);\n const upperMethod = method.toUpperCase();\n\n const matchingRoute = this.compiledRoutes.find(\n route =>\n route.regex.test(normalizedPath) && (route.verb === \"*\" || route.verb === upperMethod),\n );\n\n return matchingRoute?.config;\n }\n\n /**\n * Extract payment from HTTP headers (handles v1 and v2)\n *\n * @param adapter - HTTP adapter\n * @returns Decoded payment payload or null\n */\n private extractPayment(adapter: HTTPAdapter): PaymentPayload | null {\n // Check v2 header first (PAYMENT-SIGNATURE)\n const header = adapter.getHeader(\"payment-signature\") || adapter.getHeader(\"PAYMENT-SIGNATURE\");\n\n if (header) {\n try {\n return decodePaymentSignatureHeader(header);\n } catch (error) {\n console.warn(\"Failed to decode PAYMENT-SIGNATURE header:\", error);\n }\n }\n\n return null;\n }\n\n /**\n * Check if request is from a web browser\n *\n * @param adapter - HTTP adapter\n * @returns True if request appears to be from a browser\n */\n private isWebBrowser(adapter: HTTPAdapter): boolean {\n const accept = adapter.getAcceptHeader();\n const userAgent = adapter.getUserAgent();\n return accept.includes(\"text/html\") && userAgent.includes(\"Mozilla\");\n }\n\n /**\n * Create HTTP response instructions from payment required\n *\n * @param paymentRequired - Payment requirements\n * @param isWebBrowser - Whether request is from browser\n * @param paywallConfig - Paywall configuration\n * @param customHtml - Custom HTML template\n * @param unpaidResponse - Optional custom response (content type and body) for unpaid API requests\n * @returns Response instructions\n */\n private createHTTPResponse(\n paymentRequired: PaymentRequired,\n isWebBrowser: boolean,\n paywallConfig?: PaywallConfig,\n customHtml?: string,\n unpaidResponse?: UnpaidResponseResult,\n ): HTTPResponseInstructions {\n // Use 412 Precondition Failed for permit2_allowance_required error\n // This signals client needs to approve Permit2 before retrying\n const status = paymentRequired.error === \"permit2_allowance_required\" ? 412 : 402;\n\n if (isWebBrowser) {\n const html = this.generatePaywallHTML(paymentRequired, paywallConfig, customHtml);\n return {\n status,\n headers: { \"Content-Type\": \"text/html\" },\n body: html,\n isHtml: true,\n };\n }\n\n const response = this.createHTTPPaymentRequiredResponse(paymentRequired);\n\n // Use callback result if provided, otherwise default to JSON with empty object\n const contentType = unpaidResponse ? unpaidResponse.contentType : \"application/json\";\n const body = unpaidResponse ? unpaidResponse.body : {};\n\n return {\n status,\n headers: {\n \"Content-Type\": contentType,\n ...response.headers,\n },\n body,\n };\n }\n\n /**\n * Create HTTP payment required response (v1 puts in body, v2 puts in header)\n *\n * @param paymentRequired - Payment required object\n * @returns Headers and body for the HTTP response\n */\n private createHTTPPaymentRequiredResponse(paymentRequired: PaymentRequired): {\n headers: Record<string, string>;\n } {\n return {\n headers: {\n \"PAYMENT-REQUIRED\": encodePaymentRequiredHeader(paymentRequired),\n },\n };\n }\n\n /**\n * Create settlement response headers\n *\n * @param settleResponse - Settlement response\n * @returns Headers to add to response\n */\n private createSettlementHeaders(settleResponse: SettleResponse): Record<string, string> {\n const encoded = encodePaymentResponseHeader(settleResponse);\n return { \"PAYMENT-RESPONSE\": encoded };\n }\n\n /**\n * Parse route pattern into verb and regex\n *\n * @param pattern - Route pattern like \"GET /api/*\" or \"/api/[id]\"\n * @returns Parsed pattern with verb and regex\n */\n private parseRoutePattern(pattern: string): { verb: string; regex: RegExp } {\n const [verb, path] = pattern.includes(\" \") ? pattern.split(/\\s+/) : [\"*\", pattern];\n\n const regex = new RegExp(\n `^${\n path\n .replace(/[$()+.?^{|}]/g, \"\\\\$&\") // Escape regex special chars\n .replace(/\\*/g, \".*?\") // Wildcards\n .replace(/\\[([^\\]]+)\\]/g, \"[^/]+\") // Parameters\n .replace(/\\//g, \"\\\\/\") // Escape slashes\n }$`,\n \"i\",\n );\n\n return { verb: verb.toUpperCase(), regex };\n }\n\n /**\n * Normalize path for matching\n *\n * @param path - Raw path from request\n * @returns Normalized path\n */\n private normalizePath(path: string): string {\n const pathWithoutQuery = path.split(/[?#]/)[0];\n\n let decodedOrRawPath: string;\n try {\n decodedOrRawPath = decodeURIComponent(pathWithoutQuery);\n } catch {\n decodedOrRawPath = pathWithoutQuery;\n }\n\n return decodedOrRawPath\n .replace(/\\\\/g, \"/\")\n .replace(/\\/+/g, \"/\")\n .replace(/(.+?)\\/+$/, \"$1\");\n }\n\n /**\n * Generate paywall HTML for browser requests\n *\n * @param paymentRequired - Payment required response\n * @param paywallConfig - Optional paywall configuration\n * @param customHtml - Optional custom HTML template\n * @returns HTML string\n */\n private generatePaywallHTML(\n paymentRequired: PaymentRequired,\n paywallConfig?: PaywallConfig,\n customHtml?: string,\n ): string {\n if (customHtml) {\n return customHtml;\n }\n\n // Use custom paywall provider if set\n if (this.paywallProvider) {\n return this.paywallProvider.generateHtml(paymentRequired, paywallConfig);\n }\n\n // Try to use @x402/paywall if available (optional dependency)\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const paywall = require(\"@x402/paywall\");\n const displayAmount = this.getDisplayAmount(paymentRequired);\n const resource = paymentRequired.resource;\n\n return paywall.getPaywallHtml({\n amount: displayAmount,\n paymentRequired,\n currentUrl: resource?.url || paywallConfig?.currentUrl || \"\",\n testnet: paywallConfig?.testnet ?? true,\n appName: paywallConfig?.appName,\n appLogo: paywallConfig?.appLogo,\n sessionTokenEndpoint: paywallConfig?.sessionTokenEndpoint,\n });\n } catch {\n // @x402/paywall not installed, fall back to basic HTML\n }\n\n // Fallback: Basic HTML paywall\n const resource = paymentRequired.resource;\n const displayAmount = this.getDisplayAmount(paymentRequired);\n\n return `\n <!DOCTYPE html>\n <html>\n <head>\n <title>Payment Required</title>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n </head>\n <body>\n <div style=\"max-width: 600px; margin: 50px auto; padding: 20px; font-family: system-ui, -apple-system, sans-serif;\">\n ${paywallConfig?.appLogo ? `<img src=\"${paywallConfig.appLogo}\" alt=\"${paywallConfig.appName || \"App\"}\" style=\"max-width: 200px; margin-bottom: 20px;\">` : \"\"}\n <h1>Payment Required</h1>\n ${resource ? `<p><strong>Resource:</strong> ${resource.description || resource.url}</p>` : \"\"}\n <p><strong>Amount:</strong> $${displayAmount.toFixed(2)} USDC</p>\n <div id=\"payment-widget\" \n data-requirements='${JSON.stringify(paymentRequired)}'\n data-app-name=\"${paywallConfig?.appName || \"\"}\"\n data-testnet=\"${paywallConfig?.testnet || false}\">\n <!-- Install @x402/paywall for full wallet integration -->\n <p style=\"margin-top: 2rem; padding: 1rem; background: #fef3c7; border-radius: 0.5rem;\">\n <strong>Note:</strong> Install <code>@x402/paywall</code> for full wallet connection and payment UI.\n </p>\n </div>\n </div>\n </body>\n </html>\n `;\n }\n\n /**\n * Extract display amount from payment requirements.\n *\n * @param paymentRequired - The payment required object\n * @returns The display amount in decimal format\n */\n private getDisplayAmount(paymentRequired: PaymentRequired): number {\n const accepts = paymentRequired.accepts;\n if (accepts && accepts.length > 0) {\n const firstReq = accepts[0];\n if (\"amount\" in firstReq) {\n // V2 format\n return parseFloat(firstReq.amount) / 1000000; // Assuming USDC with 6 decimals\n }\n }\n return 0;\n }\n}\n","import { PaymentPayload, PaymentRequirements } from \"../types/payments\";\nimport {\n VerifyResponse,\n SettleResponse,\n SupportedResponse,\n VerifyError,\n SettleError,\n} from \"../types/facilitator\";\n\nconst DEFAULT_FACILITATOR_URL = \"https://x402.org/facilitator\";\n\nexport interface FacilitatorConfig {\n url?: string;\n createAuthHeaders?: () => Promise<{\n verify: Record<string, string>;\n settle: Record<string, string>;\n supported: Record<string, string>;\n }>;\n}\n\n/**\n * Interface for facilitator clients\n * Can be implemented for HTTP-based or local facilitators\n */\nexport interface FacilitatorClient {\n /**\n * Verify a payment with the facilitator\n *\n * @param paymentPayload - The payment to verify\n * @param paymentRequirements - The requirements to verify against\n * @returns Verification response\n */\n verify(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n ): Promise<VerifyResponse>;\n\n /**\n * Settle a payment with the facilitator\n *\n * @param paymentPayload - The payment to settle\n * @param paymentRequirements - The requirements for settlement\n * @returns Settlement response\n */\n settle(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n ): Promise<SettleResponse>;\n\n /**\n * Get supported payment kinds and extensions from the facilitator\n *\n * @returns Supported payment kinds and extensions\n */\n getSupported(): Promise<SupportedResponse>;\n}\n\n/**\n * HTTP-based client for interacting with x402 facilitator services\n * Handles HTTP communication with facilitator endpoints\n */\nexport class HTTPFacilitatorClient implements FacilitatorClient {\n readonly url: string;\n private readonly _createAuthHeaders?: FacilitatorConfig[\"createAuthHeaders\"];\n\n /**\n * Creates a new HTTPFacilitatorClient instance.\n *\n * @param config - Configuration options for the facilitator client\n */\n constructor(config?: FacilitatorConfig) {\n this.url = config?.url || DEFAULT_FACILITATOR_URL;\n this._createAuthHeaders = config?.createAuthHeaders;\n }\n\n /**\n * Verify a payment with the facilitator\n *\n * @param paymentPayload - The payment to verify\n * @param paymentRequirements - The requirements to verify against\n * @returns Verification response\n */\n async verify(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n ): Promise<VerifyResponse> {\n let headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (this._createAuthHeaders) {\n const authHeaders = await this.createAuthHeaders(\"verify\");\n headers = { ...headers, ...authHeaders.headers };\n }\n\n const response = await fetch(`${this.url}/verify`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n x402Version: paymentPayload.x402Version,\n paymentPayload: this.toJsonSafe(paymentPayload),\n paymentRequirements: this.toJsonSafe(paymentRequirements),\n }),\n });\n\n const data = await response.json();\n\n if (typeof data === \"object\" && data !== null && \"isValid\" in data) {\n const verifyResponse = data as VerifyResponse;\n if (!response.ok) {\n throw new VerifyError(response.status, verifyResponse);\n }\n return verifyResponse;\n }\n\n throw new Error(`Facilitator verify failed (${response.status}): ${JSON.stringify(data)}`);\n }\n\n /**\n * Settle a payment with the facilitator\n *\n * @param paymentPayload - The payment to settle\n * @param paymentRequirements - The requirements for settlement\n * @returns Settlement response\n */\n async settle(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n ): Promise<SettleResponse> {\n let headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (this._createAuthHeaders) {\n const authHeaders = await this.createAuthHeaders(\"settle\");\n headers = { ...headers, ...authHeaders.headers };\n }\n\n const response = await fetch(`${this.url}/settle`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n x402Version: paymentPayload.x402Version,\n paymentPayload: this.toJsonSafe(paymentPayload),\n paymentRequirements: this.toJsonSafe(paymentRequirements),\n }),\n });\n\n const data = await response.json();\n\n if (typeof data === \"object\" && data !== null && \"success\" in data) {\n const settleResponse = data as SettleResponse;\n if (!response.ok) {\n throw new SettleError(response.status, settleResponse);\n }\n return settleResponse;\n }\n\n throw new Error(`Facilitator settle failed (${response.status}): ${JSON.stringify(data)}`);\n }\n\n /**\n * Get supported payment kinds and extensions from the facilitator\n *\n * @returns Supported payment kinds and extensions\n */\n async getSupported(): Promise<SupportedResponse> {\n let headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (this._createAuthHeaders) {\n const authHeaders = await this.createAuthHeaders(\"supported\");\n headers = { ...headers, ...authHeaders.headers };\n }\n\n const response = await fetch(`${this.url}/supported`, {\n method: \"GET\",\n headers,\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => response.statusText);\n throw new Error(`Facilitator getSupported failed (${response.status}): ${errorText}`);\n }\n\n return (await response.json()) as SupportedResponse;\n }\n\n /**\n * Creates authentication headers for a specific path.\n *\n * @param path - The path to create authentication headers for (e.g., \"verify\", \"settle\", \"supported\")\n * @returns An object containing the authentication headers for the specified path\n */\n async createAuthHeaders(path: string): Promise<{\n headers: Record<string, string>;\n }> {\n if (this._createAuthHeaders) {\n const authHeaders = (await this._createAuthHeaders()) as Record<\n string,\n Record<string, string>\n >;\n return {\n headers: authHeaders[path] ?? {},\n };\n }\n return {\n headers: {},\n };\n }\n\n /**\n * Helper to convert objects to JSON-safe format.\n * Handles BigInt and other non-JSON types.\n *\n * @param obj - The object to convert\n * @returns The JSON-safe representation of the object\n */\n private toJsonSafe(obj: unknown): unknown {\n return JSON.parse(\n JSON.stringify(obj, (_, value) => (typeof value === \"bigint\" ? value.toString() : value)),\n );\n }\n}\n","import {\n decodePaymentRequiredHeader,\n decodePaymentResponseHeader,\n encodePaymentSignatureHeader,\n} from \".\";\nimport { SettleResponse } from \"../types\";\nimport { PaymentPayload, PaymentRequired } from \"../types/payments\";\nimport { x402Client } from \"../client/x402Client\";\n\n/**\n * Context provided to onPaymentRequired hooks.\n */\nexport interface PaymentRequiredContext {\n paymentRequired: PaymentRequired;\n}\n\n/**\n * Hook called when a 402 response is received, before payment processing.\n * Return headers to try before payment, or void to proceed directly to payment.\n */\nexport type PaymentRequiredHook = (\n context: PaymentRequiredContext,\n) => Promise<{ headers: Record<string, string> } | void>;\n\n/**\n * HTTP-specific client for handling x402 payment protocol over HTTP.\n *\n * Wraps a x402Client to provide HTTP-specific encoding/decoding functionality\n * for payment headers and responses while maintaining the builder pattern.\n */\nexport class x402HTTPClient {\n private paymentRequiredHooks: PaymentRequiredHook[] = [];\n\n /**\n * Creates a new x402HTTPClient instance.\n *\n * @param client - The underlying x402Client for payment logic\n */\n constructor(private readonly client: x402Client) {}\n\n /**\n * Register a hook to handle 402 responses before payment.\n * Hooks run in order; first to return headers wins.\n *\n * @param hook - The hook function to register\n * @returns This instance for chaining\n */\n onPaymentRequired(hook: PaymentRequiredHook): this {\n this.paymentRequiredHooks.push(hook);\n return this;\n }\n\n /**\n * Run hooks and return headers if any hook provides them.\n *\n * @param paymentRequired - The payment required response from the server\n * @returns Headers to use for retry, or null to proceed to payment\n */\n async handlePaymentRequired(\n paymentRequired: PaymentRequired,\n ): Promise<Record<string, string> | null> {\n for (const hook of this.paymentRequiredHooks) {\n const result = await hook({ paymentRequired });\n if (result?.headers) {\n return result.headers;\n }\n }\n return null;\n }\n\n /**\n * Encodes a payment payload into appropriate HTTP headers based on version.\n *\n * @param paymentPayload - The payment payload to encode\n * @returns HTTP headers containing the encoded payment signature\n */\n encodePaymentSignatureHeader(paymentPayload: PaymentPayload): Record<string, string> {\n switch (paymentPayload.x402Version) {\n case 2:\n return {\n \"PAYMENT-SIGNATURE\": encodePaymentSignatureHeader(paymentPayload),\n };\n case 1:\n return {\n \"X-PAYMENT\": encodePaymentSignatureHeader(paymentPayload),\n };\n default:\n throw new Error(\n `Unsupported x402 version: ${(paymentPayload as PaymentPayload).x402Version}`,\n );\n }\n }\n\n /**\n * Extracts payment required information from HTTP response.\n *\n * @param getHeader - Function to retrieve header value by name (case-insensitive)\n * @param body - Optional response body for v1 compatibility\n * @returns The payment required object\n */\n getPaymentRequiredResponse(\n getHeader: (name: string) => string | null | undefined,\n body?: unknown,\n ): PaymentRequired {\n // v2\n const paymentRequired = getHeader(\"PAYMENT-REQUIRED\");\n if (paymentRequired) {\n return decodePaymentRequiredHeader(paymentRequired);\n }\n\n // v1\n if (\n body &&\n body instanceof Object &&\n \"x402Version\" in body &&\n (body as PaymentRequired).x402Version === 1\n ) {\n return body as PaymentRequired;\n }\n\n throw new Error(\"Invalid payment required response\");\n }\n\n /**\n * Extracts payment settlement response from HTTP headers.\n *\n * @param getHeader - Function to retrieve header value by name (case-insensitive)\n * @returns The settlement response object\n */\n getPaymentSettleResponse(getHeader: (name: string) => string | null | undefined): SettleResponse {\n // v2\n const paymentResponse = getHeader(\"PAYMENT-RESPONSE\");\n if (paymentResponse) {\n return decodePaymentResponseHeader(paymentResponse);\n }\n\n // v1\n const xPaymentResponse = getHeader(\"X-PAYMENT-RESPONSE\");\n if (xPaymentResponse) {\n return decodePaymentResponseHeader(xPaymentResponse);\n }\n\n throw new Error(\"Payment response header not found\");\n }\n\n /**\n * Creates a payment payload for the given payment requirements.\n * Delegates to the underlying x402Client.\n *\n * @param paymentRequired - The payment required response from the server\n * @returns Promise resolving to the payment payload\n */\n async createPaymentPayload(paymentRequired: PaymentRequired): Promise<PaymentPayload> {\n return this.client.createPaymentPayload(paymentRequired);\n }\n}\n","import { SettleResponse } from \"../types\";\nimport { PaymentPayload, PaymentRequired } from \"../types/payments\";\nimport { Base64EncodedRegex, safeBase64Decode, safeBase64Encode } from \"../utils\";\n\n// HTTP Methods that typically use query parameters\nexport type QueryParamMethods = \"GET\" | \"HEAD\" | \"DELETE\";\n\n// HTTP Methods that typically use request body\nexport type BodyMethods = \"POST\" | \"PUT\" | \"PATCH\";\n\n/**\n * Encodes a payment payload as a base64 header value.\n *\n * @param paymentPayload - The payment payload to encode\n * @returns Base64 encoded string representation of the payment payload\n */\nexport function encodePaymentSignatureHeader(paymentPayload: PaymentPayload): string {\n return safeBase64Encode(JSON.stringify(paymentPayload));\n}\n\n/**\n * Decodes a base64 payment signature header into a payment payload.\n *\n * @param paymentSignatureHeader - The base64 encoded payment signature header\n * @returns The decoded payment payload\n */\nexport function decodePaymentSignatureHeader(paymentSignatureHeader: string): PaymentPayload {\n if (!Base64EncodedRegex.test(paymentSignatureHeader)) {\n throw new Error(\"Invalid payment signature header\");\n }\n return JSON.parse(safeBase64Decode(paymentSignatureHeader)) as PaymentPayload;\n}\n\n/**\n * Encodes a payment required object as a base64 header value.\n *\n * @param paymentRequired - The payment required object to encode\n * @returns Base64 encoded string representation of the payment required object\n */\nexport function encodePaymentRequiredHeader(paymentRequired: PaymentRequired): string {\n return safeBase64Encode(JSON.stringify(paymentRequired));\n}\n\n/**\n * Decodes a base64 payment required header into a payment required object.\n *\n * @param paymentRequiredHeader - The base64 encoded payment required header\n * @returns The decoded payment required object\n */\nexport function decodePaymentRequiredHeader(paymentRequiredHeader: string): PaymentRequired {\n if (!Base64EncodedRegex.test(paymentRequiredHeader)) {\n throw new Error(\"Invalid payment required header\");\n }\n return JSON.parse(safeBase64Decode(paymentRequiredHeader)) as PaymentRequired;\n}\n\n/**\n * Encodes a payment response as a base64 header value.\n *\n * @param paymentResponse - The payment response to encode\n * @returns Base64 encoded string representation of the payment response\n */\nexport function encodePaymentResponseHeader(paymentResponse: SettleResponse): string {\n return safeBase64Encode(JSON.stringify(paymentResponse));\n}\n\n/**\n * Decodes a base64 payment response header into a settle response.\n *\n * @param paymentResponseHeader - The base64 encoded payment response header\n * @returns The decoded settle response\n */\nexport function decodePaymentResponseHeader(paymentResponseHeader: string): SettleResponse {\n if (!Base64EncodedRegex.test(paymentResponseHeader)) {\n throw new Error(\"Invalid payment response header\");\n }\n return JSON.parse(safeBase64Decode(paymentResponseHeader)) as SettleResponse;\n}\n\n// Export HTTP service and types\nexport {\n x402HTTPResourceServer,\n HTTPAdapter,\n HTTPRequestContext,\n HTTPResponseInstructions,\n HTTPProcessResult,\n PaywallConfig,\n PaywallProvider,\n PaymentOption,\n RouteConfig,\n RoutesConfig,\n CompiledRoute,\n DynamicPayTo,\n DynamicPrice,\n UnpaidResponseBody,\n UnpaidResponseResult,\n ProcessSettleResultResponse,\n ProcessSettleSuccessResponse,\n ProcessSettleFailureResponse,\n RouteValidationError,\n RouteConfigurationError,\n ProtectedRequestHook,\n} from \"./x402HTTPResourceServer\";\nexport {\n HTTPFacilitatorClient,\n FacilitatorClient,\n FacilitatorConfig,\n} from \"./httpFacilitatorClient\";\nexport { x402HTTPClient, PaymentRequiredContext, PaymentRequiredHook } from \"./x402HTTPClient\";\n"],"mappings":"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","names":["displayAmount","resource"]} |
| // src/types/facilitator.ts | ||
| var VerifyError = class extends Error { | ||
| /** | ||
| * Creates a VerifyError from a failed verification response. | ||
| * | ||
| * @param statusCode - HTTP status code from the facilitator | ||
| * @param response - The verify response containing error details | ||
| */ | ||
| constructor(statusCode, response) { | ||
| const reason = response.invalidReason || "unknown reason"; | ||
| const message = response.invalidMessage; | ||
| super(message ? `${reason}: ${message}` : reason); | ||
| this.name = "VerifyError"; | ||
| this.statusCode = statusCode; | ||
| this.invalidReason = response.invalidReason; | ||
| this.invalidMessage = response.invalidMessage; | ||
| this.payer = response.payer; | ||
| } | ||
| }; | ||
| var SettleError = class extends Error { | ||
| /** | ||
| * Creates a SettleError from a failed settlement response. | ||
| * | ||
| * @param statusCode - HTTP status code from the facilitator | ||
| * @param response - The settle response containing error details | ||
| */ | ||
| constructor(statusCode, response) { | ||
| const reason = response.errorReason || "unknown reason"; | ||
| const message = response.errorMessage; | ||
| super(message ? `${reason}: ${message}` : reason); | ||
| this.name = "SettleError"; | ||
| this.statusCode = statusCode; | ||
| this.errorReason = response.errorReason; | ||
| this.errorMessage = response.errorMessage; | ||
| this.payer = response.payer; | ||
| this.transaction = response.transaction; | ||
| this.network = response.network; | ||
| } | ||
| }; | ||
| export { | ||
| VerifyError, | ||
| SettleError | ||
| }; | ||
| //# sourceMappingURL=chunk-L2RJI3BI.mjs.map |
| {"version":3,"sources":["../../src/types/facilitator.ts"],"sourcesContent":["import { PaymentPayload, PaymentRequirements } from \"./payments\";\nimport { Network } from \"./\";\n\nexport type VerifyRequest = {\n paymentPayload: PaymentPayload;\n paymentRequirements: PaymentRequirements;\n};\n\nexport type VerifyResponse = {\n isValid: boolean;\n invalidReason?: string;\n invalidMessage?: string;\n payer?: string;\n extensions?: Record<string, unknown>;\n};\n\nexport type SettleRequest = {\n paymentPayload: PaymentPayload;\n paymentRequirements: PaymentRequirements;\n};\n\nexport type SettleResponse = {\n success: boolean;\n errorReason?: string;\n errorMessage?: string;\n payer?: string;\n transaction: string;\n network: Network;\n extensions?: Record<string, unknown>;\n};\n\nexport type SupportedKind = {\n x402Version: number;\n scheme: string;\n network: Network;\n extra?: Record<string, unknown>;\n};\n\nexport type SupportedResponse = {\n kinds: SupportedKind[];\n extensions: string[];\n signers: Record<string, string[]>; // CAIP family pattern → Signer addresses\n};\n\n/**\n * Error thrown when payment verification fails.\n */\nexport class VerifyError extends Error {\n readonly invalidReason?: string;\n readonly invalidMessage?: string;\n readonly payer?: string;\n readonly statusCode: number;\n\n /**\n * Creates a VerifyError from a failed verification response.\n *\n * @param statusCode - HTTP status code from the facilitator\n * @param response - The verify response containing error details\n */\n constructor(statusCode: number, response: VerifyResponse) {\n const reason = response.invalidReason || \"unknown reason\";\n const message = response.invalidMessage;\n super(message ? `${reason}: ${message}` : reason);\n this.name = \"VerifyError\";\n this.statusCode = statusCode;\n this.invalidReason = response.invalidReason;\n this.invalidMessage = response.invalidMessage;\n this.payer = response.payer;\n }\n}\n\n/**\n * Error thrown when payment settlement fails.\n */\nexport class SettleError extends Error {\n readonly errorReason?: string;\n readonly errorMessage?: string;\n readonly payer?: string;\n readonly transaction: string;\n readonly network: Network;\n readonly statusCode: number;\n\n /**\n * Creates a SettleError from a failed settlement response.\n *\n * @param statusCode - HTTP status code from the facilitator\n * @param response - The settle response containing error details\n */\n constructor(statusCode: number, response: SettleResponse) {\n const reason = response.errorReason || \"unknown reason\";\n const message = response.errorMessage;\n super(message ? `${reason}: ${message}` : reason);\n this.name = \"SettleError\";\n this.statusCode = statusCode;\n this.errorReason = response.errorReason;\n this.errorMessage = response.errorMessage;\n this.payer = response.payer;\n this.transaction = response.transaction;\n this.network = response.network;\n }\n}\n"],"mappings":";AA+CO,IAAM,cAAN,cAA0B,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYrC,YAAY,YAAoB,UAA0B;AACxD,UAAM,SAAS,SAAS,iBAAiB;AACzC,UAAM,UAAU,SAAS;AACzB,UAAM,UAAU,GAAG,MAAM,KAAK,OAAO,KAAK,MAAM;AAChD,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,SAAK,gBAAgB,SAAS;AAC9B,SAAK,iBAAiB,SAAS;AAC/B,SAAK,QAAQ,SAAS;AAAA,EACxB;AACF;AAKO,IAAM,cAAN,cAA0B,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcrC,YAAY,YAAoB,UAA0B;AACxD,UAAM,SAAS,SAAS,eAAe;AACvC,UAAM,UAAU,SAAS;AACzB,UAAM,UAAU,GAAG,MAAM,KAAK,OAAO,KAAK,MAAM;AAChD,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,SAAK,cAAc,SAAS;AAC5B,SAAK,eAAe,SAAS;AAC7B,SAAK,QAAQ,SAAS;AACtB,SAAK,cAAc,SAAS;AAC5B,SAAK,UAAU,SAAS;AAAA,EAC1B;AACF;","names":[]} |
| type PaymentRequirementsV1 = { | ||
| scheme: string; | ||
| network: Network; | ||
| maxAmountRequired: string; | ||
| resource: string; | ||
| description: string; | ||
| mimeType: string; | ||
| outputSchema: Record<string, unknown>; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| extra: Record<string, unknown>; | ||
| }; | ||
| type PaymentRequiredV1 = { | ||
| x402Version: 1; | ||
| error?: string; | ||
| accepts: PaymentRequirementsV1[]; | ||
| }; | ||
| type PaymentPayloadV1 = { | ||
| x402Version: 1; | ||
| scheme: string; | ||
| network: Network; | ||
| payload: Record<string, unknown>; | ||
| }; | ||
| type VerifyRequestV1 = { | ||
| paymentPayload: PaymentPayloadV1; | ||
| paymentRequirements: PaymentRequirementsV1; | ||
| }; | ||
| type SettleRequestV1 = { | ||
| paymentPayload: PaymentPayloadV1; | ||
| paymentRequirements: PaymentRequirementsV1; | ||
| }; | ||
| type SettleResponseV1 = { | ||
| success: boolean; | ||
| errorReason?: string; | ||
| errorMessage?: string; | ||
| payer?: string; | ||
| transaction: string; | ||
| network: Network; | ||
| }; | ||
| type SupportedResponseV1 = { | ||
| kinds: { | ||
| x402Version: number; | ||
| scheme: string; | ||
| network: Network; | ||
| extra?: Record<string, unknown>; | ||
| }[]; | ||
| }; | ||
| interface FacilitatorConfig { | ||
| url?: string; | ||
| createAuthHeaders?: () => Promise<{ | ||
| verify: Record<string, string>; | ||
| settle: Record<string, string>; | ||
| supported: Record<string, string>; | ||
| }>; | ||
| } | ||
| /** | ||
| * Interface for facilitator clients | ||
| * Can be implemented for HTTP-based or local facilitators | ||
| */ | ||
| interface FacilitatorClient { | ||
| /** | ||
| * Verify a payment with the facilitator | ||
| * | ||
| * @param paymentPayload - The payment to verify | ||
| * @param paymentRequirements - The requirements to verify against | ||
| * @returns Verification response | ||
| */ | ||
| verify(paymentPayload: PaymentPayload, paymentRequirements: PaymentRequirements): Promise<VerifyResponse>; | ||
| /** | ||
| * Settle a payment with the facilitator | ||
| * | ||
| * @param paymentPayload - The payment to settle | ||
| * @param paymentRequirements - The requirements for settlement | ||
| * @returns Settlement response | ||
| */ | ||
| settle(paymentPayload: PaymentPayload, paymentRequirements: PaymentRequirements): Promise<SettleResponse>; | ||
| /** | ||
| * Get supported payment kinds and extensions from the facilitator | ||
| * | ||
| * @returns Supported payment kinds and extensions | ||
| */ | ||
| getSupported(): Promise<SupportedResponse>; | ||
| } | ||
| /** | ||
| * HTTP-based client for interacting with x402 facilitator services | ||
| * Handles HTTP communication with facilitator endpoints | ||
| */ | ||
| declare class HTTPFacilitatorClient implements FacilitatorClient { | ||
| readonly url: string; | ||
| private readonly _createAuthHeaders?; | ||
| /** | ||
| * Creates a new HTTPFacilitatorClient instance. | ||
| * | ||
| * @param config - Configuration options for the facilitator client | ||
| */ | ||
| constructor(config?: FacilitatorConfig); | ||
| /** | ||
| * Verify a payment with the facilitator | ||
| * | ||
| * @param paymentPayload - The payment to verify | ||
| * @param paymentRequirements - The requirements to verify against | ||
| * @returns Verification response | ||
| */ | ||
| verify(paymentPayload: PaymentPayload, paymentRequirements: PaymentRequirements): Promise<VerifyResponse>; | ||
| /** | ||
| * Settle a payment with the facilitator | ||
| * | ||
| * @param paymentPayload - The payment to settle | ||
| * @param paymentRequirements - The requirements for settlement | ||
| * @returns Settlement response | ||
| */ | ||
| settle(paymentPayload: PaymentPayload, paymentRequirements: PaymentRequirements): Promise<SettleResponse>; | ||
| /** | ||
| * Get supported payment kinds and extensions from the facilitator | ||
| * | ||
| * @returns Supported payment kinds and extensions | ||
| */ | ||
| getSupported(): Promise<SupportedResponse>; | ||
| /** | ||
| * Creates authentication headers for a specific path. | ||
| * | ||
| * @param path - The path to create authentication headers for (e.g., "verify", "settle", "supported") | ||
| * @returns An object containing the authentication headers for the specified path | ||
| */ | ||
| createAuthHeaders(path: string): Promise<{ | ||
| headers: Record<string, string>; | ||
| }>; | ||
| /** | ||
| * Helper to convert objects to JSON-safe format. | ||
| * Handles BigInt and other non-JSON types. | ||
| * | ||
| * @param obj - The object to convert | ||
| * @returns The JSON-safe representation of the object | ||
| */ | ||
| private toJsonSafe; | ||
| } | ||
| /** | ||
| * Configuration for a protected resource | ||
| * Only contains payment-specific configuration, not resource metadata | ||
| */ | ||
| interface ResourceConfig { | ||
| scheme: string; | ||
| payTo: string; | ||
| price: Price; | ||
| network: Network; | ||
| maxTimeoutSeconds?: number; | ||
| extra?: Record<string, unknown>; | ||
| } | ||
| /** | ||
| * Resource information for PaymentRequired response | ||
| */ | ||
| interface ResourceInfo$1 { | ||
| url: string; | ||
| description: string; | ||
| mimeType: string; | ||
| } | ||
| /** | ||
| * Lifecycle Hook Context Interfaces | ||
| */ | ||
| interface PaymentRequiredContext { | ||
| requirements: PaymentRequirements[]; | ||
| resourceInfo: ResourceInfo$1; | ||
| error?: string; | ||
| paymentRequiredResponse: PaymentRequired; | ||
| } | ||
| interface VerifyContext { | ||
| paymentPayload: PaymentPayload; | ||
| requirements: PaymentRequirements; | ||
| } | ||
| interface VerifyResultContext extends VerifyContext { | ||
| result: VerifyResponse; | ||
| } | ||
| interface VerifyFailureContext extends VerifyContext { | ||
| error: Error; | ||
| } | ||
| interface SettleContext { | ||
| paymentPayload: PaymentPayload; | ||
| requirements: PaymentRequirements; | ||
| } | ||
| interface SettleResultContext extends SettleContext { | ||
| result: SettleResponse; | ||
| } | ||
| interface SettleFailureContext extends SettleContext { | ||
| error: Error; | ||
| } | ||
| /** | ||
| * Lifecycle Hook Type Definitions | ||
| */ | ||
| type BeforeVerifyHook = (context: VerifyContext) => Promise<void | { | ||
| abort: true; | ||
| reason: string; | ||
| message?: string; | ||
| }>; | ||
| type AfterVerifyHook = (context: VerifyResultContext) => Promise<void>; | ||
| type OnVerifyFailureHook = (context: VerifyFailureContext) => Promise<void | { | ||
| recovered: true; | ||
| result: VerifyResponse; | ||
| }>; | ||
| type BeforeSettleHook = (context: SettleContext) => Promise<void | { | ||
| abort: true; | ||
| reason: string; | ||
| message?: string; | ||
| }>; | ||
| type AfterSettleHook = (context: SettleResultContext) => Promise<void>; | ||
| type OnSettleFailureHook = (context: SettleFailureContext) => Promise<void | { | ||
| recovered: true; | ||
| result: SettleResponse; | ||
| }>; | ||
| /** | ||
| * Core x402 protocol server for resource protection | ||
| * Transport-agnostic implementation of the x402 payment protocol | ||
| */ | ||
| declare class x402ResourceServer { | ||
| private facilitatorClients; | ||
| private registeredServerSchemes; | ||
| private supportedResponsesMap; | ||
| private facilitatorClientsMap; | ||
| private registeredExtensions; | ||
| private beforeVerifyHooks; | ||
| private afterVerifyHooks; | ||
| private onVerifyFailureHooks; | ||
| private beforeSettleHooks; | ||
| private afterSettleHooks; | ||
| private onSettleFailureHooks; | ||
| /** | ||
| * Creates a new x402ResourceServer instance. | ||
| * | ||
| * @param facilitatorClients - Optional facilitator client(s) for payment processing | ||
| */ | ||
| constructor(facilitatorClients?: FacilitatorClient | FacilitatorClient[]); | ||
| /** | ||
| * Register a scheme/network server implementation. | ||
| * | ||
| * @param network - The network identifier | ||
| * @param server - The scheme/network server implementation | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| register(network: Network, server: SchemeNetworkServer): x402ResourceServer; | ||
| /** | ||
| * Check if a scheme is registered for a given network. | ||
| * | ||
| * @param network - The network identifier | ||
| * @param scheme - The payment scheme name | ||
| * @returns True if the scheme is registered for the network, false otherwise | ||
| */ | ||
| hasRegisteredScheme(network: Network, scheme: string): boolean; | ||
| /** | ||
| * Registers a resource service extension that can enrich extension declarations. | ||
| * | ||
| * @param extension - The extension to register | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| registerExtension(extension: ResourceServerExtension): this; | ||
| /** | ||
| * Check if an extension is registered. | ||
| * | ||
| * @param key - The extension key | ||
| * @returns True if the extension is registered | ||
| */ | ||
| hasExtension(key: string): boolean; | ||
| /** | ||
| * Get all registered extensions. | ||
| * | ||
| * @returns Array of registered extensions | ||
| */ | ||
| getExtensions(): ResourceServerExtension[]; | ||
| /** | ||
| * Enriches declared extensions using registered extension hooks. | ||
| * | ||
| * @param declaredExtensions - Extensions declared on the route | ||
| * @param transportContext - Transport-specific context (HTTP, A2A, MCP, etc.) | ||
| * @returns Enriched extensions map | ||
| */ | ||
| enrichExtensions(declaredExtensions: Record<string, unknown>, transportContext: unknown): Record<string, unknown>; | ||
| /** | ||
| * Register a hook to execute before payment verification. | ||
| * Can abort verification by returning { abort: true, reason: string } | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| onBeforeVerify(hook: BeforeVerifyHook): x402ResourceServer; | ||
| /** | ||
| * Register a hook to execute after successful payment verification. | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| onAfterVerify(hook: AfterVerifyHook): x402ResourceServer; | ||
| /** | ||
| * Register a hook to execute when payment verification fails. | ||
| * Can recover from failure by returning { recovered: true, result: VerifyResponse } | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| onVerifyFailure(hook: OnVerifyFailureHook): x402ResourceServer; | ||
| /** | ||
| * Register a hook to execute before payment settlement. | ||
| * Can abort settlement by returning { abort: true, reason: string } | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| onBeforeSettle(hook: BeforeSettleHook): x402ResourceServer; | ||
| /** | ||
| * Register a hook to execute after successful payment settlement. | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| onAfterSettle(hook: AfterSettleHook): x402ResourceServer; | ||
| /** | ||
| * Register a hook to execute when payment settlement fails. | ||
| * Can recover from failure by returning { recovered: true, result: SettleResponse } | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| onSettleFailure(hook: OnSettleFailureHook): x402ResourceServer; | ||
| /** | ||
| * Initialize by fetching supported kinds from all facilitators | ||
| * Creates mappings for supported responses and facilitator clients | ||
| * Earlier facilitators in the array get precedence | ||
| */ | ||
| initialize(): Promise<void>; | ||
| /** | ||
| * Get supported kind for a specific version, network, and scheme | ||
| * | ||
| * @param x402Version - The x402 version | ||
| * @param network - The network identifier | ||
| * @param scheme - The payment scheme | ||
| * @returns The supported kind or undefined if not found | ||
| */ | ||
| getSupportedKind(x402Version: number, network: Network, scheme: string): SupportedKind | undefined; | ||
| /** | ||
| * Get facilitator extensions for a specific version, network, and scheme | ||
| * | ||
| * @param x402Version - The x402 version | ||
| * @param network - The network identifier | ||
| * @param scheme - The payment scheme | ||
| * @returns The facilitator extensions or empty array if not found | ||
| */ | ||
| getFacilitatorExtensions(x402Version: number, network: Network, scheme: string): string[]; | ||
| /** | ||
| * Build payment requirements for a protected resource | ||
| * | ||
| * @param resourceConfig - Configuration for the protected resource | ||
| * @returns Array of payment requirements | ||
| */ | ||
| buildPaymentRequirements(resourceConfig: ResourceConfig): Promise<PaymentRequirements[]>; | ||
| /** | ||
| * Build payment requirements from multiple payment options | ||
| * This method handles resolving dynamic payTo/price functions and builds requirements for each option | ||
| * | ||
| * @param paymentOptions - Array of payment options to convert | ||
| * @param context - HTTP request context for resolving dynamic functions | ||
| * @returns Array of payment requirements (one per option) | ||
| */ | ||
| buildPaymentRequirementsFromOptions<TContext = unknown>(paymentOptions: Array<{ | ||
| scheme: string; | ||
| payTo: string | ((context: TContext) => string | Promise<string>); | ||
| price: Price | ((context: TContext) => Price | Promise<Price>); | ||
| network: Network; | ||
| maxTimeoutSeconds?: number; | ||
| }>, context: TContext): Promise<PaymentRequirements[]>; | ||
| /** | ||
| * Create a payment required response | ||
| * | ||
| * @param requirements - Payment requirements | ||
| * @param resourceInfo - Resource information | ||
| * @param error - Error message | ||
| * @param extensions - Optional declared extensions (for per-key enrichment) | ||
| * @returns Payment required response object | ||
| */ | ||
| createPaymentRequiredResponse(requirements: PaymentRequirements[], resourceInfo: ResourceInfo$1, error?: string, extensions?: Record<string, unknown>): Promise<PaymentRequired>; | ||
| /** | ||
| * Verify a payment against requirements | ||
| * | ||
| * @param paymentPayload - The payment payload to verify | ||
| * @param requirements - The payment requirements | ||
| * @returns Verification response | ||
| */ | ||
| verifyPayment(paymentPayload: PaymentPayload, requirements: PaymentRequirements): Promise<VerifyResponse>; | ||
| /** | ||
| * Settle a verified payment | ||
| * | ||
| * @param paymentPayload - The payment payload to settle | ||
| * @param requirements - The payment requirements | ||
| * @param declaredExtensions - Optional declared extensions (for per-key enrichment) | ||
| * @returns Settlement response | ||
| */ | ||
| settlePayment(paymentPayload: PaymentPayload, requirements: PaymentRequirements, declaredExtensions?: Record<string, unknown>): Promise<SettleResponse>; | ||
| /** | ||
| * Find matching payment requirements for a payment | ||
| * | ||
| * @param availableRequirements - Array of available payment requirements | ||
| * @param paymentPayload - The payment payload | ||
| * @returns Matching payment requirements or undefined | ||
| */ | ||
| findMatchingRequirements(availableRequirements: PaymentRequirements[], paymentPayload: PaymentPayload): PaymentRequirements | undefined; | ||
| /** | ||
| * Process a payment request | ||
| * | ||
| * @param paymentPayload - Optional payment payload if provided | ||
| * @param resourceConfig - Configuration for the protected resource | ||
| * @param resourceInfo - Information about the resource being accessed | ||
| * @param extensions - Optional extensions to include in the response | ||
| * @returns Processing result | ||
| */ | ||
| processPaymentRequest(paymentPayload: PaymentPayload | null, resourceConfig: ResourceConfig, resourceInfo: ResourceInfo$1, extensions?: Record<string, unknown>): Promise<{ | ||
| success: boolean; | ||
| requiresPayment?: PaymentRequired; | ||
| verificationResult?: VerifyResponse; | ||
| settlementResult?: SettleResponse; | ||
| error?: string; | ||
| }>; | ||
| /** | ||
| * Get facilitator client for a specific version, network, and scheme | ||
| * | ||
| * @param x402Version - The x402 version | ||
| * @param network - The network identifier | ||
| * @param scheme - The payment scheme | ||
| * @returns The facilitator client or undefined if not found | ||
| */ | ||
| private getFacilitatorClient; | ||
| } | ||
| interface ResourceServerExtension { | ||
| key: string; | ||
| /** | ||
| * Enrich extension declaration with extension-specific data. | ||
| * | ||
| * @param declaration - Extension declaration from route config | ||
| * @param transportContext - Transport-specific context (HTTP, A2A, MCP, etc.) | ||
| * @returns Enriched extension declaration | ||
| */ | ||
| enrichDeclaration?: (declaration: unknown, transportContext: unknown) => unknown; | ||
| /** | ||
| * Called when generating a 402 PaymentRequired response. | ||
| * Return extension data to add to extensions[key], or undefined to skip. | ||
| * | ||
| * @param declaration - Extension declaration from route config | ||
| * @param context - PaymentRequired context containing response and requirements | ||
| * @returns Extension data to add to response.extensions[key] | ||
| */ | ||
| enrichPaymentRequiredResponse?: (declaration: unknown, context: PaymentRequiredContext) => Promise<unknown>; | ||
| /** | ||
| * Called after successful payment settlement. | ||
| * Return extension data to add to response.extensions[key], or undefined to skip. | ||
| * | ||
| * @param declaration - Extension declaration from route config | ||
| * @param context - Settlement result context containing payment payload, requirements, and result | ||
| * @returns Extension data to add to response.extensions[key] | ||
| */ | ||
| enrichSettlementResponse?: (declaration: unknown, context: SettleResultContext) => Promise<unknown>; | ||
| } | ||
| type Network = `${string}:${string}`; | ||
| type Money = string | number; | ||
| type AssetAmount = { | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown>; | ||
| }; | ||
| type Price = Money | AssetAmount; | ||
| interface ResourceInfo { | ||
| url: string; | ||
| description: string; | ||
| mimeType: string; | ||
| } | ||
| type PaymentRequirements = { | ||
| scheme: string; | ||
| network: Network; | ||
| asset: string; | ||
| amount: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| extra: Record<string, unknown>; | ||
| }; | ||
| type PaymentRequired = { | ||
| x402Version: number; | ||
| error?: string; | ||
| resource: ResourceInfo; | ||
| accepts: PaymentRequirements[]; | ||
| extensions?: Record<string, unknown>; | ||
| }; | ||
| type PaymentPayload = { | ||
| x402Version: number; | ||
| resource: ResourceInfo; | ||
| accepted: PaymentRequirements; | ||
| payload: Record<string, unknown>; | ||
| extensions?: Record<string, unknown>; | ||
| }; | ||
| type VerifyRequest = { | ||
| paymentPayload: PaymentPayload; | ||
| paymentRequirements: PaymentRequirements; | ||
| }; | ||
| type VerifyResponse = { | ||
| isValid: boolean; | ||
| invalidReason?: string; | ||
| invalidMessage?: string; | ||
| payer?: string; | ||
| extensions?: Record<string, unknown>; | ||
| }; | ||
| type SettleRequest = { | ||
| paymentPayload: PaymentPayload; | ||
| paymentRequirements: PaymentRequirements; | ||
| }; | ||
| type SettleResponse = { | ||
| success: boolean; | ||
| errorReason?: string; | ||
| errorMessage?: string; | ||
| payer?: string; | ||
| transaction: string; | ||
| network: Network; | ||
| extensions?: Record<string, unknown>; | ||
| }; | ||
| type SupportedKind = { | ||
| x402Version: number; | ||
| scheme: string; | ||
| network: Network; | ||
| extra?: Record<string, unknown>; | ||
| }; | ||
| type SupportedResponse = { | ||
| kinds: SupportedKind[]; | ||
| extensions: string[]; | ||
| signers: Record<string, string[]>; | ||
| }; | ||
| /** | ||
| * Error thrown when payment verification fails. | ||
| */ | ||
| declare class VerifyError extends Error { | ||
| readonly invalidReason?: string; | ||
| readonly invalidMessage?: string; | ||
| readonly payer?: string; | ||
| readonly statusCode: number; | ||
| /** | ||
| * Creates a VerifyError from a failed verification response. | ||
| * | ||
| * @param statusCode - HTTP status code from the facilitator | ||
| * @param response - The verify response containing error details | ||
| */ | ||
| constructor(statusCode: number, response: VerifyResponse); | ||
| } | ||
| /** | ||
| * Error thrown when payment settlement fails. | ||
| */ | ||
| declare class SettleError extends Error { | ||
| readonly errorReason?: string; | ||
| readonly errorMessage?: string; | ||
| readonly payer?: string; | ||
| readonly transaction: string; | ||
| readonly network: Network; | ||
| readonly statusCode: number; | ||
| /** | ||
| * Creates a SettleError from a failed settlement response. | ||
| * | ||
| * @param statusCode - HTTP status code from the facilitator | ||
| * @param response - The settle response containing error details | ||
| */ | ||
| constructor(statusCode: number, response: SettleResponse); | ||
| } | ||
| /** | ||
| * Money parser function that converts a numeric amount to an AssetAmount | ||
| * Receives the amount as a decimal number (e.g., 1.50 for $1.50) | ||
| * Returns null to indicate "cannot handle this amount", causing fallback to next parser | ||
| * Always returns a Promise for consistency - use async/await | ||
| * | ||
| * @param amount - The decimal amount (e.g., 1.50) | ||
| * @param network - The network identifier for context | ||
| * @returns AssetAmount or null to try next parser | ||
| */ | ||
| type MoneyParser = (amount: number, network: Network) => Promise<AssetAmount | null>; | ||
| /** | ||
| * Result of createPaymentPayload - the core payload fields. | ||
| * Contains the x402 version and the scheme-specific payload data. | ||
| */ | ||
| type PaymentPayloadResult = Pick<PaymentPayload, "x402Version" | "payload">; | ||
| interface SchemeNetworkClient { | ||
| readonly scheme: string; | ||
| createPaymentPayload(x402Version: number, paymentRequirements: PaymentRequirements): Promise<PaymentPayloadResult>; | ||
| } | ||
| interface SchemeNetworkFacilitator { | ||
| readonly scheme: string; | ||
| /** | ||
| * CAIP family pattern that this facilitator supports. | ||
| * Used to group signers by blockchain family in the supported response. | ||
| * | ||
| * @example | ||
| * // EVM facilitators | ||
| * readonly caipFamily = "eip155:*"; | ||
| * | ||
| * @example | ||
| * // SVM facilitators | ||
| * readonly caipFamily = "solana:*"; | ||
| */ | ||
| readonly caipFamily: string; | ||
| /** | ||
| * Get mechanism-specific extra data needed for the supported kinds endpoint. | ||
| * This method is called when building the facilitator's supported response. | ||
| * | ||
| * @param network - The network identifier for context | ||
| * @returns Extra data object or undefined if no extra data is needed | ||
| * | ||
| * @example | ||
| * // EVM schemes return undefined (no extra data needed) | ||
| * getExtra(network: Network): undefined { | ||
| * return undefined; | ||
| * } | ||
| * | ||
| * @example | ||
| * // SVM schemes return feePayer address | ||
| * getExtra(network: Network): Record<string, unknown> | undefined { | ||
| * return { feePayer: this.signer.address }; | ||
| * } | ||
| */ | ||
| getExtra(network: Network): Record<string, unknown> | undefined; | ||
| /** | ||
| * Get signer addresses used by this facilitator for a given network. | ||
| * These are included in the supported response to help clients understand | ||
| * which addresses might sign/pay for transactions. | ||
| * | ||
| * Supports multiple addresses for load balancing, key rotation, and high availability. | ||
| * | ||
| * @param network - The network identifier | ||
| * @returns Array of signer addresses (wallet addresses, fee payer addresses, etc.) | ||
| * | ||
| * @example | ||
| * // EVM facilitator | ||
| * getSigners(network: string): string[] { | ||
| * return [...this.signer.getAddresses()]; | ||
| * } | ||
| * | ||
| * @example | ||
| * // SVM facilitator | ||
| * getSigners(network: string): string[] { | ||
| * return [...this.signer.getAddresses()]; | ||
| * } | ||
| */ | ||
| getSigners(network: string): string[]; | ||
| verify(payload: PaymentPayload, requirements: PaymentRequirements): Promise<VerifyResponse>; | ||
| settle(payload: PaymentPayload, requirements: PaymentRequirements): Promise<SettleResponse>; | ||
| } | ||
| interface SchemeNetworkServer { | ||
| readonly scheme: string; | ||
| /** | ||
| * Convert a user-friendly price to the scheme's specific amount and asset format | ||
| * Always returns a Promise for consistency | ||
| * | ||
| * @param price - User-friendly price (e.g., "$0.10", "0.10", { amount: "100000", asset: "USDC" }) | ||
| * @param network - The network identifier for context | ||
| * @returns Promise that resolves to the converted amount, asset identifier, and any extra metadata | ||
| * | ||
| * @example | ||
| * // For EVM networks with USDC: | ||
| * await parsePrice("$0.10", "eip155:8453") => { amount: "100000", asset: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913" } | ||
| * | ||
| * // For custom schemes: | ||
| * await parsePrice("10 points", "custom:network") => { amount: "10", asset: "points" } | ||
| */ | ||
| parsePrice(price: Price, network: Network): Promise<AssetAmount>; | ||
| /** | ||
| * Build payment requirements for this scheme/network combination | ||
| * | ||
| * @param paymentRequirements - Base payment requirements with amount/asset already set | ||
| * @param supportedKind - The supported kind from facilitator's /supported endpoint | ||
| * @param supportedKind.x402Version - The x402 version | ||
| * @param supportedKind.scheme - The payment scheme | ||
| * @param supportedKind.network - The network identifier | ||
| * @param supportedKind.extra - Optional extra metadata | ||
| * @param facilitatorExtensions - Extensions supported by the facilitator | ||
| * @returns Enhanced payment requirements ready to be sent to clients | ||
| */ | ||
| enhancePaymentRequirements(paymentRequirements: PaymentRequirements, supportedKind: { | ||
| x402Version: number; | ||
| scheme: string; | ||
| network: Network; | ||
| extra?: Record<string, unknown>; | ||
| }, facilitatorExtensions: string[]): Promise<PaymentRequirements>; | ||
| } | ||
| export { type AssetAmount as A, type VerifyRequest as B, type FacilitatorClient as F, HTTPFacilitatorClient as H, type Money as M, type Network as N, type PaymentPayload as P, type ResourceConfig as R, type SettleResponse as S, type VerifyResponse as V, type PaymentRequirements as a, type SchemeNetworkFacilitator as b, type PaymentRequired as c, type FacilitatorConfig as d, type SchemeNetworkClient as e, type ResourceInfo$1 as f, type SettleResultContext as g, type Price as h, type PaymentPayloadV1 as i, type PaymentRequiredV1 as j, type PaymentRequirementsV1 as k, type SettleRequestV1 as l, type SettleResponseV1 as m, type SupportedResponseV1 as n, type VerifyRequestV1 as o, type MoneyParser as p, type PaymentPayloadResult as q, type PaymentRequiredContext as r, type ResourceInfo as s, type ResourceServerExtension as t, type SchemeNetworkServer as u, SettleError as v, type SettleRequest as w, x402ResourceServer as x, type SupportedResponse as y, VerifyError as z }; |
| import { z } from 'zod'; | ||
| export { z } from 'zod'; | ||
| /** | ||
| * Non-empty string schema - a string with at least one character. | ||
| * Used for required string fields that cannot be empty. | ||
| */ | ||
| declare const NonEmptyString: z.ZodString; | ||
| type NonEmptyString = z.infer<typeof NonEmptyString>; | ||
| /** | ||
| * Any record schema - an object with unknown keys and values. | ||
| * Used for scheme-specific payloads and other extensible objects. | ||
| */ | ||
| declare const Any: z.ZodRecord<z.ZodString, z.ZodUnknown>; | ||
| type Any = z.infer<typeof Any>; | ||
| /** | ||
| * Optional any record schema - an optional object with unknown keys and values. | ||
| * Used for optional extension fields like `extra` and `extensions`. | ||
| */ | ||
| declare const OptionalAny: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| type OptionalAny = z.infer<typeof OptionalAny>; | ||
| /** | ||
| * Network identifier schema for V1 - loose validation. | ||
| * V1 accepts any non-empty string for backwards compatibility. | ||
| */ | ||
| declare const NetworkSchemaV1: z.ZodString; | ||
| type NetworkV1 = z.infer<typeof NetworkSchemaV1>; | ||
| /** | ||
| * Network identifier schema for V2 - CAIP-2 format validation. | ||
| * V2 requires minimum length of 3 and a colon separator (e.g., "eip155:84532", "solana:devnet"). | ||
| */ | ||
| declare const NetworkSchemaV2: z.ZodEffects<z.ZodString, string, string>; | ||
| type NetworkV2 = z.infer<typeof NetworkSchemaV2>; | ||
| /** | ||
| * Union network schema - accepts either V1 or V2 format. | ||
| */ | ||
| declare const NetworkSchema: z.ZodUnion<[z.ZodString, z.ZodEffects<z.ZodString, string, string>]>; | ||
| type Network = z.infer<typeof NetworkSchema>; | ||
| /** | ||
| * ResourceInfo schema for V2 - describes the protected resource. | ||
| */ | ||
| declare const ResourceInfoSchema: z.ZodObject<{ | ||
| url: z.ZodString; | ||
| description: z.ZodOptional<z.ZodString>; | ||
| mimeType: z.ZodOptional<z.ZodString>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| }, { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| }>; | ||
| type ResourceInfo = z.infer<typeof ResourceInfoSchema>; | ||
| /** | ||
| * PaymentRequirements schema for V1. | ||
| * V1 includes resource info directly in the requirements object. | ||
| */ | ||
| declare const PaymentRequirementsV1Schema: z.ZodObject<{ | ||
| scheme: z.ZodString; | ||
| network: z.ZodString; | ||
| maxAmountRequired: z.ZodString; | ||
| resource: z.ZodString; | ||
| description: z.ZodString; | ||
| mimeType: z.ZodOptional<z.ZodString>; | ||
| outputSchema: z.ZodNullable<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>; | ||
| payTo: z.ZodString; | ||
| maxTimeoutSeconds: z.ZodNumber; | ||
| asset: z.ZodString; | ||
| extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| description: string; | ||
| scheme: string; | ||
| network: string; | ||
| maxAmountRequired: string; | ||
| resource: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| mimeType?: string | undefined; | ||
| outputSchema?: Record<string, unknown> | null | undefined; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }, { | ||
| description: string; | ||
| scheme: string; | ||
| network: string; | ||
| maxAmountRequired: string; | ||
| resource: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| mimeType?: string | undefined; | ||
| outputSchema?: Record<string, unknown> | null | undefined; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }>; | ||
| type PaymentRequirementsV1 = z.infer<typeof PaymentRequirementsV1Schema>; | ||
| /** | ||
| * PaymentRequired (402 response) schema for V1. | ||
| * Contains payment requirements when a resource requires payment. | ||
| */ | ||
| declare const PaymentRequiredV1Schema: z.ZodObject<{ | ||
| x402Version: z.ZodLiteral<1>; | ||
| error: z.ZodOptional<z.ZodString>; | ||
| accepts: z.ZodArray<z.ZodObject<{ | ||
| scheme: z.ZodString; | ||
| network: z.ZodString; | ||
| maxAmountRequired: z.ZodString; | ||
| resource: z.ZodString; | ||
| description: z.ZodString; | ||
| mimeType: z.ZodOptional<z.ZodString>; | ||
| outputSchema: z.ZodNullable<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>; | ||
| payTo: z.ZodString; | ||
| maxTimeoutSeconds: z.ZodNumber; | ||
| asset: z.ZodString; | ||
| extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| description: string; | ||
| scheme: string; | ||
| network: string; | ||
| maxAmountRequired: string; | ||
| resource: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| mimeType?: string | undefined; | ||
| outputSchema?: Record<string, unknown> | null | undefined; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }, { | ||
| description: string; | ||
| scheme: string; | ||
| network: string; | ||
| maxAmountRequired: string; | ||
| resource: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| mimeType?: string | undefined; | ||
| outputSchema?: Record<string, unknown> | null | undefined; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }>, "many">; | ||
| }, "strip", z.ZodTypeAny, { | ||
| x402Version: 1; | ||
| accepts: { | ||
| description: string; | ||
| scheme: string; | ||
| network: string; | ||
| maxAmountRequired: string; | ||
| resource: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| mimeType?: string | undefined; | ||
| outputSchema?: Record<string, unknown> | null | undefined; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }[]; | ||
| error?: string | undefined; | ||
| }, { | ||
| x402Version: 1; | ||
| accepts: { | ||
| description: string; | ||
| scheme: string; | ||
| network: string; | ||
| maxAmountRequired: string; | ||
| resource: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| mimeType?: string | undefined; | ||
| outputSchema?: Record<string, unknown> | null | undefined; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }[]; | ||
| error?: string | undefined; | ||
| }>; | ||
| type PaymentRequiredV1 = z.infer<typeof PaymentRequiredV1Schema>; | ||
| /** | ||
| * PaymentPayload schema for V1. | ||
| * Contains the payment data sent by the client. | ||
| */ | ||
| declare const PaymentPayloadV1Schema: z.ZodObject<{ | ||
| x402Version: z.ZodLiteral<1>; | ||
| scheme: z.ZodString; | ||
| network: z.ZodString; | ||
| payload: z.ZodRecord<z.ZodString, z.ZodUnknown>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| scheme: string; | ||
| network: string; | ||
| x402Version: 1; | ||
| payload: Record<string, unknown>; | ||
| }, { | ||
| scheme: string; | ||
| network: string; | ||
| x402Version: 1; | ||
| payload: Record<string, unknown>; | ||
| }>; | ||
| type PaymentPayloadV1 = z.infer<typeof PaymentPayloadV1Schema>; | ||
| /** | ||
| * PaymentRequirements schema for V2. | ||
| * V2 uses "amount" instead of "maxAmountRequired" and doesn't include resource info. | ||
| */ | ||
| declare const PaymentRequirementsV2Schema: z.ZodObject<{ | ||
| scheme: z.ZodString; | ||
| network: z.ZodEffects<z.ZodString, string, string>; | ||
| amount: z.ZodString; | ||
| asset: z.ZodString; | ||
| payTo: z.ZodString; | ||
| maxTimeoutSeconds: z.ZodNumber; | ||
| extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }, { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }>; | ||
| type PaymentRequirementsV2 = z.infer<typeof PaymentRequirementsV2Schema>; | ||
| /** | ||
| * PaymentRequired (402 response) schema for V2. | ||
| * Contains payment requirements when a resource requires payment. | ||
| */ | ||
| declare const PaymentRequiredV2Schema: z.ZodObject<{ | ||
| x402Version: z.ZodLiteral<2>; | ||
| error: z.ZodOptional<z.ZodString>; | ||
| resource: z.ZodObject<{ | ||
| url: z.ZodString; | ||
| description: z.ZodOptional<z.ZodString>; | ||
| mimeType: z.ZodOptional<z.ZodString>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| }, { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| }>; | ||
| accepts: z.ZodArray<z.ZodObject<{ | ||
| scheme: z.ZodString; | ||
| network: z.ZodEffects<z.ZodString, string, string>; | ||
| amount: z.ZodString; | ||
| asset: z.ZodString; | ||
| payTo: z.ZodString; | ||
| maxTimeoutSeconds: z.ZodNumber; | ||
| extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }, { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }>, "many">; | ||
| extensions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| resource: { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| }; | ||
| x402Version: 2; | ||
| accepts: { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }[]; | ||
| error?: string | undefined; | ||
| extensions?: Record<string, unknown> | undefined; | ||
| }, { | ||
| resource: { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| }; | ||
| x402Version: 2; | ||
| accepts: { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }[]; | ||
| error?: string | undefined; | ||
| extensions?: Record<string, unknown> | undefined; | ||
| }>; | ||
| type PaymentRequiredV2 = z.infer<typeof PaymentRequiredV2Schema>; | ||
| /** | ||
| * PaymentPayload schema for V2. | ||
| * Contains the payment data sent by the client. | ||
| */ | ||
| declare const PaymentPayloadV2Schema: z.ZodObject<{ | ||
| x402Version: z.ZodLiteral<2>; | ||
| resource: z.ZodOptional<z.ZodObject<{ | ||
| url: z.ZodString; | ||
| description: z.ZodOptional<z.ZodString>; | ||
| mimeType: z.ZodOptional<z.ZodString>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| }, { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| }>>; | ||
| accepted: z.ZodObject<{ | ||
| scheme: z.ZodString; | ||
| network: z.ZodEffects<z.ZodString, string, string>; | ||
| amount: z.ZodString; | ||
| asset: z.ZodString; | ||
| payTo: z.ZodString; | ||
| maxTimeoutSeconds: z.ZodNumber; | ||
| extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }, { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }>; | ||
| payload: z.ZodRecord<z.ZodString, z.ZodUnknown>; | ||
| extensions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| x402Version: 2; | ||
| payload: Record<string, unknown>; | ||
| accepted: { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }; | ||
| resource?: { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| } | undefined; | ||
| extensions?: Record<string, unknown> | undefined; | ||
| }, { | ||
| x402Version: 2; | ||
| payload: Record<string, unknown>; | ||
| accepted: { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }; | ||
| resource?: { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| } | undefined; | ||
| extensions?: Record<string, unknown> | undefined; | ||
| }>; | ||
| type PaymentPayloadV2 = z.infer<typeof PaymentPayloadV2Schema>; | ||
| /** | ||
| * PaymentRequirements union schema - accepts either V1 or V2 format. | ||
| * Use this when you need to handle both versions. | ||
| */ | ||
| declare const PaymentRequirementsSchema: z.ZodUnion<[z.ZodObject<{ | ||
| scheme: z.ZodString; | ||
| network: z.ZodString; | ||
| maxAmountRequired: z.ZodString; | ||
| resource: z.ZodString; | ||
| description: z.ZodString; | ||
| mimeType: z.ZodOptional<z.ZodString>; | ||
| outputSchema: z.ZodNullable<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>; | ||
| payTo: z.ZodString; | ||
| maxTimeoutSeconds: z.ZodNumber; | ||
| asset: z.ZodString; | ||
| extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| description: string; | ||
| scheme: string; | ||
| network: string; | ||
| maxAmountRequired: string; | ||
| resource: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| mimeType?: string | undefined; | ||
| outputSchema?: Record<string, unknown> | null | undefined; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }, { | ||
| description: string; | ||
| scheme: string; | ||
| network: string; | ||
| maxAmountRequired: string; | ||
| resource: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| mimeType?: string | undefined; | ||
| outputSchema?: Record<string, unknown> | null | undefined; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }>, z.ZodObject<{ | ||
| scheme: z.ZodString; | ||
| network: z.ZodEffects<z.ZodString, string, string>; | ||
| amount: z.ZodString; | ||
| asset: z.ZodString; | ||
| payTo: z.ZodString; | ||
| maxTimeoutSeconds: z.ZodNumber; | ||
| extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }, { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }>]>; | ||
| type PaymentRequirements = z.infer<typeof PaymentRequirementsSchema>; | ||
| /** | ||
| * PaymentRequired union schema - accepts either V1 or V2 format. | ||
| * Uses discriminated union on x402Version for efficient parsing. | ||
| */ | ||
| declare const PaymentRequiredSchema: z.ZodDiscriminatedUnion<"x402Version", [z.ZodObject<{ | ||
| x402Version: z.ZodLiteral<1>; | ||
| error: z.ZodOptional<z.ZodString>; | ||
| accepts: z.ZodArray<z.ZodObject<{ | ||
| scheme: z.ZodString; | ||
| network: z.ZodString; | ||
| maxAmountRequired: z.ZodString; | ||
| resource: z.ZodString; | ||
| description: z.ZodString; | ||
| mimeType: z.ZodOptional<z.ZodString>; | ||
| outputSchema: z.ZodNullable<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>; | ||
| payTo: z.ZodString; | ||
| maxTimeoutSeconds: z.ZodNumber; | ||
| asset: z.ZodString; | ||
| extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| description: string; | ||
| scheme: string; | ||
| network: string; | ||
| maxAmountRequired: string; | ||
| resource: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| mimeType?: string | undefined; | ||
| outputSchema?: Record<string, unknown> | null | undefined; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }, { | ||
| description: string; | ||
| scheme: string; | ||
| network: string; | ||
| maxAmountRequired: string; | ||
| resource: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| mimeType?: string | undefined; | ||
| outputSchema?: Record<string, unknown> | null | undefined; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }>, "many">; | ||
| }, "strip", z.ZodTypeAny, { | ||
| x402Version: 1; | ||
| accepts: { | ||
| description: string; | ||
| scheme: string; | ||
| network: string; | ||
| maxAmountRequired: string; | ||
| resource: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| mimeType?: string | undefined; | ||
| outputSchema?: Record<string, unknown> | null | undefined; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }[]; | ||
| error?: string | undefined; | ||
| }, { | ||
| x402Version: 1; | ||
| accepts: { | ||
| description: string; | ||
| scheme: string; | ||
| network: string; | ||
| maxAmountRequired: string; | ||
| resource: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| mimeType?: string | undefined; | ||
| outputSchema?: Record<string, unknown> | null | undefined; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }[]; | ||
| error?: string | undefined; | ||
| }>, z.ZodObject<{ | ||
| x402Version: z.ZodLiteral<2>; | ||
| error: z.ZodOptional<z.ZodString>; | ||
| resource: z.ZodObject<{ | ||
| url: z.ZodString; | ||
| description: z.ZodOptional<z.ZodString>; | ||
| mimeType: z.ZodOptional<z.ZodString>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| }, { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| }>; | ||
| accepts: z.ZodArray<z.ZodObject<{ | ||
| scheme: z.ZodString; | ||
| network: z.ZodEffects<z.ZodString, string, string>; | ||
| amount: z.ZodString; | ||
| asset: z.ZodString; | ||
| payTo: z.ZodString; | ||
| maxTimeoutSeconds: z.ZodNumber; | ||
| extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }, { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }>, "many">; | ||
| extensions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| resource: { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| }; | ||
| x402Version: 2; | ||
| accepts: { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }[]; | ||
| error?: string | undefined; | ||
| extensions?: Record<string, unknown> | undefined; | ||
| }, { | ||
| resource: { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| }; | ||
| x402Version: 2; | ||
| accepts: { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }[]; | ||
| error?: string | undefined; | ||
| extensions?: Record<string, unknown> | undefined; | ||
| }>]>; | ||
| type PaymentRequired = z.infer<typeof PaymentRequiredSchema>; | ||
| /** | ||
| * PaymentPayload union schema - accepts either V1 or V2 format. | ||
| * Uses discriminated union on x402Version for efficient parsing. | ||
| */ | ||
| declare const PaymentPayloadSchema: z.ZodDiscriminatedUnion<"x402Version", [z.ZodObject<{ | ||
| x402Version: z.ZodLiteral<1>; | ||
| scheme: z.ZodString; | ||
| network: z.ZodString; | ||
| payload: z.ZodRecord<z.ZodString, z.ZodUnknown>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| scheme: string; | ||
| network: string; | ||
| x402Version: 1; | ||
| payload: Record<string, unknown>; | ||
| }, { | ||
| scheme: string; | ||
| network: string; | ||
| x402Version: 1; | ||
| payload: Record<string, unknown>; | ||
| }>, z.ZodObject<{ | ||
| x402Version: z.ZodLiteral<2>; | ||
| resource: z.ZodOptional<z.ZodObject<{ | ||
| url: z.ZodString; | ||
| description: z.ZodOptional<z.ZodString>; | ||
| mimeType: z.ZodOptional<z.ZodString>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| }, { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| }>>; | ||
| accepted: z.ZodObject<{ | ||
| scheme: z.ZodString; | ||
| network: z.ZodEffects<z.ZodString, string, string>; | ||
| amount: z.ZodString; | ||
| asset: z.ZodString; | ||
| payTo: z.ZodString; | ||
| maxTimeoutSeconds: z.ZodNumber; | ||
| extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }, { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }>; | ||
| payload: z.ZodRecord<z.ZodString, z.ZodUnknown>; | ||
| extensions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; | ||
| }, "strip", z.ZodTypeAny, { | ||
| x402Version: 2; | ||
| payload: Record<string, unknown>; | ||
| accepted: { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }; | ||
| resource?: { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| } | undefined; | ||
| extensions?: Record<string, unknown> | undefined; | ||
| }, { | ||
| x402Version: 2; | ||
| payload: Record<string, unknown>; | ||
| accepted: { | ||
| scheme: string; | ||
| network: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown> | undefined; | ||
| }; | ||
| resource?: { | ||
| url: string; | ||
| description?: string | undefined; | ||
| mimeType?: string | undefined; | ||
| } | undefined; | ||
| extensions?: Record<string, unknown> | undefined; | ||
| }>]>; | ||
| type PaymentPayload = z.infer<typeof PaymentPayloadSchema>; | ||
| /** | ||
| * Validates a PaymentRequired object (V1 or V2). | ||
| * | ||
| * @param value - The value to validate | ||
| * @returns A result object with success status and data or error | ||
| */ | ||
| declare function parsePaymentRequired(value: unknown): z.SafeParseReturnType<unknown, PaymentRequired>; | ||
| /** | ||
| * Validates a PaymentRequired object and throws on error. | ||
| * | ||
| * @param value - The value to validate | ||
| * @returns The validated PaymentRequired | ||
| * @throws ZodError if validation fails | ||
| */ | ||
| declare function validatePaymentRequired(value: unknown): PaymentRequired; | ||
| /** | ||
| * Type guard for PaymentRequired (V1 or V2). | ||
| * | ||
| * @param value - The value to check | ||
| * @returns True if the value is a valid PaymentRequired | ||
| */ | ||
| declare function isPaymentRequired(value: unknown): value is PaymentRequired; | ||
| /** | ||
| * Validates a PaymentRequirements object (V1 or V2). | ||
| * | ||
| * @param value - The value to validate | ||
| * @returns A result object with success status and data or error | ||
| */ | ||
| declare function parsePaymentRequirements(value: unknown): z.SafeParseReturnType<unknown, PaymentRequirements>; | ||
| /** | ||
| * Validates a PaymentRequirements object and throws on error. | ||
| * | ||
| * @param value - The value to validate | ||
| * @returns The validated PaymentRequirements | ||
| * @throws ZodError if validation fails | ||
| */ | ||
| declare function validatePaymentRequirements(value: unknown): PaymentRequirements; | ||
| /** | ||
| * Type guard for PaymentRequirements (V1 or V2). | ||
| * | ||
| * @param value - The value to check | ||
| * @returns True if the value is a valid PaymentRequirements | ||
| */ | ||
| declare function isPaymentRequirements(value: unknown): value is PaymentRequirements; | ||
| /** | ||
| * Validates a PaymentPayload object (V1 or V2). | ||
| * | ||
| * @param value - The value to validate | ||
| * @returns A result object with success status and data or error | ||
| */ | ||
| declare function parsePaymentPayload(value: unknown): z.SafeParseReturnType<unknown, PaymentPayload>; | ||
| /** | ||
| * Validates a PaymentPayload object and throws on error. | ||
| * | ||
| * @param value - The value to validate | ||
| * @returns The validated PaymentPayload | ||
| * @throws ZodError if validation fails | ||
| */ | ||
| declare function validatePaymentPayload(value: unknown): PaymentPayload; | ||
| /** | ||
| * Type guard for PaymentPayload (V1 or V2). | ||
| * | ||
| * @param value - The value to check | ||
| * @returns True if the value is a valid PaymentPayload | ||
| */ | ||
| declare function isPaymentPayload(value: unknown): value is PaymentPayload; | ||
| /** | ||
| * Type guard for PaymentRequiredV1. | ||
| * | ||
| * @param value - The value to check | ||
| * @returns True if the value is a valid PaymentRequiredV1 | ||
| */ | ||
| declare function isPaymentRequiredV1(value: unknown): value is PaymentRequiredV1; | ||
| /** | ||
| * Type guard for PaymentRequiredV2. | ||
| * | ||
| * @param value - The value to check | ||
| * @returns True if the value is a valid PaymentRequiredV2 | ||
| */ | ||
| declare function isPaymentRequiredV2(value: unknown): value is PaymentRequiredV2; | ||
| /** | ||
| * Type guard for PaymentRequirementsV1. | ||
| * | ||
| * @param value - The value to check | ||
| * @returns True if the value is a valid PaymentRequirementsV1 | ||
| */ | ||
| declare function isPaymentRequirementsV1(value: unknown): value is PaymentRequirementsV1; | ||
| /** | ||
| * Type guard for PaymentRequirementsV2. | ||
| * | ||
| * @param value - The value to check | ||
| * @returns True if the value is a valid PaymentRequirementsV2 | ||
| */ | ||
| declare function isPaymentRequirementsV2(value: unknown): value is PaymentRequirementsV2; | ||
| /** | ||
| * Type guard for PaymentPayloadV1. | ||
| * | ||
| * @param value - The value to check | ||
| * @returns True if the value is a valid PaymentPayloadV1 | ||
| */ | ||
| declare function isPaymentPayloadV1(value: unknown): value is PaymentPayloadV1; | ||
| /** | ||
| * Type guard for PaymentPayloadV2. | ||
| * | ||
| * @param value - The value to check | ||
| * @returns True if the value is a valid PaymentPayloadV2 | ||
| */ | ||
| declare function isPaymentPayloadV2(value: unknown): value is PaymentPayloadV2; | ||
| export { Any, type Network, NetworkSchema, NetworkSchemaV1, NetworkSchemaV2, type NetworkV1, type NetworkV2, NonEmptyString, OptionalAny, type PaymentPayload, PaymentPayloadSchema, type PaymentPayloadV1, PaymentPayloadV1Schema, type PaymentPayloadV2, PaymentPayloadV2Schema, type PaymentRequired, PaymentRequiredSchema, type PaymentRequiredV1, PaymentRequiredV1Schema, type PaymentRequiredV2, PaymentRequiredV2Schema, type PaymentRequirements, PaymentRequirementsSchema, type PaymentRequirementsV1, PaymentRequirementsV1Schema, type PaymentRequirementsV2, PaymentRequirementsV2Schema, type ResourceInfo, ResourceInfoSchema, isPaymentPayload, isPaymentPayloadV1, isPaymentPayloadV2, isPaymentRequired, isPaymentRequiredV1, isPaymentRequiredV2, isPaymentRequirements, isPaymentRequirementsV1, isPaymentRequirementsV2, parsePaymentPayload, parsePaymentRequired, parsePaymentRequirements, validatePaymentPayload, validatePaymentRequired, validatePaymentRequirements }; |
| import "../chunk-BJTO5JO5.mjs"; | ||
| // src/schemas/index.ts | ||
| import { z } from "zod"; | ||
| import { z as z2 } from "zod"; | ||
| var NonEmptyString = z.string().min(1); | ||
| var Any = z.record(z.unknown()); | ||
| var OptionalAny = z.record(z.unknown()).optional(); | ||
| var NetworkSchemaV1 = NonEmptyString; | ||
| var NetworkSchemaV2 = z.string().min(3).refine((val) => val.includes(":"), { | ||
| message: "Network must be in CAIP-2 format (e.g., 'eip155:84532')" | ||
| }); | ||
| var NetworkSchema = z.union([NetworkSchemaV1, NetworkSchemaV2]); | ||
| var ResourceInfoSchema = z.object({ | ||
| url: NonEmptyString, | ||
| description: z.string().optional(), | ||
| mimeType: z.string().optional() | ||
| }); | ||
| var PaymentRequirementsV1Schema = z.object({ | ||
| scheme: NonEmptyString, | ||
| network: NetworkSchemaV1, | ||
| maxAmountRequired: NonEmptyString, | ||
| resource: NonEmptyString, | ||
| // URL string in V1 | ||
| description: z.string(), | ||
| mimeType: z.string().optional(), | ||
| outputSchema: Any.optional().nullable(), | ||
| payTo: NonEmptyString, | ||
| maxTimeoutSeconds: z.number().positive(), | ||
| asset: NonEmptyString, | ||
| extra: OptionalAny | ||
| }); | ||
| var PaymentRequiredV1Schema = z.object({ | ||
| x402Version: z.literal(1), | ||
| error: z.string().optional(), | ||
| accepts: z.array(PaymentRequirementsV1Schema).min(1) | ||
| }); | ||
| var PaymentPayloadV1Schema = z.object({ | ||
| x402Version: z.literal(1), | ||
| scheme: NonEmptyString, | ||
| network: NetworkSchemaV1, | ||
| payload: Any | ||
| }); | ||
| var PaymentRequirementsV2Schema = z.object({ | ||
| scheme: NonEmptyString, | ||
| network: NetworkSchemaV2, | ||
| amount: NonEmptyString, | ||
| asset: NonEmptyString, | ||
| payTo: NonEmptyString, | ||
| maxTimeoutSeconds: z.number().positive(), | ||
| extra: OptionalAny | ||
| }); | ||
| var PaymentRequiredV2Schema = z.object({ | ||
| x402Version: z.literal(2), | ||
| error: z.string().optional(), | ||
| resource: ResourceInfoSchema, | ||
| accepts: z.array(PaymentRequirementsV2Schema).min(1), | ||
| extensions: OptionalAny | ||
| }); | ||
| var PaymentPayloadV2Schema = z.object({ | ||
| x402Version: z.literal(2), | ||
| resource: ResourceInfoSchema.optional(), | ||
| accepted: PaymentRequirementsV2Schema, | ||
| payload: Any, | ||
| extensions: OptionalAny | ||
| }); | ||
| var PaymentRequirementsSchema = z.union([ | ||
| PaymentRequirementsV1Schema, | ||
| PaymentRequirementsV2Schema | ||
| ]); | ||
| var PaymentRequiredSchema = z.discriminatedUnion("x402Version", [ | ||
| PaymentRequiredV1Schema, | ||
| PaymentRequiredV2Schema | ||
| ]); | ||
| var PaymentPayloadSchema = z.discriminatedUnion("x402Version", [ | ||
| PaymentPayloadV1Schema, | ||
| PaymentPayloadV2Schema | ||
| ]); | ||
| function parsePaymentRequired(value) { | ||
| return PaymentRequiredSchema.safeParse(value); | ||
| } | ||
| function validatePaymentRequired(value) { | ||
| return PaymentRequiredSchema.parse(value); | ||
| } | ||
| function isPaymentRequired(value) { | ||
| return PaymentRequiredSchema.safeParse(value).success; | ||
| } | ||
| function parsePaymentRequirements(value) { | ||
| return PaymentRequirementsSchema.safeParse(value); | ||
| } | ||
| function validatePaymentRequirements(value) { | ||
| return PaymentRequirementsSchema.parse(value); | ||
| } | ||
| function isPaymentRequirements(value) { | ||
| return PaymentRequirementsSchema.safeParse(value).success; | ||
| } | ||
| function parsePaymentPayload(value) { | ||
| return PaymentPayloadSchema.safeParse(value); | ||
| } | ||
| function validatePaymentPayload(value) { | ||
| return PaymentPayloadSchema.parse(value); | ||
| } | ||
| function isPaymentPayload(value) { | ||
| return PaymentPayloadSchema.safeParse(value).success; | ||
| } | ||
| function isPaymentRequiredV1(value) { | ||
| return PaymentRequiredV1Schema.safeParse(value).success; | ||
| } | ||
| function isPaymentRequiredV2(value) { | ||
| return PaymentRequiredV2Schema.safeParse(value).success; | ||
| } | ||
| function isPaymentRequirementsV1(value) { | ||
| return PaymentRequirementsV1Schema.safeParse(value).success; | ||
| } | ||
| function isPaymentRequirementsV2(value) { | ||
| return PaymentRequirementsV2Schema.safeParse(value).success; | ||
| } | ||
| function isPaymentPayloadV1(value) { | ||
| return PaymentPayloadV1Schema.safeParse(value).success; | ||
| } | ||
| function isPaymentPayloadV2(value) { | ||
| return PaymentPayloadV2Schema.safeParse(value).success; | ||
| } | ||
| export { | ||
| Any, | ||
| NetworkSchema, | ||
| NetworkSchemaV1, | ||
| NetworkSchemaV2, | ||
| NonEmptyString, | ||
| OptionalAny, | ||
| PaymentPayloadSchema, | ||
| PaymentPayloadV1Schema, | ||
| PaymentPayloadV2Schema, | ||
| PaymentRequiredSchema, | ||
| PaymentRequiredV1Schema, | ||
| PaymentRequiredV2Schema, | ||
| PaymentRequirementsSchema, | ||
| PaymentRequirementsV1Schema, | ||
| PaymentRequirementsV2Schema, | ||
| ResourceInfoSchema, | ||
| isPaymentPayload, | ||
| isPaymentPayloadV1, | ||
| isPaymentPayloadV2, | ||
| isPaymentRequired, | ||
| isPaymentRequiredV1, | ||
| isPaymentRequiredV2, | ||
| isPaymentRequirements, | ||
| isPaymentRequirementsV1, | ||
| isPaymentRequirementsV2, | ||
| parsePaymentPayload, | ||
| parsePaymentRequired, | ||
| parsePaymentRequirements, | ||
| validatePaymentPayload, | ||
| validatePaymentRequired, | ||
| validatePaymentRequirements, | ||
| z2 as z | ||
| }; | ||
| //# sourceMappingURL=index.mjs.map |
| {"version":3,"sources":["../../../src/schemas/index.ts"],"sourcesContent":["import { z } from \"zod\";\n\n// ============================================================================\n// Reusable Primitive Schemas\n// ============================================================================\n\n/**\n * Non-empty string schema - a string with at least one character.\n * Used for required string fields that cannot be empty.\n */\nexport const NonEmptyString = z.string().min(1);\nexport type NonEmptyString = z.infer<typeof NonEmptyString>;\n\n/**\n * Any record schema - an object with unknown keys and values.\n * Used for scheme-specific payloads and other extensible objects.\n */\nexport const Any = z.record(z.unknown());\nexport type Any = z.infer<typeof Any>;\n\n/**\n * Optional any record schema - an optional object with unknown keys and values.\n * Used for optional extension fields like `extra` and `extensions`.\n */\nexport const OptionalAny = z.record(z.unknown()).optional();\nexport type OptionalAny = z.infer<typeof OptionalAny>;\n\n// ============================================================================\n// Network Schemas\n// ============================================================================\n\n/**\n * Network identifier schema for V1 - loose validation.\n * V1 accepts any non-empty string for backwards compatibility.\n */\nexport const NetworkSchemaV1 = NonEmptyString;\nexport type NetworkV1 = z.infer<typeof NetworkSchemaV1>;\n\n/**\n * Network identifier schema for V2 - CAIP-2 format validation.\n * V2 requires minimum length of 3 and a colon separator (e.g., \"eip155:84532\", \"solana:devnet\").\n */\nexport const NetworkSchemaV2 = z\n .string()\n .min(3)\n .refine(val => val.includes(\":\"), {\n message: \"Network must be in CAIP-2 format (e.g., 'eip155:84532')\",\n });\nexport type NetworkV2 = z.infer<typeof NetworkSchemaV2>;\n\n/**\n * Union network schema - accepts either V1 or V2 format.\n */\nexport const NetworkSchema = z.union([NetworkSchemaV1, NetworkSchemaV2]);\nexport type Network = z.infer<typeof NetworkSchema>;\n\n// ============================================================================\n// Shared Schemas\n// ============================================================================\n\n/**\n * ResourceInfo schema for V2 - describes the protected resource.\n */\nexport const ResourceInfoSchema = z.object({\n url: NonEmptyString,\n description: z.string().optional(),\n mimeType: z.string().optional(),\n});\nexport type ResourceInfo = z.infer<typeof ResourceInfoSchema>;\n\n// ============================================================================\n// V1 Schemas\n// ============================================================================\n\n/**\n * PaymentRequirements schema for V1.\n * V1 includes resource info directly in the requirements object.\n */\nexport const PaymentRequirementsV1Schema = z.object({\n scheme: NonEmptyString,\n network: NetworkSchemaV1,\n maxAmountRequired: NonEmptyString,\n resource: NonEmptyString, // URL string in V1\n description: z.string(),\n mimeType: z.string().optional(),\n outputSchema: Any.optional().nullable(),\n payTo: NonEmptyString,\n maxTimeoutSeconds: z.number().positive(),\n asset: NonEmptyString,\n extra: OptionalAny,\n});\nexport type PaymentRequirementsV1 = z.infer<typeof PaymentRequirementsV1Schema>;\n\n/**\n * PaymentRequired (402 response) schema for V1.\n * Contains payment requirements when a resource requires payment.\n */\nexport const PaymentRequiredV1Schema = z.object({\n x402Version: z.literal(1),\n error: z.string().optional(),\n accepts: z.array(PaymentRequirementsV1Schema).min(1),\n});\nexport type PaymentRequiredV1 = z.infer<typeof PaymentRequiredV1Schema>;\n\n/**\n * PaymentPayload schema for V1.\n * Contains the payment data sent by the client.\n */\nexport const PaymentPayloadV1Schema = z.object({\n x402Version: z.literal(1),\n scheme: NonEmptyString,\n network: NetworkSchemaV1,\n payload: Any,\n});\nexport type PaymentPayloadV1 = z.infer<typeof PaymentPayloadV1Schema>;\n\n// ============================================================================\n// V2 Schemas\n// ============================================================================\n\n/**\n * PaymentRequirements schema for V2.\n * V2 uses \"amount\" instead of \"maxAmountRequired\" and doesn't include resource info.\n */\nexport const PaymentRequirementsV2Schema = z.object({\n scheme: NonEmptyString,\n network: NetworkSchemaV2,\n amount: NonEmptyString,\n asset: NonEmptyString,\n payTo: NonEmptyString,\n maxTimeoutSeconds: z.number().positive(),\n extra: OptionalAny,\n});\nexport type PaymentRequirementsV2 = z.infer<typeof PaymentRequirementsV2Schema>;\n\n/**\n * PaymentRequired (402 response) schema for V2.\n * Contains payment requirements when a resource requires payment.\n */\nexport const PaymentRequiredV2Schema = z.object({\n x402Version: z.literal(2),\n error: z.string().optional(),\n resource: ResourceInfoSchema,\n accepts: z.array(PaymentRequirementsV2Schema).min(1),\n extensions: OptionalAny,\n});\nexport type PaymentRequiredV2 = z.infer<typeof PaymentRequiredV2Schema>;\n\n/**\n * PaymentPayload schema for V2.\n * Contains the payment data sent by the client.\n */\nexport const PaymentPayloadV2Schema = z.object({\n x402Version: z.literal(2),\n resource: ResourceInfoSchema.optional(),\n accepted: PaymentRequirementsV2Schema,\n payload: Any,\n extensions: OptionalAny,\n});\nexport type PaymentPayloadV2 = z.infer<typeof PaymentPayloadV2Schema>;\n\n// ============================================================================\n// Union Schemas (V1 | V2)\n// ============================================================================\n\n/**\n * PaymentRequirements union schema - accepts either V1 or V2 format.\n * Use this when you need to handle both versions.\n */\nexport const PaymentRequirementsSchema = z.union([\n PaymentRequirementsV1Schema,\n PaymentRequirementsV2Schema,\n]);\nexport type PaymentRequirements = z.infer<typeof PaymentRequirementsSchema>;\n\n/**\n * PaymentRequired union schema - accepts either V1 or V2 format.\n * Uses discriminated union on x402Version for efficient parsing.\n */\nexport const PaymentRequiredSchema = z.discriminatedUnion(\"x402Version\", [\n PaymentRequiredV1Schema,\n PaymentRequiredV2Schema,\n]);\nexport type PaymentRequired = z.infer<typeof PaymentRequiredSchema>;\n\n/**\n * PaymentPayload union schema - accepts either V1 or V2 format.\n * Uses discriminated union on x402Version for efficient parsing.\n */\nexport const PaymentPayloadSchema = z.discriminatedUnion(\"x402Version\", [\n PaymentPayloadV1Schema,\n PaymentPayloadV2Schema,\n]);\nexport type PaymentPayload = z.infer<typeof PaymentPayloadSchema>;\n\n// ============================================================================\n// Validation Functions\n// ============================================================================\n\n/**\n * Validates a PaymentRequired object (V1 or V2).\n *\n * @param value - The value to validate\n * @returns A result object with success status and data or error\n */\nexport function parsePaymentRequired(\n value: unknown,\n): z.SafeParseReturnType<unknown, PaymentRequired> {\n return PaymentRequiredSchema.safeParse(value);\n}\n\n/**\n * Validates a PaymentRequired object and throws on error.\n *\n * @param value - The value to validate\n * @returns The validated PaymentRequired\n * @throws ZodError if validation fails\n */\nexport function validatePaymentRequired(value: unknown): PaymentRequired {\n return PaymentRequiredSchema.parse(value);\n}\n\n/**\n * Type guard for PaymentRequired (V1 or V2).\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentRequired\n */\nexport function isPaymentRequired(value: unknown): value is PaymentRequired {\n return PaymentRequiredSchema.safeParse(value).success;\n}\n\n/**\n * Validates a PaymentRequirements object (V1 or V2).\n *\n * @param value - The value to validate\n * @returns A result object with success status and data or error\n */\nexport function parsePaymentRequirements(\n value: unknown,\n): z.SafeParseReturnType<unknown, PaymentRequirements> {\n return PaymentRequirementsSchema.safeParse(value);\n}\n\n/**\n * Validates a PaymentRequirements object and throws on error.\n *\n * @param value - The value to validate\n * @returns The validated PaymentRequirements\n * @throws ZodError if validation fails\n */\nexport function validatePaymentRequirements(value: unknown): PaymentRequirements {\n return PaymentRequirementsSchema.parse(value);\n}\n\n/**\n * Type guard for PaymentRequirements (V1 or V2).\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentRequirements\n */\nexport function isPaymentRequirements(value: unknown): value is PaymentRequirements {\n return PaymentRequirementsSchema.safeParse(value).success;\n}\n\n/**\n * Validates a PaymentPayload object (V1 or V2).\n *\n * @param value - The value to validate\n * @returns A result object with success status and data or error\n */\nexport function parsePaymentPayload(\n value: unknown,\n): z.SafeParseReturnType<unknown, PaymentPayload> {\n return PaymentPayloadSchema.safeParse(value);\n}\n\n/**\n * Validates a PaymentPayload object and throws on error.\n *\n * @param value - The value to validate\n * @returns The validated PaymentPayload\n * @throws ZodError if validation fails\n */\nexport function validatePaymentPayload(value: unknown): PaymentPayload {\n return PaymentPayloadSchema.parse(value);\n}\n\n/**\n * Type guard for PaymentPayload (V1 or V2).\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentPayload\n */\nexport function isPaymentPayload(value: unknown): value is PaymentPayload {\n return PaymentPayloadSchema.safeParse(value).success;\n}\n\n// ============================================================================\n// Version-Specific Type Guards\n// ============================================================================\n\n/**\n * Type guard for PaymentRequiredV1.\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentRequiredV1\n */\nexport function isPaymentRequiredV1(value: unknown): value is PaymentRequiredV1 {\n return PaymentRequiredV1Schema.safeParse(value).success;\n}\n\n/**\n * Type guard for PaymentRequiredV2.\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentRequiredV2\n */\nexport function isPaymentRequiredV2(value: unknown): value is PaymentRequiredV2 {\n return PaymentRequiredV2Schema.safeParse(value).success;\n}\n\n/**\n * Type guard for PaymentRequirementsV1.\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentRequirementsV1\n */\nexport function isPaymentRequirementsV1(value: unknown): value is PaymentRequirementsV1 {\n return PaymentRequirementsV1Schema.safeParse(value).success;\n}\n\n/**\n * Type guard for PaymentRequirementsV2.\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentRequirementsV2\n */\nexport function isPaymentRequirementsV2(value: unknown): value is PaymentRequirementsV2 {\n return PaymentRequirementsV2Schema.safeParse(value).success;\n}\n\n/**\n * Type guard for PaymentPayloadV1.\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentPayloadV1\n */\nexport function isPaymentPayloadV1(value: unknown): value is PaymentPayloadV1 {\n return PaymentPayloadV1Schema.safeParse(value).success;\n}\n\n/**\n * Type guard for PaymentPayloadV2.\n *\n * @param value - The value to check\n * @returns True if the value is a valid PaymentPayloadV2\n */\nexport function isPaymentPayloadV2(value: unknown): value is PaymentPayloadV2 {\n return PaymentPayloadV2Schema.safeParse(value).success;\n}\n\n// ============================================================================\n// Re-export zod for convenience\n// ============================================================================\n\nexport { z } from \"zod\";\n"],"mappings":";;;AAAA,SAAS,SAAS;AA8WlB,SAAS,KAAAA,UAAS;AApWX,IAAM,iBAAiB,EAAE,OAAO,EAAE,IAAI,CAAC;AAOvC,IAAM,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC;AAOhC,IAAM,cAAc,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAWnD,IAAM,kBAAkB;AAOxB,IAAM,kBAAkB,EAC5B,OAAO,EACP,IAAI,CAAC,EACL,OAAO,SAAO,IAAI,SAAS,GAAG,GAAG;AAAA,EAChC,SAAS;AACX,CAAC;AAMI,IAAM,gBAAgB,EAAE,MAAM,CAAC,iBAAiB,eAAe,CAAC;AAUhE,IAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,KAAK;AAAA,EACL,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,UAAU,EAAE,OAAO,EAAE,SAAS;AAChC,CAAC;AAWM,IAAM,8BAA8B,EAAE,OAAO;AAAA,EAClD,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,mBAAmB;AAAA,EACnB,UAAU;AAAA;AAAA,EACV,aAAa,EAAE,OAAO;AAAA,EACtB,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,cAAc,IAAI,SAAS,EAAE,SAAS;AAAA,EACtC,OAAO;AAAA,EACP,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,EACvC,OAAO;AAAA,EACP,OAAO;AACT,CAAC;AAOM,IAAM,0BAA0B,EAAE,OAAO;AAAA,EAC9C,aAAa,EAAE,QAAQ,CAAC;AAAA,EACxB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,SAAS,EAAE,MAAM,2BAA2B,EAAE,IAAI,CAAC;AACrD,CAAC;AAOM,IAAM,yBAAyB,EAAE,OAAO;AAAA,EAC7C,aAAa,EAAE,QAAQ,CAAC;AAAA,EACxB,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AACX,CAAC;AAWM,IAAM,8BAA8B,EAAE,OAAO;AAAA,EAClD,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,EACvC,OAAO;AACT,CAAC;AAOM,IAAM,0BAA0B,EAAE,OAAO;AAAA,EAC9C,aAAa,EAAE,QAAQ,CAAC;AAAA,EACxB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,UAAU;AAAA,EACV,SAAS,EAAE,MAAM,2BAA2B,EAAE,IAAI,CAAC;AAAA,EACnD,YAAY;AACd,CAAC;AAOM,IAAM,yBAAyB,EAAE,OAAO;AAAA,EAC7C,aAAa,EAAE,QAAQ,CAAC;AAAA,EACxB,UAAU,mBAAmB,SAAS;AAAA,EACtC,UAAU;AAAA,EACV,SAAS;AAAA,EACT,YAAY;AACd,CAAC;AAWM,IAAM,4BAA4B,EAAE,MAAM;AAAA,EAC/C;AAAA,EACA;AACF,CAAC;AAOM,IAAM,wBAAwB,EAAE,mBAAmB,eAAe;AAAA,EACvE;AAAA,EACA;AACF,CAAC;AAOM,IAAM,uBAAuB,EAAE,mBAAmB,eAAe;AAAA,EACtE;AAAA,EACA;AACF,CAAC;AAaM,SAAS,qBACd,OACiD;AACjD,SAAO,sBAAsB,UAAU,KAAK;AAC9C;AASO,SAAS,wBAAwB,OAAiC;AACvE,SAAO,sBAAsB,MAAM,KAAK;AAC1C;AAQO,SAAS,kBAAkB,OAA0C;AAC1E,SAAO,sBAAsB,UAAU,KAAK,EAAE;AAChD;AAQO,SAAS,yBACd,OACqD;AACrD,SAAO,0BAA0B,UAAU,KAAK;AAClD;AASO,SAAS,4BAA4B,OAAqC;AAC/E,SAAO,0BAA0B,MAAM,KAAK;AAC9C;AAQO,SAAS,sBAAsB,OAA8C;AAClF,SAAO,0BAA0B,UAAU,KAAK,EAAE;AACpD;AAQO,SAAS,oBACd,OACgD;AAChD,SAAO,qBAAqB,UAAU,KAAK;AAC7C;AASO,SAAS,uBAAuB,OAAgC;AACrE,SAAO,qBAAqB,MAAM,KAAK;AACzC;AAQO,SAAS,iBAAiB,OAAyC;AACxE,SAAO,qBAAqB,UAAU,KAAK,EAAE;AAC/C;AAYO,SAAS,oBAAoB,OAA4C;AAC9E,SAAO,wBAAwB,UAAU,KAAK,EAAE;AAClD;AAQO,SAAS,oBAAoB,OAA4C;AAC9E,SAAO,wBAAwB,UAAU,KAAK,EAAE;AAClD;AAQO,SAAS,wBAAwB,OAAgD;AACtF,SAAO,4BAA4B,UAAU,KAAK,EAAE;AACtD;AAQO,SAAS,wBAAwB,OAAgD;AACtF,SAAO,4BAA4B,UAAU,KAAK,EAAE;AACtD;AAQO,SAAS,mBAAmB,OAA2C;AAC5E,SAAO,uBAAuB,UAAU,KAAK,EAAE;AACjD;AAQO,SAAS,mBAAmB,OAA2C;AAC5E,SAAO,uBAAuB,UAAU,KAAK,EAAE;AACjD;","names":["z"]} |
| import { h as Price, N as Network, P as PaymentPayload, a as PaymentRequirements, c as PaymentRequired, S as SettleResponse, x as x402ResourceServer } from './mechanisms-CP6q1k8-.mjs'; | ||
| /** | ||
| * Framework-agnostic HTTP adapter interface | ||
| * Implementations provide framework-specific HTTP operations | ||
| */ | ||
| interface HTTPAdapter { | ||
| getHeader(name: string): string | undefined; | ||
| getMethod(): string; | ||
| getPath(): string; | ||
| getUrl(): string; | ||
| getAcceptHeader(): string; | ||
| getUserAgent(): string; | ||
| /** | ||
| * Get query parameters from the request URL | ||
| * | ||
| * @returns Record of query parameter key-value pairs | ||
| */ | ||
| getQueryParams?(): Record<string, string | string[]>; | ||
| /** | ||
| * Get a specific query parameter by name | ||
| * | ||
| * @param name - The query parameter name | ||
| * @returns The query parameter value(s) or undefined | ||
| */ | ||
| getQueryParam?(name: string): string | string[] | undefined; | ||
| /** | ||
| * Get the parsed request body | ||
| * Framework adapters should parse JSON/form data appropriately | ||
| * | ||
| * @returns The parsed request body | ||
| */ | ||
| getBody?(): unknown; | ||
| } | ||
| /** | ||
| * Paywall configuration for HTML responses | ||
| */ | ||
| interface PaywallConfig { | ||
| appName?: string; | ||
| appLogo?: string; | ||
| sessionTokenEndpoint?: string; | ||
| currentUrl?: string; | ||
| testnet?: boolean; | ||
| } | ||
| /** | ||
| * Paywall provider interface for generating HTML | ||
| */ | ||
| interface PaywallProvider { | ||
| generateHtml(paymentRequired: PaymentRequired, config?: PaywallConfig): string; | ||
| } | ||
| /** | ||
| * Dynamic payTo function that receives HTTP request context | ||
| */ | ||
| type DynamicPayTo = (context: HTTPRequestContext) => string | Promise<string>; | ||
| /** | ||
| * Dynamic price function that receives HTTP request context | ||
| */ | ||
| type DynamicPrice = (context: HTTPRequestContext) => Price | Promise<Price>; | ||
| /** | ||
| * Result of the unpaid response callback containing content type and body. | ||
| */ | ||
| interface UnpaidResponseResult { | ||
| /** | ||
| * The content type for the response (e.g., 'application/json', 'text/plain'). | ||
| */ | ||
| contentType: string; | ||
| /** | ||
| * The response body to include in the 402 response. | ||
| */ | ||
| body: unknown; | ||
| } | ||
| /** | ||
| * Dynamic function to generate a custom response for unpaid requests. | ||
| * Receives the HTTP request context and returns the content type and body to include in the 402 response. | ||
| */ | ||
| type UnpaidResponseBody = (context: HTTPRequestContext) => UnpaidResponseResult | Promise<UnpaidResponseResult>; | ||
| /** | ||
| * A single payment option for a route | ||
| * Represents one way a client can pay for access to the resource | ||
| */ | ||
| interface PaymentOption { | ||
| scheme: string; | ||
| payTo: string | DynamicPayTo; | ||
| price: Price | DynamicPrice; | ||
| network: Network; | ||
| maxTimeoutSeconds?: number; | ||
| extra?: Record<string, unknown>; | ||
| } | ||
| /** | ||
| * Route configuration for HTTP endpoints | ||
| * | ||
| * The 'accepts' field defines payment options for the route. | ||
| * Can be a single PaymentOption or an array of PaymentOptions for multiple payment methods. | ||
| */ | ||
| interface RouteConfig { | ||
| accepts: PaymentOption | PaymentOption[]; | ||
| resource?: string; | ||
| description?: string; | ||
| mimeType?: string; | ||
| customPaywallHtml?: string; | ||
| /** | ||
| * Optional callback to generate a custom response for unpaid API requests. | ||
| * This allows servers to return preview data, error messages, or other content | ||
| * when a request lacks payment. | ||
| * | ||
| * For browser requests (Accept: text/html), the paywall HTML takes precedence. | ||
| * This callback is only used for API clients. | ||
| * | ||
| * If not provided, defaults to { contentType: 'application/json', body: {} }. | ||
| * | ||
| * @param context - The HTTP request context | ||
| * @returns An object containing both contentType and body for the 402 response | ||
| */ | ||
| unpaidResponseBody?: UnpaidResponseBody; | ||
| extensions?: Record<string, unknown>; | ||
| } | ||
| /** | ||
| * Routes configuration - maps path patterns to route configs | ||
| */ | ||
| type RoutesConfig = Record<string, RouteConfig> | RouteConfig; | ||
| /** | ||
| * Hook that runs on every request to a protected route, before payment processing. | ||
| * Can grant access without payment, deny the request, or continue to payment flow. | ||
| * | ||
| * @returns | ||
| * - `void` - Continue to payment processing (default behavior) | ||
| * - `{ grantAccess: true }` - Grant access without requiring payment | ||
| * - `{ abort: true; reason: string }` - Deny the request (returns 403) | ||
| */ | ||
| type ProtectedRequestHook = (context: HTTPRequestContext, routeConfig: RouteConfig) => Promise<void | { | ||
| grantAccess: true; | ||
| } | { | ||
| abort: true; | ||
| reason: string; | ||
| }>; | ||
| /** | ||
| * Compiled route for efficient matching | ||
| */ | ||
| interface CompiledRoute { | ||
| verb: string; | ||
| regex: RegExp; | ||
| config: RouteConfig; | ||
| } | ||
| /** | ||
| * HTTP request context that encapsulates all request data | ||
| */ | ||
| interface HTTPRequestContext { | ||
| adapter: HTTPAdapter; | ||
| path: string; | ||
| method: string; | ||
| paymentHeader?: string; | ||
| } | ||
| /** | ||
| * HTTP response instructions for the framework middleware | ||
| */ | ||
| interface HTTPResponseInstructions { | ||
| status: number; | ||
| headers: Record<string, string>; | ||
| body?: unknown; | ||
| isHtml?: boolean; | ||
| } | ||
| /** | ||
| * Result of processing an HTTP request for payment | ||
| */ | ||
| type HTTPProcessResult = { | ||
| type: "no-payment-required"; | ||
| } | { | ||
| type: "payment-verified"; | ||
| paymentPayload: PaymentPayload; | ||
| paymentRequirements: PaymentRequirements; | ||
| declaredExtensions?: Record<string, unknown>; | ||
| } | { | ||
| type: "payment-error"; | ||
| response: HTTPResponseInstructions; | ||
| }; | ||
| /** | ||
| * Result of processSettlement | ||
| */ | ||
| type ProcessSettleSuccessResponse = SettleResponse & { | ||
| success: true; | ||
| headers: Record<string, string>; | ||
| requirements: PaymentRequirements; | ||
| }; | ||
| type ProcessSettleFailureResponse = SettleResponse & { | ||
| success: false; | ||
| errorReason: string; | ||
| errorMessage?: string; | ||
| }; | ||
| type ProcessSettleResultResponse = ProcessSettleSuccessResponse | ProcessSettleFailureResponse; | ||
| /** | ||
| * Represents a validation error for a specific route's payment configuration. | ||
| */ | ||
| interface RouteValidationError { | ||
| /** The route pattern (e.g., "GET /api/weather") */ | ||
| routePattern: string; | ||
| /** The payment scheme that failed validation */ | ||
| scheme: string; | ||
| /** The network that failed validation */ | ||
| network: Network; | ||
| /** The type of validation failure */ | ||
| reason: "missing_scheme" | "missing_facilitator"; | ||
| /** Human-readable error message */ | ||
| message: string; | ||
| } | ||
| /** | ||
| * Error thrown when route configuration validation fails. | ||
| */ | ||
| declare class RouteConfigurationError extends Error { | ||
| /** The validation errors that caused this exception */ | ||
| readonly errors: RouteValidationError[]; | ||
| /** | ||
| * Creates a new RouteConfigurationError with the given validation errors. | ||
| * | ||
| * @param errors - The validation errors that caused this exception. | ||
| */ | ||
| constructor(errors: RouteValidationError[]); | ||
| } | ||
| /** | ||
| * HTTP-enhanced x402 resource server | ||
| * Provides framework-agnostic HTTP protocol handling | ||
| */ | ||
| declare class x402HTTPResourceServer { | ||
| private ResourceServer; | ||
| private compiledRoutes; | ||
| private routesConfig; | ||
| private paywallProvider?; | ||
| private protectedRequestHooks; | ||
| /** | ||
| * Creates a new x402HTTPResourceServer instance. | ||
| * | ||
| * @param ResourceServer - The core x402ResourceServer instance to use | ||
| * @param routes - Route configuration for payment-protected endpoints | ||
| */ | ||
| constructor(ResourceServer: x402ResourceServer, routes: RoutesConfig); | ||
| /** | ||
| * Get the underlying x402ResourceServer instance. | ||
| * | ||
| * @returns The underlying x402ResourceServer instance | ||
| */ | ||
| get server(): x402ResourceServer; | ||
| /** | ||
| * Get the routes configuration. | ||
| * | ||
| * @returns The routes configuration | ||
| */ | ||
| get routes(): RoutesConfig; | ||
| /** | ||
| * Initialize the HTTP resource server. | ||
| * | ||
| * This method initializes the underlying resource server (fetching facilitator support) | ||
| * and then validates that all route payment configurations have corresponding | ||
| * registered schemes and facilitator support. | ||
| * | ||
| * @throws RouteConfigurationError if any route's payment options don't have | ||
| * corresponding registered schemes or facilitator support | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const httpServer = new x402HTTPResourceServer(server, routes); | ||
| * await httpServer.initialize(); | ||
| * ``` | ||
| */ | ||
| initialize(): Promise<void>; | ||
| /** | ||
| * Register a custom paywall provider for generating HTML | ||
| * | ||
| * @param provider - PaywallProvider instance | ||
| * @returns This service instance for chaining | ||
| */ | ||
| registerPaywallProvider(provider: PaywallProvider): this; | ||
| /** | ||
| * Register a hook that runs on every request to a protected route, before payment processing. | ||
| * Hooks are executed in order of registration. The first hook to return a non-void result wins. | ||
| * | ||
| * @param hook - The request hook function | ||
| * @returns The x402HTTPResourceServer instance for chaining | ||
| */ | ||
| onProtectedRequest(hook: ProtectedRequestHook): this; | ||
| /** | ||
| * Process HTTP request and return response instructions | ||
| * This is the main entry point for framework middleware | ||
| * | ||
| * @param context - HTTP request context | ||
| * @param paywallConfig - Optional paywall configuration | ||
| * @returns Process result indicating next action for middleware | ||
| */ | ||
| processHTTPRequest(context: HTTPRequestContext, paywallConfig?: PaywallConfig): Promise<HTTPProcessResult>; | ||
| /** | ||
| * Process settlement after successful response | ||
| * | ||
| * @param paymentPayload - The verified payment payload | ||
| * @param requirements - The matching payment requirements | ||
| * @param declaredExtensions - Optional declared extensions (for per-key enrichment) | ||
| * @returns ProcessSettleResultResponse - SettleResponse with headers if success or errorReason if failure | ||
| */ | ||
| processSettlement(paymentPayload: PaymentPayload, requirements: PaymentRequirements, declaredExtensions?: Record<string, unknown>): Promise<ProcessSettleResultResponse>; | ||
| /** | ||
| * Check if a request requires payment based on route configuration | ||
| * | ||
| * @param context - HTTP request context | ||
| * @returns True if the route requires payment, false otherwise | ||
| */ | ||
| requiresPayment(context: HTTPRequestContext): boolean; | ||
| /** | ||
| * Normalizes a RouteConfig's accepts field into an array of PaymentOptions | ||
| * Handles both single PaymentOption and array formats | ||
| * | ||
| * @param routeConfig - Route configuration | ||
| * @returns Array of payment options | ||
| */ | ||
| private normalizePaymentOptions; | ||
| /** | ||
| * Validates that all payment options in routes have corresponding registered schemes | ||
| * and facilitator support. | ||
| * | ||
| * @returns Array of validation errors (empty if all routes are valid) | ||
| */ | ||
| private validateRouteConfiguration; | ||
| /** | ||
| * Get route configuration for a request | ||
| * | ||
| * @param path - Request path | ||
| * @param method - HTTP method | ||
| * @returns Route configuration or undefined if no match | ||
| */ | ||
| private getRouteConfig; | ||
| /** | ||
| * Extract payment from HTTP headers (handles v1 and v2) | ||
| * | ||
| * @param adapter - HTTP adapter | ||
| * @returns Decoded payment payload or null | ||
| */ | ||
| private extractPayment; | ||
| /** | ||
| * Check if request is from a web browser | ||
| * | ||
| * @param adapter - HTTP adapter | ||
| * @returns True if request appears to be from a browser | ||
| */ | ||
| private isWebBrowser; | ||
| /** | ||
| * Create HTTP response instructions from payment required | ||
| * | ||
| * @param paymentRequired - Payment requirements | ||
| * @param isWebBrowser - Whether request is from browser | ||
| * @param paywallConfig - Paywall configuration | ||
| * @param customHtml - Custom HTML template | ||
| * @param unpaidResponse - Optional custom response (content type and body) for unpaid API requests | ||
| * @returns Response instructions | ||
| */ | ||
| private createHTTPResponse; | ||
| /** | ||
| * Create HTTP payment required response (v1 puts in body, v2 puts in header) | ||
| * | ||
| * @param paymentRequired - Payment required object | ||
| * @returns Headers and body for the HTTP response | ||
| */ | ||
| private createHTTPPaymentRequiredResponse; | ||
| /** | ||
| * Create settlement response headers | ||
| * | ||
| * @param settleResponse - Settlement response | ||
| * @returns Headers to add to response | ||
| */ | ||
| private createSettlementHeaders; | ||
| /** | ||
| * Parse route pattern into verb and regex | ||
| * | ||
| * @param pattern - Route pattern like "GET /api/*" or "/api/[id]" | ||
| * @returns Parsed pattern with verb and regex | ||
| */ | ||
| private parseRoutePattern; | ||
| /** | ||
| * Normalize path for matching | ||
| * | ||
| * @param path - Raw path from request | ||
| * @returns Normalized path | ||
| */ | ||
| private normalizePath; | ||
| /** | ||
| * Generate paywall HTML for browser requests | ||
| * | ||
| * @param paymentRequired - Payment required response | ||
| * @param paywallConfig - Optional paywall configuration | ||
| * @param customHtml - Optional custom HTML template | ||
| * @returns HTML string | ||
| */ | ||
| private generatePaywallHTML; | ||
| /** | ||
| * Extract display amount from payment requirements. | ||
| * | ||
| * @param paymentRequired - The payment required object | ||
| * @returns The display amount in decimal format | ||
| */ | ||
| private getDisplayAmount; | ||
| } | ||
| export { type CompiledRoute as C, type DynamicPayTo as D, type HTTPAdapter as H, type PaymentOption as P, type RouteConfig as R, type UnpaidResponseBody as U, type DynamicPrice as a, type HTTPProcessResult as b, type HTTPRequestContext as c, type HTTPResponseInstructions as d, type PaywallConfig as e, type PaywallProvider as f, type ProcessSettleFailureResponse as g, type ProcessSettleResultResponse as h, type ProcessSettleSuccessResponse as i, type ProtectedRequestHook as j, RouteConfigurationError as k, type RouteValidationError as l, type RoutesConfig as m, type UnpaidResponseResult as n, x402HTTPResourceServer as x }; |
@@ -1,2 +0,2 @@ | ||
| import { c as PaymentRequired, a as PaymentRequirements, P as PaymentPayload, N as Network, d as SchemeNetworkClient, S as SettleResponse } from '../mechanisms-CzuGzYsS.js'; | ||
| import { c as PaymentRequired, a as PaymentRequirements, P as PaymentPayload, N as Network, e as SchemeNetworkClient, S as SettleResponse } from '../mechanisms-CP6q1k8-.js'; | ||
@@ -198,2 +198,15 @@ /** | ||
| /** | ||
| * Context provided to onPaymentRequired hooks. | ||
| */ | ||
| interface PaymentRequiredContext { | ||
| paymentRequired: PaymentRequired; | ||
| } | ||
| /** | ||
| * Hook called when a 402 response is received, before payment processing. | ||
| * Return headers to try before payment, or void to proceed directly to payment. | ||
| */ | ||
| type PaymentRequiredHook = (context: PaymentRequiredContext) => Promise<{ | ||
| headers: Record<string, string>; | ||
| } | void>; | ||
| /** | ||
| * HTTP-specific client for handling x402 payment protocol over HTTP. | ||
@@ -206,2 +219,3 @@ * | ||
| private readonly client; | ||
| private paymentRequiredHooks; | ||
| /** | ||
@@ -214,2 +228,17 @@ * Creates a new x402HTTPClient instance. | ||
| /** | ||
| * Register a hook to handle 402 responses before payment. | ||
| * Hooks run in order; first to return headers wins. | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns This instance for chaining | ||
| */ | ||
| onPaymentRequired(hook: PaymentRequiredHook): this; | ||
| /** | ||
| * Run hooks and return headers if any hook provides them. | ||
| * | ||
| * @param paymentRequired - The payment required response from the server | ||
| * @returns Headers to use for retry, or null to proceed to payment | ||
| */ | ||
| handlePaymentRequired(paymentRequired: PaymentRequired): Promise<Record<string, string> | null>; | ||
| /** | ||
| * Encodes a payment payload into appropriate HTTP headers based on version. | ||
@@ -246,2 +275,2 @@ * | ||
| export { type AfterPaymentCreationHook, type BeforePaymentCreationHook, type OnPaymentCreationFailureHook, type PaymentCreatedContext, type PaymentCreationContext, type PaymentCreationFailureContext, type PaymentPolicy, type SchemeRegistration, type SelectPaymentRequirements, x402Client, type x402ClientConfig, x402HTTPClient }; | ||
| export { type AfterPaymentCreationHook, type BeforePaymentCreationHook, type OnPaymentCreationFailureHook, type PaymentCreatedContext, type PaymentCreationContext, type PaymentCreationFailureContext, type PaymentPolicy, type PaymentRequiredContext, type PaymentRequiredHook, type SchemeRegistration, type SelectPaymentRequirements, x402Client, type x402ClientConfig, x402HTTPClient }; |
@@ -340,4 +340,31 @@ "use strict"; | ||
| this.client = client; | ||
| this.paymentRequiredHooks = []; | ||
| } | ||
| /** | ||
| * Register a hook to handle 402 responses before payment. | ||
| * Hooks run in order; first to return headers wins. | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns This instance for chaining | ||
| */ | ||
| onPaymentRequired(hook) { | ||
| this.paymentRequiredHooks.push(hook); | ||
| return this; | ||
| } | ||
| /** | ||
| * Run hooks and return headers if any hook provides them. | ||
| * | ||
| * @param paymentRequired - The payment required response from the server | ||
| * @returns Headers to use for retry, or null to proceed to payment | ||
| */ | ||
| async handlePaymentRequired(paymentRequired) { | ||
| for (const hook of this.paymentRequiredHooks) { | ||
| const result = await hook({ paymentRequired }); | ||
| if (result?.headers) { | ||
| return result.headers; | ||
| } | ||
| } | ||
| return null; | ||
| } | ||
| /** | ||
| * Encodes a payment payload into appropriate HTTP headers based on version. | ||
@@ -344,0 +371,0 @@ * |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../../../src/client/index.ts","../../../src/index.ts","../../../src/utils/index.ts","../../../src/client/x402Client.ts","../../../src/http/index.ts","../../../src/http/x402HTTPClient.ts"],"sourcesContent":["export * from \"./x402Client\";\nexport * from \"../http/x402HTTPClient\";","export const x402Version = 2;\n","import { Network } from \"../types\";\n\n/**\n * Scheme data structure for facilitator storage\n */\nexport interface SchemeData<T> {\n facilitator: T;\n networks: Set<Network>;\n pattern: Network;\n}\n\nexport const findSchemesByNetwork = <T>(\n map: Map<string, Map<string, T>>,\n network: Network,\n): Map<string, T> | undefined => {\n // Direct match first\n let implementationsByScheme = map.get(network);\n\n if (!implementationsByScheme) {\n // Try pattern matching for registered network patterns\n for (const [registeredNetworkPattern, implementations] of map.entries()) {\n // Convert the registered network pattern to a regex\n // e.g., \"eip155:*\" becomes /^eip155:.*$/\n const pattern = registeredNetworkPattern\n .replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\") // Escape special regex chars except *\n .replace(/\\\\\\*/g, \".*\"); // Replace escaped * with .*\n\n const regex = new RegExp(`^${pattern}$`);\n\n if (regex.test(network)) {\n implementationsByScheme = implementations;\n break;\n }\n }\n }\n\n return implementationsByScheme;\n};\n\nexport const findByNetworkAndScheme = <T>(\n map: Map<string, Map<string, T>>,\n scheme: string,\n network: Network,\n): T | undefined => {\n return findSchemesByNetwork(map, network)?.get(scheme);\n};\n\n/**\n * Finds a facilitator by scheme and network using pattern matching.\n * Works with new SchemeData storage structure.\n *\n * @param schemeMap - Map of scheme names to SchemeData\n * @param scheme - The scheme to find\n * @param network - The network to match against\n * @returns The facilitator if found, undefined otherwise\n */\nexport const findFacilitatorBySchemeAndNetwork = <T>(\n schemeMap: Map<string, SchemeData<T>>,\n scheme: string,\n network: Network,\n): T | undefined => {\n const schemeData = schemeMap.get(scheme);\n if (!schemeData) return undefined;\n\n // Check if network is in the stored networks set\n if (schemeData.networks.has(network)) {\n return schemeData.facilitator;\n }\n\n // Try pattern matching\n const patternRegex = new RegExp(\"^\" + schemeData.pattern.replace(\"*\", \".*\") + \"$\");\n if (patternRegex.test(network)) {\n return schemeData.facilitator;\n }\n\n return undefined;\n};\n\nexport const Base64EncodedRegex = /^[A-Za-z0-9+/]*={0,2}$/;\n\n/**\n * Encodes a string to base64 format\n *\n * @param data - The string to be encoded to base64\n * @returns The base64 encoded string\n */\nexport function safeBase64Encode(data: string): string {\n if (typeof globalThis !== \"undefined\" && typeof globalThis.btoa === \"function\") {\n const bytes = new TextEncoder().encode(data);\n const binaryString = Array.from(bytes, byte => String.fromCharCode(byte)).join(\"\");\n return globalThis.btoa(binaryString);\n }\n return Buffer.from(data, \"utf8\").toString(\"base64\");\n}\n\n/**\n * Decodes a base64 string back to its original format\n *\n * @param data - The base64 encoded string to be decoded\n * @returns The decoded string in UTF-8 format\n */\nexport function safeBase64Decode(data: string): string {\n if (typeof globalThis !== \"undefined\" && typeof globalThis.atob === \"function\") {\n const binaryString = globalThis.atob(data);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n const decoder = new TextDecoder(\"utf-8\");\n return decoder.decode(bytes);\n }\n return Buffer.from(data, \"base64\").toString(\"utf-8\");\n}\n\n/**\n * Deep equality comparison for payment requirements\n * Uses a normalized JSON.stringify for consistent comparison\n *\n * @param obj1 - First object to compare\n * @param obj2 - Second object to compare\n * @returns True if objects are deeply equal\n */\nexport function deepEqual(obj1: unknown, obj2: unknown): boolean {\n // Normalize and stringify both objects for comparison\n // This handles nested objects, arrays, and different property orders\n const normalize = (obj: unknown): string => {\n // Handle primitives and null/undefined\n if (obj === null || obj === undefined) return JSON.stringify(obj);\n if (typeof obj !== \"object\") return JSON.stringify(obj);\n\n // Handle arrays\n if (Array.isArray(obj)) {\n return JSON.stringify(\n obj.map(item =>\n typeof item === \"object\" && item !== null ? JSON.parse(normalize(item)) : item,\n ),\n );\n }\n\n // Handle objects - sort keys and recursively normalize values\n const sorted: Record<string, unknown> = {};\n Object.keys(obj as Record<string, unknown>)\n .sort()\n .forEach(key => {\n const value = (obj as Record<string, unknown>)[key];\n sorted[key] =\n typeof value === \"object\" && value !== null ? JSON.parse(normalize(value)) : value;\n });\n return JSON.stringify(sorted);\n };\n\n try {\n return normalize(obj1) === normalize(obj2);\n } catch {\n // Fallback to simple comparison if normalization fails\n return JSON.stringify(obj1) === JSON.stringify(obj2);\n }\n}\n","import { x402Version } from \"..\";\nimport { SchemeNetworkClient } from \"../types/mechanisms\";\nimport { PaymentPayload, PaymentRequirements } from \"../types/payments\";\nimport { Network, PaymentRequired } from \"../types\";\nimport { findByNetworkAndScheme, findSchemesByNetwork } from \"../utils\";\n\n/**\n * Client Hook Context Interfaces\n */\n\nexport interface PaymentCreationContext {\n paymentRequired: PaymentRequired;\n selectedRequirements: PaymentRequirements;\n}\n\nexport interface PaymentCreatedContext extends PaymentCreationContext {\n paymentPayload: PaymentPayload;\n}\n\nexport interface PaymentCreationFailureContext extends PaymentCreationContext {\n error: Error;\n}\n\n/**\n * Client Hook Type Definitions\n */\n\nexport type BeforePaymentCreationHook = (\n context: PaymentCreationContext,\n) => Promise<void | { abort: true; reason: string }>;\n\nexport type AfterPaymentCreationHook = (context: PaymentCreatedContext) => Promise<void>;\n\nexport type OnPaymentCreationFailureHook = (\n context: PaymentCreationFailureContext,\n) => Promise<void | { recovered: true; payload: PaymentPayload }>;\n\nexport type SelectPaymentRequirements = (x402Version: number, paymentRequirements: PaymentRequirements[]) => PaymentRequirements;\n\n/**\n * A policy function that filters or transforms payment requirements.\n * Policies are applied in order before the selector chooses the final option.\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - Array of payment requirements to filter/transform\n * @returns Filtered array of payment requirements\n */\nexport type PaymentPolicy = (x402Version: number, paymentRequirements: PaymentRequirements[]) => PaymentRequirements[];\n\n\n/**\n * Configuration for registering a payment scheme with a specific network\n */\nexport interface SchemeRegistration {\n /**\n * The network identifier (e.g., 'eip155:8453', 'solana:mainnet')\n */\n network: Network;\n\n /**\n * The scheme client implementation for this network\n */\n client: SchemeNetworkClient;\n\n /**\n * The x402 protocol version to use for this scheme\n *\n * @default 2\n */\n x402Version?: number;\n}\n\n/**\n * Configuration options for the fetch wrapper\n */\nexport interface x402ClientConfig {\n /**\n * Array of scheme registrations defining which payment methods are supported\n */\n schemes: SchemeRegistration[];\n\n /**\n * Policies to apply to the client\n */\n policies?: PaymentPolicy[];\n\n /**\n * Custom payment requirements selector function\n * If not provided, uses the default selector (first available option)\n */\n paymentRequirementsSelector?: SelectPaymentRequirements;\n}\n\n/**\n * Core client for managing x402 payment schemes and creating payment payloads.\n *\n * Handles registration of payment schemes, policy-based filtering of payment requirements,\n * and creation of payment payloads based on server requirements.\n */\nexport class x402Client {\n private readonly paymentRequirementsSelector: SelectPaymentRequirements;\n private readonly registeredClientSchemes: Map<number, Map<string, Map<string, SchemeNetworkClient>>> = new Map();\n private readonly policies: PaymentPolicy[] = [];\n\n private beforePaymentCreationHooks: BeforePaymentCreationHook[] = [];\n private afterPaymentCreationHooks: AfterPaymentCreationHook[] = [];\n private onPaymentCreationFailureHooks: OnPaymentCreationFailureHook[] = [];\n\n /**\n * Creates a new x402Client instance.\n *\n * @param paymentRequirementsSelector - Function to select payment requirements from available options\n */\n constructor(paymentRequirementsSelector?: SelectPaymentRequirements) {\n this.paymentRequirementsSelector = paymentRequirementsSelector || ((x402Version, accepts) => accepts[0]);\n }\n\n /**\n * Creates a new x402Client instance from a configuration object.\n *\n * @param config - The client configuration including schemes, policies, and payment requirements selector\n * @returns A configured x402Client instance\n */\n static fromConfig(config: x402ClientConfig): x402Client {\n const client = new x402Client(config.paymentRequirementsSelector);\n config.schemes.forEach(scheme => {\n if (scheme.x402Version === 1) {\n client.registerV1(scheme.network, scheme.client);\n } else {\n client.register(scheme.network, scheme.client);\n }\n });\n config.policies?.forEach(policy => {\n client.registerPolicy(policy);\n });\n return client;\n }\n\n /**\n * Registers a scheme client for the current x402 version.\n *\n * @param network - The network to register the client for\n * @param client - The scheme network client to register\n * @returns The x402Client instance for chaining\n */\n register(network: Network, client: SchemeNetworkClient): x402Client {\n return this._registerScheme(x402Version, network, client);\n }\n\n /**\n * Registers a scheme client for x402 version 1.\n *\n * @param network - The v1 network identifier (e.g., 'base-sepolia', 'solana-devnet')\n * @param client - The scheme network client to register\n * @returns The x402Client instance for chaining\n */\n registerV1(network: string, client: SchemeNetworkClient): x402Client {\n return this._registerScheme(1, network as Network, client);\n }\n\n /**\n * Registers a policy to filter or transform payment requirements.\n *\n * Policies are applied in order after filtering by registered schemes\n * and before the selector chooses the final payment requirement.\n *\n * @param policy - Function to filter/transform payment requirements\n * @returns The x402Client instance for chaining\n *\n * @example\n * ```typescript\n * // Prefer cheaper options\n * client.registerPolicy((version, reqs) =>\n * reqs.filter(r => BigInt(r.value) < BigInt('1000000'))\n * );\n *\n * // Prefer specific networks\n * client.registerPolicy((version, reqs) =>\n * reqs.filter(r => r.network.startsWith('eip155:'))\n * );\n * ```\n */\n registerPolicy(policy: PaymentPolicy): x402Client {\n this.policies.push(policy);\n return this;\n }\n\n /**\n * Register a hook to execute before payment payload creation.\n * Can abort creation by returning { abort: true, reason: string }\n *\n * @param hook - The hook function to register\n * @returns The x402Client instance for chaining\n */\n onBeforePaymentCreation(hook: BeforePaymentCreationHook): x402Client {\n this.beforePaymentCreationHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute after successful payment payload creation.\n *\n * @param hook - The hook function to register\n * @returns The x402Client instance for chaining\n */\n onAfterPaymentCreation(hook: AfterPaymentCreationHook): x402Client {\n this.afterPaymentCreationHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute when payment payload creation fails.\n * Can recover from failure by returning { recovered: true, payload: PaymentPayload }\n *\n * @param hook - The hook function to register\n * @returns The x402Client instance for chaining\n */\n onPaymentCreationFailure(hook: OnPaymentCreationFailureHook): x402Client {\n this.onPaymentCreationFailureHooks.push(hook);\n return this;\n }\n\n /**\n * Creates a payment payload based on a PaymentRequired response.\n *\n * Automatically extracts x402Version, resource, and extensions from the PaymentRequired\n * response and constructs a complete PaymentPayload with the accepted requirements.\n *\n * @param paymentRequired - The PaymentRequired response from the server\n * @returns Promise resolving to the complete payment payload\n */\n async createPaymentPayload(\n paymentRequired: PaymentRequired,\n ): Promise<PaymentPayload> {\n const clientSchemesByNetwork = this.registeredClientSchemes.get(paymentRequired.x402Version);\n if (!clientSchemesByNetwork) {\n throw new Error(`No client registered for x402 version: ${paymentRequired.x402Version}`);\n }\n\n const requirements = this.selectPaymentRequirements(paymentRequired.x402Version, paymentRequired.accepts);\n\n const context: PaymentCreationContext = {\n paymentRequired,\n selectedRequirements: requirements,\n };\n\n // Execute beforePaymentCreation hooks\n for (const hook of this.beforePaymentCreationHooks) {\n const result = await hook(context);\n if (result && \"abort\" in result && result.abort) {\n throw new Error(`Payment creation aborted: ${result.reason}`);\n }\n }\n\n try {\n const schemeNetworkClient = findByNetworkAndScheme(clientSchemesByNetwork, requirements.scheme, requirements.network);\n if (!schemeNetworkClient) {\n throw new Error(`No client registered for scheme: ${requirements.scheme} and network: ${requirements.network}`);\n }\n\n const partialPayload = await schemeNetworkClient.createPaymentPayload(paymentRequired.x402Version, requirements);\n\n let paymentPayload: PaymentPayload;\n if (partialPayload.x402Version == 1) {\n paymentPayload = partialPayload as PaymentPayload;\n } else {\n paymentPayload = {\n ...partialPayload,\n extensions: paymentRequired.extensions,\n resource: paymentRequired.resource,\n accepted: requirements,\n };\n }\n\n // Execute afterPaymentCreation hooks\n const createdContext: PaymentCreatedContext = {\n ...context,\n paymentPayload,\n };\n\n for (const hook of this.afterPaymentCreationHooks) {\n await hook(createdContext);\n }\n\n return paymentPayload;\n } catch (error) {\n const failureContext: PaymentCreationFailureContext = {\n ...context,\n error: error as Error,\n };\n\n // Execute onPaymentCreationFailure hooks\n for (const hook of this.onPaymentCreationFailureHooks) {\n const result = await hook(failureContext);\n if (result && \"recovered\" in result && result.recovered) {\n return result.payload;\n }\n }\n\n throw error;\n }\n }\n\n\n\n /**\n * Selects appropriate payment requirements based on registered clients and policies.\n *\n * Selection process:\n * 1. Filter by registered schemes (network + scheme support)\n * 2. Apply all registered policies in order\n * 3. Use selector to choose final requirement\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - Array of available payment requirements\n * @returns The selected payment requirements\n */\n private selectPaymentRequirements(x402Version: number, paymentRequirements: PaymentRequirements[]): PaymentRequirements {\n const clientSchemesByNetwork = this.registeredClientSchemes.get(x402Version);\n if (!clientSchemesByNetwork) {\n throw new Error(`No client registered for x402 version: ${x402Version}`);\n }\n\n // Step 1: Filter by registered schemes\n const supportedPaymentRequirements = paymentRequirements.filter(requirement => {\n let clientSchemes = findSchemesByNetwork(clientSchemesByNetwork, requirement.network);\n if (!clientSchemes) {\n return false;\n }\n\n return clientSchemes.has(requirement.scheme);\n })\n\n if (supportedPaymentRequirements.length === 0) {\n throw new Error(`No network/scheme registered for x402 version: ${x402Version} which comply with the payment requirements. ${JSON.stringify({\n x402Version,\n paymentRequirements,\n x402Versions: Array.from(this.registeredClientSchemes.keys()),\n networks: Array.from(clientSchemesByNetwork.keys()),\n schemes: Array.from(clientSchemesByNetwork.values()).map(schemes => Array.from(schemes.keys())).flat(),\n })}`);\n }\n\n // Step 2: Apply all policies in order\n let filteredRequirements = supportedPaymentRequirements;\n for (const policy of this.policies) {\n filteredRequirements = policy(x402Version, filteredRequirements);\n\n if (filteredRequirements.length === 0) {\n throw new Error(`All payment requirements were filtered out by policies for x402 version: ${x402Version}`);\n }\n }\n\n // Step 3: Use selector to choose final requirement\n return this.paymentRequirementsSelector(x402Version, filteredRequirements);\n }\n\n /**\n * Internal method to register a scheme client.\n *\n * @param x402Version - The x402 protocol version\n * @param network - The network to register the client for\n * @param client - The scheme network client to register\n * @returns The x402Client instance for chaining\n */\n private _registerScheme(x402Version: number, network: Network, client: SchemeNetworkClient): x402Client {\n if (!this.registeredClientSchemes.has(x402Version)) {\n this.registeredClientSchemes.set(x402Version, new Map());\n }\n const clientSchemesByNetwork = this.registeredClientSchemes.get(x402Version)!;\n if (!clientSchemesByNetwork.has(network)) {\n clientSchemesByNetwork.set(network, new Map());\n }\n\n const clientByScheme = clientSchemesByNetwork.get(network)!;\n if (!clientByScheme.has(client.scheme)) {\n clientByScheme.set(client.scheme, client);\n }\n\n return this;\n }\n}\n","import { SettleResponse } from \"../types\";\nimport { PaymentPayload, PaymentRequired } from \"../types/payments\";\nimport { Base64EncodedRegex, safeBase64Decode, safeBase64Encode } from \"../utils\";\n\n// HTTP Methods that typically use query parameters\nexport type QueryParamMethods = \"GET\" | \"HEAD\" | \"DELETE\";\n\n// HTTP Methods that typically use request body\nexport type BodyMethods = \"POST\" | \"PUT\" | \"PATCH\";\n\n/**\n * Encodes a payment payload as a base64 header value.\n *\n * @param paymentPayload - The payment payload to encode\n * @returns Base64 encoded string representation of the payment payload\n */\nexport function encodePaymentSignatureHeader(paymentPayload: PaymentPayload): string {\n return safeBase64Encode(JSON.stringify(paymentPayload));\n}\n\n/**\n * Decodes a base64 payment signature header into a payment payload.\n *\n * @param paymentSignatureHeader - The base64 encoded payment signature header\n * @returns The decoded payment payload\n */\nexport function decodePaymentSignatureHeader(paymentSignatureHeader: string): PaymentPayload {\n if (!Base64EncodedRegex.test(paymentSignatureHeader)) {\n throw new Error(\"Invalid payment signature header\");\n }\n return JSON.parse(safeBase64Decode(paymentSignatureHeader)) as PaymentPayload;\n}\n\n/**\n * Encodes a payment required object as a base64 header value.\n *\n * @param paymentRequired - The payment required object to encode\n * @returns Base64 encoded string representation of the payment required object\n */\nexport function encodePaymentRequiredHeader(paymentRequired: PaymentRequired): string {\n return safeBase64Encode(JSON.stringify(paymentRequired));\n}\n\n/**\n * Decodes a base64 payment required header into a payment required object.\n *\n * @param paymentRequiredHeader - The base64 encoded payment required header\n * @returns The decoded payment required object\n */\nexport function decodePaymentRequiredHeader(paymentRequiredHeader: string): PaymentRequired {\n if (!Base64EncodedRegex.test(paymentRequiredHeader)) {\n throw new Error(\"Invalid payment required header\");\n }\n return JSON.parse(safeBase64Decode(paymentRequiredHeader)) as PaymentRequired;\n}\n\n/**\n * Encodes a payment response as a base64 header value.\n *\n * @param paymentResponse - The payment response to encode\n * @returns Base64 encoded string representation of the payment response\n */\nexport function encodePaymentResponseHeader(paymentResponse: SettleResponse): string {\n return safeBase64Encode(JSON.stringify(paymentResponse));\n}\n\n/**\n * Decodes a base64 payment response header into a settle response.\n *\n * @param paymentResponseHeader - The base64 encoded payment response header\n * @returns The decoded settle response\n */\nexport function decodePaymentResponseHeader(paymentResponseHeader: string): SettleResponse {\n if (!Base64EncodedRegex.test(paymentResponseHeader)) {\n throw new Error(\"Invalid payment response header\");\n }\n return JSON.parse(safeBase64Decode(paymentResponseHeader)) as SettleResponse;\n}\n\n// Export HTTP service and types\nexport {\n x402HTTPResourceServer,\n HTTPAdapter,\n HTTPRequestContext,\n HTTPResponseInstructions,\n HTTPProcessResult,\n PaywallConfig,\n PaywallProvider,\n PaymentOption,\n RouteConfig,\n RoutesConfig,\n CompiledRoute,\n DynamicPayTo,\n DynamicPrice,\n UnpaidResponseBody,\n UnpaidResponseResult,\n ProcessSettleResultResponse,\n ProcessSettleSuccessResponse,\n ProcessSettleFailureResponse,\n RouteValidationError,\n RouteConfigurationError,\n} from \"./x402HTTPResourceServer\";\nexport {\n HTTPFacilitatorClient,\n FacilitatorClient,\n FacilitatorConfig,\n} from \"./httpFacilitatorClient\";\nexport { x402HTTPClient } from \"./x402HTTPClient\";\n","import {\n decodePaymentRequiredHeader,\n decodePaymentResponseHeader,\n encodePaymentSignatureHeader,\n} from \".\";\nimport { SettleResponse } from \"../types\";\nimport { PaymentPayload, PaymentRequired } from \"../types/payments\";\nimport { x402Client } from \"../client/x402Client\";\n\n/**\n * HTTP-specific client for handling x402 payment protocol over HTTP.\n *\n * Wraps a x402Client to provide HTTP-specific encoding/decoding functionality\n * for payment headers and responses while maintaining the builder pattern.\n */\nexport class x402HTTPClient {\n /**\n * Creates a new x402HTTPClient instance.\n *\n * @param client - The underlying x402Client for payment logic\n */\n constructor(private readonly client: x402Client) {}\n\n /**\n * Encodes a payment payload into appropriate HTTP headers based on version.\n *\n * @param paymentPayload - The payment payload to encode\n * @returns HTTP headers containing the encoded payment signature\n */\n encodePaymentSignatureHeader(paymentPayload: PaymentPayload): Record<string, string> {\n switch (paymentPayload.x402Version) {\n case 2:\n return {\n \"PAYMENT-SIGNATURE\": encodePaymentSignatureHeader(paymentPayload),\n };\n case 1:\n return {\n \"X-PAYMENT\": encodePaymentSignatureHeader(paymentPayload),\n };\n default:\n throw new Error(\n `Unsupported x402 version: ${(paymentPayload as PaymentPayload).x402Version}`,\n );\n }\n }\n\n /**\n * Extracts payment required information from HTTP response.\n *\n * @param getHeader - Function to retrieve header value by name (case-insensitive)\n * @param body - Optional response body for v1 compatibility\n * @returns The payment required object\n */\n getPaymentRequiredResponse(\n getHeader: (name: string) => string | null | undefined,\n body?: unknown,\n ): PaymentRequired {\n // v2\n const paymentRequired = getHeader(\"PAYMENT-REQUIRED\");\n if (paymentRequired) {\n return decodePaymentRequiredHeader(paymentRequired);\n }\n\n // v1\n if (\n body &&\n body instanceof Object &&\n \"x402Version\" in body &&\n (body as PaymentRequired).x402Version === 1\n ) {\n return body as PaymentRequired;\n }\n\n throw new Error(\"Invalid payment required response\");\n }\n\n /**\n * Extracts payment settlement response from HTTP headers.\n *\n * @param getHeader - Function to retrieve header value by name (case-insensitive)\n * @returns The settlement response object\n */\n getPaymentSettleResponse(getHeader: (name: string) => string | null | undefined): SettleResponse {\n // v2\n const paymentResponse = getHeader(\"PAYMENT-RESPONSE\");\n if (paymentResponse) {\n return decodePaymentResponseHeader(paymentResponse);\n }\n\n // v1\n const xPaymentResponse = getHeader(\"X-PAYMENT-RESPONSE\");\n if (xPaymentResponse) {\n return decodePaymentResponseHeader(xPaymentResponse);\n }\n\n throw new Error(\"Payment response header not found\");\n }\n\n /**\n * Creates a payment payload for the given payment requirements.\n * Delegates to the underlying x402Client.\n *\n * @param paymentRequired - The payment required response from the server\n * @returns Promise resolving to the payment payload\n */\n async createPaymentPayload(paymentRequired: PaymentRequired): Promise<PaymentPayload> {\n return this.client.createPaymentPayload(paymentRequired);\n }\n}\n"],"mappings":"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","names":["x402Version"]} | ||
| {"version":3,"sources":["../../../src/client/index.ts","../../../src/index.ts","../../../src/utils/index.ts","../../../src/client/x402Client.ts","../../../src/http/index.ts","../../../src/http/x402HTTPClient.ts"],"sourcesContent":["export * from \"./x402Client\";\nexport * from \"../http/x402HTTPClient\";","export const x402Version = 2;\n","import { Network } from \"../types\";\n\n/**\n * Scheme data structure for facilitator storage\n */\nexport interface SchemeData<T> {\n facilitator: T;\n networks: Set<Network>;\n pattern: Network;\n}\n\nexport const findSchemesByNetwork = <T>(\n map: Map<string, Map<string, T>>,\n network: Network,\n): Map<string, T> | undefined => {\n // Direct match first\n let implementationsByScheme = map.get(network);\n\n if (!implementationsByScheme) {\n // Try pattern matching for registered network patterns\n for (const [registeredNetworkPattern, implementations] of map.entries()) {\n // Convert the registered network pattern to a regex\n // e.g., \"eip155:*\" becomes /^eip155:.*$/\n const pattern = registeredNetworkPattern\n .replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\") // Escape special regex chars except *\n .replace(/\\\\\\*/g, \".*\"); // Replace escaped * with .*\n\n const regex = new RegExp(`^${pattern}$`);\n\n if (regex.test(network)) {\n implementationsByScheme = implementations;\n break;\n }\n }\n }\n\n return implementationsByScheme;\n};\n\nexport const findByNetworkAndScheme = <T>(\n map: Map<string, Map<string, T>>,\n scheme: string,\n network: Network,\n): T | undefined => {\n return findSchemesByNetwork(map, network)?.get(scheme);\n};\n\n/**\n * Finds a facilitator by scheme and network using pattern matching.\n * Works with new SchemeData storage structure.\n *\n * @param schemeMap - Map of scheme names to SchemeData\n * @param scheme - The scheme to find\n * @param network - The network to match against\n * @returns The facilitator if found, undefined otherwise\n */\nexport const findFacilitatorBySchemeAndNetwork = <T>(\n schemeMap: Map<string, SchemeData<T>>,\n scheme: string,\n network: Network,\n): T | undefined => {\n const schemeData = schemeMap.get(scheme);\n if (!schemeData) return undefined;\n\n // Check if network is in the stored networks set\n if (schemeData.networks.has(network)) {\n return schemeData.facilitator;\n }\n\n // Try pattern matching\n const patternRegex = new RegExp(\"^\" + schemeData.pattern.replace(\"*\", \".*\") + \"$\");\n if (patternRegex.test(network)) {\n return schemeData.facilitator;\n }\n\n return undefined;\n};\n\nexport const Base64EncodedRegex = /^[A-Za-z0-9+/]*={0,2}$/;\n\n/**\n * Encodes a string to base64 format\n *\n * @param data - The string to be encoded to base64\n * @returns The base64 encoded string\n */\nexport function safeBase64Encode(data: string): string {\n if (typeof globalThis !== \"undefined\" && typeof globalThis.btoa === \"function\") {\n const bytes = new TextEncoder().encode(data);\n const binaryString = Array.from(bytes, byte => String.fromCharCode(byte)).join(\"\");\n return globalThis.btoa(binaryString);\n }\n return Buffer.from(data, \"utf8\").toString(\"base64\");\n}\n\n/**\n * Decodes a base64 string back to its original format\n *\n * @param data - The base64 encoded string to be decoded\n * @returns The decoded string in UTF-8 format\n */\nexport function safeBase64Decode(data: string): string {\n if (typeof globalThis !== \"undefined\" && typeof globalThis.atob === \"function\") {\n const binaryString = globalThis.atob(data);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n const decoder = new TextDecoder(\"utf-8\");\n return decoder.decode(bytes);\n }\n return Buffer.from(data, \"base64\").toString(\"utf-8\");\n}\n\n/**\n * Deep equality comparison for payment requirements\n * Uses a normalized JSON.stringify for consistent comparison\n *\n * @param obj1 - First object to compare\n * @param obj2 - Second object to compare\n * @returns True if objects are deeply equal\n */\nexport function deepEqual(obj1: unknown, obj2: unknown): boolean {\n // Normalize and stringify both objects for comparison\n // This handles nested objects, arrays, and different property orders\n const normalize = (obj: unknown): string => {\n // Handle primitives and null/undefined\n if (obj === null || obj === undefined) return JSON.stringify(obj);\n if (typeof obj !== \"object\") return JSON.stringify(obj);\n\n // Handle arrays\n if (Array.isArray(obj)) {\n return JSON.stringify(\n obj.map(item =>\n typeof item === \"object\" && item !== null ? JSON.parse(normalize(item)) : item,\n ),\n );\n }\n\n // Handle objects - sort keys and recursively normalize values\n const sorted: Record<string, unknown> = {};\n Object.keys(obj as Record<string, unknown>)\n .sort()\n .forEach(key => {\n const value = (obj as Record<string, unknown>)[key];\n sorted[key] =\n typeof value === \"object\" && value !== null ? JSON.parse(normalize(value)) : value;\n });\n return JSON.stringify(sorted);\n };\n\n try {\n return normalize(obj1) === normalize(obj2);\n } catch {\n // Fallback to simple comparison if normalization fails\n return JSON.stringify(obj1) === JSON.stringify(obj2);\n }\n}\n","import { x402Version } from \"..\";\nimport { SchemeNetworkClient } from \"../types/mechanisms\";\nimport { PaymentPayload, PaymentRequirements } from \"../types/payments\";\nimport { Network, PaymentRequired } from \"../types\";\nimport { findByNetworkAndScheme, findSchemesByNetwork } from \"../utils\";\n\n/**\n * Client Hook Context Interfaces\n */\n\nexport interface PaymentCreationContext {\n paymentRequired: PaymentRequired;\n selectedRequirements: PaymentRequirements;\n}\n\nexport interface PaymentCreatedContext extends PaymentCreationContext {\n paymentPayload: PaymentPayload;\n}\n\nexport interface PaymentCreationFailureContext extends PaymentCreationContext {\n error: Error;\n}\n\n/**\n * Client Hook Type Definitions\n */\n\nexport type BeforePaymentCreationHook = (\n context: PaymentCreationContext,\n) => Promise<void | { abort: true; reason: string }>;\n\nexport type AfterPaymentCreationHook = (context: PaymentCreatedContext) => Promise<void>;\n\nexport type OnPaymentCreationFailureHook = (\n context: PaymentCreationFailureContext,\n) => Promise<void | { recovered: true; payload: PaymentPayload }>;\n\nexport type SelectPaymentRequirements = (x402Version: number, paymentRequirements: PaymentRequirements[]) => PaymentRequirements;\n\n/**\n * A policy function that filters or transforms payment requirements.\n * Policies are applied in order before the selector chooses the final option.\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - Array of payment requirements to filter/transform\n * @returns Filtered array of payment requirements\n */\nexport type PaymentPolicy = (x402Version: number, paymentRequirements: PaymentRequirements[]) => PaymentRequirements[];\n\n\n/**\n * Configuration for registering a payment scheme with a specific network\n */\nexport interface SchemeRegistration {\n /**\n * The network identifier (e.g., 'eip155:8453', 'solana:mainnet')\n */\n network: Network;\n\n /**\n * The scheme client implementation for this network\n */\n client: SchemeNetworkClient;\n\n /**\n * The x402 protocol version to use for this scheme\n *\n * @default 2\n */\n x402Version?: number;\n}\n\n/**\n * Configuration options for the fetch wrapper\n */\nexport interface x402ClientConfig {\n /**\n * Array of scheme registrations defining which payment methods are supported\n */\n schemes: SchemeRegistration[];\n\n /**\n * Policies to apply to the client\n */\n policies?: PaymentPolicy[];\n\n /**\n * Custom payment requirements selector function\n * If not provided, uses the default selector (first available option)\n */\n paymentRequirementsSelector?: SelectPaymentRequirements;\n}\n\n/**\n * Core client for managing x402 payment schemes and creating payment payloads.\n *\n * Handles registration of payment schemes, policy-based filtering of payment requirements,\n * and creation of payment payloads based on server requirements.\n */\nexport class x402Client {\n private readonly paymentRequirementsSelector: SelectPaymentRequirements;\n private readonly registeredClientSchemes: Map<number, Map<string, Map<string, SchemeNetworkClient>>> = new Map();\n private readonly policies: PaymentPolicy[] = [];\n\n private beforePaymentCreationHooks: BeforePaymentCreationHook[] = [];\n private afterPaymentCreationHooks: AfterPaymentCreationHook[] = [];\n private onPaymentCreationFailureHooks: OnPaymentCreationFailureHook[] = [];\n\n /**\n * Creates a new x402Client instance.\n *\n * @param paymentRequirementsSelector - Function to select payment requirements from available options\n */\n constructor(paymentRequirementsSelector?: SelectPaymentRequirements) {\n this.paymentRequirementsSelector = paymentRequirementsSelector || ((x402Version, accepts) => accepts[0]);\n }\n\n /**\n * Creates a new x402Client instance from a configuration object.\n *\n * @param config - The client configuration including schemes, policies, and payment requirements selector\n * @returns A configured x402Client instance\n */\n static fromConfig(config: x402ClientConfig): x402Client {\n const client = new x402Client(config.paymentRequirementsSelector);\n config.schemes.forEach(scheme => {\n if (scheme.x402Version === 1) {\n client.registerV1(scheme.network, scheme.client);\n } else {\n client.register(scheme.network, scheme.client);\n }\n });\n config.policies?.forEach(policy => {\n client.registerPolicy(policy);\n });\n return client;\n }\n\n /**\n * Registers a scheme client for the current x402 version.\n *\n * @param network - The network to register the client for\n * @param client - The scheme network client to register\n * @returns The x402Client instance for chaining\n */\n register(network: Network, client: SchemeNetworkClient): x402Client {\n return this._registerScheme(x402Version, network, client);\n }\n\n /**\n * Registers a scheme client for x402 version 1.\n *\n * @param network - The v1 network identifier (e.g., 'base-sepolia', 'solana-devnet')\n * @param client - The scheme network client to register\n * @returns The x402Client instance for chaining\n */\n registerV1(network: string, client: SchemeNetworkClient): x402Client {\n return this._registerScheme(1, network as Network, client);\n }\n\n /**\n * Registers a policy to filter or transform payment requirements.\n *\n * Policies are applied in order after filtering by registered schemes\n * and before the selector chooses the final payment requirement.\n *\n * @param policy - Function to filter/transform payment requirements\n * @returns The x402Client instance for chaining\n *\n * @example\n * ```typescript\n * // Prefer cheaper options\n * client.registerPolicy((version, reqs) =>\n * reqs.filter(r => BigInt(r.value) < BigInt('1000000'))\n * );\n *\n * // Prefer specific networks\n * client.registerPolicy((version, reqs) =>\n * reqs.filter(r => r.network.startsWith('eip155:'))\n * );\n * ```\n */\n registerPolicy(policy: PaymentPolicy): x402Client {\n this.policies.push(policy);\n return this;\n }\n\n /**\n * Register a hook to execute before payment payload creation.\n * Can abort creation by returning { abort: true, reason: string }\n *\n * @param hook - The hook function to register\n * @returns The x402Client instance for chaining\n */\n onBeforePaymentCreation(hook: BeforePaymentCreationHook): x402Client {\n this.beforePaymentCreationHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute after successful payment payload creation.\n *\n * @param hook - The hook function to register\n * @returns The x402Client instance for chaining\n */\n onAfterPaymentCreation(hook: AfterPaymentCreationHook): x402Client {\n this.afterPaymentCreationHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute when payment payload creation fails.\n * Can recover from failure by returning { recovered: true, payload: PaymentPayload }\n *\n * @param hook - The hook function to register\n * @returns The x402Client instance for chaining\n */\n onPaymentCreationFailure(hook: OnPaymentCreationFailureHook): x402Client {\n this.onPaymentCreationFailureHooks.push(hook);\n return this;\n }\n\n /**\n * Creates a payment payload based on a PaymentRequired response.\n *\n * Automatically extracts x402Version, resource, and extensions from the PaymentRequired\n * response and constructs a complete PaymentPayload with the accepted requirements.\n *\n * @param paymentRequired - The PaymentRequired response from the server\n * @returns Promise resolving to the complete payment payload\n */\n async createPaymentPayload(\n paymentRequired: PaymentRequired,\n ): Promise<PaymentPayload> {\n const clientSchemesByNetwork = this.registeredClientSchemes.get(paymentRequired.x402Version);\n if (!clientSchemesByNetwork) {\n throw new Error(`No client registered for x402 version: ${paymentRequired.x402Version}`);\n }\n\n const requirements = this.selectPaymentRequirements(paymentRequired.x402Version, paymentRequired.accepts);\n\n const context: PaymentCreationContext = {\n paymentRequired,\n selectedRequirements: requirements,\n };\n\n // Execute beforePaymentCreation hooks\n for (const hook of this.beforePaymentCreationHooks) {\n const result = await hook(context);\n if (result && \"abort\" in result && result.abort) {\n throw new Error(`Payment creation aborted: ${result.reason}`);\n }\n }\n\n try {\n const schemeNetworkClient = findByNetworkAndScheme(clientSchemesByNetwork, requirements.scheme, requirements.network);\n if (!schemeNetworkClient) {\n throw new Error(`No client registered for scheme: ${requirements.scheme} and network: ${requirements.network}`);\n }\n\n const partialPayload = await schemeNetworkClient.createPaymentPayload(paymentRequired.x402Version, requirements);\n\n let paymentPayload: PaymentPayload;\n if (partialPayload.x402Version == 1) {\n paymentPayload = partialPayload as PaymentPayload;\n } else {\n paymentPayload = {\n ...partialPayload,\n extensions: paymentRequired.extensions,\n resource: paymentRequired.resource,\n accepted: requirements,\n };\n }\n\n // Execute afterPaymentCreation hooks\n const createdContext: PaymentCreatedContext = {\n ...context,\n paymentPayload,\n };\n\n for (const hook of this.afterPaymentCreationHooks) {\n await hook(createdContext);\n }\n\n return paymentPayload;\n } catch (error) {\n const failureContext: PaymentCreationFailureContext = {\n ...context,\n error: error as Error,\n };\n\n // Execute onPaymentCreationFailure hooks\n for (const hook of this.onPaymentCreationFailureHooks) {\n const result = await hook(failureContext);\n if (result && \"recovered\" in result && result.recovered) {\n return result.payload;\n }\n }\n\n throw error;\n }\n }\n\n\n\n /**\n * Selects appropriate payment requirements based on registered clients and policies.\n *\n * Selection process:\n * 1. Filter by registered schemes (network + scheme support)\n * 2. Apply all registered policies in order\n * 3. Use selector to choose final requirement\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - Array of available payment requirements\n * @returns The selected payment requirements\n */\n private selectPaymentRequirements(x402Version: number, paymentRequirements: PaymentRequirements[]): PaymentRequirements {\n const clientSchemesByNetwork = this.registeredClientSchemes.get(x402Version);\n if (!clientSchemesByNetwork) {\n throw new Error(`No client registered for x402 version: ${x402Version}`);\n }\n\n // Step 1: Filter by registered schemes\n const supportedPaymentRequirements = paymentRequirements.filter(requirement => {\n let clientSchemes = findSchemesByNetwork(clientSchemesByNetwork, requirement.network);\n if (!clientSchemes) {\n return false;\n }\n\n return clientSchemes.has(requirement.scheme);\n })\n\n if (supportedPaymentRequirements.length === 0) {\n throw new Error(`No network/scheme registered for x402 version: ${x402Version} which comply with the payment requirements. ${JSON.stringify({\n x402Version,\n paymentRequirements,\n x402Versions: Array.from(this.registeredClientSchemes.keys()),\n networks: Array.from(clientSchemesByNetwork.keys()),\n schemes: Array.from(clientSchemesByNetwork.values()).map(schemes => Array.from(schemes.keys())).flat(),\n })}`);\n }\n\n // Step 2: Apply all policies in order\n let filteredRequirements = supportedPaymentRequirements;\n for (const policy of this.policies) {\n filteredRequirements = policy(x402Version, filteredRequirements);\n\n if (filteredRequirements.length === 0) {\n throw new Error(`All payment requirements were filtered out by policies for x402 version: ${x402Version}`);\n }\n }\n\n // Step 3: Use selector to choose final requirement\n return this.paymentRequirementsSelector(x402Version, filteredRequirements);\n }\n\n /**\n * Internal method to register a scheme client.\n *\n * @param x402Version - The x402 protocol version\n * @param network - The network to register the client for\n * @param client - The scheme network client to register\n * @returns The x402Client instance for chaining\n */\n private _registerScheme(x402Version: number, network: Network, client: SchemeNetworkClient): x402Client {\n if (!this.registeredClientSchemes.has(x402Version)) {\n this.registeredClientSchemes.set(x402Version, new Map());\n }\n const clientSchemesByNetwork = this.registeredClientSchemes.get(x402Version)!;\n if (!clientSchemesByNetwork.has(network)) {\n clientSchemesByNetwork.set(network, new Map());\n }\n\n const clientByScheme = clientSchemesByNetwork.get(network)!;\n if (!clientByScheme.has(client.scheme)) {\n clientByScheme.set(client.scheme, client);\n }\n\n return this;\n }\n}\n","import { SettleResponse } from \"../types\";\nimport { PaymentPayload, PaymentRequired } from \"../types/payments\";\nimport { Base64EncodedRegex, safeBase64Decode, safeBase64Encode } from \"../utils\";\n\n// HTTP Methods that typically use query parameters\nexport type QueryParamMethods = \"GET\" | \"HEAD\" | \"DELETE\";\n\n// HTTP Methods that typically use request body\nexport type BodyMethods = \"POST\" | \"PUT\" | \"PATCH\";\n\n/**\n * Encodes a payment payload as a base64 header value.\n *\n * @param paymentPayload - The payment payload to encode\n * @returns Base64 encoded string representation of the payment payload\n */\nexport function encodePaymentSignatureHeader(paymentPayload: PaymentPayload): string {\n return safeBase64Encode(JSON.stringify(paymentPayload));\n}\n\n/**\n * Decodes a base64 payment signature header into a payment payload.\n *\n * @param paymentSignatureHeader - The base64 encoded payment signature header\n * @returns The decoded payment payload\n */\nexport function decodePaymentSignatureHeader(paymentSignatureHeader: string): PaymentPayload {\n if (!Base64EncodedRegex.test(paymentSignatureHeader)) {\n throw new Error(\"Invalid payment signature header\");\n }\n return JSON.parse(safeBase64Decode(paymentSignatureHeader)) as PaymentPayload;\n}\n\n/**\n * Encodes a payment required object as a base64 header value.\n *\n * @param paymentRequired - The payment required object to encode\n * @returns Base64 encoded string representation of the payment required object\n */\nexport function encodePaymentRequiredHeader(paymentRequired: PaymentRequired): string {\n return safeBase64Encode(JSON.stringify(paymentRequired));\n}\n\n/**\n * Decodes a base64 payment required header into a payment required object.\n *\n * @param paymentRequiredHeader - The base64 encoded payment required header\n * @returns The decoded payment required object\n */\nexport function decodePaymentRequiredHeader(paymentRequiredHeader: string): PaymentRequired {\n if (!Base64EncodedRegex.test(paymentRequiredHeader)) {\n throw new Error(\"Invalid payment required header\");\n }\n return JSON.parse(safeBase64Decode(paymentRequiredHeader)) as PaymentRequired;\n}\n\n/**\n * Encodes a payment response as a base64 header value.\n *\n * @param paymentResponse - The payment response to encode\n * @returns Base64 encoded string representation of the payment response\n */\nexport function encodePaymentResponseHeader(paymentResponse: SettleResponse): string {\n return safeBase64Encode(JSON.stringify(paymentResponse));\n}\n\n/**\n * Decodes a base64 payment response header into a settle response.\n *\n * @param paymentResponseHeader - The base64 encoded payment response header\n * @returns The decoded settle response\n */\nexport function decodePaymentResponseHeader(paymentResponseHeader: string): SettleResponse {\n if (!Base64EncodedRegex.test(paymentResponseHeader)) {\n throw new Error(\"Invalid payment response header\");\n }\n return JSON.parse(safeBase64Decode(paymentResponseHeader)) as SettleResponse;\n}\n\n// Export HTTP service and types\nexport {\n x402HTTPResourceServer,\n HTTPAdapter,\n HTTPRequestContext,\n HTTPResponseInstructions,\n HTTPProcessResult,\n PaywallConfig,\n PaywallProvider,\n PaymentOption,\n RouteConfig,\n RoutesConfig,\n CompiledRoute,\n DynamicPayTo,\n DynamicPrice,\n UnpaidResponseBody,\n UnpaidResponseResult,\n ProcessSettleResultResponse,\n ProcessSettleSuccessResponse,\n ProcessSettleFailureResponse,\n RouteValidationError,\n RouteConfigurationError,\n ProtectedRequestHook,\n} from \"./x402HTTPResourceServer\";\nexport {\n HTTPFacilitatorClient,\n FacilitatorClient,\n FacilitatorConfig,\n} from \"./httpFacilitatorClient\";\nexport { x402HTTPClient, PaymentRequiredContext, PaymentRequiredHook } from \"./x402HTTPClient\";\n","import {\n decodePaymentRequiredHeader,\n decodePaymentResponseHeader,\n encodePaymentSignatureHeader,\n} from \".\";\nimport { SettleResponse } from \"../types\";\nimport { PaymentPayload, PaymentRequired } from \"../types/payments\";\nimport { x402Client } from \"../client/x402Client\";\n\n/**\n * Context provided to onPaymentRequired hooks.\n */\nexport interface PaymentRequiredContext {\n paymentRequired: PaymentRequired;\n}\n\n/**\n * Hook called when a 402 response is received, before payment processing.\n * Return headers to try before payment, or void to proceed directly to payment.\n */\nexport type PaymentRequiredHook = (\n context: PaymentRequiredContext,\n) => Promise<{ headers: Record<string, string> } | void>;\n\n/**\n * HTTP-specific client for handling x402 payment protocol over HTTP.\n *\n * Wraps a x402Client to provide HTTP-specific encoding/decoding functionality\n * for payment headers and responses while maintaining the builder pattern.\n */\nexport class x402HTTPClient {\n private paymentRequiredHooks: PaymentRequiredHook[] = [];\n\n /**\n * Creates a new x402HTTPClient instance.\n *\n * @param client - The underlying x402Client for payment logic\n */\n constructor(private readonly client: x402Client) {}\n\n /**\n * Register a hook to handle 402 responses before payment.\n * Hooks run in order; first to return headers wins.\n *\n * @param hook - The hook function to register\n * @returns This instance for chaining\n */\n onPaymentRequired(hook: PaymentRequiredHook): this {\n this.paymentRequiredHooks.push(hook);\n return this;\n }\n\n /**\n * Run hooks and return headers if any hook provides them.\n *\n * @param paymentRequired - The payment required response from the server\n * @returns Headers to use for retry, or null to proceed to payment\n */\n async handlePaymentRequired(\n paymentRequired: PaymentRequired,\n ): Promise<Record<string, string> | null> {\n for (const hook of this.paymentRequiredHooks) {\n const result = await hook({ paymentRequired });\n if (result?.headers) {\n return result.headers;\n }\n }\n return null;\n }\n\n /**\n * Encodes a payment payload into appropriate HTTP headers based on version.\n *\n * @param paymentPayload - The payment payload to encode\n * @returns HTTP headers containing the encoded payment signature\n */\n encodePaymentSignatureHeader(paymentPayload: PaymentPayload): Record<string, string> {\n switch (paymentPayload.x402Version) {\n case 2:\n return {\n \"PAYMENT-SIGNATURE\": encodePaymentSignatureHeader(paymentPayload),\n };\n case 1:\n return {\n \"X-PAYMENT\": encodePaymentSignatureHeader(paymentPayload),\n };\n default:\n throw new Error(\n `Unsupported x402 version: ${(paymentPayload as PaymentPayload).x402Version}`,\n );\n }\n }\n\n /**\n * Extracts payment required information from HTTP response.\n *\n * @param getHeader - Function to retrieve header value by name (case-insensitive)\n * @param body - Optional response body for v1 compatibility\n * @returns The payment required object\n */\n getPaymentRequiredResponse(\n getHeader: (name: string) => string | null | undefined,\n body?: unknown,\n ): PaymentRequired {\n // v2\n const paymentRequired = getHeader(\"PAYMENT-REQUIRED\");\n if (paymentRequired) {\n return decodePaymentRequiredHeader(paymentRequired);\n }\n\n // v1\n if (\n body &&\n body instanceof Object &&\n \"x402Version\" in body &&\n (body as PaymentRequired).x402Version === 1\n ) {\n return body as PaymentRequired;\n }\n\n throw new Error(\"Invalid payment required response\");\n }\n\n /**\n * Extracts payment settlement response from HTTP headers.\n *\n * @param getHeader - Function to retrieve header value by name (case-insensitive)\n * @returns The settlement response object\n */\n getPaymentSettleResponse(getHeader: (name: string) => string | null | undefined): SettleResponse {\n // v2\n const paymentResponse = getHeader(\"PAYMENT-RESPONSE\");\n if (paymentResponse) {\n return decodePaymentResponseHeader(paymentResponse);\n }\n\n // v1\n const xPaymentResponse = getHeader(\"X-PAYMENT-RESPONSE\");\n if (xPaymentResponse) {\n return decodePaymentResponseHeader(xPaymentResponse);\n }\n\n throw new Error(\"Payment response header not found\");\n }\n\n /**\n * Creates a payment payload for the given payment requirements.\n * Delegates to the underlying x402Client.\n *\n * @param paymentRequired - The payment required response from the server\n * @returns Promise resolving to the payment payload\n */\n async createPaymentPayload(paymentRequired: PaymentRequired): Promise<PaymentPayload> {\n return this.client.createPaymentPayload(paymentRequired);\n }\n}\n"],"mappings":"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","names":["x402Version"]} |
@@ -1,2 +0,2 @@ | ||
| import { P as PaymentPayload, a as PaymentRequirements, V as VerifyResponse, S as SettleResponse, N as Network, b as SchemeNetworkFacilitator } from '../mechanisms-CzuGzYsS.js'; | ||
| import { P as PaymentPayload, a as PaymentRequirements, S as SettleResponse, V as VerifyResponse, N as Network, b as SchemeNetworkFacilitator } from '../mechanisms-CP6q1k8-.js'; | ||
@@ -3,0 +3,0 @@ /** |
@@ -1,4 +0,5 @@ | ||
| import { P as PaymentPayload, c as PaymentRequired, S as SettleResponse } from '../mechanisms-CzuGzYsS.js'; | ||
| export { C as CompiledRoute, D as DynamicPayTo, g as DynamicPrice, F as FacilitatorClient, o as FacilitatorConfig, H as HTTPAdapter, n as HTTPFacilitatorClient, c as HTTPProcessResult, a as HTTPRequestContext, b as HTTPResponseInstructions, e as PaymentOption, P as PaywallConfig, d as PaywallProvider, k as ProcessSettleFailureResponse, i as ProcessSettleResultResponse, j as ProcessSettleSuccessResponse, R as RouteConfig, m as RouteConfigurationError, l as RouteValidationError, f as RoutesConfig, U as UnpaidResponseBody, h as UnpaidResponseResult, x as x402HTTPResourceServer } from '../x402HTTPResourceServer-DM4H2xTR.js'; | ||
| export { x402HTTPClient } from '../client/index.js'; | ||
| import { c as PaymentRequired, S as SettleResponse, P as PaymentPayload } from '../mechanisms-CP6q1k8-.js'; | ||
| export { F as FacilitatorClient, d as FacilitatorConfig, H as HTTPFacilitatorClient } from '../mechanisms-CP6q1k8-.js'; | ||
| export { C as CompiledRoute, D as DynamicPayTo, a as DynamicPrice, H as HTTPAdapter, b as HTTPProcessResult, c as HTTPRequestContext, d as HTTPResponseInstructions, P as PaymentOption, e as PaywallConfig, f as PaywallProvider, g as ProcessSettleFailureResponse, h as ProcessSettleResultResponse, i as ProcessSettleSuccessResponse, j as ProtectedRequestHook, R as RouteConfig, k as RouteConfigurationError, l as RouteValidationError, m as RoutesConfig, U as UnpaidResponseBody, n as UnpaidResponseResult, x as x402HTTPResourceServer } from '../x402HTTPResourceServer-DrJ5idoz.js'; | ||
| export { PaymentRequiredContext, PaymentRequiredHook, x402HTTPClient } from '../client/index.js'; | ||
@@ -5,0 +6,0 @@ type QueryParamMethods = "GET" | "HEAD" | "DELETE"; |
+105
-17
@@ -68,6 +68,9 @@ "use strict"; | ||
| constructor(statusCode, response) { | ||
| super(`verification failed: ${response.invalidReason || "unknown reason"}`); | ||
| const reason = response.invalidReason || "unknown reason"; | ||
| const message = response.invalidMessage; | ||
| super(message ? `${reason}: ${message}` : reason); | ||
| this.name = "VerifyError"; | ||
| this.statusCode = statusCode; | ||
| this.invalidReason = response.invalidReason; | ||
| this.invalidMessage = response.invalidMessage; | ||
| this.payer = response.payer; | ||
@@ -84,6 +87,9 @@ } | ||
| constructor(statusCode, response) { | ||
| super(`settlement failed: ${response.errorReason || "unknown reason"}`); | ||
| const reason = response.errorReason || "unknown reason"; | ||
| const message = response.errorMessage; | ||
| super(message ? `${reason}: ${message}` : reason); | ||
| this.name = "SettleError"; | ||
| this.statusCode = statusCode; | ||
| this.errorReason = response.errorReason; | ||
| this.errorMessage = response.errorMessage; | ||
| this.payer = response.payer; | ||
@@ -122,2 +128,3 @@ this.transaction = response.transaction; | ||
| this.compiledRoutes = []; | ||
| this.protectedRequestHooks = []; | ||
| this.ResourceServer = ResourceServer; | ||
@@ -136,2 +143,18 @@ this.routesConfig = routes; | ||
| /** | ||
| * Get the underlying x402ResourceServer instance. | ||
| * | ||
| * @returns The underlying x402ResourceServer instance | ||
| */ | ||
| get server() { | ||
| return this.ResourceServer; | ||
| } | ||
| /** | ||
| * Get the routes configuration. | ||
| * | ||
| * @returns The routes configuration | ||
| */ | ||
| get routes() { | ||
| return this.routesConfig; | ||
| } | ||
| /** | ||
| * Initialize the HTTP resource server. | ||
@@ -170,2 +193,13 @@ * | ||
| /** | ||
| * Register a hook that runs on every request to a protected route, before payment processing. | ||
| * Hooks are executed in order of registration. The first hook to return a non-void result wins. | ||
| * | ||
| * @param hook - The request hook function | ||
| * @returns The x402HTTPResourceServer instance for chaining | ||
| */ | ||
| onProtectedRequest(hook) { | ||
| this.protectedRequestHooks.push(hook); | ||
| return this; | ||
| } | ||
| /** | ||
| * Process HTTP request and return response instructions | ||
@@ -184,2 +218,18 @@ * This is the main entry point for framework middleware | ||
| } | ||
| for (const hook of this.protectedRequestHooks) { | ||
| const result = await hook(context, routeConfig); | ||
| if (result && "grantAccess" in result) { | ||
| return { type: "no-payment-required" }; | ||
| } | ||
| if (result && "abort" in result) { | ||
| return { | ||
| type: "payment-error", | ||
| response: { | ||
| status: 403, | ||
| headers: { "Content-Type": "application/json" }, | ||
| body: { error: result.reason } | ||
| } | ||
| }; | ||
| } | ||
| } | ||
| const paymentOptions = this.normalizePaymentOptions(routeConfig); | ||
@@ -192,3 +242,3 @@ const paymentPayload = this.extractPayment(adapter); | ||
| }; | ||
| const requirements = await this.ResourceServer.buildPaymentRequirementsFromOptions( | ||
| let requirements = await this.ResourceServer.buildPaymentRequirementsFromOptions( | ||
| paymentOptions, | ||
@@ -201,3 +251,3 @@ context | ||
| } | ||
| const paymentRequired = this.ResourceServer.createPaymentRequiredResponse( | ||
| const paymentRequired = await this.ResourceServer.createPaymentRequiredResponse( | ||
| requirements, | ||
@@ -227,3 +277,3 @@ resourceInfo, | ||
| if (!matchingRequirements) { | ||
| const errorResponse = this.ResourceServer.createPaymentRequiredResponse( | ||
| const errorResponse = await this.ResourceServer.createPaymentRequiredResponse( | ||
| requirements, | ||
@@ -244,3 +294,3 @@ resourceInfo, | ||
| if (!verifyResult.isValid) { | ||
| const errorResponse = this.ResourceServer.createPaymentRequiredResponse( | ||
| const errorResponse = await this.ResourceServer.createPaymentRequiredResponse( | ||
| requirements, | ||
@@ -259,6 +309,7 @@ resourceInfo, | ||
| paymentPayload, | ||
| paymentRequirements: matchingRequirements | ||
| paymentRequirements: matchingRequirements, | ||
| declaredExtensions: routeConfig.extensions | ||
| }; | ||
| } catch (error) { | ||
| const errorResponse = this.ResourceServer.createPaymentRequiredResponse( | ||
| const errorResponse = await this.ResourceServer.createPaymentRequiredResponse( | ||
| requirements, | ||
@@ -280,7 +331,12 @@ resourceInfo, | ||
| * @param requirements - The matching payment requirements | ||
| * @param declaredExtensions - Optional declared extensions (for per-key enrichment) | ||
| * @returns ProcessSettleResultResponse - SettleResponse with headers if success or errorReason if failure | ||
| */ | ||
| async processSettlement(paymentPayload, requirements) { | ||
| async processSettlement(paymentPayload, requirements, declaredExtensions) { | ||
| try { | ||
| const settleResponse = await this.ResourceServer.settlePayment(paymentPayload, requirements); | ||
| const settleResponse = await this.ResourceServer.settlePayment( | ||
| paymentPayload, | ||
| requirements, | ||
| declaredExtensions | ||
| ); | ||
| if (!settleResponse.success) { | ||
@@ -290,3 +346,4 @@ return { | ||
| success: false, | ||
| errorReason: settleResponse.errorReason || "Settlement failed" | ||
| errorReason: settleResponse.errorReason || "Settlement failed", | ||
| errorMessage: settleResponse.errorMessage || settleResponse.errorReason || "Settlement failed" | ||
| }; | ||
@@ -305,2 +362,3 @@ } | ||
| errorReason: error.errorReason || error.message, | ||
| errorMessage: error.errorMessage || error.errorReason || error.message, | ||
| payer: error.payer, | ||
@@ -314,2 +372,3 @@ network: error.network, | ||
| errorReason: error instanceof Error ? error.message : "Settlement failed", | ||
| errorMessage: error instanceof Error ? error.message : "Settlement failed", | ||
| network: requirements.network, | ||
@@ -434,6 +493,7 @@ transaction: "" | ||
| createHTTPResponse(paymentRequired, isWebBrowser, paywallConfig, customHtml, unpaidResponse) { | ||
| const status = paymentRequired.error === "permit2_allowance_required" ? 412 : 402; | ||
| if (isWebBrowser) { | ||
| const html = this.generatePaywallHTML(paymentRequired, paywallConfig, customHtml); | ||
| return { | ||
| status: 402, | ||
| status, | ||
| headers: { "Content-Type": "text/html" }, | ||
@@ -448,3 +508,3 @@ body: html, | ||
| return { | ||
| status: 402, | ||
| status, | ||
| headers: { | ||
@@ -501,9 +561,10 @@ "Content-Type": contentType, | ||
| normalizePath(path) { | ||
| const pathWithoutQuery = path.split(/[?#]/)[0]; | ||
| let decodedOrRawPath; | ||
| try { | ||
| const pathWithoutQuery = path.split(/[?#]/)[0]; | ||
| const decodedPath = decodeURIComponent(pathWithoutQuery); | ||
| return decodedPath.replace(/\\/g, "/").replace(/\/+/g, "/").replace(/(.+?)\/+$/, "$1"); | ||
| decodedOrRawPath = decodeURIComponent(pathWithoutQuery); | ||
| } catch { | ||
| return path; | ||
| decodedOrRawPath = pathWithoutQuery; | ||
| } | ||
| return decodedOrRawPath.replace(/\\/g, "/").replace(/\/+/g, "/").replace(/(.+?)\/+$/, "$1"); | ||
| } | ||
@@ -731,4 +792,31 @@ /** | ||
| this.client = client; | ||
| this.paymentRequiredHooks = []; | ||
| } | ||
| /** | ||
| * Register a hook to handle 402 responses before payment. | ||
| * Hooks run in order; first to return headers wins. | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns This instance for chaining | ||
| */ | ||
| onPaymentRequired(hook) { | ||
| this.paymentRequiredHooks.push(hook); | ||
| return this; | ||
| } | ||
| /** | ||
| * Run hooks and return headers if any hook provides them. | ||
| * | ||
| * @param paymentRequired - The payment required response from the server | ||
| * @returns Headers to use for retry, or null to proceed to payment | ||
| */ | ||
| async handlePaymentRequired(paymentRequired) { | ||
| for (const hook of this.paymentRequiredHooks) { | ||
| const result = await hook({ paymentRequired }); | ||
| if (result?.headers) { | ||
| return result.headers; | ||
| } | ||
| } | ||
| return null; | ||
| } | ||
| /** | ||
| * Encodes a payment payload into appropriate HTTP headers based on version. | ||
@@ -735,0 +823,0 @@ * |
@@ -1,2 +0,2 @@ | ||
| export { C as CompiledRoute, F as FacilitatorClient, o as FacilitatorConfig, H as HTTPAdapter, n as HTTPFacilitatorClient, c as HTTPProcessResult, a as HTTPRequestContext, b as HTTPResponseInstructions, P as PaywallConfig, d as PaywallProvider, k as ProcessSettleFailureResponse, i as ProcessSettleResultResponse, j as ProcessSettleSuccessResponse, q as ResourceConfig, r as ResourceInfo, R as RouteConfig, m as RouteConfigurationError, l as RouteValidationError, f as RoutesConfig, U as UnpaidResponseBody, h as UnpaidResponseResult, x as x402HTTPResourceServer, p as x402ResourceServer } from '../x402HTTPResourceServer-DM4H2xTR.js'; | ||
| import '../mechanisms-CzuGzYsS.js'; | ||
| export { F as FacilitatorClient, d as FacilitatorConfig, H as HTTPFacilitatorClient, R as ResourceConfig, f as ResourceInfo, g as SettleResultContext, x as x402ResourceServer } from '../mechanisms-CP6q1k8-.js'; | ||
| export { C as CompiledRoute, H as HTTPAdapter, b as HTTPProcessResult, c as HTTPRequestContext, d as HTTPResponseInstructions, e as PaywallConfig, f as PaywallProvider, g as ProcessSettleFailureResponse, h as ProcessSettleResultResponse, i as ProcessSettleSuccessResponse, R as RouteConfig, k as RouteConfigurationError, l as RouteValidationError, m as RoutesConfig, U as UnpaidResponseBody, n as UnpaidResponseResult, x as x402HTTPResourceServer } from '../x402HTTPResourceServer-DrJ5idoz.js'; |
+221
-64
@@ -30,2 +30,42 @@ "use strict"; | ||
| // src/types/facilitator.ts | ||
| var VerifyError = class extends Error { | ||
| /** | ||
| * Creates a VerifyError from a failed verification response. | ||
| * | ||
| * @param statusCode - HTTP status code from the facilitator | ||
| * @param response - The verify response containing error details | ||
| */ | ||
| constructor(statusCode, response) { | ||
| const reason = response.invalidReason || "unknown reason"; | ||
| const message = response.invalidMessage; | ||
| super(message ? `${reason}: ${message}` : reason); | ||
| this.name = "VerifyError"; | ||
| this.statusCode = statusCode; | ||
| this.invalidReason = response.invalidReason; | ||
| this.invalidMessage = response.invalidMessage; | ||
| this.payer = response.payer; | ||
| } | ||
| }; | ||
| var SettleError = class extends Error { | ||
| /** | ||
| * Creates a SettleError from a failed settlement response. | ||
| * | ||
| * @param statusCode - HTTP status code from the facilitator | ||
| * @param response - The settle response containing error details | ||
| */ | ||
| constructor(statusCode, response) { | ||
| const reason = response.errorReason || "unknown reason"; | ||
| const message = response.errorMessage; | ||
| super(message ? `${reason}: ${message}` : reason); | ||
| this.name = "SettleError"; | ||
| this.statusCode = statusCode; | ||
| this.errorReason = response.errorReason; | ||
| this.errorMessage = response.errorMessage; | ||
| this.payer = response.payer; | ||
| this.transaction = response.transaction; | ||
| this.network = response.network; | ||
| } | ||
| }; | ||
| // src/utils/index.ts | ||
@@ -95,36 +135,2 @@ var findSchemesByNetwork = (map, network) => { | ||
| // src/types/facilitator.ts | ||
| var VerifyError = class extends Error { | ||
| /** | ||
| * Creates a VerifyError from a failed verification response. | ||
| * | ||
| * @param statusCode - HTTP status code from the facilitator | ||
| * @param response - The verify response containing error details | ||
| */ | ||
| constructor(statusCode, response) { | ||
| super(`verification failed: ${response.invalidReason || "unknown reason"}`); | ||
| this.name = "VerifyError"; | ||
| this.statusCode = statusCode; | ||
| this.invalidReason = response.invalidReason; | ||
| this.payer = response.payer; | ||
| } | ||
| }; | ||
| var SettleError = class extends Error { | ||
| /** | ||
| * Creates a SettleError from a failed settlement response. | ||
| * | ||
| * @param statusCode - HTTP status code from the facilitator | ||
| * @param response - The settle response containing error details | ||
| */ | ||
| constructor(statusCode, response) { | ||
| super(`settlement failed: ${response.errorReason || "unknown reason"}`); | ||
| this.name = "SettleError"; | ||
| this.statusCode = statusCode; | ||
| this.errorReason = response.errorReason; | ||
| this.payer = response.payer; | ||
| this.transaction = response.transaction; | ||
| this.network = response.network; | ||
| } | ||
| }; | ||
| // src/http/httpFacilitatorClient.ts | ||
@@ -331,2 +337,19 @@ var DEFAULT_FACILITATOR_URL = "https://x402.org/facilitator"; | ||
| /** | ||
| * Check if an extension is registered. | ||
| * | ||
| * @param key - The extension key | ||
| * @returns True if the extension is registered | ||
| */ | ||
| hasExtension(key) { | ||
| return this.registeredExtensions.has(key); | ||
| } | ||
| /** | ||
| * Get all registered extensions. | ||
| * | ||
| * @returns Array of registered extensions | ||
| */ | ||
| getExtensions() { | ||
| return Array.from(this.registeredExtensions.values()); | ||
| } | ||
| /** | ||
| * Enriches declared extensions using registered extension hooks. | ||
@@ -532,3 +555,5 @@ * | ||
| extra: { | ||
| ...parsedPrice.extra | ||
| ...parsedPrice.extra, | ||
| ...resourceConfig.extra | ||
| // Merge user-provided extra | ||
| } | ||
@@ -578,7 +603,7 @@ }; | ||
| * @param error - Error message | ||
| * @param extensions - Optional extensions | ||
| * @param extensions - Optional declared extensions (for per-key enrichment) | ||
| * @returns Payment required response object | ||
| */ | ||
| createPaymentRequiredResponse(requirements, resourceInfo, error, extensions) { | ||
| const response = { | ||
| async createPaymentRequiredResponse(requirements, resourceInfo, error, extensions) { | ||
| let response = { | ||
| x402Version: 2, | ||
@@ -592,2 +617,32 @@ error, | ||
| } | ||
| if (extensions) { | ||
| for (const [key, declaration] of Object.entries(extensions)) { | ||
| const extension = this.registeredExtensions.get(key); | ||
| if (extension?.enrichPaymentRequiredResponse) { | ||
| try { | ||
| const context = { | ||
| requirements, | ||
| resourceInfo, | ||
| error, | ||
| paymentRequiredResponse: response | ||
| }; | ||
| const extensionData = await extension.enrichPaymentRequiredResponse( | ||
| declaration, | ||
| context | ||
| ); | ||
| if (extensionData !== void 0) { | ||
| if (!response.extensions) { | ||
| response.extensions = {}; | ||
| } | ||
| response.extensions[key] = extensionData; | ||
| } | ||
| } catch (error2) { | ||
| console.error( | ||
| `Error in enrichPaymentRequiredResponse hook for extension ${key}:`, | ||
| error2 | ||
| ); | ||
| } | ||
| } | ||
| } | ||
| } | ||
| return response; | ||
@@ -608,8 +663,17 @@ } | ||
| for (const hook of this.beforeVerifyHooks) { | ||
| const result = await hook(context); | ||
| if (result && "abort" in result && result.abort) { | ||
| return { | ||
| try { | ||
| const result = await hook(context); | ||
| if (result && "abort" in result && result.abort) { | ||
| return { | ||
| isValid: false, | ||
| invalidReason: result.reason, | ||
| invalidMessage: result.message | ||
| }; | ||
| } | ||
| } catch (error) { | ||
| throw new VerifyError(400, { | ||
| isValid: false, | ||
| invalidReason: result.reason | ||
| }; | ||
| invalidReason: "before_verify_hook_error", | ||
| invalidMessage: error instanceof Error ? error.message : "" | ||
| }); | ||
| } | ||
@@ -669,5 +733,6 @@ } | ||
| * @param requirements - The payment requirements | ||
| * @param declaredExtensions - Optional declared extensions (for per-key enrichment) | ||
| * @returns Settlement response | ||
| */ | ||
| async settlePayment(paymentPayload, requirements) { | ||
| async settlePayment(paymentPayload, requirements, declaredExtensions) { | ||
| const context = { | ||
@@ -678,5 +743,21 @@ paymentPayload, | ||
| for (const hook of this.beforeSettleHooks) { | ||
| const result = await hook(context); | ||
| if (result && "abort" in result && result.abort) { | ||
| throw new Error(`Settlement aborted: ${result.reason}`); | ||
| try { | ||
| const result = await hook(context); | ||
| if (result && "abort" in result && result.abort) { | ||
| throw new SettleError(400, { | ||
| success: false, | ||
| errorReason: result.reason, | ||
| errorMessage: result.message, | ||
| transaction: "", | ||
| network: requirements.network | ||
| }); | ||
| } | ||
| } catch (error) { | ||
| throw new SettleError(400, { | ||
| success: false, | ||
| errorReason: "before_settle_hook_error", | ||
| errorMessage: error instanceof Error ? error.message : "", | ||
| transaction: "", | ||
| network: requirements.network | ||
| }); | ||
| } | ||
@@ -716,2 +797,23 @@ } | ||
| } | ||
| if (declaredExtensions) { | ||
| for (const [key, declaration] of Object.entries(declaredExtensions)) { | ||
| const extension = this.registeredExtensions.get(key); | ||
| if (extension?.enrichSettlementResponse) { | ||
| try { | ||
| const extensionData = await extension.enrichSettlementResponse( | ||
| declaration, | ||
| resultContext | ||
| ); | ||
| if (extensionData !== void 0) { | ||
| if (!settleResult.extensions) { | ||
| settleResult.extensions = {}; | ||
| } | ||
| settleResult.extensions[key] = extensionData; | ||
| } | ||
| } catch (error) { | ||
| console.error(`Error in enrichSettlementResponse hook for extension ${key}:`, error); | ||
| } | ||
| } | ||
| } | ||
| } | ||
| return settleResult; | ||
@@ -769,3 +871,3 @@ } catch (error) { | ||
| success: false, | ||
| requiresPayment: this.createPaymentRequiredResponse( | ||
| requiresPayment: await this.createPaymentRequiredResponse( | ||
| requirements, | ||
@@ -782,3 +884,3 @@ resourceInfo, | ||
| success: false, | ||
| requiresPayment: this.createPaymentRequiredResponse( | ||
| requiresPayment: await this.createPaymentRequiredResponse( | ||
| requirements, | ||
@@ -857,2 +959,3 @@ resourceInfo, | ||
| this.compiledRoutes = []; | ||
| this.protectedRequestHooks = []; | ||
| this.ResourceServer = ResourceServer; | ||
@@ -871,2 +974,18 @@ this.routesConfig = routes; | ||
| /** | ||
| * Get the underlying x402ResourceServer instance. | ||
| * | ||
| * @returns The underlying x402ResourceServer instance | ||
| */ | ||
| get server() { | ||
| return this.ResourceServer; | ||
| } | ||
| /** | ||
| * Get the routes configuration. | ||
| * | ||
| * @returns The routes configuration | ||
| */ | ||
| get routes() { | ||
| return this.routesConfig; | ||
| } | ||
| /** | ||
| * Initialize the HTTP resource server. | ||
@@ -905,2 +1024,13 @@ * | ||
| /** | ||
| * Register a hook that runs on every request to a protected route, before payment processing. | ||
| * Hooks are executed in order of registration. The first hook to return a non-void result wins. | ||
| * | ||
| * @param hook - The request hook function | ||
| * @returns The x402HTTPResourceServer instance for chaining | ||
| */ | ||
| onProtectedRequest(hook) { | ||
| this.protectedRequestHooks.push(hook); | ||
| return this; | ||
| } | ||
| /** | ||
| * Process HTTP request and return response instructions | ||
@@ -919,2 +1049,18 @@ * This is the main entry point for framework middleware | ||
| } | ||
| for (const hook of this.protectedRequestHooks) { | ||
| const result = await hook(context, routeConfig); | ||
| if (result && "grantAccess" in result) { | ||
| return { type: "no-payment-required" }; | ||
| } | ||
| if (result && "abort" in result) { | ||
| return { | ||
| type: "payment-error", | ||
| response: { | ||
| status: 403, | ||
| headers: { "Content-Type": "application/json" }, | ||
| body: { error: result.reason } | ||
| } | ||
| }; | ||
| } | ||
| } | ||
| const paymentOptions = this.normalizePaymentOptions(routeConfig); | ||
@@ -927,3 +1073,3 @@ const paymentPayload = this.extractPayment(adapter); | ||
| }; | ||
| const requirements = await this.ResourceServer.buildPaymentRequirementsFromOptions( | ||
| let requirements = await this.ResourceServer.buildPaymentRequirementsFromOptions( | ||
| paymentOptions, | ||
@@ -936,3 +1082,3 @@ context | ||
| } | ||
| const paymentRequired = this.ResourceServer.createPaymentRequiredResponse( | ||
| const paymentRequired = await this.ResourceServer.createPaymentRequiredResponse( | ||
| requirements, | ||
@@ -962,3 +1108,3 @@ resourceInfo, | ||
| if (!matchingRequirements) { | ||
| const errorResponse = this.ResourceServer.createPaymentRequiredResponse( | ||
| const errorResponse = await this.ResourceServer.createPaymentRequiredResponse( | ||
| requirements, | ||
@@ -979,3 +1125,3 @@ resourceInfo, | ||
| if (!verifyResult.isValid) { | ||
| const errorResponse = this.ResourceServer.createPaymentRequiredResponse( | ||
| const errorResponse = await this.ResourceServer.createPaymentRequiredResponse( | ||
| requirements, | ||
@@ -994,6 +1140,7 @@ resourceInfo, | ||
| paymentPayload, | ||
| paymentRequirements: matchingRequirements | ||
| paymentRequirements: matchingRequirements, | ||
| declaredExtensions: routeConfig.extensions | ||
| }; | ||
| } catch (error) { | ||
| const errorResponse = this.ResourceServer.createPaymentRequiredResponse( | ||
| const errorResponse = await this.ResourceServer.createPaymentRequiredResponse( | ||
| requirements, | ||
@@ -1015,7 +1162,12 @@ resourceInfo, | ||
| * @param requirements - The matching payment requirements | ||
| * @param declaredExtensions - Optional declared extensions (for per-key enrichment) | ||
| * @returns ProcessSettleResultResponse - SettleResponse with headers if success or errorReason if failure | ||
| */ | ||
| async processSettlement(paymentPayload, requirements) { | ||
| async processSettlement(paymentPayload, requirements, declaredExtensions) { | ||
| try { | ||
| const settleResponse = await this.ResourceServer.settlePayment(paymentPayload, requirements); | ||
| const settleResponse = await this.ResourceServer.settlePayment( | ||
| paymentPayload, | ||
| requirements, | ||
| declaredExtensions | ||
| ); | ||
| if (!settleResponse.success) { | ||
@@ -1025,3 +1177,4 @@ return { | ||
| success: false, | ||
| errorReason: settleResponse.errorReason || "Settlement failed" | ||
| errorReason: settleResponse.errorReason || "Settlement failed", | ||
| errorMessage: settleResponse.errorMessage || settleResponse.errorReason || "Settlement failed" | ||
| }; | ||
@@ -1040,2 +1193,3 @@ } | ||
| errorReason: error.errorReason || error.message, | ||
| errorMessage: error.errorMessage || error.errorReason || error.message, | ||
| payer: error.payer, | ||
@@ -1049,2 +1203,3 @@ network: error.network, | ||
| errorReason: error instanceof Error ? error.message : "Settlement failed", | ||
| errorMessage: error instanceof Error ? error.message : "Settlement failed", | ||
| network: requirements.network, | ||
@@ -1169,6 +1324,7 @@ transaction: "" | ||
| createHTTPResponse(paymentRequired, isWebBrowser, paywallConfig, customHtml, unpaidResponse) { | ||
| const status = paymentRequired.error === "permit2_allowance_required" ? 412 : 402; | ||
| if (isWebBrowser) { | ||
| const html = this.generatePaywallHTML(paymentRequired, paywallConfig, customHtml); | ||
| return { | ||
| status: 402, | ||
| status, | ||
| headers: { "Content-Type": "text/html" }, | ||
@@ -1183,3 +1339,3 @@ body: html, | ||
| return { | ||
| status: 402, | ||
| status, | ||
| headers: { | ||
@@ -1236,9 +1392,10 @@ "Content-Type": contentType, | ||
| normalizePath(path) { | ||
| const pathWithoutQuery = path.split(/[?#]/)[0]; | ||
| let decodedOrRawPath; | ||
| try { | ||
| const pathWithoutQuery = path.split(/[?#]/)[0]; | ||
| const decodedPath = decodeURIComponent(pathWithoutQuery); | ||
| return decodedPath.replace(/\\/g, "/").replace(/\/+/g, "/").replace(/(.+?)\/+$/, "$1"); | ||
| decodedOrRawPath = decodeURIComponent(pathWithoutQuery); | ||
| } catch { | ||
| return path; | ||
| decodedOrRawPath = pathWithoutQuery; | ||
| } | ||
| return decodedOrRawPath.replace(/\\/g, "/").replace(/\/+/g, "/").replace(/(.+?)\/+$/, "$1"); | ||
| } | ||
@@ -1245,0 +1402,0 @@ /** |
@@ -1,1 +0,1 @@ | ||
| export { A as AssetAmount, M as Money, t as MoneyParser, N as Network, P as PaymentPayload, k as PaymentPayloadV1, c as PaymentRequired, j as PaymentRequiredV1, a as PaymentRequirements, i as PaymentRequirementsV1, h as Price, R as ResourceServerExtension, d as SchemeNetworkClient, b as SchemeNetworkFacilitator, f as SchemeNetworkServer, s as SettleError, q as SettleRequest, S as SettleResponse, e as SupportedResponse, r as VerifyError, p as VerifyRequest, V as VerifyResponse } from '../mechanisms-CzuGzYsS.js'; | ||
| export { A as AssetAmount, M as Money, p as MoneyParser, N as Network, P as PaymentPayload, q as PaymentPayloadResult, i as PaymentPayloadV1, c as PaymentRequired, r as PaymentRequiredContext, j as PaymentRequiredV1, a as PaymentRequirements, k as PaymentRequirementsV1, h as Price, s as ResourceInfo, t as ResourceServerExtension, e as SchemeNetworkClient, b as SchemeNetworkFacilitator, u as SchemeNetworkServer, v as SettleError, w as SettleRequest, S as SettleResponse, g as SettleResultContext, y as SupportedResponse, z as VerifyError, B as VerifyRequest, V as VerifyResponse } from '../mechanisms-CP6q1k8-.js'; |
@@ -37,6 +37,9 @@ "use strict"; | ||
| constructor(statusCode, response) { | ||
| super(`verification failed: ${response.invalidReason || "unknown reason"}`); | ||
| const reason = response.invalidReason || "unknown reason"; | ||
| const message = response.invalidMessage; | ||
| super(message ? `${reason}: ${message}` : reason); | ||
| this.name = "VerifyError"; | ||
| this.statusCode = statusCode; | ||
| this.invalidReason = response.invalidReason; | ||
| this.invalidMessage = response.invalidMessage; | ||
| this.payer = response.payer; | ||
@@ -53,6 +56,9 @@ } | ||
| constructor(statusCode, response) { | ||
| super(`settlement failed: ${response.errorReason || "unknown reason"}`); | ||
| const reason = response.errorReason || "unknown reason"; | ||
| const message = response.errorMessage; | ||
| super(message ? `${reason}: ${message}` : reason); | ||
| this.name = "SettleError"; | ||
| this.statusCode = statusCode; | ||
| this.errorReason = response.errorReason; | ||
| this.errorMessage = response.errorMessage; | ||
| this.payer = response.payer; | ||
@@ -59,0 +65,0 @@ this.transaction = response.transaction; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../../../src/types/index.ts","../../../src/types/facilitator.ts"],"sourcesContent":["export type {\n VerifyRequest,\n VerifyResponse,\n SettleRequest,\n SettleResponse,\n SupportedResponse,\n} from \"./facilitator\";\nexport { VerifyError, SettleError } from \"./facilitator\";\nexport type { PaymentRequirements, PaymentPayload, PaymentRequired } from \"./payments\";\nexport type {\n SchemeNetworkClient,\n SchemeNetworkFacilitator,\n SchemeNetworkServer,\n MoneyParser,\n} from \"./mechanisms\";\nexport type { PaymentRequirementsV1, PaymentRequiredV1, PaymentPayloadV1 } from \"./v1\";\nexport type { ResourceServerExtension } from \"./extensions\";\n\nexport type Network = `${string}:${string}`;\n\nexport type Money = string | number;\nexport type AssetAmount = {\n asset: string;\n amount: string;\n extra?: Record<string, unknown>;\n};\nexport type Price = Money | AssetAmount;\n","import { PaymentPayload, PaymentRequirements } from \"./payments\";\nimport { Network } from \"./\";\n\nexport type VerifyRequest = {\n paymentPayload: PaymentPayload;\n paymentRequirements: PaymentRequirements;\n};\n\nexport type VerifyResponse = {\n isValid: boolean;\n invalidReason?: string;\n payer?: string;\n};\n\nexport type SettleRequest = {\n paymentPayload: PaymentPayload;\n paymentRequirements: PaymentRequirements;\n};\n\nexport type SettleResponse = {\n success: boolean;\n errorReason?: string;\n payer?: string;\n transaction: string;\n network: Network;\n};\n\nexport type SupportedKind = {\n x402Version: number;\n scheme: string;\n network: Network;\n extra?: Record<string, unknown>;\n};\n\nexport type SupportedResponse = {\n kinds: SupportedKind[];\n extensions: string[];\n signers: Record<string, string[]>; // CAIP family pattern → Signer addresses\n};\n\n/**\n * Error thrown when payment verification fails.\n */\nexport class VerifyError extends Error {\n readonly invalidReason?: string;\n readonly payer?: string;\n readonly statusCode: number;\n\n /**\n * Creates a VerifyError from a failed verification response.\n *\n * @param statusCode - HTTP status code from the facilitator\n * @param response - The verify response containing error details\n */\n constructor(statusCode: number, response: VerifyResponse) {\n super(`verification failed: ${response.invalidReason || \"unknown reason\"}`);\n this.name = \"VerifyError\";\n this.statusCode = statusCode;\n this.invalidReason = response.invalidReason;\n this.payer = response.payer;\n }\n}\n\n/**\n * Error thrown when payment settlement fails.\n */\nexport class SettleError extends Error {\n readonly errorReason?: string;\n readonly payer?: string;\n readonly transaction: string;\n readonly network: Network;\n readonly statusCode: number;\n\n /**\n * Creates a SettleError from a failed settlement response.\n *\n * @param statusCode - HTTP status code from the facilitator\n * @param response - The settle response containing error details\n */\n constructor(statusCode: number, response: SettleResponse) {\n super(`settlement failed: ${response.errorReason || \"unknown reason\"}`);\n this.name = \"SettleError\";\n this.statusCode = statusCode;\n this.errorReason = response.errorReason;\n this.payer = response.payer;\n this.transaction = response.transaction;\n this.network = response.network;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AC2CO,IAAM,cAAN,cAA0B,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWrC,YAAY,YAAoB,UAA0B;AACxD,UAAM,wBAAwB,SAAS,iBAAiB,gBAAgB,EAAE;AAC1E,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,SAAK,gBAAgB,SAAS;AAC9B,SAAK,QAAQ,SAAS;AAAA,EACxB;AACF;AAKO,IAAM,cAAN,cAA0B,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAarC,YAAY,YAAoB,UAA0B;AACxD,UAAM,sBAAsB,SAAS,eAAe,gBAAgB,EAAE;AACtE,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,SAAK,cAAc,SAAS;AAC5B,SAAK,QAAQ,SAAS;AACtB,SAAK,cAAc,SAAS;AAC5B,SAAK,UAAU,SAAS;AAAA,EAC1B;AACF;","names":[]} | ||
| {"version":3,"sources":["../../../src/types/index.ts","../../../src/types/facilitator.ts"],"sourcesContent":["export type {\n VerifyRequest,\n VerifyResponse,\n SettleRequest,\n SettleResponse,\n SupportedResponse,\n} from \"./facilitator\";\nexport { VerifyError, SettleError } from \"./facilitator\";\nexport type {\n PaymentRequirements,\n PaymentPayload,\n PaymentRequired,\n ResourceInfo,\n} from \"./payments\";\nexport type {\n SchemeNetworkClient,\n SchemeNetworkFacilitator,\n SchemeNetworkServer,\n MoneyParser,\n PaymentPayloadResult,\n} from \"./mechanisms\";\nexport type { PaymentRequirementsV1, PaymentRequiredV1, PaymentPayloadV1 } from \"./v1\";\nexport type {\n ResourceServerExtension,\n PaymentRequiredContext,\n SettleResultContext,\n} from \"./extensions\";\n\nexport type Network = `${string}:${string}`;\n\nexport type Money = string | number;\nexport type AssetAmount = {\n asset: string;\n amount: string;\n extra?: Record<string, unknown>;\n};\nexport type Price = Money | AssetAmount;\n","import { PaymentPayload, PaymentRequirements } from \"./payments\";\nimport { Network } from \"./\";\n\nexport type VerifyRequest = {\n paymentPayload: PaymentPayload;\n paymentRequirements: PaymentRequirements;\n};\n\nexport type VerifyResponse = {\n isValid: boolean;\n invalidReason?: string;\n invalidMessage?: string;\n payer?: string;\n extensions?: Record<string, unknown>;\n};\n\nexport type SettleRequest = {\n paymentPayload: PaymentPayload;\n paymentRequirements: PaymentRequirements;\n};\n\nexport type SettleResponse = {\n success: boolean;\n errorReason?: string;\n errorMessage?: string;\n payer?: string;\n transaction: string;\n network: Network;\n extensions?: Record<string, unknown>;\n};\n\nexport type SupportedKind = {\n x402Version: number;\n scheme: string;\n network: Network;\n extra?: Record<string, unknown>;\n};\n\nexport type SupportedResponse = {\n kinds: SupportedKind[];\n extensions: string[];\n signers: Record<string, string[]>; // CAIP family pattern → Signer addresses\n};\n\n/**\n * Error thrown when payment verification fails.\n */\nexport class VerifyError extends Error {\n readonly invalidReason?: string;\n readonly invalidMessage?: string;\n readonly payer?: string;\n readonly statusCode: number;\n\n /**\n * Creates a VerifyError from a failed verification response.\n *\n * @param statusCode - HTTP status code from the facilitator\n * @param response - The verify response containing error details\n */\n constructor(statusCode: number, response: VerifyResponse) {\n const reason = response.invalidReason || \"unknown reason\";\n const message = response.invalidMessage;\n super(message ? `${reason}: ${message}` : reason);\n this.name = \"VerifyError\";\n this.statusCode = statusCode;\n this.invalidReason = response.invalidReason;\n this.invalidMessage = response.invalidMessage;\n this.payer = response.payer;\n }\n}\n\n/**\n * Error thrown when payment settlement fails.\n */\nexport class SettleError extends Error {\n readonly errorReason?: string;\n readonly errorMessage?: string;\n readonly payer?: string;\n readonly transaction: string;\n readonly network: Network;\n readonly statusCode: number;\n\n /**\n * Creates a SettleError from a failed settlement response.\n *\n * @param statusCode - HTTP status code from the facilitator\n * @param response - The settle response containing error details\n */\n constructor(statusCode: number, response: SettleResponse) {\n const reason = response.errorReason || \"unknown reason\";\n const message = response.errorMessage;\n super(message ? `${reason}: ${message}` : reason);\n this.name = \"SettleError\";\n this.statusCode = statusCode;\n this.errorReason = response.errorReason;\n this.errorMessage = response.errorMessage;\n this.payer = response.payer;\n this.transaction = response.transaction;\n this.network = response.network;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AC+CO,IAAM,cAAN,cAA0B,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYrC,YAAY,YAAoB,UAA0B;AACxD,UAAM,SAAS,SAAS,iBAAiB;AACzC,UAAM,UAAU,SAAS;AACzB,UAAM,UAAU,GAAG,MAAM,KAAK,OAAO,KAAK,MAAM;AAChD,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,SAAK,gBAAgB,SAAS;AAC9B,SAAK,iBAAiB,SAAS;AAC/B,SAAK,QAAQ,SAAS;AAAA,EACxB;AACF;AAKO,IAAM,cAAN,cAA0B,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcrC,YAAY,YAAoB,UAA0B;AACxD,UAAM,SAAS,SAAS,eAAe;AACvC,UAAM,UAAU,SAAS;AACzB,UAAM,UAAU,GAAG,MAAM,KAAK,OAAO,KAAK,MAAM;AAChD,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,SAAK,cAAc,SAAS;AAC5B,SAAK,eAAe,SAAS;AAC7B,SAAK,QAAQ,SAAS;AACtB,SAAK,cAAc,SAAS;AAC5B,SAAK,UAAU,SAAS;AAAA,EAC1B;AACF;","names":[]} |
@@ -1,1 +0,1 @@ | ||
| export { k as PaymentPayloadV1, j as PaymentRequiredV1, i as PaymentRequirementsV1, m as SettleRequestV1, n as SettleResponseV1, o as SupportedResponseV1, l as VerifyRequestV1 } from '../../mechanisms-CzuGzYsS.js'; | ||
| export { i as PaymentPayloadV1, j as PaymentRequiredV1, k as PaymentRequirementsV1, l as SettleRequestV1, m as SettleResponseV1, n as SupportedResponseV1, o as VerifyRequestV1 } from '../../mechanisms-CP6q1k8-.js'; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../../../../src/types/v1/index.ts"],"sourcesContent":["import { Network } from \"../\";\n\n// Payments\nexport type PaymentRequirementsV1 = {\n scheme: string;\n network: Network;\n maxAmountRequired: string;\n resource: string;\n description: string;\n mimeType: string;\n outputSchema: Record<string, unknown>;\n payTo: string;\n maxTimeoutSeconds: number;\n asset: string;\n extra: Record<string, unknown>;\n};\n\nexport type PaymentRequiredV1 = {\n x402Version: 1;\n error?: string;\n accepts: PaymentRequirementsV1[];\n};\n\nexport type PaymentPayloadV1 = {\n x402Version: 1;\n scheme: string;\n network: Network;\n payload: Record<string, unknown>;\n};\n\n// Facilitator Requests/Responses\nexport type VerifyRequestV1 = {\n paymentPayload: PaymentPayloadV1;\n paymentRequirements: PaymentRequirementsV1;\n};\n\nexport type SettleRequestV1 = {\n paymentPayload: PaymentPayloadV1;\n paymentRequirements: PaymentRequirementsV1;\n};\n\nexport type SettleResponseV1 = {\n success: boolean;\n errorReason?: string;\n payer?: string;\n transaction: string;\n network: Network;\n};\n\nexport type SupportedResponseV1 = {\n kinds: {\n x402Version: number;\n scheme: string;\n network: Network;\n extra?: Record<string, unknown>;\n }[];\n // NO extensions field - V1 doesn't support extensions\n};\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]} | ||
| {"version":3,"sources":["../../../../src/types/v1/index.ts"],"sourcesContent":["import { Network } from \"../\";\n\n// Payments\nexport type PaymentRequirementsV1 = {\n scheme: string;\n network: Network;\n maxAmountRequired: string;\n resource: string;\n description: string;\n mimeType: string;\n outputSchema: Record<string, unknown>;\n payTo: string;\n maxTimeoutSeconds: number;\n asset: string;\n extra: Record<string, unknown>;\n};\n\nexport type PaymentRequiredV1 = {\n x402Version: 1;\n error?: string;\n accepts: PaymentRequirementsV1[];\n};\n\nexport type PaymentPayloadV1 = {\n x402Version: 1;\n scheme: string;\n network: Network;\n payload: Record<string, unknown>;\n};\n\n// Facilitator Requests/Responses\nexport type VerifyRequestV1 = {\n paymentPayload: PaymentPayloadV1;\n paymentRequirements: PaymentRequirementsV1;\n};\n\nexport type SettleRequestV1 = {\n paymentPayload: PaymentPayloadV1;\n paymentRequirements: PaymentRequirementsV1;\n};\n\nexport type SettleResponseV1 = {\n success: boolean;\n errorReason?: string;\n errorMessage?: string;\n payer?: string;\n transaction: string;\n network: Network;\n};\n\nexport type SupportedResponseV1 = {\n kinds: {\n x402Version: number;\n scheme: string;\n network: Network;\n extra?: Record<string, unknown>;\n }[];\n // NO extensions field - V1 doesn't support extensions\n};\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]} |
@@ -1,2 +0,2 @@ | ||
| import { N as Network } from '../mechanisms-CzuGzYsS.js'; | ||
| import { N as Network } from '../mechanisms-CP6q1k8-.js'; | ||
@@ -3,0 +3,0 @@ /** |
@@ -1,2 +0,2 @@ | ||
| import { c as PaymentRequired, a as PaymentRequirements, P as PaymentPayload, N as Network, d as SchemeNetworkClient, S as SettleResponse } from '../mechanisms-CzuGzYsS.mjs'; | ||
| import { c as PaymentRequired, a as PaymentRequirements, P as PaymentPayload, N as Network, e as SchemeNetworkClient, S as SettleResponse } from '../mechanisms-CP6q1k8-.mjs'; | ||
@@ -198,2 +198,15 @@ /** | ||
| /** | ||
| * Context provided to onPaymentRequired hooks. | ||
| */ | ||
| interface PaymentRequiredContext { | ||
| paymentRequired: PaymentRequired; | ||
| } | ||
| /** | ||
| * Hook called when a 402 response is received, before payment processing. | ||
| * Return headers to try before payment, or void to proceed directly to payment. | ||
| */ | ||
| type PaymentRequiredHook = (context: PaymentRequiredContext) => Promise<{ | ||
| headers: Record<string, string>; | ||
| } | void>; | ||
| /** | ||
| * HTTP-specific client for handling x402 payment protocol over HTTP. | ||
@@ -206,2 +219,3 @@ * | ||
| private readonly client; | ||
| private paymentRequiredHooks; | ||
| /** | ||
@@ -214,2 +228,17 @@ * Creates a new x402HTTPClient instance. | ||
| /** | ||
| * Register a hook to handle 402 responses before payment. | ||
| * Hooks run in order; first to return headers wins. | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns This instance for chaining | ||
| */ | ||
| onPaymentRequired(hook: PaymentRequiredHook): this; | ||
| /** | ||
| * Run hooks and return headers if any hook provides them. | ||
| * | ||
| * @param paymentRequired - The payment required response from the server | ||
| * @returns Headers to use for retry, or null to proceed to payment | ||
| */ | ||
| handlePaymentRequired(paymentRequired: PaymentRequired): Promise<Record<string, string> | null>; | ||
| /** | ||
| * Encodes a payment payload into appropriate HTTP headers based on version. | ||
@@ -246,2 +275,2 @@ * | ||
| export { type AfterPaymentCreationHook, type BeforePaymentCreationHook, type OnPaymentCreationFailureHook, type PaymentCreatedContext, type PaymentCreationContext, type PaymentCreationFailureContext, type PaymentPolicy, type SchemeRegistration, type SelectPaymentRequirements, x402Client, type x402ClientConfig, x402HTTPClient }; | ||
| export { type AfterPaymentCreationHook, type BeforePaymentCreationHook, type OnPaymentCreationFailureHook, type PaymentCreatedContext, type PaymentCreationContext, type PaymentCreationFailureContext, type PaymentPolicy, type PaymentRequiredContext, type PaymentRequiredHook, type SchemeRegistration, type SelectPaymentRequirements, x402Client, type x402ClientConfig, x402HTTPClient }; |
| import { | ||
| x402HTTPClient | ||
| } from "../chunk-55XTTMLF.mjs"; | ||
| } from "../chunk-CWIHZ5RE.mjs"; | ||
| import { | ||
| x402Version | ||
| } from "../chunk-VE37GDG2.mjs"; | ||
| import "../chunk-X4W4S5RB.mjs"; | ||
| import "../chunk-L2RJI3BI.mjs"; | ||
| import { | ||
@@ -9,0 +9,0 @@ findByNetworkAndScheme, |
@@ -1,2 +0,2 @@ | ||
| import { P as PaymentPayload, a as PaymentRequirements, V as VerifyResponse, S as SettleResponse, N as Network, b as SchemeNetworkFacilitator } from '../mechanisms-CzuGzYsS.mjs'; | ||
| import { P as PaymentPayload, a as PaymentRequirements, S as SettleResponse, V as VerifyResponse, N as Network, b as SchemeNetworkFacilitator } from '../mechanisms-CP6q1k8-.mjs'; | ||
@@ -3,0 +3,0 @@ /** |
@@ -1,4 +0,5 @@ | ||
| import { P as PaymentPayload, c as PaymentRequired, S as SettleResponse } from '../mechanisms-CzuGzYsS.mjs'; | ||
| export { C as CompiledRoute, D as DynamicPayTo, g as DynamicPrice, F as FacilitatorClient, o as FacilitatorConfig, H as HTTPAdapter, n as HTTPFacilitatorClient, c as HTTPProcessResult, a as HTTPRequestContext, b as HTTPResponseInstructions, e as PaymentOption, P as PaywallConfig, d as PaywallProvider, k as ProcessSettleFailureResponse, i as ProcessSettleResultResponse, j as ProcessSettleSuccessResponse, R as RouteConfig, m as RouteConfigurationError, l as RouteValidationError, f as RoutesConfig, U as UnpaidResponseBody, h as UnpaidResponseResult, x as x402HTTPResourceServer } from '../x402HTTPResourceServer-BAYqDlfW.mjs'; | ||
| export { x402HTTPClient } from '../client/index.mjs'; | ||
| import { c as PaymentRequired, S as SettleResponse, P as PaymentPayload } from '../mechanisms-CP6q1k8-.mjs'; | ||
| export { F as FacilitatorClient, d as FacilitatorConfig, H as HTTPFacilitatorClient } from '../mechanisms-CP6q1k8-.mjs'; | ||
| export { C as CompiledRoute, D as DynamicPayTo, a as DynamicPrice, H as HTTPAdapter, b as HTTPProcessResult, c as HTTPRequestContext, d as HTTPResponseInstructions, P as PaymentOption, e as PaywallConfig, f as PaywallProvider, g as ProcessSettleFailureResponse, h as ProcessSettleResultResponse, i as ProcessSettleSuccessResponse, j as ProtectedRequestHook, R as RouteConfig, k as RouteConfigurationError, l as RouteValidationError, m as RoutesConfig, U as UnpaidResponseBody, n as UnpaidResponseResult, x as x402HTTPResourceServer } from '../x402HTTPResourceServer-BBpDcurO.mjs'; | ||
| export { PaymentRequiredContext, PaymentRequiredHook, x402HTTPClient } from '../client/index.mjs'; | ||
@@ -5,0 +6,0 @@ type QueryParamMethods = "GET" | "HEAD" | "DELETE"; |
@@ -12,5 +12,5 @@ import { | ||
| x402HTTPResourceServer | ||
| } from "../chunk-55XTTMLF.mjs"; | ||
| } from "../chunk-CWIHZ5RE.mjs"; | ||
| import "../chunk-VE37GDG2.mjs"; | ||
| import "../chunk-X4W4S5RB.mjs"; | ||
| import "../chunk-L2RJI3BI.mjs"; | ||
| import "../chunk-TDLQZ6MP.mjs"; | ||
@@ -17,0 +17,0 @@ import "../chunk-BJTO5JO5.mjs"; |
@@ -1,2 +0,2 @@ | ||
| export { C as CompiledRoute, F as FacilitatorClient, o as FacilitatorConfig, H as HTTPAdapter, n as HTTPFacilitatorClient, c as HTTPProcessResult, a as HTTPRequestContext, b as HTTPResponseInstructions, P as PaywallConfig, d as PaywallProvider, k as ProcessSettleFailureResponse, i as ProcessSettleResultResponse, j as ProcessSettleSuccessResponse, q as ResourceConfig, r as ResourceInfo, R as RouteConfig, m as RouteConfigurationError, l as RouteValidationError, f as RoutesConfig, U as UnpaidResponseBody, h as UnpaidResponseResult, x as x402HTTPResourceServer, p as x402ResourceServer } from '../x402HTTPResourceServer-BAYqDlfW.mjs'; | ||
| import '../mechanisms-CzuGzYsS.mjs'; | ||
| export { F as FacilitatorClient, d as FacilitatorConfig, H as HTTPFacilitatorClient, R as ResourceConfig, f as ResourceInfo, g as SettleResultContext, x as x402ResourceServer } from '../mechanisms-CP6q1k8-.mjs'; | ||
| export { C as CompiledRoute, H as HTTPAdapter, b as HTTPProcessResult, c as HTTPRequestContext, d as HTTPResponseInstructions, e as PaywallConfig, f as PaywallProvider, g as ProcessSettleFailureResponse, h as ProcessSettleResultResponse, i as ProcessSettleSuccessResponse, R as RouteConfig, k as RouteConfigurationError, l as RouteValidationError, m as RoutesConfig, U as UnpaidResponseBody, n as UnpaidResponseResult, x as x402HTTPResourceServer } from '../x402HTTPResourceServer-BBpDcurO.mjs'; |
+116
-17
@@ -5,8 +5,11 @@ import { | ||
| x402HTTPResourceServer | ||
| } from "../chunk-55XTTMLF.mjs"; | ||
| } from "../chunk-CWIHZ5RE.mjs"; | ||
| import { | ||
| x402Version | ||
| } from "../chunk-VE37GDG2.mjs"; | ||
| import "../chunk-X4W4S5RB.mjs"; | ||
| import { | ||
| SettleError, | ||
| VerifyError | ||
| } from "../chunk-L2RJI3BI.mjs"; | ||
| import { | ||
| deepEqual, | ||
@@ -81,2 +84,19 @@ findByNetworkAndScheme | ||
| /** | ||
| * Check if an extension is registered. | ||
| * | ||
| * @param key - The extension key | ||
| * @returns True if the extension is registered | ||
| */ | ||
| hasExtension(key) { | ||
| return this.registeredExtensions.has(key); | ||
| } | ||
| /** | ||
| * Get all registered extensions. | ||
| * | ||
| * @returns Array of registered extensions | ||
| */ | ||
| getExtensions() { | ||
| return Array.from(this.registeredExtensions.values()); | ||
| } | ||
| /** | ||
| * Enriches declared extensions using registered extension hooks. | ||
@@ -282,3 +302,5 @@ * | ||
| extra: { | ||
| ...parsedPrice.extra | ||
| ...parsedPrice.extra, | ||
| ...resourceConfig.extra | ||
| // Merge user-provided extra | ||
| } | ||
@@ -328,7 +350,7 @@ }; | ||
| * @param error - Error message | ||
| * @param extensions - Optional extensions | ||
| * @param extensions - Optional declared extensions (for per-key enrichment) | ||
| * @returns Payment required response object | ||
| */ | ||
| createPaymentRequiredResponse(requirements, resourceInfo, error, extensions) { | ||
| const response = { | ||
| async createPaymentRequiredResponse(requirements, resourceInfo, error, extensions) { | ||
| let response = { | ||
| x402Version: 2, | ||
@@ -342,2 +364,32 @@ error, | ||
| } | ||
| if (extensions) { | ||
| for (const [key, declaration] of Object.entries(extensions)) { | ||
| const extension = this.registeredExtensions.get(key); | ||
| if (extension?.enrichPaymentRequiredResponse) { | ||
| try { | ||
| const context = { | ||
| requirements, | ||
| resourceInfo, | ||
| error, | ||
| paymentRequiredResponse: response | ||
| }; | ||
| const extensionData = await extension.enrichPaymentRequiredResponse( | ||
| declaration, | ||
| context | ||
| ); | ||
| if (extensionData !== void 0) { | ||
| if (!response.extensions) { | ||
| response.extensions = {}; | ||
| } | ||
| response.extensions[key] = extensionData; | ||
| } | ||
| } catch (error2) { | ||
| console.error( | ||
| `Error in enrichPaymentRequiredResponse hook for extension ${key}:`, | ||
| error2 | ||
| ); | ||
| } | ||
| } | ||
| } | ||
| } | ||
| return response; | ||
@@ -358,8 +410,17 @@ } | ||
| for (const hook of this.beforeVerifyHooks) { | ||
| const result = await hook(context); | ||
| if (result && "abort" in result && result.abort) { | ||
| return { | ||
| try { | ||
| const result = await hook(context); | ||
| if (result && "abort" in result && result.abort) { | ||
| return { | ||
| isValid: false, | ||
| invalidReason: result.reason, | ||
| invalidMessage: result.message | ||
| }; | ||
| } | ||
| } catch (error) { | ||
| throw new VerifyError(400, { | ||
| isValid: false, | ||
| invalidReason: result.reason | ||
| }; | ||
| invalidReason: "before_verify_hook_error", | ||
| invalidMessage: error instanceof Error ? error.message : "" | ||
| }); | ||
| } | ||
@@ -419,5 +480,6 @@ } | ||
| * @param requirements - The payment requirements | ||
| * @param declaredExtensions - Optional declared extensions (for per-key enrichment) | ||
| * @returns Settlement response | ||
| */ | ||
| async settlePayment(paymentPayload, requirements) { | ||
| async settlePayment(paymentPayload, requirements, declaredExtensions) { | ||
| const context = { | ||
@@ -428,5 +490,21 @@ paymentPayload, | ||
| for (const hook of this.beforeSettleHooks) { | ||
| const result = await hook(context); | ||
| if (result && "abort" in result && result.abort) { | ||
| throw new Error(`Settlement aborted: ${result.reason}`); | ||
| try { | ||
| const result = await hook(context); | ||
| if (result && "abort" in result && result.abort) { | ||
| throw new SettleError(400, { | ||
| success: false, | ||
| errorReason: result.reason, | ||
| errorMessage: result.message, | ||
| transaction: "", | ||
| network: requirements.network | ||
| }); | ||
| } | ||
| } catch (error) { | ||
| throw new SettleError(400, { | ||
| success: false, | ||
| errorReason: "before_settle_hook_error", | ||
| errorMessage: error instanceof Error ? error.message : "", | ||
| transaction: "", | ||
| network: requirements.network | ||
| }); | ||
| } | ||
@@ -466,2 +544,23 @@ } | ||
| } | ||
| if (declaredExtensions) { | ||
| for (const [key, declaration] of Object.entries(declaredExtensions)) { | ||
| const extension = this.registeredExtensions.get(key); | ||
| if (extension?.enrichSettlementResponse) { | ||
| try { | ||
| const extensionData = await extension.enrichSettlementResponse( | ||
| declaration, | ||
| resultContext | ||
| ); | ||
| if (extensionData !== void 0) { | ||
| if (!settleResult.extensions) { | ||
| settleResult.extensions = {}; | ||
| } | ||
| settleResult.extensions[key] = extensionData; | ||
| } | ||
| } catch (error) { | ||
| console.error(`Error in enrichSettlementResponse hook for extension ${key}:`, error); | ||
| } | ||
| } | ||
| } | ||
| } | ||
| return settleResult; | ||
@@ -519,3 +618,3 @@ } catch (error) { | ||
| success: false, | ||
| requiresPayment: this.createPaymentRequiredResponse( | ||
| requiresPayment: await this.createPaymentRequiredResponse( | ||
| requirements, | ||
@@ -532,3 +631,3 @@ resourceInfo, | ||
| success: false, | ||
| requiresPayment: this.createPaymentRequiredResponse( | ||
| requiresPayment: await this.createPaymentRequiredResponse( | ||
| requirements, | ||
@@ -535,0 +634,0 @@ resourceInfo, |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../../../src/server/x402ResourceServer.ts"],"sourcesContent":["import {\n SettleResponse,\n VerifyResponse,\n SupportedResponse,\n SupportedKind,\n} from \"../types/facilitator\";\nimport { PaymentPayload, PaymentRequirements, PaymentRequired } from \"../types/payments\";\nimport { SchemeNetworkServer } from \"../types/mechanisms\";\nimport { Price, Network, ResourceServerExtension } from \"../types\";\nimport { deepEqual, findByNetworkAndScheme } from \"../utils\";\nimport { FacilitatorClient, HTTPFacilitatorClient } from \"../http/httpFacilitatorClient\";\nimport { x402Version } from \"..\";\n\n/**\n * Configuration for a protected resource\n * Only contains payment-specific configuration, not resource metadata\n */\nexport interface ResourceConfig {\n scheme: string;\n payTo: string; // Payment recipient address\n price: Price;\n network: Network;\n maxTimeoutSeconds?: number;\n}\n\n/**\n * Resource information for PaymentRequired response\n */\nexport interface ResourceInfo {\n url: string;\n description: string;\n mimeType: string;\n}\n\n/**\n * Lifecycle Hook Context Interfaces\n */\n\nexport interface VerifyContext {\n paymentPayload: PaymentPayload;\n requirements: PaymentRequirements;\n}\n\nexport interface VerifyResultContext extends VerifyContext {\n result: VerifyResponse;\n}\n\nexport interface VerifyFailureContext extends VerifyContext {\n error: Error;\n}\n\nexport interface SettleContext {\n paymentPayload: PaymentPayload;\n requirements: PaymentRequirements;\n}\n\nexport interface SettleResultContext extends SettleContext {\n result: SettleResponse;\n}\n\nexport interface SettleFailureContext extends SettleContext {\n error: Error;\n}\n\n/**\n * Lifecycle Hook Type Definitions\n */\n\nexport type BeforeVerifyHook = (\n context: VerifyContext,\n) => Promise<void | { abort: true; reason: string }>;\n\nexport type AfterVerifyHook = (context: VerifyResultContext) => Promise<void>;\n\nexport type OnVerifyFailureHook = (\n context: VerifyFailureContext,\n) => Promise<void | { recovered: true; result: VerifyResponse }>;\n\nexport type BeforeSettleHook = (\n context: SettleContext,\n) => Promise<void | { abort: true; reason: string }>;\n\nexport type AfterSettleHook = (context: SettleResultContext) => Promise<void>;\n\nexport type OnSettleFailureHook = (\n context: SettleFailureContext,\n) => Promise<void | { recovered: true; result: SettleResponse }>;\n\n/**\n * Core x402 protocol server for resource protection\n * Transport-agnostic implementation of the x402 payment protocol\n */\nexport class x402ResourceServer {\n private facilitatorClients: FacilitatorClient[];\n private registeredServerSchemes: Map<string, Map<string, SchemeNetworkServer>> = new Map();\n private supportedResponsesMap: Map<number, Map<string, Map<string, SupportedResponse>>> =\n new Map();\n private facilitatorClientsMap: Map<number, Map<string, Map<string, FacilitatorClient>>> =\n new Map();\n private registeredExtensions: Map<string, ResourceServerExtension> = new Map();\n\n private beforeVerifyHooks: BeforeVerifyHook[] = [];\n private afterVerifyHooks: AfterVerifyHook[] = [];\n private onVerifyFailureHooks: OnVerifyFailureHook[] = [];\n private beforeSettleHooks: BeforeSettleHook[] = [];\n private afterSettleHooks: AfterSettleHook[] = [];\n private onSettleFailureHooks: OnSettleFailureHook[] = [];\n\n /**\n * Creates a new x402ResourceServer instance.\n *\n * @param facilitatorClients - Optional facilitator client(s) for payment processing\n */\n constructor(facilitatorClients?: FacilitatorClient | FacilitatorClient[]) {\n // Normalize facilitator clients to array\n if (!facilitatorClients) {\n // No clients provided, create a default HTTP client\n this.facilitatorClients = [new HTTPFacilitatorClient()];\n } else if (Array.isArray(facilitatorClients)) {\n // Array of clients provided\n this.facilitatorClients =\n facilitatorClients.length > 0 ? facilitatorClients : [new HTTPFacilitatorClient()];\n } else {\n // Single client provided\n this.facilitatorClients = [facilitatorClients];\n }\n }\n\n /**\n * Register a scheme/network server implementation.\n *\n * @param network - The network identifier\n * @param server - The scheme/network server implementation\n * @returns The x402ResourceServer instance for chaining\n */\n register(network: Network, server: SchemeNetworkServer): x402ResourceServer {\n if (!this.registeredServerSchemes.has(network)) {\n this.registeredServerSchemes.set(network, new Map());\n }\n\n const serverByScheme = this.registeredServerSchemes.get(network)!;\n if (!serverByScheme.has(server.scheme)) {\n serverByScheme.set(server.scheme, server);\n }\n\n return this;\n }\n\n /**\n * Check if a scheme is registered for a given network.\n *\n * @param network - The network identifier\n * @param scheme - The payment scheme name\n * @returns True if the scheme is registered for the network, false otherwise\n */\n hasRegisteredScheme(network: Network, scheme: string): boolean {\n return !!findByNetworkAndScheme(this.registeredServerSchemes, scheme, network);\n }\n\n /**\n * Registers a resource service extension that can enrich extension declarations.\n *\n * @param extension - The extension to register\n * @returns The x402ResourceServer instance for chaining\n */\n registerExtension(extension: ResourceServerExtension): this {\n this.registeredExtensions.set(extension.key, extension);\n return this;\n }\n\n /**\n * Enriches declared extensions using registered extension hooks.\n *\n * @param declaredExtensions - Extensions declared on the route\n * @param transportContext - Transport-specific context (HTTP, A2A, MCP, etc.)\n * @returns Enriched extensions map\n */\n enrichExtensions(\n declaredExtensions: Record<string, unknown>,\n transportContext: unknown,\n ): Record<string, unknown> {\n const enriched: Record<string, unknown> = {};\n\n for (const [key, declaration] of Object.entries(declaredExtensions)) {\n const extension = this.registeredExtensions.get(key);\n\n if (extension?.enrichDeclaration) {\n enriched[key] = extension.enrichDeclaration(declaration, transportContext);\n } else {\n enriched[key] = declaration;\n }\n }\n\n return enriched;\n }\n\n /**\n * Register a hook to execute before payment verification.\n * Can abort verification by returning { abort: true, reason: string }\n *\n * @param hook - The hook function to register\n * @returns The x402ResourceServer instance for chaining\n */\n onBeforeVerify(hook: BeforeVerifyHook): x402ResourceServer {\n this.beforeVerifyHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute after successful payment verification.\n *\n * @param hook - The hook function to register\n * @returns The x402ResourceServer instance for chaining\n */\n onAfterVerify(hook: AfterVerifyHook): x402ResourceServer {\n this.afterVerifyHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute when payment verification fails.\n * Can recover from failure by returning { recovered: true, result: VerifyResponse }\n *\n * @param hook - The hook function to register\n * @returns The x402ResourceServer instance for chaining\n */\n onVerifyFailure(hook: OnVerifyFailureHook): x402ResourceServer {\n this.onVerifyFailureHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute before payment settlement.\n * Can abort settlement by returning { abort: true, reason: string }\n *\n * @param hook - The hook function to register\n * @returns The x402ResourceServer instance for chaining\n */\n onBeforeSettle(hook: BeforeSettleHook): x402ResourceServer {\n this.beforeSettleHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute after successful payment settlement.\n *\n * @param hook - The hook function to register\n * @returns The x402ResourceServer instance for chaining\n */\n onAfterSettle(hook: AfterSettleHook): x402ResourceServer {\n this.afterSettleHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute when payment settlement fails.\n * Can recover from failure by returning { recovered: true, result: SettleResponse }\n *\n * @param hook - The hook function to register\n * @returns The x402ResourceServer instance for chaining\n */\n onSettleFailure(hook: OnSettleFailureHook): x402ResourceServer {\n this.onSettleFailureHooks.push(hook);\n return this;\n }\n\n /**\n * Initialize by fetching supported kinds from all facilitators\n * Creates mappings for supported responses and facilitator clients\n * Earlier facilitators in the array get precedence\n */\n async initialize(): Promise<void> {\n // Clear existing mappings\n this.supportedResponsesMap.clear();\n this.facilitatorClientsMap.clear();\n\n // Fetch supported kinds from all facilitator clients\n // Process in order to give precedence to earlier facilitators\n for (const facilitatorClient of this.facilitatorClients) {\n try {\n const supported = await facilitatorClient.getSupported();\n\n // Process each supported kind (now flat array with version in each element)\n for (const kind of supported.kinds) {\n const x402Version = kind.x402Version;\n\n // Get or create version map for supported responses\n if (!this.supportedResponsesMap.has(x402Version)) {\n this.supportedResponsesMap.set(x402Version, new Map());\n }\n const responseVersionMap = this.supportedResponsesMap.get(x402Version)!;\n\n // Get or create version map for facilitator clients\n if (!this.facilitatorClientsMap.has(x402Version)) {\n this.facilitatorClientsMap.set(x402Version, new Map());\n }\n const clientVersionMap = this.facilitatorClientsMap.get(x402Version)!;\n\n // Get or create network map for responses\n if (!responseVersionMap.has(kind.network)) {\n responseVersionMap.set(kind.network, new Map());\n }\n const responseNetworkMap = responseVersionMap.get(kind.network)!;\n\n // Get or create network map for clients\n if (!clientVersionMap.has(kind.network)) {\n clientVersionMap.set(kind.network, new Map());\n }\n const clientNetworkMap = clientVersionMap.get(kind.network)!;\n\n // Only store if not already present (gives precedence to earlier facilitators)\n if (!responseNetworkMap.has(kind.scheme)) {\n responseNetworkMap.set(kind.scheme, supported);\n clientNetworkMap.set(kind.scheme, facilitatorClient);\n }\n }\n } catch (error) {\n // Log error but continue with other facilitators\n console.warn(`Failed to fetch supported kinds from facilitator: ${error}`);\n }\n }\n }\n\n /**\n * Get supported kind for a specific version, network, and scheme\n *\n * @param x402Version - The x402 version\n * @param network - The network identifier\n * @param scheme - The payment scheme\n * @returns The supported kind or undefined if not found\n */\n getSupportedKind(\n x402Version: number,\n network: Network,\n scheme: string,\n ): SupportedKind | undefined {\n const versionMap = this.supportedResponsesMap.get(x402Version);\n if (!versionMap) return undefined;\n\n const supportedResponse = findByNetworkAndScheme(versionMap, scheme, network);\n if (!supportedResponse) return undefined;\n\n // Find the specific kind from the response (kinds are flat array with version in each element)\n return supportedResponse.kinds.find(\n kind =>\n kind.x402Version === x402Version && kind.network === network && kind.scheme === scheme,\n );\n }\n\n /**\n * Get facilitator extensions for a specific version, network, and scheme\n *\n * @param x402Version - The x402 version\n * @param network - The network identifier\n * @param scheme - The payment scheme\n * @returns The facilitator extensions or empty array if not found\n */\n getFacilitatorExtensions(x402Version: number, network: Network, scheme: string): string[] {\n const versionMap = this.supportedResponsesMap.get(x402Version);\n if (!versionMap) return [];\n\n const supportedResponse = findByNetworkAndScheme(versionMap, scheme, network);\n return supportedResponse?.extensions || [];\n }\n\n /**\n * Build payment requirements for a protected resource\n *\n * @param resourceConfig - Configuration for the protected resource\n * @returns Array of payment requirements\n */\n async buildPaymentRequirements(resourceConfig: ResourceConfig): Promise<PaymentRequirements[]> {\n const requirements: PaymentRequirements[] = [];\n\n // Find the matching server implementation\n const scheme = resourceConfig.scheme;\n const SchemeNetworkServer = findByNetworkAndScheme(\n this.registeredServerSchemes,\n scheme,\n resourceConfig.network,\n );\n\n if (!SchemeNetworkServer) {\n // Fallback to placeholder implementation if no server registered\n // TODO: Remove this fallback once implementations are registered\n console.warn(\n `No server implementation registered for scheme: ${scheme}, network: ${resourceConfig.network}`,\n );\n return requirements;\n }\n\n // Find the matching supported kind from facilitator\n const supportedKind = this.getSupportedKind(\n x402Version,\n resourceConfig.network,\n SchemeNetworkServer.scheme,\n );\n\n if (!supportedKind) {\n throw new Error(\n `Facilitator does not support ${SchemeNetworkServer.scheme} on ${resourceConfig.network}. ` +\n `Make sure to call initialize() to fetch supported kinds from facilitators.`,\n );\n }\n\n // Get facilitator extensions for this combination\n const facilitatorExtensions = this.getFacilitatorExtensions(\n x402Version,\n resourceConfig.network,\n SchemeNetworkServer.scheme,\n );\n\n // Parse the price using the scheme's price parser\n const parsedPrice = await SchemeNetworkServer.parsePrice(\n resourceConfig.price,\n resourceConfig.network,\n );\n\n // Build base payment requirements from resource config\n const baseRequirements: PaymentRequirements = {\n scheme: SchemeNetworkServer.scheme,\n network: resourceConfig.network,\n amount: parsedPrice.amount,\n asset: parsedPrice.asset,\n payTo: resourceConfig.payTo,\n maxTimeoutSeconds: resourceConfig.maxTimeoutSeconds || 300, // Default 5 minutes\n extra: {\n ...parsedPrice.extra,\n },\n };\n\n // Delegate to the implementation for scheme-specific enhancements\n // Note: enhancePaymentRequirements expects x402Version in the kind, so we add it back\n const requirement = await SchemeNetworkServer.enhancePaymentRequirements(\n baseRequirements,\n {\n ...supportedKind,\n x402Version,\n },\n facilitatorExtensions,\n );\n\n requirements.push(requirement);\n return requirements;\n }\n\n /**\n * Build payment requirements from multiple payment options\n * This method handles resolving dynamic payTo/price functions and builds requirements for each option\n *\n * @param paymentOptions - Array of payment options to convert\n * @param context - HTTP request context for resolving dynamic functions\n * @returns Array of payment requirements (one per option)\n */\n async buildPaymentRequirementsFromOptions<TContext = unknown>(\n paymentOptions: Array<{\n scheme: string;\n payTo: string | ((context: TContext) => string | Promise<string>);\n price: Price | ((context: TContext) => Price | Promise<Price>);\n network: Network;\n maxTimeoutSeconds?: number;\n }>,\n context: TContext,\n ): Promise<PaymentRequirements[]> {\n const allRequirements: PaymentRequirements[] = [];\n\n for (const option of paymentOptions) {\n // Resolve dynamic payTo and price if they are functions\n const resolvedPayTo =\n typeof option.payTo === \"function\" ? await option.payTo(context) : option.payTo;\n const resolvedPrice =\n typeof option.price === \"function\" ? await option.price(context) : option.price;\n\n const resourceConfig: ResourceConfig = {\n scheme: option.scheme,\n payTo: resolvedPayTo,\n price: resolvedPrice,\n network: option.network,\n maxTimeoutSeconds: option.maxTimeoutSeconds,\n };\n\n // Use existing buildPaymentRequirements for each option\n const requirements = await this.buildPaymentRequirements(resourceConfig);\n allRequirements.push(...requirements);\n }\n\n return allRequirements;\n }\n\n /**\n * Create a payment required response\n *\n * @param requirements - Payment requirements\n * @param resourceInfo - Resource information\n * @param error - Error message\n * @param extensions - Optional extensions\n * @returns Payment required response object\n */\n createPaymentRequiredResponse(\n requirements: PaymentRequirements[],\n resourceInfo: ResourceInfo,\n error?: string,\n extensions?: Record<string, unknown>,\n ): PaymentRequired {\n // V2 response with resource at top level\n const response: PaymentRequired = {\n x402Version: 2,\n error,\n resource: resourceInfo,\n accepts: requirements as PaymentRequirements[],\n };\n\n // Add extensions if provided\n if (extensions && Object.keys(extensions).length > 0) {\n response.extensions = extensions;\n }\n\n return response;\n }\n\n /**\n * Verify a payment against requirements\n *\n * @param paymentPayload - The payment payload to verify\n * @param requirements - The payment requirements\n * @returns Verification response\n */\n async verifyPayment(\n paymentPayload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<VerifyResponse> {\n const context: VerifyContext = {\n paymentPayload,\n requirements,\n };\n\n // Execute beforeVerify hooks\n for (const hook of this.beforeVerifyHooks) {\n const result = await hook(context);\n if (result && \"abort\" in result && result.abort) {\n return {\n isValid: false,\n invalidReason: result.reason,\n };\n }\n }\n\n try {\n // Find the facilitator that supports this payment type\n const facilitatorClient = this.getFacilitatorClient(\n paymentPayload.x402Version,\n requirements.network,\n requirements.scheme,\n );\n\n let verifyResult: VerifyResponse;\n\n if (!facilitatorClient) {\n // Fallback: try all facilitators if no specific support found\n let lastError: Error | undefined;\n\n for (const client of this.facilitatorClients) {\n try {\n verifyResult = await client.verify(paymentPayload, requirements);\n break;\n } catch (error) {\n lastError = error as Error;\n }\n }\n\n if (!verifyResult!) {\n throw (\n lastError ||\n new Error(\n `No facilitator supports ${requirements.scheme} on ${requirements.network} for v${paymentPayload.x402Version}`,\n )\n );\n }\n } else {\n // Use the specific facilitator that supports this payment\n verifyResult = await facilitatorClient.verify(paymentPayload, requirements);\n }\n\n // Execute afterVerify hooks\n const resultContext: VerifyResultContext = {\n ...context,\n result: verifyResult,\n };\n\n for (const hook of this.afterVerifyHooks) {\n await hook(resultContext);\n }\n\n return verifyResult;\n } catch (error) {\n const failureContext: VerifyFailureContext = {\n ...context,\n error: error as Error,\n };\n\n // Execute onVerifyFailure hooks\n for (const hook of this.onVerifyFailureHooks) {\n const result = await hook(failureContext);\n if (result && \"recovered\" in result && result.recovered) {\n return result.result;\n }\n }\n\n throw error;\n }\n }\n\n /**\n * Settle a verified payment\n *\n * @param paymentPayload - The payment payload to settle\n * @param requirements - The payment requirements\n * @returns Settlement response\n */\n async settlePayment(\n paymentPayload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<SettleResponse> {\n const context: SettleContext = {\n paymentPayload,\n requirements,\n };\n\n // Execute beforeSettle hooks\n for (const hook of this.beforeSettleHooks) {\n const result = await hook(context);\n if (result && \"abort\" in result && result.abort) {\n throw new Error(`Settlement aborted: ${result.reason}`);\n }\n }\n\n try {\n // Find the facilitator that supports this payment type\n const facilitatorClient = this.getFacilitatorClient(\n paymentPayload.x402Version,\n requirements.network,\n requirements.scheme,\n );\n\n let settleResult: SettleResponse;\n\n if (!facilitatorClient) {\n // Fallback: try all facilitators if no specific support found\n let lastError: Error | undefined;\n\n for (const client of this.facilitatorClients) {\n try {\n settleResult = await client.settle(paymentPayload, requirements);\n break;\n } catch (error) {\n lastError = error as Error;\n }\n }\n\n if (!settleResult!) {\n throw (\n lastError ||\n new Error(\n `No facilitator supports ${requirements.scheme} on ${requirements.network} for v${paymentPayload.x402Version}`,\n )\n );\n }\n } else {\n // Use the specific facilitator that supports this payment\n settleResult = await facilitatorClient.settle(paymentPayload, requirements);\n }\n\n // Execute afterSettle hooks\n const resultContext: SettleResultContext = {\n ...context,\n result: settleResult,\n };\n\n for (const hook of this.afterSettleHooks) {\n await hook(resultContext);\n }\n\n return settleResult;\n } catch (error) {\n const failureContext: SettleFailureContext = {\n ...context,\n error: error as Error,\n };\n\n // Execute onSettleFailure hooks\n for (const hook of this.onSettleFailureHooks) {\n const result = await hook(failureContext);\n if (result && \"recovered\" in result && result.recovered) {\n return result.result;\n }\n }\n\n throw error;\n }\n }\n\n /**\n * Find matching payment requirements for a payment\n *\n * @param availableRequirements - Array of available payment requirements\n * @param paymentPayload - The payment payload\n * @returns Matching payment requirements or undefined\n */\n findMatchingRequirements(\n availableRequirements: PaymentRequirements[],\n paymentPayload: PaymentPayload,\n ): PaymentRequirements | undefined {\n switch (paymentPayload.x402Version) {\n case 2:\n // For v2, match by accepted requirements\n return availableRequirements.find(paymentRequirements =>\n deepEqual(paymentRequirements, paymentPayload.accepted),\n );\n case 1:\n // For v1, match by scheme and network\n return availableRequirements.find(\n req =>\n req.scheme === paymentPayload.accepted.scheme &&\n req.network === paymentPayload.accepted.network,\n );\n default:\n throw new Error(\n `Unsupported x402 version: ${(paymentPayload as PaymentPayload).x402Version}`,\n );\n }\n }\n\n /**\n * Process a payment request\n *\n * @param paymentPayload - Optional payment payload if provided\n * @param resourceConfig - Configuration for the protected resource\n * @param resourceInfo - Information about the resource being accessed\n * @param extensions - Optional extensions to include in the response\n * @returns Processing result\n */\n async processPaymentRequest(\n paymentPayload: PaymentPayload | null,\n resourceConfig: ResourceConfig,\n resourceInfo: ResourceInfo,\n extensions?: Record<string, unknown>,\n ): Promise<{\n success: boolean;\n requiresPayment?: PaymentRequired;\n verificationResult?: VerifyResponse;\n settlementResult?: SettleResponse;\n error?: string;\n }> {\n const requirements = await this.buildPaymentRequirements(resourceConfig);\n\n if (!paymentPayload) {\n return {\n success: false,\n requiresPayment: this.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n \"Payment required\",\n extensions,\n ),\n };\n }\n\n // Find matching requirements\n const matchingRequirements = this.findMatchingRequirements(requirements, paymentPayload);\n if (!matchingRequirements) {\n return {\n success: false,\n requiresPayment: this.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n \"No matching payment requirements found\",\n extensions,\n ),\n };\n }\n\n // Verify payment\n const verificationResult = await this.verifyPayment(paymentPayload, matchingRequirements);\n if (!verificationResult.isValid) {\n return {\n success: false,\n error: verificationResult.invalidReason,\n verificationResult,\n };\n }\n\n // Payment verified, ready for settlement\n return {\n success: true,\n verificationResult,\n };\n }\n\n /**\n * Get facilitator client for a specific version, network, and scheme\n *\n * @param x402Version - The x402 version\n * @param network - The network identifier\n * @param scheme - The payment scheme\n * @returns The facilitator client or undefined if not found\n */\n private getFacilitatorClient(\n x402Version: number,\n network: Network,\n scheme: string,\n ): FacilitatorClient | undefined {\n const versionMap = this.facilitatorClientsMap.get(x402Version);\n if (!versionMap) return undefined;\n\n // Use findByNetworkAndScheme for pattern matching\n return findByNetworkAndScheme(versionMap, scheme, network);\n }\n}\n\nexport default x402ResourceServer;\n"],"mappings":"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","names":["x402Version"]} | ||
| {"version":3,"sources":["../../../src/server/x402ResourceServer.ts"],"sourcesContent":["import {\n SettleError,\n SettleResponse,\n VerifyResponse,\n SupportedResponse,\n SupportedKind,\n} from \"../types/facilitator\";\nimport { PaymentPayload, PaymentRequirements, PaymentRequired } from \"../types/payments\";\nimport { SchemeNetworkServer } from \"../types/mechanisms\";\nimport { Price, Network, ResourceServerExtension, VerifyError } from \"../types\";\nimport { deepEqual, findByNetworkAndScheme } from \"../utils\";\nimport { FacilitatorClient, HTTPFacilitatorClient } from \"../http/httpFacilitatorClient\";\nimport { x402Version } from \"..\";\n\n/**\n * Configuration for a protected resource\n * Only contains payment-specific configuration, not resource metadata\n */\nexport interface ResourceConfig {\n scheme: string;\n payTo: string; // Payment recipient address\n price: Price;\n network: Network;\n maxTimeoutSeconds?: number;\n extra?: Record<string, unknown>; // Scheme-specific additional data\n}\n\n/**\n * Resource information for PaymentRequired response\n */\nexport interface ResourceInfo {\n url: string;\n description: string;\n mimeType: string;\n}\n\n/**\n * Lifecycle Hook Context Interfaces\n */\n\nexport interface PaymentRequiredContext {\n requirements: PaymentRequirements[];\n resourceInfo: ResourceInfo;\n error?: string;\n paymentRequiredResponse: PaymentRequired;\n}\n\nexport interface VerifyContext {\n paymentPayload: PaymentPayload;\n requirements: PaymentRequirements;\n}\n\nexport interface VerifyResultContext extends VerifyContext {\n result: VerifyResponse;\n}\n\nexport interface VerifyFailureContext extends VerifyContext {\n error: Error;\n}\n\nexport interface SettleContext {\n paymentPayload: PaymentPayload;\n requirements: PaymentRequirements;\n}\n\nexport interface SettleResultContext extends SettleContext {\n result: SettleResponse;\n}\n\nexport interface SettleFailureContext extends SettleContext {\n error: Error;\n}\n\n/**\n * Lifecycle Hook Type Definitions\n */\n\nexport type BeforeVerifyHook = (\n context: VerifyContext,\n) => Promise<void | { abort: true; reason: string; message?: string }>;\n\nexport type AfterVerifyHook = (context: VerifyResultContext) => Promise<void>;\n\nexport type OnVerifyFailureHook = (\n context: VerifyFailureContext,\n) => Promise<void | { recovered: true; result: VerifyResponse }>;\n\nexport type BeforeSettleHook = (\n context: SettleContext,\n) => Promise<void | { abort: true; reason: string; message?: string }>;\n\nexport type AfterSettleHook = (context: SettleResultContext) => Promise<void>;\n\nexport type OnSettleFailureHook = (\n context: SettleFailureContext,\n) => Promise<void | { recovered: true; result: SettleResponse }>;\n\n/**\n * Core x402 protocol server for resource protection\n * Transport-agnostic implementation of the x402 payment protocol\n */\nexport class x402ResourceServer {\n private facilitatorClients: FacilitatorClient[];\n private registeredServerSchemes: Map<string, Map<string, SchemeNetworkServer>> = new Map();\n private supportedResponsesMap: Map<number, Map<string, Map<string, SupportedResponse>>> =\n new Map();\n private facilitatorClientsMap: Map<number, Map<string, Map<string, FacilitatorClient>>> =\n new Map();\n private registeredExtensions: Map<string, ResourceServerExtension> = new Map();\n\n private beforeVerifyHooks: BeforeVerifyHook[] = [];\n private afterVerifyHooks: AfterVerifyHook[] = [];\n private onVerifyFailureHooks: OnVerifyFailureHook[] = [];\n private beforeSettleHooks: BeforeSettleHook[] = [];\n private afterSettleHooks: AfterSettleHook[] = [];\n private onSettleFailureHooks: OnSettleFailureHook[] = [];\n\n /**\n * Creates a new x402ResourceServer instance.\n *\n * @param facilitatorClients - Optional facilitator client(s) for payment processing\n */\n constructor(facilitatorClients?: FacilitatorClient | FacilitatorClient[]) {\n // Normalize facilitator clients to array\n if (!facilitatorClients) {\n // No clients provided, create a default HTTP client\n this.facilitatorClients = [new HTTPFacilitatorClient()];\n } else if (Array.isArray(facilitatorClients)) {\n // Array of clients provided\n this.facilitatorClients =\n facilitatorClients.length > 0 ? facilitatorClients : [new HTTPFacilitatorClient()];\n } else {\n // Single client provided\n this.facilitatorClients = [facilitatorClients];\n }\n }\n\n /**\n * Register a scheme/network server implementation.\n *\n * @param network - The network identifier\n * @param server - The scheme/network server implementation\n * @returns The x402ResourceServer instance for chaining\n */\n register(network: Network, server: SchemeNetworkServer): x402ResourceServer {\n if (!this.registeredServerSchemes.has(network)) {\n this.registeredServerSchemes.set(network, new Map());\n }\n\n const serverByScheme = this.registeredServerSchemes.get(network)!;\n if (!serverByScheme.has(server.scheme)) {\n serverByScheme.set(server.scheme, server);\n }\n\n return this;\n }\n\n /**\n * Check if a scheme is registered for a given network.\n *\n * @param network - The network identifier\n * @param scheme - The payment scheme name\n * @returns True if the scheme is registered for the network, false otherwise\n */\n hasRegisteredScheme(network: Network, scheme: string): boolean {\n return !!findByNetworkAndScheme(this.registeredServerSchemes, scheme, network);\n }\n\n /**\n * Registers a resource service extension that can enrich extension declarations.\n *\n * @param extension - The extension to register\n * @returns The x402ResourceServer instance for chaining\n */\n registerExtension(extension: ResourceServerExtension): this {\n this.registeredExtensions.set(extension.key, extension);\n return this;\n }\n\n /**\n * Check if an extension is registered.\n *\n * @param key - The extension key\n * @returns True if the extension is registered\n */\n hasExtension(key: string): boolean {\n return this.registeredExtensions.has(key);\n }\n\n /**\n * Get all registered extensions.\n *\n * @returns Array of registered extensions\n */\n getExtensions(): ResourceServerExtension[] {\n return Array.from(this.registeredExtensions.values());\n }\n\n /**\n * Enriches declared extensions using registered extension hooks.\n *\n * @param declaredExtensions - Extensions declared on the route\n * @param transportContext - Transport-specific context (HTTP, A2A, MCP, etc.)\n * @returns Enriched extensions map\n */\n enrichExtensions(\n declaredExtensions: Record<string, unknown>,\n transportContext: unknown,\n ): Record<string, unknown> {\n const enriched: Record<string, unknown> = {};\n\n for (const [key, declaration] of Object.entries(declaredExtensions)) {\n const extension = this.registeredExtensions.get(key);\n\n if (extension?.enrichDeclaration) {\n enriched[key] = extension.enrichDeclaration(declaration, transportContext);\n } else {\n enriched[key] = declaration;\n }\n }\n\n return enriched;\n }\n\n /**\n * Register a hook to execute before payment verification.\n * Can abort verification by returning { abort: true, reason: string }\n *\n * @param hook - The hook function to register\n * @returns The x402ResourceServer instance for chaining\n */\n onBeforeVerify(hook: BeforeVerifyHook): x402ResourceServer {\n this.beforeVerifyHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute after successful payment verification.\n *\n * @param hook - The hook function to register\n * @returns The x402ResourceServer instance for chaining\n */\n onAfterVerify(hook: AfterVerifyHook): x402ResourceServer {\n this.afterVerifyHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute when payment verification fails.\n * Can recover from failure by returning { recovered: true, result: VerifyResponse }\n *\n * @param hook - The hook function to register\n * @returns The x402ResourceServer instance for chaining\n */\n onVerifyFailure(hook: OnVerifyFailureHook): x402ResourceServer {\n this.onVerifyFailureHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute before payment settlement.\n * Can abort settlement by returning { abort: true, reason: string }\n *\n * @param hook - The hook function to register\n * @returns The x402ResourceServer instance for chaining\n */\n onBeforeSettle(hook: BeforeSettleHook): x402ResourceServer {\n this.beforeSettleHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute after successful payment settlement.\n *\n * @param hook - The hook function to register\n * @returns The x402ResourceServer instance for chaining\n */\n onAfterSettle(hook: AfterSettleHook): x402ResourceServer {\n this.afterSettleHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute when payment settlement fails.\n * Can recover from failure by returning { recovered: true, result: SettleResponse }\n *\n * @param hook - The hook function to register\n * @returns The x402ResourceServer instance for chaining\n */\n onSettleFailure(hook: OnSettleFailureHook): x402ResourceServer {\n this.onSettleFailureHooks.push(hook);\n return this;\n }\n\n /**\n * Initialize by fetching supported kinds from all facilitators\n * Creates mappings for supported responses and facilitator clients\n * Earlier facilitators in the array get precedence\n */\n async initialize(): Promise<void> {\n // Clear existing mappings\n this.supportedResponsesMap.clear();\n this.facilitatorClientsMap.clear();\n\n // Fetch supported kinds from all facilitator clients\n // Process in order to give precedence to earlier facilitators\n for (const facilitatorClient of this.facilitatorClients) {\n try {\n const supported = await facilitatorClient.getSupported();\n\n // Process each supported kind (now flat array with version in each element)\n for (const kind of supported.kinds) {\n const x402Version = kind.x402Version;\n\n // Get or create version map for supported responses\n if (!this.supportedResponsesMap.has(x402Version)) {\n this.supportedResponsesMap.set(x402Version, new Map());\n }\n const responseVersionMap = this.supportedResponsesMap.get(x402Version)!;\n\n // Get or create version map for facilitator clients\n if (!this.facilitatorClientsMap.has(x402Version)) {\n this.facilitatorClientsMap.set(x402Version, new Map());\n }\n const clientVersionMap = this.facilitatorClientsMap.get(x402Version)!;\n\n // Get or create network map for responses\n if (!responseVersionMap.has(kind.network)) {\n responseVersionMap.set(kind.network, new Map());\n }\n const responseNetworkMap = responseVersionMap.get(kind.network)!;\n\n // Get or create network map for clients\n if (!clientVersionMap.has(kind.network)) {\n clientVersionMap.set(kind.network, new Map());\n }\n const clientNetworkMap = clientVersionMap.get(kind.network)!;\n\n // Only store if not already present (gives precedence to earlier facilitators)\n if (!responseNetworkMap.has(kind.scheme)) {\n responseNetworkMap.set(kind.scheme, supported);\n clientNetworkMap.set(kind.scheme, facilitatorClient);\n }\n }\n } catch (error) {\n // Log error but continue with other facilitators\n console.warn(`Failed to fetch supported kinds from facilitator: ${error}`);\n }\n }\n }\n\n /**\n * Get supported kind for a specific version, network, and scheme\n *\n * @param x402Version - The x402 version\n * @param network - The network identifier\n * @param scheme - The payment scheme\n * @returns The supported kind or undefined if not found\n */\n getSupportedKind(\n x402Version: number,\n network: Network,\n scheme: string,\n ): SupportedKind | undefined {\n const versionMap = this.supportedResponsesMap.get(x402Version);\n if (!versionMap) return undefined;\n\n const supportedResponse = findByNetworkAndScheme(versionMap, scheme, network);\n if (!supportedResponse) return undefined;\n\n // Find the specific kind from the response (kinds are flat array with version in each element)\n return supportedResponse.kinds.find(\n kind =>\n kind.x402Version === x402Version && kind.network === network && kind.scheme === scheme,\n );\n }\n\n /**\n * Get facilitator extensions for a specific version, network, and scheme\n *\n * @param x402Version - The x402 version\n * @param network - The network identifier\n * @param scheme - The payment scheme\n * @returns The facilitator extensions or empty array if not found\n */\n getFacilitatorExtensions(x402Version: number, network: Network, scheme: string): string[] {\n const versionMap = this.supportedResponsesMap.get(x402Version);\n if (!versionMap) return [];\n\n const supportedResponse = findByNetworkAndScheme(versionMap, scheme, network);\n return supportedResponse?.extensions || [];\n }\n\n /**\n * Build payment requirements for a protected resource\n *\n * @param resourceConfig - Configuration for the protected resource\n * @returns Array of payment requirements\n */\n async buildPaymentRequirements(resourceConfig: ResourceConfig): Promise<PaymentRequirements[]> {\n const requirements: PaymentRequirements[] = [];\n\n // Find the matching server implementation\n const scheme = resourceConfig.scheme;\n const SchemeNetworkServer = findByNetworkAndScheme(\n this.registeredServerSchemes,\n scheme,\n resourceConfig.network,\n );\n\n if (!SchemeNetworkServer) {\n // Fallback to placeholder implementation if no server registered\n // TODO: Remove this fallback once implementations are registered\n console.warn(\n `No server implementation registered for scheme: ${scheme}, network: ${resourceConfig.network}`,\n );\n return requirements;\n }\n\n // Find the matching supported kind from facilitator\n const supportedKind = this.getSupportedKind(\n x402Version,\n resourceConfig.network,\n SchemeNetworkServer.scheme,\n );\n\n if (!supportedKind) {\n throw new Error(\n `Facilitator does not support ${SchemeNetworkServer.scheme} on ${resourceConfig.network}. ` +\n `Make sure to call initialize() to fetch supported kinds from facilitators.`,\n );\n }\n\n // Get facilitator extensions for this combination\n const facilitatorExtensions = this.getFacilitatorExtensions(\n x402Version,\n resourceConfig.network,\n SchemeNetworkServer.scheme,\n );\n\n // Parse the price using the scheme's price parser\n const parsedPrice = await SchemeNetworkServer.parsePrice(\n resourceConfig.price,\n resourceConfig.network,\n );\n\n // Build base payment requirements from resource config\n const baseRequirements: PaymentRequirements = {\n scheme: SchemeNetworkServer.scheme,\n network: resourceConfig.network,\n amount: parsedPrice.amount,\n asset: parsedPrice.asset,\n payTo: resourceConfig.payTo,\n maxTimeoutSeconds: resourceConfig.maxTimeoutSeconds || 300, // Default 5 minutes\n extra: {\n ...parsedPrice.extra,\n ...resourceConfig.extra, // Merge user-provided extra\n },\n };\n\n // Delegate to the implementation for scheme-specific enhancements\n // Note: enhancePaymentRequirements expects x402Version in the kind, so we add it back\n const requirement = await SchemeNetworkServer.enhancePaymentRequirements(\n baseRequirements,\n {\n ...supportedKind,\n x402Version,\n },\n facilitatorExtensions,\n );\n\n requirements.push(requirement);\n return requirements;\n }\n\n /**\n * Build payment requirements from multiple payment options\n * This method handles resolving dynamic payTo/price functions and builds requirements for each option\n *\n * @param paymentOptions - Array of payment options to convert\n * @param context - HTTP request context for resolving dynamic functions\n * @returns Array of payment requirements (one per option)\n */\n async buildPaymentRequirementsFromOptions<TContext = unknown>(\n paymentOptions: Array<{\n scheme: string;\n payTo: string | ((context: TContext) => string | Promise<string>);\n price: Price | ((context: TContext) => Price | Promise<Price>);\n network: Network;\n maxTimeoutSeconds?: number;\n }>,\n context: TContext,\n ): Promise<PaymentRequirements[]> {\n const allRequirements: PaymentRequirements[] = [];\n\n for (const option of paymentOptions) {\n // Resolve dynamic payTo and price if they are functions\n const resolvedPayTo =\n typeof option.payTo === \"function\" ? await option.payTo(context) : option.payTo;\n const resolvedPrice =\n typeof option.price === \"function\" ? await option.price(context) : option.price;\n\n const resourceConfig: ResourceConfig = {\n scheme: option.scheme,\n payTo: resolvedPayTo,\n price: resolvedPrice,\n network: option.network,\n maxTimeoutSeconds: option.maxTimeoutSeconds,\n };\n\n // Use existing buildPaymentRequirements for each option\n const requirements = await this.buildPaymentRequirements(resourceConfig);\n allRequirements.push(...requirements);\n }\n\n return allRequirements;\n }\n\n /**\n * Create a payment required response\n *\n * @param requirements - Payment requirements\n * @param resourceInfo - Resource information\n * @param error - Error message\n * @param extensions - Optional declared extensions (for per-key enrichment)\n * @returns Payment required response object\n */\n async createPaymentRequiredResponse(\n requirements: PaymentRequirements[],\n resourceInfo: ResourceInfo,\n error?: string,\n extensions?: Record<string, unknown>,\n ): Promise<PaymentRequired> {\n // V2 response with resource at top level\n let response: PaymentRequired = {\n x402Version: 2,\n error,\n resource: resourceInfo,\n accepts: requirements as PaymentRequirements[],\n };\n\n // Add extensions if provided\n if (extensions && Object.keys(extensions).length > 0) {\n response.extensions = extensions;\n }\n\n // Let declared extensions add data to PaymentRequired response\n if (extensions) {\n for (const [key, declaration] of Object.entries(extensions)) {\n const extension = this.registeredExtensions.get(key);\n if (extension?.enrichPaymentRequiredResponse) {\n try {\n const context: PaymentRequiredContext = {\n requirements,\n resourceInfo,\n error,\n paymentRequiredResponse: response,\n };\n const extensionData = await extension.enrichPaymentRequiredResponse(\n declaration,\n context,\n );\n if (extensionData !== undefined) {\n if (!response.extensions) {\n response.extensions = {};\n }\n response.extensions[key] = extensionData;\n }\n } catch (error) {\n console.error(\n `Error in enrichPaymentRequiredResponse hook for extension ${key}:`,\n error,\n );\n }\n }\n }\n }\n\n return response;\n }\n\n /**\n * Verify a payment against requirements\n *\n * @param paymentPayload - The payment payload to verify\n * @param requirements - The payment requirements\n * @returns Verification response\n */\n async verifyPayment(\n paymentPayload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<VerifyResponse> {\n const context: VerifyContext = {\n paymentPayload,\n requirements,\n };\n\n // Execute beforeVerify hooks\n for (const hook of this.beforeVerifyHooks) {\n try {\n const result = await hook(context);\n if (result && \"abort\" in result && result.abort) {\n return {\n isValid: false,\n invalidReason: result.reason,\n invalidMessage: result.message,\n };\n }\n } catch (error) {\n throw new VerifyError(400, {\n isValid: false,\n invalidReason: \"before_verify_hook_error\",\n invalidMessage: error instanceof Error ? error.message : \"\",\n });\n }\n }\n\n try {\n // Find the facilitator that supports this payment type\n const facilitatorClient = this.getFacilitatorClient(\n paymentPayload.x402Version,\n requirements.network,\n requirements.scheme,\n );\n\n let verifyResult: VerifyResponse;\n\n if (!facilitatorClient) {\n // Fallback: try all facilitators if no specific support found\n let lastError: Error | undefined;\n\n for (const client of this.facilitatorClients) {\n try {\n verifyResult = await client.verify(paymentPayload, requirements);\n break;\n } catch (error) {\n lastError = error as Error;\n }\n }\n\n if (!verifyResult!) {\n throw (\n lastError ||\n new Error(\n `No facilitator supports ${requirements.scheme} on ${requirements.network} for v${paymentPayload.x402Version}`,\n )\n );\n }\n } else {\n // Use the specific facilitator that supports this payment\n verifyResult = await facilitatorClient.verify(paymentPayload, requirements);\n }\n\n // Execute afterVerify hooks\n const resultContext: VerifyResultContext = {\n ...context,\n result: verifyResult,\n };\n\n for (const hook of this.afterVerifyHooks) {\n await hook(resultContext);\n }\n\n return verifyResult;\n } catch (error) {\n const failureContext: VerifyFailureContext = {\n ...context,\n error: error as Error,\n };\n\n // Execute onVerifyFailure hooks\n for (const hook of this.onVerifyFailureHooks) {\n const result = await hook(failureContext);\n if (result && \"recovered\" in result && result.recovered) {\n return result.result;\n }\n }\n\n throw error;\n }\n }\n\n /**\n * Settle a verified payment\n *\n * @param paymentPayload - The payment payload to settle\n * @param requirements - The payment requirements\n * @param declaredExtensions - Optional declared extensions (for per-key enrichment)\n * @returns Settlement response\n */\n async settlePayment(\n paymentPayload: PaymentPayload,\n requirements: PaymentRequirements,\n declaredExtensions?: Record<string, unknown>,\n ): Promise<SettleResponse> {\n const context: SettleContext = {\n paymentPayload,\n requirements,\n };\n\n // Execute beforeSettle hooks\n for (const hook of this.beforeSettleHooks) {\n try {\n const result = await hook(context);\n if (result && \"abort\" in result && result.abort) {\n throw new SettleError(400, {\n success: false,\n errorReason: result.reason,\n errorMessage: result.message,\n transaction: \"\",\n network: requirements.network,\n });\n }\n } catch (error) {\n throw new SettleError(400, {\n success: false,\n errorReason: \"before_settle_hook_error\",\n errorMessage: error instanceof Error ? error.message : \"\",\n transaction: \"\",\n network: requirements.network,\n });\n }\n }\n\n try {\n // Find the facilitator that supports this payment type\n const facilitatorClient = this.getFacilitatorClient(\n paymentPayload.x402Version,\n requirements.network,\n requirements.scheme,\n );\n\n let settleResult: SettleResponse;\n\n if (!facilitatorClient) {\n // Fallback: try all facilitators if no specific support found\n let lastError: Error | undefined;\n\n for (const client of this.facilitatorClients) {\n try {\n settleResult = await client.settle(paymentPayload, requirements);\n break;\n } catch (error) {\n lastError = error as Error;\n }\n }\n\n if (!settleResult!) {\n throw (\n lastError ||\n new Error(\n `No facilitator supports ${requirements.scheme} on ${requirements.network} for v${paymentPayload.x402Version}`,\n )\n );\n }\n } else {\n // Use the specific facilitator that supports this payment\n settleResult = await facilitatorClient.settle(paymentPayload, requirements);\n }\n\n // Execute afterSettle hooks\n const resultContext: SettleResultContext = {\n ...context,\n result: settleResult,\n };\n\n for (const hook of this.afterSettleHooks) {\n await hook(resultContext);\n }\n\n // Let declared extensions add data to settlement response\n if (declaredExtensions) {\n for (const [key, declaration] of Object.entries(declaredExtensions)) {\n const extension = this.registeredExtensions.get(key);\n if (extension?.enrichSettlementResponse) {\n try {\n const extensionData = await extension.enrichSettlementResponse(\n declaration,\n resultContext,\n );\n if (extensionData !== undefined) {\n if (!settleResult.extensions) {\n settleResult.extensions = {};\n }\n settleResult.extensions[key] = extensionData;\n }\n } catch (error) {\n console.error(`Error in enrichSettlementResponse hook for extension ${key}:`, error);\n }\n }\n }\n }\n\n return settleResult;\n } catch (error) {\n const failureContext: SettleFailureContext = {\n ...context,\n error: error as Error,\n };\n\n // Execute onSettleFailure hooks\n for (const hook of this.onSettleFailureHooks) {\n const result = await hook(failureContext);\n if (result && \"recovered\" in result && result.recovered) {\n return result.result;\n }\n }\n\n throw error;\n }\n }\n\n /**\n * Find matching payment requirements for a payment\n *\n * @param availableRequirements - Array of available payment requirements\n * @param paymentPayload - The payment payload\n * @returns Matching payment requirements or undefined\n */\n findMatchingRequirements(\n availableRequirements: PaymentRequirements[],\n paymentPayload: PaymentPayload,\n ): PaymentRequirements | undefined {\n switch (paymentPayload.x402Version) {\n case 2:\n // For v2, match by accepted requirements\n return availableRequirements.find(paymentRequirements =>\n deepEqual(paymentRequirements, paymentPayload.accepted),\n );\n case 1:\n // For v1, match by scheme and network\n return availableRequirements.find(\n req =>\n req.scheme === paymentPayload.accepted.scheme &&\n req.network === paymentPayload.accepted.network,\n );\n default:\n throw new Error(\n `Unsupported x402 version: ${(paymentPayload as PaymentPayload).x402Version}`,\n );\n }\n }\n\n /**\n * Process a payment request\n *\n * @param paymentPayload - Optional payment payload if provided\n * @param resourceConfig - Configuration for the protected resource\n * @param resourceInfo - Information about the resource being accessed\n * @param extensions - Optional extensions to include in the response\n * @returns Processing result\n */\n async processPaymentRequest(\n paymentPayload: PaymentPayload | null,\n resourceConfig: ResourceConfig,\n resourceInfo: ResourceInfo,\n extensions?: Record<string, unknown>,\n ): Promise<{\n success: boolean;\n requiresPayment?: PaymentRequired;\n verificationResult?: VerifyResponse;\n settlementResult?: SettleResponse;\n error?: string;\n }> {\n const requirements = await this.buildPaymentRequirements(resourceConfig);\n\n if (!paymentPayload) {\n return {\n success: false,\n requiresPayment: await this.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n \"Payment required\",\n extensions,\n ),\n };\n }\n\n // Find matching requirements\n const matchingRequirements = this.findMatchingRequirements(requirements, paymentPayload);\n if (!matchingRequirements) {\n return {\n success: false,\n requiresPayment: await this.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n \"No matching payment requirements found\",\n extensions,\n ),\n };\n }\n\n // Verify payment\n const verificationResult = await this.verifyPayment(paymentPayload, matchingRequirements);\n if (!verificationResult.isValid) {\n return {\n success: false,\n error: verificationResult.invalidReason,\n verificationResult,\n };\n }\n\n // Payment verified, ready for settlement\n return {\n success: true,\n verificationResult,\n };\n }\n\n /**\n * Get facilitator client for a specific version, network, and scheme\n *\n * @param x402Version - The x402 version\n * @param network - The network identifier\n * @param scheme - The payment scheme\n * @returns The facilitator client or undefined if not found\n */\n private getFacilitatorClient(\n x402Version: number,\n network: Network,\n scheme: string,\n ): FacilitatorClient | undefined {\n const versionMap = this.facilitatorClientsMap.get(x402Version);\n if (!versionMap) return undefined;\n\n // Use findByNetworkAndScheme for pattern matching\n return findByNetworkAndScheme(versionMap, scheme, network);\n }\n}\n\nexport default x402ResourceServer;\n"],"mappings":"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","names":["x402Version","error"]} |
@@ -1,1 +0,1 @@ | ||
| export { A as AssetAmount, M as Money, t as MoneyParser, N as Network, P as PaymentPayload, k as PaymentPayloadV1, c as PaymentRequired, j as PaymentRequiredV1, a as PaymentRequirements, i as PaymentRequirementsV1, h as Price, R as ResourceServerExtension, d as SchemeNetworkClient, b as SchemeNetworkFacilitator, f as SchemeNetworkServer, s as SettleError, q as SettleRequest, S as SettleResponse, e as SupportedResponse, r as VerifyError, p as VerifyRequest, V as VerifyResponse } from '../mechanisms-CzuGzYsS.mjs'; | ||
| export { A as AssetAmount, M as Money, p as MoneyParser, N as Network, P as PaymentPayload, q as PaymentPayloadResult, i as PaymentPayloadV1, c as PaymentRequired, r as PaymentRequiredContext, j as PaymentRequiredV1, a as PaymentRequirements, k as PaymentRequirementsV1, h as Price, s as ResourceInfo, t as ResourceServerExtension, e as SchemeNetworkClient, b as SchemeNetworkFacilitator, u as SchemeNetworkServer, v as SettleError, w as SettleRequest, S as SettleResponse, g as SettleResultContext, y as SupportedResponse, z as VerifyError, B as VerifyRequest, V as VerifyResponse } from '../mechanisms-CP6q1k8-.mjs'; |
| import { | ||
| SettleError, | ||
| VerifyError | ||
| } from "../chunk-X4W4S5RB.mjs"; | ||
| } from "../chunk-L2RJI3BI.mjs"; | ||
| import "../chunk-BJTO5JO5.mjs"; | ||
@@ -6,0 +6,0 @@ export { |
@@ -1,1 +0,1 @@ | ||
| export { k as PaymentPayloadV1, j as PaymentRequiredV1, i as PaymentRequirementsV1, m as SettleRequestV1, n as SettleResponseV1, o as SupportedResponseV1, l as VerifyRequestV1 } from '../../mechanisms-CzuGzYsS.mjs'; | ||
| export { i as PaymentPayloadV1, j as PaymentRequiredV1, k as PaymentRequirementsV1, l as SettleRequestV1, m as SettleResponseV1, n as SupportedResponseV1, o as VerifyRequestV1 } from '../../mechanisms-CP6q1k8-.mjs'; |
@@ -1,2 +0,2 @@ | ||
| import { N as Network } from '../mechanisms-CzuGzYsS.mjs'; | ||
| import { N as Network } from '../mechanisms-CP6q1k8-.mjs'; | ||
@@ -3,0 +3,0 @@ /** |
+11
-1
| { | ||
| "name": "@x402/core", | ||
| "version": "2.2.0", | ||
| "version": "2.3.0", | ||
| "main": "./dist/cjs/index.js", | ||
@@ -112,2 +112,12 @@ "module": "./dist/esm/index.js", | ||
| } | ||
| }, | ||
| "./schemas": { | ||
| "import": { | ||
| "types": "./dist/esm/schemas/index.d.mts", | ||
| "default": "./dist/esm/schemas/index.mjs" | ||
| }, | ||
| "require": { | ||
| "types": "./dist/cjs/schemas/index.d.ts", | ||
| "default": "./dist/cjs/schemas/index.js" | ||
| } | ||
| } | ||
@@ -114,0 +124,0 @@ }, |
| type PaymentRequirementsV1 = { | ||
| scheme: string; | ||
| network: Network; | ||
| maxAmountRequired: string; | ||
| resource: string; | ||
| description: string; | ||
| mimeType: string; | ||
| outputSchema: Record<string, unknown>; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| extra: Record<string, unknown>; | ||
| }; | ||
| type PaymentRequiredV1 = { | ||
| x402Version: 1; | ||
| error?: string; | ||
| accepts: PaymentRequirementsV1[]; | ||
| }; | ||
| type PaymentPayloadV1 = { | ||
| x402Version: 1; | ||
| scheme: string; | ||
| network: Network; | ||
| payload: Record<string, unknown>; | ||
| }; | ||
| type VerifyRequestV1 = { | ||
| paymentPayload: PaymentPayloadV1; | ||
| paymentRequirements: PaymentRequirementsV1; | ||
| }; | ||
| type SettleRequestV1 = { | ||
| paymentPayload: PaymentPayloadV1; | ||
| paymentRequirements: PaymentRequirementsV1; | ||
| }; | ||
| type SettleResponseV1 = { | ||
| success: boolean; | ||
| errorReason?: string; | ||
| payer?: string; | ||
| transaction: string; | ||
| network: Network; | ||
| }; | ||
| type SupportedResponseV1 = { | ||
| kinds: { | ||
| x402Version: number; | ||
| scheme: string; | ||
| network: Network; | ||
| extra?: Record<string, unknown>; | ||
| }[]; | ||
| }; | ||
| interface ResourceServerExtension { | ||
| key: string; | ||
| enrichDeclaration?: (declaration: unknown, transportContext: unknown) => unknown; | ||
| } | ||
| type Network = `${string}:${string}`; | ||
| type Money = string | number; | ||
| type AssetAmount = { | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown>; | ||
| }; | ||
| type Price = Money | AssetAmount; | ||
| interface ResourceInfo { | ||
| url: string; | ||
| description: string; | ||
| mimeType: string; | ||
| } | ||
| type PaymentRequirements = { | ||
| scheme: string; | ||
| network: Network; | ||
| asset: string; | ||
| amount: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| extra: Record<string, unknown>; | ||
| }; | ||
| type PaymentRequired = { | ||
| x402Version: number; | ||
| error?: string; | ||
| resource: ResourceInfo; | ||
| accepts: PaymentRequirements[]; | ||
| extensions?: Record<string, unknown>; | ||
| }; | ||
| type PaymentPayload = { | ||
| x402Version: number; | ||
| resource: ResourceInfo; | ||
| accepted: PaymentRequirements; | ||
| payload: Record<string, unknown>; | ||
| extensions?: Record<string, unknown>; | ||
| }; | ||
| type VerifyRequest = { | ||
| paymentPayload: PaymentPayload; | ||
| paymentRequirements: PaymentRequirements; | ||
| }; | ||
| type VerifyResponse = { | ||
| isValid: boolean; | ||
| invalidReason?: string; | ||
| payer?: string; | ||
| }; | ||
| type SettleRequest = { | ||
| paymentPayload: PaymentPayload; | ||
| paymentRequirements: PaymentRequirements; | ||
| }; | ||
| type SettleResponse = { | ||
| success: boolean; | ||
| errorReason?: string; | ||
| payer?: string; | ||
| transaction: string; | ||
| network: Network; | ||
| }; | ||
| type SupportedKind = { | ||
| x402Version: number; | ||
| scheme: string; | ||
| network: Network; | ||
| extra?: Record<string, unknown>; | ||
| }; | ||
| type SupportedResponse = { | ||
| kinds: SupportedKind[]; | ||
| extensions: string[]; | ||
| signers: Record<string, string[]>; | ||
| }; | ||
| /** | ||
| * Error thrown when payment verification fails. | ||
| */ | ||
| declare class VerifyError extends Error { | ||
| readonly invalidReason?: string; | ||
| readonly payer?: string; | ||
| readonly statusCode: number; | ||
| /** | ||
| * Creates a VerifyError from a failed verification response. | ||
| * | ||
| * @param statusCode - HTTP status code from the facilitator | ||
| * @param response - The verify response containing error details | ||
| */ | ||
| constructor(statusCode: number, response: VerifyResponse); | ||
| } | ||
| /** | ||
| * Error thrown when payment settlement fails. | ||
| */ | ||
| declare class SettleError extends Error { | ||
| readonly errorReason?: string; | ||
| readonly payer?: string; | ||
| readonly transaction: string; | ||
| readonly network: Network; | ||
| readonly statusCode: number; | ||
| /** | ||
| * Creates a SettleError from a failed settlement response. | ||
| * | ||
| * @param statusCode - HTTP status code from the facilitator | ||
| * @param response - The settle response containing error details | ||
| */ | ||
| constructor(statusCode: number, response: SettleResponse); | ||
| } | ||
| /** | ||
| * Money parser function that converts a numeric amount to an AssetAmount | ||
| * Receives the amount as a decimal number (e.g., 1.50 for $1.50) | ||
| * Returns null to indicate "cannot handle this amount", causing fallback to next parser | ||
| * Always returns a Promise for consistency - use async/await | ||
| * | ||
| * @param amount - The decimal amount (e.g., 1.50) | ||
| * @param network - The network identifier for context | ||
| * @returns AssetAmount or null to try next parser | ||
| */ | ||
| type MoneyParser = (amount: number, network: Network) => Promise<AssetAmount | null>; | ||
| interface SchemeNetworkClient { | ||
| readonly scheme: string; | ||
| createPaymentPayload(x402Version: number, paymentRequirements: PaymentRequirements): Promise<Pick<PaymentPayload, "x402Version" | "payload">>; | ||
| } | ||
| interface SchemeNetworkFacilitator { | ||
| readonly scheme: string; | ||
| /** | ||
| * CAIP family pattern that this facilitator supports. | ||
| * Used to group signers by blockchain family in the supported response. | ||
| * | ||
| * @example | ||
| * // EVM facilitators | ||
| * readonly caipFamily = "eip155:*"; | ||
| * | ||
| * @example | ||
| * // SVM facilitators | ||
| * readonly caipFamily = "solana:*"; | ||
| */ | ||
| readonly caipFamily: string; | ||
| /** | ||
| * Get mechanism-specific extra data needed for the supported kinds endpoint. | ||
| * This method is called when building the facilitator's supported response. | ||
| * | ||
| * @param network - The network identifier for context | ||
| * @returns Extra data object or undefined if no extra data is needed | ||
| * | ||
| * @example | ||
| * // EVM schemes return undefined (no extra data needed) | ||
| * getExtra(network: Network): undefined { | ||
| * return undefined; | ||
| * } | ||
| * | ||
| * @example | ||
| * // SVM schemes return feePayer address | ||
| * getExtra(network: Network): Record<string, unknown> | undefined { | ||
| * return { feePayer: this.signer.address }; | ||
| * } | ||
| */ | ||
| getExtra(network: Network): Record<string, unknown> | undefined; | ||
| /** | ||
| * Get signer addresses used by this facilitator for a given network. | ||
| * These are included in the supported response to help clients understand | ||
| * which addresses might sign/pay for transactions. | ||
| * | ||
| * Supports multiple addresses for load balancing, key rotation, and high availability. | ||
| * | ||
| * @param network - The network identifier | ||
| * @returns Array of signer addresses (wallet addresses, fee payer addresses, etc.) | ||
| * | ||
| * @example | ||
| * // EVM facilitator | ||
| * getSigners(network: string): string[] { | ||
| * return [...this.signer.getAddresses()]; | ||
| * } | ||
| * | ||
| * @example | ||
| * // SVM facilitator | ||
| * getSigners(network: string): string[] { | ||
| * return [...this.signer.getAddresses()]; | ||
| * } | ||
| */ | ||
| getSigners(network: string): string[]; | ||
| verify(payload: PaymentPayload, requirements: PaymentRequirements): Promise<VerifyResponse>; | ||
| settle(payload: PaymentPayload, requirements: PaymentRequirements): Promise<SettleResponse>; | ||
| } | ||
| interface SchemeNetworkServer { | ||
| readonly scheme: string; | ||
| /** | ||
| * Convert a user-friendly price to the scheme's specific amount and asset format | ||
| * Always returns a Promise for consistency | ||
| * | ||
| * @param price - User-friendly price (e.g., "$0.10", "0.10", { amount: "100000", asset: "USDC" }) | ||
| * @param network - The network identifier for context | ||
| * @returns Promise that resolves to the converted amount, asset identifier, and any extra metadata | ||
| * | ||
| * @example | ||
| * // For EVM networks with USDC: | ||
| * await parsePrice("$0.10", "eip155:8453") => { amount: "100000", asset: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913" } | ||
| * | ||
| * // For custom schemes: | ||
| * await parsePrice("10 points", "custom:network") => { amount: "10", asset: "points" } | ||
| */ | ||
| parsePrice(price: Price, network: Network): Promise<AssetAmount>; | ||
| /** | ||
| * Build payment requirements for this scheme/network combination | ||
| * | ||
| * @param paymentRequirements - Base payment requirements with amount/asset already set | ||
| * @param supportedKind - The supported kind from facilitator's /supported endpoint | ||
| * @param supportedKind.x402Version - The x402 version | ||
| * @param supportedKind.scheme - The payment scheme | ||
| * @param supportedKind.network - The network identifier | ||
| * @param supportedKind.extra - Optional extra metadata | ||
| * @param facilitatorExtensions - Extensions supported by the facilitator | ||
| * @returns Enhanced payment requirements ready to be sent to clients | ||
| */ | ||
| enhancePaymentRequirements(paymentRequirements: PaymentRequirements, supportedKind: { | ||
| x402Version: number; | ||
| scheme: string; | ||
| network: Network; | ||
| extra?: Record<string, unknown>; | ||
| }, facilitatorExtensions: string[]): Promise<PaymentRequirements>; | ||
| } | ||
| export { type AssetAmount as A, type Money as M, type Network as N, type PaymentPayload as P, type ResourceServerExtension as R, type SettleResponse as S, type VerifyResponse as V, type PaymentRequirements as a, type SchemeNetworkFacilitator as b, type PaymentRequired as c, type SchemeNetworkClient as d, type SupportedResponse as e, type SchemeNetworkServer as f, type SupportedKind as g, type Price as h, type PaymentRequirementsV1 as i, type PaymentRequiredV1 as j, type PaymentPayloadV1 as k, type VerifyRequestV1 as l, type SettleRequestV1 as m, type SettleResponseV1 as n, type SupportedResponseV1 as o, type VerifyRequest as p, type SettleRequest as q, VerifyError as r, SettleError as s, type MoneyParser as t }; |
| import { P as PaymentPayload, a as PaymentRequirements, V as VerifyResponse, S as SettleResponse, e as SupportedResponse, N as Network, f as SchemeNetworkServer, R as ResourceServerExtension, g as SupportedKind, h as Price, c as PaymentRequired } from './mechanisms-CzuGzYsS.js'; | ||
| interface FacilitatorConfig { | ||
| url?: string; | ||
| createAuthHeaders?: () => Promise<{ | ||
| verify: Record<string, string>; | ||
| settle: Record<string, string>; | ||
| supported: Record<string, string>; | ||
| }>; | ||
| } | ||
| /** | ||
| * Interface for facilitator clients | ||
| * Can be implemented for HTTP-based or local facilitators | ||
| */ | ||
| interface FacilitatorClient { | ||
| /** | ||
| * Verify a payment with the facilitator | ||
| * | ||
| * @param paymentPayload - The payment to verify | ||
| * @param paymentRequirements - The requirements to verify against | ||
| * @returns Verification response | ||
| */ | ||
| verify(paymentPayload: PaymentPayload, paymentRequirements: PaymentRequirements): Promise<VerifyResponse>; | ||
| /** | ||
| * Settle a payment with the facilitator | ||
| * | ||
| * @param paymentPayload - The payment to settle | ||
| * @param paymentRequirements - The requirements for settlement | ||
| * @returns Settlement response | ||
| */ | ||
| settle(paymentPayload: PaymentPayload, paymentRequirements: PaymentRequirements): Promise<SettleResponse>; | ||
| /** | ||
| * Get supported payment kinds and extensions from the facilitator | ||
| * | ||
| * @returns Supported payment kinds and extensions | ||
| */ | ||
| getSupported(): Promise<SupportedResponse>; | ||
| } | ||
| /** | ||
| * HTTP-based client for interacting with x402 facilitator services | ||
| * Handles HTTP communication with facilitator endpoints | ||
| */ | ||
| declare class HTTPFacilitatorClient implements FacilitatorClient { | ||
| readonly url: string; | ||
| private readonly _createAuthHeaders?; | ||
| /** | ||
| * Creates a new HTTPFacilitatorClient instance. | ||
| * | ||
| * @param config - Configuration options for the facilitator client | ||
| */ | ||
| constructor(config?: FacilitatorConfig); | ||
| /** | ||
| * Verify a payment with the facilitator | ||
| * | ||
| * @param paymentPayload - The payment to verify | ||
| * @param paymentRequirements - The requirements to verify against | ||
| * @returns Verification response | ||
| */ | ||
| verify(paymentPayload: PaymentPayload, paymentRequirements: PaymentRequirements): Promise<VerifyResponse>; | ||
| /** | ||
| * Settle a payment with the facilitator | ||
| * | ||
| * @param paymentPayload - The payment to settle | ||
| * @param paymentRequirements - The requirements for settlement | ||
| * @returns Settlement response | ||
| */ | ||
| settle(paymentPayload: PaymentPayload, paymentRequirements: PaymentRequirements): Promise<SettleResponse>; | ||
| /** | ||
| * Get supported payment kinds and extensions from the facilitator | ||
| * | ||
| * @returns Supported payment kinds and extensions | ||
| */ | ||
| getSupported(): Promise<SupportedResponse>; | ||
| /** | ||
| * Creates authentication headers for a specific path. | ||
| * | ||
| * @param path - The path to create authentication headers for (e.g., "verify", "settle", "supported") | ||
| * @returns An object containing the authentication headers for the specified path | ||
| */ | ||
| createAuthHeaders(path: string): Promise<{ | ||
| headers: Record<string, string>; | ||
| }>; | ||
| /** | ||
| * Helper to convert objects to JSON-safe format. | ||
| * Handles BigInt and other non-JSON types. | ||
| * | ||
| * @param obj - The object to convert | ||
| * @returns The JSON-safe representation of the object | ||
| */ | ||
| private toJsonSafe; | ||
| } | ||
| /** | ||
| * Configuration for a protected resource | ||
| * Only contains payment-specific configuration, not resource metadata | ||
| */ | ||
| interface ResourceConfig { | ||
| scheme: string; | ||
| payTo: string; | ||
| price: Price; | ||
| network: Network; | ||
| maxTimeoutSeconds?: number; | ||
| } | ||
| /** | ||
| * Resource information for PaymentRequired response | ||
| */ | ||
| interface ResourceInfo { | ||
| url: string; | ||
| description: string; | ||
| mimeType: string; | ||
| } | ||
| /** | ||
| * Lifecycle Hook Context Interfaces | ||
| */ | ||
| interface VerifyContext { | ||
| paymentPayload: PaymentPayload; | ||
| requirements: PaymentRequirements; | ||
| } | ||
| interface VerifyResultContext extends VerifyContext { | ||
| result: VerifyResponse; | ||
| } | ||
| interface VerifyFailureContext extends VerifyContext { | ||
| error: Error; | ||
| } | ||
| interface SettleContext { | ||
| paymentPayload: PaymentPayload; | ||
| requirements: PaymentRequirements; | ||
| } | ||
| interface SettleResultContext extends SettleContext { | ||
| result: SettleResponse; | ||
| } | ||
| interface SettleFailureContext extends SettleContext { | ||
| error: Error; | ||
| } | ||
| /** | ||
| * Lifecycle Hook Type Definitions | ||
| */ | ||
| type BeforeVerifyHook = (context: VerifyContext) => Promise<void | { | ||
| abort: true; | ||
| reason: string; | ||
| }>; | ||
| type AfterVerifyHook = (context: VerifyResultContext) => Promise<void>; | ||
| type OnVerifyFailureHook = (context: VerifyFailureContext) => Promise<void | { | ||
| recovered: true; | ||
| result: VerifyResponse; | ||
| }>; | ||
| type BeforeSettleHook = (context: SettleContext) => Promise<void | { | ||
| abort: true; | ||
| reason: string; | ||
| }>; | ||
| type AfterSettleHook = (context: SettleResultContext) => Promise<void>; | ||
| type OnSettleFailureHook = (context: SettleFailureContext) => Promise<void | { | ||
| recovered: true; | ||
| result: SettleResponse; | ||
| }>; | ||
| /** | ||
| * Core x402 protocol server for resource protection | ||
| * Transport-agnostic implementation of the x402 payment protocol | ||
| */ | ||
| declare class x402ResourceServer { | ||
| private facilitatorClients; | ||
| private registeredServerSchemes; | ||
| private supportedResponsesMap; | ||
| private facilitatorClientsMap; | ||
| private registeredExtensions; | ||
| private beforeVerifyHooks; | ||
| private afterVerifyHooks; | ||
| private onVerifyFailureHooks; | ||
| private beforeSettleHooks; | ||
| private afterSettleHooks; | ||
| private onSettleFailureHooks; | ||
| /** | ||
| * Creates a new x402ResourceServer instance. | ||
| * | ||
| * @param facilitatorClients - Optional facilitator client(s) for payment processing | ||
| */ | ||
| constructor(facilitatorClients?: FacilitatorClient | FacilitatorClient[]); | ||
| /** | ||
| * Register a scheme/network server implementation. | ||
| * | ||
| * @param network - The network identifier | ||
| * @param server - The scheme/network server implementation | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| register(network: Network, server: SchemeNetworkServer): x402ResourceServer; | ||
| /** | ||
| * Check if a scheme is registered for a given network. | ||
| * | ||
| * @param network - The network identifier | ||
| * @param scheme - The payment scheme name | ||
| * @returns True if the scheme is registered for the network, false otherwise | ||
| */ | ||
| hasRegisteredScheme(network: Network, scheme: string): boolean; | ||
| /** | ||
| * Registers a resource service extension that can enrich extension declarations. | ||
| * | ||
| * @param extension - The extension to register | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| registerExtension(extension: ResourceServerExtension): this; | ||
| /** | ||
| * Enriches declared extensions using registered extension hooks. | ||
| * | ||
| * @param declaredExtensions - Extensions declared on the route | ||
| * @param transportContext - Transport-specific context (HTTP, A2A, MCP, etc.) | ||
| * @returns Enriched extensions map | ||
| */ | ||
| enrichExtensions(declaredExtensions: Record<string, unknown>, transportContext: unknown): Record<string, unknown>; | ||
| /** | ||
| * Register a hook to execute before payment verification. | ||
| * Can abort verification by returning { abort: true, reason: string } | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| onBeforeVerify(hook: BeforeVerifyHook): x402ResourceServer; | ||
| /** | ||
| * Register a hook to execute after successful payment verification. | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| onAfterVerify(hook: AfterVerifyHook): x402ResourceServer; | ||
| /** | ||
| * Register a hook to execute when payment verification fails. | ||
| * Can recover from failure by returning { recovered: true, result: VerifyResponse } | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| onVerifyFailure(hook: OnVerifyFailureHook): x402ResourceServer; | ||
| /** | ||
| * Register a hook to execute before payment settlement. | ||
| * Can abort settlement by returning { abort: true, reason: string } | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| onBeforeSettle(hook: BeforeSettleHook): x402ResourceServer; | ||
| /** | ||
| * Register a hook to execute after successful payment settlement. | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| onAfterSettle(hook: AfterSettleHook): x402ResourceServer; | ||
| /** | ||
| * Register a hook to execute when payment settlement fails. | ||
| * Can recover from failure by returning { recovered: true, result: SettleResponse } | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| onSettleFailure(hook: OnSettleFailureHook): x402ResourceServer; | ||
| /** | ||
| * Initialize by fetching supported kinds from all facilitators | ||
| * Creates mappings for supported responses and facilitator clients | ||
| * Earlier facilitators in the array get precedence | ||
| */ | ||
| initialize(): Promise<void>; | ||
| /** | ||
| * Get supported kind for a specific version, network, and scheme | ||
| * | ||
| * @param x402Version - The x402 version | ||
| * @param network - The network identifier | ||
| * @param scheme - The payment scheme | ||
| * @returns The supported kind or undefined if not found | ||
| */ | ||
| getSupportedKind(x402Version: number, network: Network, scheme: string): SupportedKind | undefined; | ||
| /** | ||
| * Get facilitator extensions for a specific version, network, and scheme | ||
| * | ||
| * @param x402Version - The x402 version | ||
| * @param network - The network identifier | ||
| * @param scheme - The payment scheme | ||
| * @returns The facilitator extensions or empty array if not found | ||
| */ | ||
| getFacilitatorExtensions(x402Version: number, network: Network, scheme: string): string[]; | ||
| /** | ||
| * Build payment requirements for a protected resource | ||
| * | ||
| * @param resourceConfig - Configuration for the protected resource | ||
| * @returns Array of payment requirements | ||
| */ | ||
| buildPaymentRequirements(resourceConfig: ResourceConfig): Promise<PaymentRequirements[]>; | ||
| /** | ||
| * Build payment requirements from multiple payment options | ||
| * This method handles resolving dynamic payTo/price functions and builds requirements for each option | ||
| * | ||
| * @param paymentOptions - Array of payment options to convert | ||
| * @param context - HTTP request context for resolving dynamic functions | ||
| * @returns Array of payment requirements (one per option) | ||
| */ | ||
| buildPaymentRequirementsFromOptions<TContext = unknown>(paymentOptions: Array<{ | ||
| scheme: string; | ||
| payTo: string | ((context: TContext) => string | Promise<string>); | ||
| price: Price | ((context: TContext) => Price | Promise<Price>); | ||
| network: Network; | ||
| maxTimeoutSeconds?: number; | ||
| }>, context: TContext): Promise<PaymentRequirements[]>; | ||
| /** | ||
| * Create a payment required response | ||
| * | ||
| * @param requirements - Payment requirements | ||
| * @param resourceInfo - Resource information | ||
| * @param error - Error message | ||
| * @param extensions - Optional extensions | ||
| * @returns Payment required response object | ||
| */ | ||
| createPaymentRequiredResponse(requirements: PaymentRequirements[], resourceInfo: ResourceInfo, error?: string, extensions?: Record<string, unknown>): PaymentRequired; | ||
| /** | ||
| * Verify a payment against requirements | ||
| * | ||
| * @param paymentPayload - The payment payload to verify | ||
| * @param requirements - The payment requirements | ||
| * @returns Verification response | ||
| */ | ||
| verifyPayment(paymentPayload: PaymentPayload, requirements: PaymentRequirements): Promise<VerifyResponse>; | ||
| /** | ||
| * Settle a verified payment | ||
| * | ||
| * @param paymentPayload - The payment payload to settle | ||
| * @param requirements - The payment requirements | ||
| * @returns Settlement response | ||
| */ | ||
| settlePayment(paymentPayload: PaymentPayload, requirements: PaymentRequirements): Promise<SettleResponse>; | ||
| /** | ||
| * Find matching payment requirements for a payment | ||
| * | ||
| * @param availableRequirements - Array of available payment requirements | ||
| * @param paymentPayload - The payment payload | ||
| * @returns Matching payment requirements or undefined | ||
| */ | ||
| findMatchingRequirements(availableRequirements: PaymentRequirements[], paymentPayload: PaymentPayload): PaymentRequirements | undefined; | ||
| /** | ||
| * Process a payment request | ||
| * | ||
| * @param paymentPayload - Optional payment payload if provided | ||
| * @param resourceConfig - Configuration for the protected resource | ||
| * @param resourceInfo - Information about the resource being accessed | ||
| * @param extensions - Optional extensions to include in the response | ||
| * @returns Processing result | ||
| */ | ||
| processPaymentRequest(paymentPayload: PaymentPayload | null, resourceConfig: ResourceConfig, resourceInfo: ResourceInfo, extensions?: Record<string, unknown>): Promise<{ | ||
| success: boolean; | ||
| requiresPayment?: PaymentRequired; | ||
| verificationResult?: VerifyResponse; | ||
| settlementResult?: SettleResponse; | ||
| error?: string; | ||
| }>; | ||
| /** | ||
| * Get facilitator client for a specific version, network, and scheme | ||
| * | ||
| * @param x402Version - The x402 version | ||
| * @param network - The network identifier | ||
| * @param scheme - The payment scheme | ||
| * @returns The facilitator client or undefined if not found | ||
| */ | ||
| private getFacilitatorClient; | ||
| } | ||
| /** | ||
| * Framework-agnostic HTTP adapter interface | ||
| * Implementations provide framework-specific HTTP operations | ||
| */ | ||
| interface HTTPAdapter { | ||
| getHeader(name: string): string | undefined; | ||
| getMethod(): string; | ||
| getPath(): string; | ||
| getUrl(): string; | ||
| getAcceptHeader(): string; | ||
| getUserAgent(): string; | ||
| /** | ||
| * Get query parameters from the request URL | ||
| * | ||
| * @returns Record of query parameter key-value pairs | ||
| */ | ||
| getQueryParams?(): Record<string, string | string[]>; | ||
| /** | ||
| * Get a specific query parameter by name | ||
| * | ||
| * @param name - The query parameter name | ||
| * @returns The query parameter value(s) or undefined | ||
| */ | ||
| getQueryParam?(name: string): string | string[] | undefined; | ||
| /** | ||
| * Get the parsed request body | ||
| * Framework adapters should parse JSON/form data appropriately | ||
| * | ||
| * @returns The parsed request body | ||
| */ | ||
| getBody?(): unknown; | ||
| } | ||
| /** | ||
| * Paywall configuration for HTML responses | ||
| */ | ||
| interface PaywallConfig { | ||
| appName?: string; | ||
| appLogo?: string; | ||
| sessionTokenEndpoint?: string; | ||
| currentUrl?: string; | ||
| testnet?: boolean; | ||
| } | ||
| /** | ||
| * Paywall provider interface for generating HTML | ||
| */ | ||
| interface PaywallProvider { | ||
| generateHtml(paymentRequired: PaymentRequired, config?: PaywallConfig): string; | ||
| } | ||
| /** | ||
| * Dynamic payTo function that receives HTTP request context | ||
| */ | ||
| type DynamicPayTo = (context: HTTPRequestContext) => string | Promise<string>; | ||
| /** | ||
| * Dynamic price function that receives HTTP request context | ||
| */ | ||
| type DynamicPrice = (context: HTTPRequestContext) => Price | Promise<Price>; | ||
| /** | ||
| * Result of the unpaid response callback containing content type and body. | ||
| */ | ||
| interface UnpaidResponseResult { | ||
| /** | ||
| * The content type for the response (e.g., 'application/json', 'text/plain'). | ||
| */ | ||
| contentType: string; | ||
| /** | ||
| * The response body to include in the 402 response. | ||
| */ | ||
| body: unknown; | ||
| } | ||
| /** | ||
| * Dynamic function to generate a custom response for unpaid requests. | ||
| * Receives the HTTP request context and returns the content type and body to include in the 402 response. | ||
| */ | ||
| type UnpaidResponseBody = (context: HTTPRequestContext) => UnpaidResponseResult | Promise<UnpaidResponseResult>; | ||
| /** | ||
| * A single payment option for a route | ||
| * Represents one way a client can pay for access to the resource | ||
| */ | ||
| interface PaymentOption { | ||
| scheme: string; | ||
| payTo: string | DynamicPayTo; | ||
| price: Price | DynamicPrice; | ||
| network: Network; | ||
| maxTimeoutSeconds?: number; | ||
| extra?: Record<string, unknown>; | ||
| } | ||
| /** | ||
| * Route configuration for HTTP endpoints | ||
| * | ||
| * The 'accepts' field defines payment options for the route. | ||
| * Can be a single PaymentOption or an array of PaymentOptions for multiple payment methods. | ||
| */ | ||
| interface RouteConfig { | ||
| accepts: PaymentOption | PaymentOption[]; | ||
| resource?: string; | ||
| description?: string; | ||
| mimeType?: string; | ||
| customPaywallHtml?: string; | ||
| /** | ||
| * Optional callback to generate a custom response for unpaid API requests. | ||
| * This allows servers to return preview data, error messages, or other content | ||
| * when a request lacks payment. | ||
| * | ||
| * For browser requests (Accept: text/html), the paywall HTML takes precedence. | ||
| * This callback is only used for API clients. | ||
| * | ||
| * If not provided, defaults to { contentType: 'application/json', body: {} }. | ||
| * | ||
| * @param context - The HTTP request context | ||
| * @returns An object containing both contentType and body for the 402 response | ||
| */ | ||
| unpaidResponseBody?: UnpaidResponseBody; | ||
| extensions?: Record<string, unknown>; | ||
| } | ||
| /** | ||
| * Routes configuration - maps path patterns to route configs | ||
| */ | ||
| type RoutesConfig = Record<string, RouteConfig> | RouteConfig; | ||
| /** | ||
| * Compiled route for efficient matching | ||
| */ | ||
| interface CompiledRoute { | ||
| verb: string; | ||
| regex: RegExp; | ||
| config: RouteConfig; | ||
| } | ||
| /** | ||
| * HTTP request context that encapsulates all request data | ||
| */ | ||
| interface HTTPRequestContext { | ||
| adapter: HTTPAdapter; | ||
| path: string; | ||
| method: string; | ||
| paymentHeader?: string; | ||
| } | ||
| /** | ||
| * HTTP response instructions for the framework middleware | ||
| */ | ||
| interface HTTPResponseInstructions { | ||
| status: number; | ||
| headers: Record<string, string>; | ||
| body?: unknown; | ||
| isHtml?: boolean; | ||
| } | ||
| /** | ||
| * Result of processing an HTTP request for payment | ||
| */ | ||
| type HTTPProcessResult = { | ||
| type: "no-payment-required"; | ||
| } | { | ||
| type: "payment-verified"; | ||
| paymentPayload: PaymentPayload; | ||
| paymentRequirements: PaymentRequirements; | ||
| } | { | ||
| type: "payment-error"; | ||
| response: HTTPResponseInstructions; | ||
| }; | ||
| /** | ||
| * Result of processSettlement | ||
| */ | ||
| type ProcessSettleSuccessResponse = SettleResponse & { | ||
| success: true; | ||
| headers: Record<string, string>; | ||
| requirements: PaymentRequirements; | ||
| }; | ||
| type ProcessSettleFailureResponse = SettleResponse & { | ||
| success: false; | ||
| errorReason: string; | ||
| }; | ||
| type ProcessSettleResultResponse = ProcessSettleSuccessResponse | ProcessSettleFailureResponse; | ||
| /** | ||
| * Represents a validation error for a specific route's payment configuration. | ||
| */ | ||
| interface RouteValidationError { | ||
| /** The route pattern (e.g., "GET /api/weather") */ | ||
| routePattern: string; | ||
| /** The payment scheme that failed validation */ | ||
| scheme: string; | ||
| /** The network that failed validation */ | ||
| network: Network; | ||
| /** The type of validation failure */ | ||
| reason: "missing_scheme" | "missing_facilitator"; | ||
| /** Human-readable error message */ | ||
| message: string; | ||
| } | ||
| /** | ||
| * Error thrown when route configuration validation fails. | ||
| */ | ||
| declare class RouteConfigurationError extends Error { | ||
| /** The validation errors that caused this exception */ | ||
| readonly errors: RouteValidationError[]; | ||
| /** | ||
| * Creates a new RouteConfigurationError with the given validation errors. | ||
| * | ||
| * @param errors - The validation errors that caused this exception. | ||
| */ | ||
| constructor(errors: RouteValidationError[]); | ||
| } | ||
| /** | ||
| * HTTP-enhanced x402 resource server | ||
| * Provides framework-agnostic HTTP protocol handling | ||
| */ | ||
| declare class x402HTTPResourceServer { | ||
| private ResourceServer; | ||
| private compiledRoutes; | ||
| private routesConfig; | ||
| private paywallProvider?; | ||
| /** | ||
| * Creates a new x402HTTPResourceServer instance. | ||
| * | ||
| * @param ResourceServer - The core x402ResourceServer instance to use | ||
| * @param routes - Route configuration for payment-protected endpoints | ||
| */ | ||
| constructor(ResourceServer: x402ResourceServer, routes: RoutesConfig); | ||
| /** | ||
| * Initialize the HTTP resource server. | ||
| * | ||
| * This method initializes the underlying resource server (fetching facilitator support) | ||
| * and then validates that all route payment configurations have corresponding | ||
| * registered schemes and facilitator support. | ||
| * | ||
| * @throws RouteConfigurationError if any route's payment options don't have | ||
| * corresponding registered schemes or facilitator support | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const httpServer = new x402HTTPResourceServer(server, routes); | ||
| * await httpServer.initialize(); | ||
| * ``` | ||
| */ | ||
| initialize(): Promise<void>; | ||
| /** | ||
| * Register a custom paywall provider for generating HTML | ||
| * | ||
| * @param provider - PaywallProvider instance | ||
| * @returns This service instance for chaining | ||
| */ | ||
| registerPaywallProvider(provider: PaywallProvider): this; | ||
| /** | ||
| * Process HTTP request and return response instructions | ||
| * This is the main entry point for framework middleware | ||
| * | ||
| * @param context - HTTP request context | ||
| * @param paywallConfig - Optional paywall configuration | ||
| * @returns Process result indicating next action for middleware | ||
| */ | ||
| processHTTPRequest(context: HTTPRequestContext, paywallConfig?: PaywallConfig): Promise<HTTPProcessResult>; | ||
| /** | ||
| * Process settlement after successful response | ||
| * | ||
| * @param paymentPayload - The verified payment payload | ||
| * @param requirements - The matching payment requirements | ||
| * @returns ProcessSettleResultResponse - SettleResponse with headers if success or errorReason if failure | ||
| */ | ||
| processSettlement(paymentPayload: PaymentPayload, requirements: PaymentRequirements): Promise<ProcessSettleResultResponse>; | ||
| /** | ||
| * Check if a request requires payment based on route configuration | ||
| * | ||
| * @param context - HTTP request context | ||
| * @returns True if the route requires payment, false otherwise | ||
| */ | ||
| requiresPayment(context: HTTPRequestContext): boolean; | ||
| /** | ||
| * Normalizes a RouteConfig's accepts field into an array of PaymentOptions | ||
| * Handles both single PaymentOption and array formats | ||
| * | ||
| * @param routeConfig - Route configuration | ||
| * @returns Array of payment options | ||
| */ | ||
| private normalizePaymentOptions; | ||
| /** | ||
| * Validates that all payment options in routes have corresponding registered schemes | ||
| * and facilitator support. | ||
| * | ||
| * @returns Array of validation errors (empty if all routes are valid) | ||
| */ | ||
| private validateRouteConfiguration; | ||
| /** | ||
| * Get route configuration for a request | ||
| * | ||
| * @param path - Request path | ||
| * @param method - HTTP method | ||
| * @returns Route configuration or undefined if no match | ||
| */ | ||
| private getRouteConfig; | ||
| /** | ||
| * Extract payment from HTTP headers (handles v1 and v2) | ||
| * | ||
| * @param adapter - HTTP adapter | ||
| * @returns Decoded payment payload or null | ||
| */ | ||
| private extractPayment; | ||
| /** | ||
| * Check if request is from a web browser | ||
| * | ||
| * @param adapter - HTTP adapter | ||
| * @returns True if request appears to be from a browser | ||
| */ | ||
| private isWebBrowser; | ||
| /** | ||
| * Create HTTP response instructions from payment required | ||
| * | ||
| * @param paymentRequired - Payment requirements | ||
| * @param isWebBrowser - Whether request is from browser | ||
| * @param paywallConfig - Paywall configuration | ||
| * @param customHtml - Custom HTML template | ||
| * @param unpaidResponse - Optional custom response (content type and body) for unpaid API requests | ||
| * @returns Response instructions | ||
| */ | ||
| private createHTTPResponse; | ||
| /** | ||
| * Create HTTP payment required response (v1 puts in body, v2 puts in header) | ||
| * | ||
| * @param paymentRequired - Payment required object | ||
| * @returns Headers and body for the HTTP response | ||
| */ | ||
| private createHTTPPaymentRequiredResponse; | ||
| /** | ||
| * Create settlement response headers | ||
| * | ||
| * @param settleResponse - Settlement response | ||
| * @returns Headers to add to response | ||
| */ | ||
| private createSettlementHeaders; | ||
| /** | ||
| * Parse route pattern into verb and regex | ||
| * | ||
| * @param pattern - Route pattern like "GET /api/*" or "/api/[id]" | ||
| * @returns Parsed pattern with verb and regex | ||
| */ | ||
| private parseRoutePattern; | ||
| /** | ||
| * Normalize path for matching | ||
| * | ||
| * @param path - Raw path from request | ||
| * @returns Normalized path | ||
| */ | ||
| private normalizePath; | ||
| /** | ||
| * Generate paywall HTML for browser requests | ||
| * | ||
| * @param paymentRequired - Payment required response | ||
| * @param paywallConfig - Optional paywall configuration | ||
| * @param customHtml - Optional custom HTML template | ||
| * @returns HTML string | ||
| */ | ||
| private generatePaywallHTML; | ||
| /** | ||
| * Extract display amount from payment requirements. | ||
| * | ||
| * @param paymentRequired - The payment required object | ||
| * @returns The display amount in decimal format | ||
| */ | ||
| private getDisplayAmount; | ||
| } | ||
| export { type CompiledRoute as C, type DynamicPayTo as D, type FacilitatorClient as F, type HTTPAdapter as H, type PaywallConfig as P, type RouteConfig as R, type UnpaidResponseBody as U, type HTTPRequestContext as a, type HTTPResponseInstructions as b, type HTTPProcessResult as c, type PaywallProvider as d, type PaymentOption as e, type RoutesConfig as f, type DynamicPrice as g, type UnpaidResponseResult as h, type ProcessSettleResultResponse as i, type ProcessSettleSuccessResponse as j, type ProcessSettleFailureResponse as k, type RouteValidationError as l, RouteConfigurationError as m, HTTPFacilitatorClient as n, type FacilitatorConfig as o, x402ResourceServer as p, type ResourceConfig as q, type ResourceInfo as r, x402HTTPResourceServer as x }; |
| import { | ||
| x402Version | ||
| } from "./chunk-VE37GDG2.mjs"; | ||
| import { | ||
| SettleError, | ||
| VerifyError | ||
| } from "./chunk-X4W4S5RB.mjs"; | ||
| import { | ||
| Base64EncodedRegex, | ||
| safeBase64Decode, | ||
| safeBase64Encode | ||
| } from "./chunk-TDLQZ6MP.mjs"; | ||
| import { | ||
| __require | ||
| } from "./chunk-BJTO5JO5.mjs"; | ||
| // src/http/x402HTTPResourceServer.ts | ||
| var RouteConfigurationError = class extends Error { | ||
| /** | ||
| * Creates a new RouteConfigurationError with the given validation errors. | ||
| * | ||
| * @param errors - The validation errors that caused this exception. | ||
| */ | ||
| constructor(errors) { | ||
| const message = `x402 Route Configuration Errors: | ||
| ${errors.map((e) => ` - ${e.message}`).join("\n")}`; | ||
| super(message); | ||
| this.name = "RouteConfigurationError"; | ||
| this.errors = errors; | ||
| } | ||
| }; | ||
| var x402HTTPResourceServer = class { | ||
| /** | ||
| * Creates a new x402HTTPResourceServer instance. | ||
| * | ||
| * @param ResourceServer - The core x402ResourceServer instance to use | ||
| * @param routes - Route configuration for payment-protected endpoints | ||
| */ | ||
| constructor(ResourceServer, routes) { | ||
| this.compiledRoutes = []; | ||
| this.ResourceServer = ResourceServer; | ||
| this.routesConfig = routes; | ||
| const normalizedRoutes = typeof routes === "object" && !("accepts" in routes) ? routes : { "*": routes }; | ||
| for (const [pattern, config] of Object.entries(normalizedRoutes)) { | ||
| const parsed = this.parseRoutePattern(pattern); | ||
| this.compiledRoutes.push({ | ||
| verb: parsed.verb, | ||
| regex: parsed.regex, | ||
| config | ||
| }); | ||
| } | ||
| } | ||
| /** | ||
| * Initialize the HTTP resource server. | ||
| * | ||
| * This method initializes the underlying resource server (fetching facilitator support) | ||
| * and then validates that all route payment configurations have corresponding | ||
| * registered schemes and facilitator support. | ||
| * | ||
| * @throws RouteConfigurationError if any route's payment options don't have | ||
| * corresponding registered schemes or facilitator support | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const httpServer = new x402HTTPResourceServer(server, routes); | ||
| * await httpServer.initialize(); | ||
| * ``` | ||
| */ | ||
| async initialize() { | ||
| await this.ResourceServer.initialize(); | ||
| const errors = this.validateRouteConfiguration(); | ||
| if (errors.length > 0) { | ||
| throw new RouteConfigurationError(errors); | ||
| } | ||
| } | ||
| /** | ||
| * Register a custom paywall provider for generating HTML | ||
| * | ||
| * @param provider - PaywallProvider instance | ||
| * @returns This service instance for chaining | ||
| */ | ||
| registerPaywallProvider(provider) { | ||
| this.paywallProvider = provider; | ||
| return this; | ||
| } | ||
| /** | ||
| * Process HTTP request and return response instructions | ||
| * This is the main entry point for framework middleware | ||
| * | ||
| * @param context - HTTP request context | ||
| * @param paywallConfig - Optional paywall configuration | ||
| * @returns Process result indicating next action for middleware | ||
| */ | ||
| async processHTTPRequest(context, paywallConfig) { | ||
| const { adapter, path, method } = context; | ||
| const routeConfig = this.getRouteConfig(path, method); | ||
| if (!routeConfig) { | ||
| return { type: "no-payment-required" }; | ||
| } | ||
| const paymentOptions = this.normalizePaymentOptions(routeConfig); | ||
| const paymentPayload = this.extractPayment(adapter); | ||
| const resourceInfo = { | ||
| url: routeConfig.resource || context.adapter.getUrl(), | ||
| description: routeConfig.description || "", | ||
| mimeType: routeConfig.mimeType || "" | ||
| }; | ||
| const requirements = await this.ResourceServer.buildPaymentRequirementsFromOptions( | ||
| paymentOptions, | ||
| context | ||
| ); | ||
| let extensions = routeConfig.extensions; | ||
| if (extensions) { | ||
| extensions = this.ResourceServer.enrichExtensions(extensions, context); | ||
| } | ||
| const paymentRequired = this.ResourceServer.createPaymentRequiredResponse( | ||
| requirements, | ||
| resourceInfo, | ||
| !paymentPayload ? "Payment required" : void 0, | ||
| extensions | ||
| ); | ||
| if (!paymentPayload) { | ||
| const unpaidBody = routeConfig.unpaidResponseBody ? await routeConfig.unpaidResponseBody(context) : void 0; | ||
| return { | ||
| type: "payment-error", | ||
| response: this.createHTTPResponse( | ||
| paymentRequired, | ||
| this.isWebBrowser(adapter), | ||
| paywallConfig, | ||
| routeConfig.customPaywallHtml, | ||
| unpaidBody | ||
| ) | ||
| }; | ||
| } | ||
| try { | ||
| const matchingRequirements = this.ResourceServer.findMatchingRequirements( | ||
| paymentRequired.accepts, | ||
| paymentPayload | ||
| ); | ||
| if (!matchingRequirements) { | ||
| const errorResponse = this.ResourceServer.createPaymentRequiredResponse( | ||
| requirements, | ||
| resourceInfo, | ||
| "No matching payment requirements", | ||
| routeConfig.extensions | ||
| ); | ||
| return { | ||
| type: "payment-error", | ||
| response: this.createHTTPResponse(errorResponse, false, paywallConfig) | ||
| }; | ||
| } | ||
| const verifyResult = await this.ResourceServer.verifyPayment( | ||
| paymentPayload, | ||
| matchingRequirements | ||
| ); | ||
| if (!verifyResult.isValid) { | ||
| const errorResponse = this.ResourceServer.createPaymentRequiredResponse( | ||
| requirements, | ||
| resourceInfo, | ||
| verifyResult.invalidReason, | ||
| routeConfig.extensions | ||
| ); | ||
| return { | ||
| type: "payment-error", | ||
| response: this.createHTTPResponse(errorResponse, false, paywallConfig) | ||
| }; | ||
| } | ||
| return { | ||
| type: "payment-verified", | ||
| paymentPayload, | ||
| paymentRequirements: matchingRequirements | ||
| }; | ||
| } catch (error) { | ||
| const errorResponse = this.ResourceServer.createPaymentRequiredResponse( | ||
| requirements, | ||
| resourceInfo, | ||
| error instanceof Error ? error.message : "Payment verification failed", | ||
| routeConfig.extensions | ||
| ); | ||
| return { | ||
| type: "payment-error", | ||
| response: this.createHTTPResponse(errorResponse, false, paywallConfig) | ||
| }; | ||
| } | ||
| } | ||
| /** | ||
| * Process settlement after successful response | ||
| * | ||
| * @param paymentPayload - The verified payment payload | ||
| * @param requirements - The matching payment requirements | ||
| * @returns ProcessSettleResultResponse - SettleResponse with headers if success or errorReason if failure | ||
| */ | ||
| async processSettlement(paymentPayload, requirements) { | ||
| try { | ||
| const settleResponse = await this.ResourceServer.settlePayment(paymentPayload, requirements); | ||
| if (!settleResponse.success) { | ||
| return { | ||
| ...settleResponse, | ||
| success: false, | ||
| errorReason: settleResponse.errorReason || "Settlement failed" | ||
| }; | ||
| } | ||
| return { | ||
| ...settleResponse, | ||
| success: true, | ||
| headers: this.createSettlementHeaders(settleResponse), | ||
| requirements | ||
| }; | ||
| } catch (error) { | ||
| if (error instanceof SettleError) { | ||
| return { | ||
| success: false, | ||
| errorReason: error.errorReason || error.message, | ||
| payer: error.payer, | ||
| network: error.network, | ||
| transaction: error.transaction | ||
| }; | ||
| } | ||
| return { | ||
| success: false, | ||
| errorReason: error instanceof Error ? error.message : "Settlement failed", | ||
| network: requirements.network, | ||
| transaction: "" | ||
| }; | ||
| } | ||
| } | ||
| /** | ||
| * Check if a request requires payment based on route configuration | ||
| * | ||
| * @param context - HTTP request context | ||
| * @returns True if the route requires payment, false otherwise | ||
| */ | ||
| requiresPayment(context) { | ||
| const routeConfig = this.getRouteConfig(context.path, context.method); | ||
| return routeConfig !== void 0; | ||
| } | ||
| /** | ||
| * Normalizes a RouteConfig's accepts field into an array of PaymentOptions | ||
| * Handles both single PaymentOption and array formats | ||
| * | ||
| * @param routeConfig - Route configuration | ||
| * @returns Array of payment options | ||
| */ | ||
| normalizePaymentOptions(routeConfig) { | ||
| return Array.isArray(routeConfig.accepts) ? routeConfig.accepts : [routeConfig.accepts]; | ||
| } | ||
| /** | ||
| * Validates that all payment options in routes have corresponding registered schemes | ||
| * and facilitator support. | ||
| * | ||
| * @returns Array of validation errors (empty if all routes are valid) | ||
| */ | ||
| validateRouteConfiguration() { | ||
| const errors = []; | ||
| const normalizedRoutes = typeof this.routesConfig === "object" && !("accepts" in this.routesConfig) ? Object.entries(this.routesConfig) : [["*", this.routesConfig]]; | ||
| for (const [pattern, config] of normalizedRoutes) { | ||
| const paymentOptions = this.normalizePaymentOptions(config); | ||
| for (const option of paymentOptions) { | ||
| if (!this.ResourceServer.hasRegisteredScheme(option.network, option.scheme)) { | ||
| errors.push({ | ||
| routePattern: pattern, | ||
| scheme: option.scheme, | ||
| network: option.network, | ||
| reason: "missing_scheme", | ||
| message: `Route "${pattern}": No scheme implementation registered for "${option.scheme}" on network "${option.network}"` | ||
| }); | ||
| continue; | ||
| } | ||
| const supportedKind = this.ResourceServer.getSupportedKind( | ||
| x402Version, | ||
| option.network, | ||
| option.scheme | ||
| ); | ||
| if (!supportedKind) { | ||
| errors.push({ | ||
| routePattern: pattern, | ||
| scheme: option.scheme, | ||
| network: option.network, | ||
| reason: "missing_facilitator", | ||
| message: `Route "${pattern}": Facilitator does not support scheme "${option.scheme}" on network "${option.network}"` | ||
| }); | ||
| } | ||
| } | ||
| } | ||
| return errors; | ||
| } | ||
| /** | ||
| * Get route configuration for a request | ||
| * | ||
| * @param path - Request path | ||
| * @param method - HTTP method | ||
| * @returns Route configuration or undefined if no match | ||
| */ | ||
| getRouteConfig(path, method) { | ||
| const normalizedPath = this.normalizePath(path); | ||
| const upperMethod = method.toUpperCase(); | ||
| const matchingRoute = this.compiledRoutes.find( | ||
| (route) => route.regex.test(normalizedPath) && (route.verb === "*" || route.verb === upperMethod) | ||
| ); | ||
| return matchingRoute?.config; | ||
| } | ||
| /** | ||
| * Extract payment from HTTP headers (handles v1 and v2) | ||
| * | ||
| * @param adapter - HTTP adapter | ||
| * @returns Decoded payment payload or null | ||
| */ | ||
| extractPayment(adapter) { | ||
| const header = adapter.getHeader("payment-signature") || adapter.getHeader("PAYMENT-SIGNATURE"); | ||
| if (header) { | ||
| try { | ||
| return decodePaymentSignatureHeader(header); | ||
| } catch (error) { | ||
| console.warn("Failed to decode PAYMENT-SIGNATURE header:", error); | ||
| } | ||
| } | ||
| return null; | ||
| } | ||
| /** | ||
| * Check if request is from a web browser | ||
| * | ||
| * @param adapter - HTTP adapter | ||
| * @returns True if request appears to be from a browser | ||
| */ | ||
| isWebBrowser(adapter) { | ||
| const accept = adapter.getAcceptHeader(); | ||
| const userAgent = adapter.getUserAgent(); | ||
| return accept.includes("text/html") && userAgent.includes("Mozilla"); | ||
| } | ||
| /** | ||
| * Create HTTP response instructions from payment required | ||
| * | ||
| * @param paymentRequired - Payment requirements | ||
| * @param isWebBrowser - Whether request is from browser | ||
| * @param paywallConfig - Paywall configuration | ||
| * @param customHtml - Custom HTML template | ||
| * @param unpaidResponse - Optional custom response (content type and body) for unpaid API requests | ||
| * @returns Response instructions | ||
| */ | ||
| createHTTPResponse(paymentRequired, isWebBrowser, paywallConfig, customHtml, unpaidResponse) { | ||
| if (isWebBrowser) { | ||
| const html = this.generatePaywallHTML(paymentRequired, paywallConfig, customHtml); | ||
| return { | ||
| status: 402, | ||
| headers: { "Content-Type": "text/html" }, | ||
| body: html, | ||
| isHtml: true | ||
| }; | ||
| } | ||
| const response = this.createHTTPPaymentRequiredResponse(paymentRequired); | ||
| const contentType = unpaidResponse ? unpaidResponse.contentType : "application/json"; | ||
| const body = unpaidResponse ? unpaidResponse.body : {}; | ||
| return { | ||
| status: 402, | ||
| headers: { | ||
| "Content-Type": contentType, | ||
| ...response.headers | ||
| }, | ||
| body | ||
| }; | ||
| } | ||
| /** | ||
| * Create HTTP payment required response (v1 puts in body, v2 puts in header) | ||
| * | ||
| * @param paymentRequired - Payment required object | ||
| * @returns Headers and body for the HTTP response | ||
| */ | ||
| createHTTPPaymentRequiredResponse(paymentRequired) { | ||
| return { | ||
| headers: { | ||
| "PAYMENT-REQUIRED": encodePaymentRequiredHeader(paymentRequired) | ||
| } | ||
| }; | ||
| } | ||
| /** | ||
| * Create settlement response headers | ||
| * | ||
| * @param settleResponse - Settlement response | ||
| * @returns Headers to add to response | ||
| */ | ||
| createSettlementHeaders(settleResponse) { | ||
| const encoded = encodePaymentResponseHeader(settleResponse); | ||
| return { "PAYMENT-RESPONSE": encoded }; | ||
| } | ||
| /** | ||
| * Parse route pattern into verb and regex | ||
| * | ||
| * @param pattern - Route pattern like "GET /api/*" or "/api/[id]" | ||
| * @returns Parsed pattern with verb and regex | ||
| */ | ||
| parseRoutePattern(pattern) { | ||
| const [verb, path] = pattern.includes(" ") ? pattern.split(/\s+/) : ["*", pattern]; | ||
| const regex = new RegExp( | ||
| `^${path.replace(/[$()+.?^{|}]/g, "\\$&").replace(/\*/g, ".*?").replace(/\[([^\]]+)\]/g, "[^/]+").replace(/\//g, "\\/")}$`, | ||
| "i" | ||
| ); | ||
| return { verb: verb.toUpperCase(), regex }; | ||
| } | ||
| /** | ||
| * Normalize path for matching | ||
| * | ||
| * @param path - Raw path from request | ||
| * @returns Normalized path | ||
| */ | ||
| normalizePath(path) { | ||
| try { | ||
| const pathWithoutQuery = path.split(/[?#]/)[0]; | ||
| const decodedPath = decodeURIComponent(pathWithoutQuery); | ||
| return decodedPath.replace(/\\/g, "/").replace(/\/+/g, "/").replace(/(.+?)\/+$/, "$1"); | ||
| } catch { | ||
| return path; | ||
| } | ||
| } | ||
| /** | ||
| * Generate paywall HTML for browser requests | ||
| * | ||
| * @param paymentRequired - Payment required response | ||
| * @param paywallConfig - Optional paywall configuration | ||
| * @param customHtml - Optional custom HTML template | ||
| * @returns HTML string | ||
| */ | ||
| generatePaywallHTML(paymentRequired, paywallConfig, customHtml) { | ||
| if (customHtml) { | ||
| return customHtml; | ||
| } | ||
| if (this.paywallProvider) { | ||
| return this.paywallProvider.generateHtml(paymentRequired, paywallConfig); | ||
| } | ||
| try { | ||
| const paywall = __require("@x402/paywall"); | ||
| const displayAmount2 = this.getDisplayAmount(paymentRequired); | ||
| const resource2 = paymentRequired.resource; | ||
| return paywall.getPaywallHtml({ | ||
| amount: displayAmount2, | ||
| paymentRequired, | ||
| currentUrl: resource2?.url || paywallConfig?.currentUrl || "", | ||
| testnet: paywallConfig?.testnet ?? true, | ||
| appName: paywallConfig?.appName, | ||
| appLogo: paywallConfig?.appLogo, | ||
| sessionTokenEndpoint: paywallConfig?.sessionTokenEndpoint | ||
| }); | ||
| } catch { | ||
| } | ||
| const resource = paymentRequired.resource; | ||
| const displayAmount = this.getDisplayAmount(paymentRequired); | ||
| return ` | ||
| <!DOCTYPE html> | ||
| <html> | ||
| <head> | ||
| <title>Payment Required</title> | ||
| <meta charset="UTF-8"> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||
| </head> | ||
| <body> | ||
| <div style="max-width: 600px; margin: 50px auto; padding: 20px; font-family: system-ui, -apple-system, sans-serif;"> | ||
| ${paywallConfig?.appLogo ? `<img src="${paywallConfig.appLogo}" alt="${paywallConfig.appName || "App"}" style="max-width: 200px; margin-bottom: 20px;">` : ""} | ||
| <h1>Payment Required</h1> | ||
| ${resource ? `<p><strong>Resource:</strong> ${resource.description || resource.url}</p>` : ""} | ||
| <p><strong>Amount:</strong> $${displayAmount.toFixed(2)} USDC</p> | ||
| <div id="payment-widget" | ||
| data-requirements='${JSON.stringify(paymentRequired)}' | ||
| data-app-name="${paywallConfig?.appName || ""}" | ||
| data-testnet="${paywallConfig?.testnet || false}"> | ||
| <!-- Install @x402/paywall for full wallet integration --> | ||
| <p style="margin-top: 2rem; padding: 1rem; background: #fef3c7; border-radius: 0.5rem;"> | ||
| <strong>Note:</strong> Install <code>@x402/paywall</code> for full wallet connection and payment UI. | ||
| </p> | ||
| </div> | ||
| </div> | ||
| </body> | ||
| </html> | ||
| `; | ||
| } | ||
| /** | ||
| * Extract display amount from payment requirements. | ||
| * | ||
| * @param paymentRequired - The payment required object | ||
| * @returns The display amount in decimal format | ||
| */ | ||
| getDisplayAmount(paymentRequired) { | ||
| const accepts = paymentRequired.accepts; | ||
| if (accepts && accepts.length > 0) { | ||
| const firstReq = accepts[0]; | ||
| if ("amount" in firstReq) { | ||
| return parseFloat(firstReq.amount) / 1e6; | ||
| } | ||
| } | ||
| return 0; | ||
| } | ||
| }; | ||
| // src/http/httpFacilitatorClient.ts | ||
| var DEFAULT_FACILITATOR_URL = "https://x402.org/facilitator"; | ||
| var HTTPFacilitatorClient = class { | ||
| /** | ||
| * Creates a new HTTPFacilitatorClient instance. | ||
| * | ||
| * @param config - Configuration options for the facilitator client | ||
| */ | ||
| constructor(config) { | ||
| this.url = config?.url || DEFAULT_FACILITATOR_URL; | ||
| this._createAuthHeaders = config?.createAuthHeaders; | ||
| } | ||
| /** | ||
| * Verify a payment with the facilitator | ||
| * | ||
| * @param paymentPayload - The payment to verify | ||
| * @param paymentRequirements - The requirements to verify against | ||
| * @returns Verification response | ||
| */ | ||
| async verify(paymentPayload, paymentRequirements) { | ||
| let headers = { | ||
| "Content-Type": "application/json" | ||
| }; | ||
| if (this._createAuthHeaders) { | ||
| const authHeaders = await this.createAuthHeaders("verify"); | ||
| headers = { ...headers, ...authHeaders.headers }; | ||
| } | ||
| const response = await fetch(`${this.url}/verify`, { | ||
| method: "POST", | ||
| headers, | ||
| body: JSON.stringify({ | ||
| x402Version: paymentPayload.x402Version, | ||
| paymentPayload: this.toJsonSafe(paymentPayload), | ||
| paymentRequirements: this.toJsonSafe(paymentRequirements) | ||
| }) | ||
| }); | ||
| const data = await response.json(); | ||
| if (typeof data === "object" && data !== null && "isValid" in data) { | ||
| const verifyResponse = data; | ||
| if (!response.ok) { | ||
| throw new VerifyError(response.status, verifyResponse); | ||
| } | ||
| return verifyResponse; | ||
| } | ||
| throw new Error(`Facilitator verify failed (${response.status}): ${JSON.stringify(data)}`); | ||
| } | ||
| /** | ||
| * Settle a payment with the facilitator | ||
| * | ||
| * @param paymentPayload - The payment to settle | ||
| * @param paymentRequirements - The requirements for settlement | ||
| * @returns Settlement response | ||
| */ | ||
| async settle(paymentPayload, paymentRequirements) { | ||
| let headers = { | ||
| "Content-Type": "application/json" | ||
| }; | ||
| if (this._createAuthHeaders) { | ||
| const authHeaders = await this.createAuthHeaders("settle"); | ||
| headers = { ...headers, ...authHeaders.headers }; | ||
| } | ||
| const response = await fetch(`${this.url}/settle`, { | ||
| method: "POST", | ||
| headers, | ||
| body: JSON.stringify({ | ||
| x402Version: paymentPayload.x402Version, | ||
| paymentPayload: this.toJsonSafe(paymentPayload), | ||
| paymentRequirements: this.toJsonSafe(paymentRequirements) | ||
| }) | ||
| }); | ||
| const data = await response.json(); | ||
| if (typeof data === "object" && data !== null && "success" in data) { | ||
| const settleResponse = data; | ||
| if (!response.ok) { | ||
| throw new SettleError(response.status, settleResponse); | ||
| } | ||
| return settleResponse; | ||
| } | ||
| throw new Error(`Facilitator settle failed (${response.status}): ${JSON.stringify(data)}`); | ||
| } | ||
| /** | ||
| * Get supported payment kinds and extensions from the facilitator | ||
| * | ||
| * @returns Supported payment kinds and extensions | ||
| */ | ||
| async getSupported() { | ||
| let headers = { | ||
| "Content-Type": "application/json" | ||
| }; | ||
| if (this._createAuthHeaders) { | ||
| const authHeaders = await this.createAuthHeaders("supported"); | ||
| headers = { ...headers, ...authHeaders.headers }; | ||
| } | ||
| const response = await fetch(`${this.url}/supported`, { | ||
| method: "GET", | ||
| headers | ||
| }); | ||
| if (!response.ok) { | ||
| const errorText = await response.text().catch(() => response.statusText); | ||
| throw new Error(`Facilitator getSupported failed (${response.status}): ${errorText}`); | ||
| } | ||
| return await response.json(); | ||
| } | ||
| /** | ||
| * Creates authentication headers for a specific path. | ||
| * | ||
| * @param path - The path to create authentication headers for (e.g., "verify", "settle", "supported") | ||
| * @returns An object containing the authentication headers for the specified path | ||
| */ | ||
| async createAuthHeaders(path) { | ||
| if (this._createAuthHeaders) { | ||
| const authHeaders = await this._createAuthHeaders(); | ||
| return { | ||
| headers: authHeaders[path] ?? {} | ||
| }; | ||
| } | ||
| return { | ||
| headers: {} | ||
| }; | ||
| } | ||
| /** | ||
| * Helper to convert objects to JSON-safe format. | ||
| * Handles BigInt and other non-JSON types. | ||
| * | ||
| * @param obj - The object to convert | ||
| * @returns The JSON-safe representation of the object | ||
| */ | ||
| toJsonSafe(obj) { | ||
| return JSON.parse( | ||
| JSON.stringify(obj, (_, value) => typeof value === "bigint" ? value.toString() : value) | ||
| ); | ||
| } | ||
| }; | ||
| // src/http/x402HTTPClient.ts | ||
| var x402HTTPClient = class { | ||
| /** | ||
| * Creates a new x402HTTPClient instance. | ||
| * | ||
| * @param client - The underlying x402Client for payment logic | ||
| */ | ||
| constructor(client) { | ||
| this.client = client; | ||
| } | ||
| /** | ||
| * Encodes a payment payload into appropriate HTTP headers based on version. | ||
| * | ||
| * @param paymentPayload - The payment payload to encode | ||
| * @returns HTTP headers containing the encoded payment signature | ||
| */ | ||
| encodePaymentSignatureHeader(paymentPayload) { | ||
| switch (paymentPayload.x402Version) { | ||
| case 2: | ||
| return { | ||
| "PAYMENT-SIGNATURE": encodePaymentSignatureHeader(paymentPayload) | ||
| }; | ||
| case 1: | ||
| return { | ||
| "X-PAYMENT": encodePaymentSignatureHeader(paymentPayload) | ||
| }; | ||
| default: | ||
| throw new Error( | ||
| `Unsupported x402 version: ${paymentPayload.x402Version}` | ||
| ); | ||
| } | ||
| } | ||
| /** | ||
| * Extracts payment required information from HTTP response. | ||
| * | ||
| * @param getHeader - Function to retrieve header value by name (case-insensitive) | ||
| * @param body - Optional response body for v1 compatibility | ||
| * @returns The payment required object | ||
| */ | ||
| getPaymentRequiredResponse(getHeader, body) { | ||
| const paymentRequired = getHeader("PAYMENT-REQUIRED"); | ||
| if (paymentRequired) { | ||
| return decodePaymentRequiredHeader(paymentRequired); | ||
| } | ||
| if (body && body instanceof Object && "x402Version" in body && body.x402Version === 1) { | ||
| return body; | ||
| } | ||
| throw new Error("Invalid payment required response"); | ||
| } | ||
| /** | ||
| * Extracts payment settlement response from HTTP headers. | ||
| * | ||
| * @param getHeader - Function to retrieve header value by name (case-insensitive) | ||
| * @returns The settlement response object | ||
| */ | ||
| getPaymentSettleResponse(getHeader) { | ||
| const paymentResponse = getHeader("PAYMENT-RESPONSE"); | ||
| if (paymentResponse) { | ||
| return decodePaymentResponseHeader(paymentResponse); | ||
| } | ||
| const xPaymentResponse = getHeader("X-PAYMENT-RESPONSE"); | ||
| if (xPaymentResponse) { | ||
| return decodePaymentResponseHeader(xPaymentResponse); | ||
| } | ||
| throw new Error("Payment response header not found"); | ||
| } | ||
| /** | ||
| * Creates a payment payload for the given payment requirements. | ||
| * Delegates to the underlying x402Client. | ||
| * | ||
| * @param paymentRequired - The payment required response from the server | ||
| * @returns Promise resolving to the payment payload | ||
| */ | ||
| async createPaymentPayload(paymentRequired) { | ||
| return this.client.createPaymentPayload(paymentRequired); | ||
| } | ||
| }; | ||
| // src/http/index.ts | ||
| function encodePaymentSignatureHeader(paymentPayload) { | ||
| return safeBase64Encode(JSON.stringify(paymentPayload)); | ||
| } | ||
| function decodePaymentSignatureHeader(paymentSignatureHeader) { | ||
| if (!Base64EncodedRegex.test(paymentSignatureHeader)) { | ||
| throw new Error("Invalid payment signature header"); | ||
| } | ||
| return JSON.parse(safeBase64Decode(paymentSignatureHeader)); | ||
| } | ||
| function encodePaymentRequiredHeader(paymentRequired) { | ||
| return safeBase64Encode(JSON.stringify(paymentRequired)); | ||
| } | ||
| function decodePaymentRequiredHeader(paymentRequiredHeader) { | ||
| if (!Base64EncodedRegex.test(paymentRequiredHeader)) { | ||
| throw new Error("Invalid payment required header"); | ||
| } | ||
| return JSON.parse(safeBase64Decode(paymentRequiredHeader)); | ||
| } | ||
| function encodePaymentResponseHeader(paymentResponse) { | ||
| return safeBase64Encode(JSON.stringify(paymentResponse)); | ||
| } | ||
| function decodePaymentResponseHeader(paymentResponseHeader) { | ||
| if (!Base64EncodedRegex.test(paymentResponseHeader)) { | ||
| throw new Error("Invalid payment response header"); | ||
| } | ||
| return JSON.parse(safeBase64Decode(paymentResponseHeader)); | ||
| } | ||
| export { | ||
| RouteConfigurationError, | ||
| x402HTTPResourceServer, | ||
| HTTPFacilitatorClient, | ||
| encodePaymentSignatureHeader, | ||
| decodePaymentSignatureHeader, | ||
| encodePaymentRequiredHeader, | ||
| decodePaymentRequiredHeader, | ||
| encodePaymentResponseHeader, | ||
| decodePaymentResponseHeader, | ||
| x402HTTPClient | ||
| }; | ||
| //# sourceMappingURL=chunk-55XTTMLF.mjs.map |
| {"version":3,"sources":["../../src/http/x402HTTPResourceServer.ts","../../src/http/httpFacilitatorClient.ts","../../src/http/x402HTTPClient.ts","../../src/http/index.ts"],"sourcesContent":["import { x402ResourceServer } from \"../server\";\nimport {\n decodePaymentSignatureHeader,\n encodePaymentRequiredHeader,\n encodePaymentResponseHeader,\n} from \".\";\nimport {\n PaymentPayload,\n PaymentRequired,\n SettleResponse,\n SettleError,\n Price,\n Network,\n PaymentRequirements,\n} from \"../types\";\nimport { x402Version } from \"..\";\n\n/**\n * Framework-agnostic HTTP adapter interface\n * Implementations provide framework-specific HTTP operations\n */\nexport interface HTTPAdapter {\n getHeader(name: string): string | undefined;\n getMethod(): string;\n getPath(): string;\n getUrl(): string;\n getAcceptHeader(): string;\n getUserAgent(): string;\n\n /**\n * Get query parameters from the request URL\n *\n * @returns Record of query parameter key-value pairs\n */\n getQueryParams?(): Record<string, string | string[]>;\n\n /**\n * Get a specific query parameter by name\n *\n * @param name - The query parameter name\n * @returns The query parameter value(s) or undefined\n */\n getQueryParam?(name: string): string | string[] | undefined;\n\n /**\n * Get the parsed request body\n * Framework adapters should parse JSON/form data appropriately\n *\n * @returns The parsed request body\n */\n getBody?(): unknown;\n}\n\n/**\n * Paywall configuration for HTML responses\n */\nexport interface PaywallConfig {\n appName?: string;\n appLogo?: string;\n sessionTokenEndpoint?: string;\n currentUrl?: string;\n testnet?: boolean;\n}\n\n/**\n * Paywall provider interface for generating HTML\n */\nexport interface PaywallProvider {\n generateHtml(paymentRequired: PaymentRequired, config?: PaywallConfig): string;\n}\n\n/**\n * Dynamic payTo function that receives HTTP request context\n */\nexport type DynamicPayTo = (context: HTTPRequestContext) => string | Promise<string>;\n\n/**\n * Dynamic price function that receives HTTP request context\n */\nexport type DynamicPrice = (context: HTTPRequestContext) => Price | Promise<Price>;\n\n/**\n * Result of the unpaid response callback containing content type and body.\n */\nexport interface UnpaidResponseResult {\n /**\n * The content type for the response (e.g., 'application/json', 'text/plain').\n */\n contentType: string;\n\n /**\n * The response body to include in the 402 response.\n */\n body: unknown;\n}\n\n/**\n * Dynamic function to generate a custom response for unpaid requests.\n * Receives the HTTP request context and returns the content type and body to include in the 402 response.\n */\nexport type UnpaidResponseBody = (\n context: HTTPRequestContext,\n) => UnpaidResponseResult | Promise<UnpaidResponseResult>;\n\n/**\n * A single payment option for a route\n * Represents one way a client can pay for access to the resource\n */\nexport interface PaymentOption {\n scheme: string;\n payTo: string | DynamicPayTo;\n price: Price | DynamicPrice;\n network: Network;\n maxTimeoutSeconds?: number;\n extra?: Record<string, unknown>;\n}\n\n/**\n * Route configuration for HTTP endpoints\n *\n * The 'accepts' field defines payment options for the route.\n * Can be a single PaymentOption or an array of PaymentOptions for multiple payment methods.\n */\nexport interface RouteConfig {\n // Payment option(s): single or array\n accepts: PaymentOption | PaymentOption[];\n\n // HTTP-specific metadata\n resource?: string;\n description?: string;\n mimeType?: string;\n customPaywallHtml?: string;\n\n /**\n * Optional callback to generate a custom response for unpaid API requests.\n * This allows servers to return preview data, error messages, or other content\n * when a request lacks payment.\n *\n * For browser requests (Accept: text/html), the paywall HTML takes precedence.\n * This callback is only used for API clients.\n *\n * If not provided, defaults to { contentType: 'application/json', body: {} }.\n *\n * @param context - The HTTP request context\n * @returns An object containing both contentType and body for the 402 response\n */\n unpaidResponseBody?: UnpaidResponseBody;\n\n // Extensions\n extensions?: Record<string, unknown>;\n}\n\n/**\n * Routes configuration - maps path patterns to route configs\n */\nexport type RoutesConfig = Record<string, RouteConfig> | RouteConfig;\n\n/**\n * Compiled route for efficient matching\n */\nexport interface CompiledRoute {\n verb: string;\n regex: RegExp;\n config: RouteConfig;\n}\n\n/**\n * HTTP request context that encapsulates all request data\n */\nexport interface HTTPRequestContext {\n adapter: HTTPAdapter;\n path: string;\n method: string;\n paymentHeader?: string;\n}\n\n/**\n * HTTP response instructions for the framework middleware\n */\nexport interface HTTPResponseInstructions {\n status: number;\n headers: Record<string, string>;\n body?: unknown; // e.g. Paywall for web browser requests, but could be any other type\n isHtml?: boolean; // e.g. if body is a paywall, then isHtml is true\n}\n\n/**\n * Result of processing an HTTP request for payment\n */\nexport type HTTPProcessResult =\n | { type: \"no-payment-required\" }\n | {\n type: \"payment-verified\";\n paymentPayload: PaymentPayload;\n paymentRequirements: PaymentRequirements;\n }\n | { type: \"payment-error\"; response: HTTPResponseInstructions };\n\n/**\n * Result of processSettlement\n */\nexport type ProcessSettleSuccessResponse = SettleResponse & {\n success: true;\n headers: Record<string, string>;\n requirements: PaymentRequirements;\n};\n\nexport type ProcessSettleFailureResponse = SettleResponse & {\n success: false;\n errorReason: string;\n};\n\nexport type ProcessSettleResultResponse =\n | ProcessSettleSuccessResponse\n | ProcessSettleFailureResponse;\n\n/**\n * Represents a validation error for a specific route's payment configuration.\n */\nexport interface RouteValidationError {\n /** The route pattern (e.g., \"GET /api/weather\") */\n routePattern: string;\n /** The payment scheme that failed validation */\n scheme: string;\n /** The network that failed validation */\n network: Network;\n /** The type of validation failure */\n reason: \"missing_scheme\" | \"missing_facilitator\";\n /** Human-readable error message */\n message: string;\n}\n\n/**\n * Error thrown when route configuration validation fails.\n */\nexport class RouteConfigurationError extends Error {\n /** The validation errors that caused this exception */\n public readonly errors: RouteValidationError[];\n\n /**\n * Creates a new RouteConfigurationError with the given validation errors.\n *\n * @param errors - The validation errors that caused this exception.\n */\n constructor(errors: RouteValidationError[]) {\n const message = `x402 Route Configuration Errors:\\n${errors.map(e => ` - ${e.message}`).join(\"\\n\")}`;\n super(message);\n this.name = \"RouteConfigurationError\";\n this.errors = errors;\n }\n}\n\n/**\n * HTTP-enhanced x402 resource server\n * Provides framework-agnostic HTTP protocol handling\n */\nexport class x402HTTPResourceServer {\n private ResourceServer: x402ResourceServer;\n private compiledRoutes: CompiledRoute[] = [];\n private routesConfig: RoutesConfig;\n private paywallProvider?: PaywallProvider;\n\n /**\n * Creates a new x402HTTPResourceServer instance.\n *\n * @param ResourceServer - The core x402ResourceServer instance to use\n * @param routes - Route configuration for payment-protected endpoints\n */\n constructor(ResourceServer: x402ResourceServer, routes: RoutesConfig) {\n this.ResourceServer = ResourceServer;\n this.routesConfig = routes;\n\n // Handle both single route and multiple routes\n const normalizedRoutes =\n typeof routes === \"object\" && !(\"accepts\" in routes)\n ? (routes as Record<string, RouteConfig>)\n : { \"*\": routes as RouteConfig };\n\n for (const [pattern, config] of Object.entries(normalizedRoutes)) {\n const parsed = this.parseRoutePattern(pattern);\n this.compiledRoutes.push({\n verb: parsed.verb,\n regex: parsed.regex,\n config,\n });\n }\n }\n\n /**\n * Initialize the HTTP resource server.\n *\n * This method initializes the underlying resource server (fetching facilitator support)\n * and then validates that all route payment configurations have corresponding\n * registered schemes and facilitator support.\n *\n * @throws RouteConfigurationError if any route's payment options don't have\n * corresponding registered schemes or facilitator support\n *\n * @example\n * ```typescript\n * const httpServer = new x402HTTPResourceServer(server, routes);\n * await httpServer.initialize();\n * ```\n */\n async initialize(): Promise<void> {\n // First, initialize the underlying resource server (fetches facilitator support)\n await this.ResourceServer.initialize();\n\n // Then validate route configuration\n const errors = this.validateRouteConfiguration();\n if (errors.length > 0) {\n throw new RouteConfigurationError(errors);\n }\n }\n\n /**\n * Register a custom paywall provider for generating HTML\n *\n * @param provider - PaywallProvider instance\n * @returns This service instance for chaining\n */\n registerPaywallProvider(provider: PaywallProvider): this {\n this.paywallProvider = provider;\n return this;\n }\n\n /**\n * Process HTTP request and return response instructions\n * This is the main entry point for framework middleware\n *\n * @param context - HTTP request context\n * @param paywallConfig - Optional paywall configuration\n * @returns Process result indicating next action for middleware\n */\n async processHTTPRequest(\n context: HTTPRequestContext,\n paywallConfig?: PaywallConfig,\n ): Promise<HTTPProcessResult> {\n const { adapter, path, method } = context;\n\n // Find matching route\n const routeConfig = this.getRouteConfig(path, method);\n if (!routeConfig) {\n return { type: \"no-payment-required\" }; // No payment required for this route\n }\n\n // Normalize accepts field to array of payment options\n const paymentOptions = this.normalizePaymentOptions(routeConfig);\n\n // Check for payment header (v1 or v2)\n const paymentPayload = this.extractPayment(adapter);\n\n // Create resource info, using config override if provided\n const resourceInfo = {\n url: routeConfig.resource || context.adapter.getUrl(),\n description: routeConfig.description || \"\",\n mimeType: routeConfig.mimeType || \"\",\n };\n\n // Build requirements from all payment options\n // (this method handles resolving dynamic functions internally)\n const requirements = await this.ResourceServer.buildPaymentRequirementsFromOptions(\n paymentOptions,\n context,\n );\n\n let extensions = routeConfig.extensions;\n if (extensions) {\n extensions = this.ResourceServer.enrichExtensions(extensions, context);\n }\n\n const paymentRequired = this.ResourceServer.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n !paymentPayload ? \"Payment required\" : undefined,\n extensions,\n );\n\n // If no payment provided\n if (!paymentPayload) {\n // Resolve custom unpaid response body if provided\n const unpaidBody = routeConfig.unpaidResponseBody\n ? await routeConfig.unpaidResponseBody(context)\n : undefined;\n\n return {\n type: \"payment-error\",\n response: this.createHTTPResponse(\n paymentRequired,\n this.isWebBrowser(adapter),\n paywallConfig,\n routeConfig.customPaywallHtml,\n unpaidBody,\n ),\n };\n }\n\n // Verify payment\n try {\n const matchingRequirements = this.ResourceServer.findMatchingRequirements(\n paymentRequired.accepts,\n paymentPayload,\n );\n\n if (!matchingRequirements) {\n const errorResponse = this.ResourceServer.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n \"No matching payment requirements\",\n routeConfig.extensions,\n );\n return {\n type: \"payment-error\",\n response: this.createHTTPResponse(errorResponse, false, paywallConfig),\n };\n }\n\n const verifyResult = await this.ResourceServer.verifyPayment(\n paymentPayload,\n matchingRequirements,\n );\n\n if (!verifyResult.isValid) {\n const errorResponse = this.ResourceServer.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n verifyResult.invalidReason,\n routeConfig.extensions,\n );\n return {\n type: \"payment-error\",\n response: this.createHTTPResponse(errorResponse, false, paywallConfig),\n };\n }\n\n // Payment is valid, return data needed for settlement\n return {\n type: \"payment-verified\",\n paymentPayload,\n paymentRequirements: matchingRequirements,\n };\n } catch (error) {\n const errorResponse = this.ResourceServer.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n error instanceof Error ? error.message : \"Payment verification failed\",\n routeConfig.extensions,\n );\n return {\n type: \"payment-error\",\n response: this.createHTTPResponse(errorResponse, false, paywallConfig),\n };\n }\n }\n\n /**\n * Process settlement after successful response\n *\n * @param paymentPayload - The verified payment payload\n * @param requirements - The matching payment requirements\n * @returns ProcessSettleResultResponse - SettleResponse with headers if success or errorReason if failure\n */\n async processSettlement(\n paymentPayload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<ProcessSettleResultResponse> {\n try {\n const settleResponse = await this.ResourceServer.settlePayment(paymentPayload, requirements);\n\n if (!settleResponse.success) {\n return {\n ...settleResponse,\n success: false,\n errorReason: settleResponse.errorReason || \"Settlement failed\",\n };\n }\n\n return {\n ...settleResponse,\n success: true,\n headers: this.createSettlementHeaders(settleResponse),\n requirements,\n };\n } catch (error) {\n if (error instanceof SettleError) {\n return {\n success: false,\n errorReason: error.errorReason || error.message,\n payer: error.payer,\n network: error.network,\n transaction: error.transaction,\n };\n }\n return {\n success: false,\n errorReason: error instanceof Error ? error.message : \"Settlement failed\",\n network: requirements.network as Network,\n transaction: \"\",\n };\n }\n }\n\n /**\n * Check if a request requires payment based on route configuration\n *\n * @param context - HTTP request context\n * @returns True if the route requires payment, false otherwise\n */\n requiresPayment(context: HTTPRequestContext): boolean {\n const routeConfig = this.getRouteConfig(context.path, context.method);\n return routeConfig !== undefined;\n }\n\n /**\n * Normalizes a RouteConfig's accepts field into an array of PaymentOptions\n * Handles both single PaymentOption and array formats\n *\n * @param routeConfig - Route configuration\n * @returns Array of payment options\n */\n private normalizePaymentOptions(routeConfig: RouteConfig): PaymentOption[] {\n return Array.isArray(routeConfig.accepts) ? routeConfig.accepts : [routeConfig.accepts];\n }\n\n /**\n * Validates that all payment options in routes have corresponding registered schemes\n * and facilitator support.\n *\n * @returns Array of validation errors (empty if all routes are valid)\n */\n private validateRouteConfiguration(): RouteValidationError[] {\n const errors: RouteValidationError[] = [];\n\n // Normalize routes to array of [pattern, config] pairs\n const normalizedRoutes =\n typeof this.routesConfig === \"object\" && !(\"accepts\" in this.routesConfig)\n ? Object.entries(this.routesConfig as Record<string, RouteConfig>)\n : [[\"*\", this.routesConfig as RouteConfig] as [string, RouteConfig]];\n\n for (const [pattern, config] of normalizedRoutes) {\n const paymentOptions = this.normalizePaymentOptions(config);\n\n for (const option of paymentOptions) {\n // Check 1: Is scheme registered?\n if (!this.ResourceServer.hasRegisteredScheme(option.network, option.scheme)) {\n errors.push({\n routePattern: pattern,\n scheme: option.scheme,\n network: option.network,\n reason: \"missing_scheme\",\n message: `Route \"${pattern}\": No scheme implementation registered for \"${option.scheme}\" on network \"${option.network}\"`,\n });\n // Skip facilitator check if scheme isn't registered\n continue;\n }\n\n // Check 2: Does facilitator support this scheme/network combination?\n const supportedKind = this.ResourceServer.getSupportedKind(\n x402Version,\n option.network,\n option.scheme,\n );\n\n if (!supportedKind) {\n errors.push({\n routePattern: pattern,\n scheme: option.scheme,\n network: option.network,\n reason: \"missing_facilitator\",\n message: `Route \"${pattern}\": Facilitator does not support scheme \"${option.scheme}\" on network \"${option.network}\"`,\n });\n }\n }\n }\n\n return errors;\n }\n\n /**\n * Get route configuration for a request\n *\n * @param path - Request path\n * @param method - HTTP method\n * @returns Route configuration or undefined if no match\n */\n private getRouteConfig(path: string, method: string): RouteConfig | undefined {\n const normalizedPath = this.normalizePath(path);\n const upperMethod = method.toUpperCase();\n\n const matchingRoute = this.compiledRoutes.find(\n route =>\n route.regex.test(normalizedPath) && (route.verb === \"*\" || route.verb === upperMethod),\n );\n\n return matchingRoute?.config;\n }\n\n /**\n * Extract payment from HTTP headers (handles v1 and v2)\n *\n * @param adapter - HTTP adapter\n * @returns Decoded payment payload or null\n */\n private extractPayment(adapter: HTTPAdapter): PaymentPayload | null {\n // Check v2 header first (PAYMENT-SIGNATURE)\n const header = adapter.getHeader(\"payment-signature\") || adapter.getHeader(\"PAYMENT-SIGNATURE\");\n\n if (header) {\n try {\n return decodePaymentSignatureHeader(header);\n } catch (error) {\n console.warn(\"Failed to decode PAYMENT-SIGNATURE header:\", error);\n }\n }\n\n return null;\n }\n\n /**\n * Check if request is from a web browser\n *\n * @param adapter - HTTP adapter\n * @returns True if request appears to be from a browser\n */\n private isWebBrowser(adapter: HTTPAdapter): boolean {\n const accept = adapter.getAcceptHeader();\n const userAgent = adapter.getUserAgent();\n return accept.includes(\"text/html\") && userAgent.includes(\"Mozilla\");\n }\n\n /**\n * Create HTTP response instructions from payment required\n *\n * @param paymentRequired - Payment requirements\n * @param isWebBrowser - Whether request is from browser\n * @param paywallConfig - Paywall configuration\n * @param customHtml - Custom HTML template\n * @param unpaidResponse - Optional custom response (content type and body) for unpaid API requests\n * @returns Response instructions\n */\n private createHTTPResponse(\n paymentRequired: PaymentRequired,\n isWebBrowser: boolean,\n paywallConfig?: PaywallConfig,\n customHtml?: string,\n unpaidResponse?: UnpaidResponseResult,\n ): HTTPResponseInstructions {\n if (isWebBrowser) {\n const html = this.generatePaywallHTML(paymentRequired, paywallConfig, customHtml);\n return {\n status: 402,\n headers: { \"Content-Type\": \"text/html\" },\n body: html,\n isHtml: true,\n };\n }\n\n const response = this.createHTTPPaymentRequiredResponse(paymentRequired);\n\n // Use callback result if provided, otherwise default to JSON with empty object\n const contentType = unpaidResponse ? unpaidResponse.contentType : \"application/json\";\n const body = unpaidResponse ? unpaidResponse.body : {};\n\n return {\n status: 402,\n headers: {\n \"Content-Type\": contentType,\n ...response.headers,\n },\n body,\n };\n }\n\n /**\n * Create HTTP payment required response (v1 puts in body, v2 puts in header)\n *\n * @param paymentRequired - Payment required object\n * @returns Headers and body for the HTTP response\n */\n private createHTTPPaymentRequiredResponse(paymentRequired: PaymentRequired): {\n headers: Record<string, string>;\n } {\n return {\n headers: {\n \"PAYMENT-REQUIRED\": encodePaymentRequiredHeader(paymentRequired),\n },\n };\n }\n\n /**\n * Create settlement response headers\n *\n * @param settleResponse - Settlement response\n * @returns Headers to add to response\n */\n private createSettlementHeaders(settleResponse: SettleResponse): Record<string, string> {\n const encoded = encodePaymentResponseHeader(settleResponse);\n return { \"PAYMENT-RESPONSE\": encoded };\n }\n\n /**\n * Parse route pattern into verb and regex\n *\n * @param pattern - Route pattern like \"GET /api/*\" or \"/api/[id]\"\n * @returns Parsed pattern with verb and regex\n */\n private parseRoutePattern(pattern: string): { verb: string; regex: RegExp } {\n const [verb, path] = pattern.includes(\" \") ? pattern.split(/\\s+/) : [\"*\", pattern];\n\n const regex = new RegExp(\n `^${\n path\n .replace(/[$()+.?^{|}]/g, \"\\\\$&\") // Escape regex special chars\n .replace(/\\*/g, \".*?\") // Wildcards\n .replace(/\\[([^\\]]+)\\]/g, \"[^/]+\") // Parameters\n .replace(/\\//g, \"\\\\/\") // Escape slashes\n }$`,\n \"i\",\n );\n\n return { verb: verb.toUpperCase(), regex };\n }\n\n /**\n * Normalize path for matching\n *\n * @param path - Raw path from request\n * @returns Normalized path\n */\n private normalizePath(path: string): string {\n try {\n const pathWithoutQuery = path.split(/[?#]/)[0];\n const decodedPath = decodeURIComponent(pathWithoutQuery);\n return decodedPath\n .replace(/\\\\/g, \"/\")\n .replace(/\\/+/g, \"/\")\n .replace(/(.+?)\\/+$/, \"$1\");\n } catch {\n return path;\n }\n }\n\n /**\n * Generate paywall HTML for browser requests\n *\n * @param paymentRequired - Payment required response\n * @param paywallConfig - Optional paywall configuration\n * @param customHtml - Optional custom HTML template\n * @returns HTML string\n */\n private generatePaywallHTML(\n paymentRequired: PaymentRequired,\n paywallConfig?: PaywallConfig,\n customHtml?: string,\n ): string {\n if (customHtml) {\n return customHtml;\n }\n\n // Use custom paywall provider if set\n if (this.paywallProvider) {\n return this.paywallProvider.generateHtml(paymentRequired, paywallConfig);\n }\n\n // Try to use @x402/paywall if available (optional dependency)\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const paywall = require(\"@x402/paywall\");\n const displayAmount = this.getDisplayAmount(paymentRequired);\n const resource = paymentRequired.resource;\n\n return paywall.getPaywallHtml({\n amount: displayAmount,\n paymentRequired,\n currentUrl: resource?.url || paywallConfig?.currentUrl || \"\",\n testnet: paywallConfig?.testnet ?? true,\n appName: paywallConfig?.appName,\n appLogo: paywallConfig?.appLogo,\n sessionTokenEndpoint: paywallConfig?.sessionTokenEndpoint,\n });\n } catch {\n // @x402/paywall not installed, fall back to basic HTML\n }\n\n // Fallback: Basic HTML paywall\n const resource = paymentRequired.resource;\n const displayAmount = this.getDisplayAmount(paymentRequired);\n\n return `\n <!DOCTYPE html>\n <html>\n <head>\n <title>Payment Required</title>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n </head>\n <body>\n <div style=\"max-width: 600px; margin: 50px auto; padding: 20px; font-family: system-ui, -apple-system, sans-serif;\">\n ${paywallConfig?.appLogo ? `<img src=\"${paywallConfig.appLogo}\" alt=\"${paywallConfig.appName || \"App\"}\" style=\"max-width: 200px; margin-bottom: 20px;\">` : \"\"}\n <h1>Payment Required</h1>\n ${resource ? `<p><strong>Resource:</strong> ${resource.description || resource.url}</p>` : \"\"}\n <p><strong>Amount:</strong> $${displayAmount.toFixed(2)} USDC</p>\n <div id=\"payment-widget\" \n data-requirements='${JSON.stringify(paymentRequired)}'\n data-app-name=\"${paywallConfig?.appName || \"\"}\"\n data-testnet=\"${paywallConfig?.testnet || false}\">\n <!-- Install @x402/paywall for full wallet integration -->\n <p style=\"margin-top: 2rem; padding: 1rem; background: #fef3c7; border-radius: 0.5rem;\">\n <strong>Note:</strong> Install <code>@x402/paywall</code> for full wallet connection and payment UI.\n </p>\n </div>\n </div>\n </body>\n </html>\n `;\n }\n\n /**\n * Extract display amount from payment requirements.\n *\n * @param paymentRequired - The payment required object\n * @returns The display amount in decimal format\n */\n private getDisplayAmount(paymentRequired: PaymentRequired): number {\n const accepts = paymentRequired.accepts;\n if (accepts && accepts.length > 0) {\n const firstReq = accepts[0];\n if (\"amount\" in firstReq) {\n // V2 format\n return parseFloat(firstReq.amount) / 1000000; // Assuming USDC with 6 decimals\n }\n }\n return 0;\n }\n}\n","import { PaymentPayload, PaymentRequirements } from \"../types/payments\";\nimport {\n VerifyResponse,\n SettleResponse,\n SupportedResponse,\n VerifyError,\n SettleError,\n} from \"../types/facilitator\";\n\nconst DEFAULT_FACILITATOR_URL = \"https://x402.org/facilitator\";\n\nexport interface FacilitatorConfig {\n url?: string;\n createAuthHeaders?: () => Promise<{\n verify: Record<string, string>;\n settle: Record<string, string>;\n supported: Record<string, string>;\n }>;\n}\n\n/**\n * Interface for facilitator clients\n * Can be implemented for HTTP-based or local facilitators\n */\nexport interface FacilitatorClient {\n /**\n * Verify a payment with the facilitator\n *\n * @param paymentPayload - The payment to verify\n * @param paymentRequirements - The requirements to verify against\n * @returns Verification response\n */\n verify(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n ): Promise<VerifyResponse>;\n\n /**\n * Settle a payment with the facilitator\n *\n * @param paymentPayload - The payment to settle\n * @param paymentRequirements - The requirements for settlement\n * @returns Settlement response\n */\n settle(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n ): Promise<SettleResponse>;\n\n /**\n * Get supported payment kinds and extensions from the facilitator\n *\n * @returns Supported payment kinds and extensions\n */\n getSupported(): Promise<SupportedResponse>;\n}\n\n/**\n * HTTP-based client for interacting with x402 facilitator services\n * Handles HTTP communication with facilitator endpoints\n */\nexport class HTTPFacilitatorClient implements FacilitatorClient {\n readonly url: string;\n private readonly _createAuthHeaders?: FacilitatorConfig[\"createAuthHeaders\"];\n\n /**\n * Creates a new HTTPFacilitatorClient instance.\n *\n * @param config - Configuration options for the facilitator client\n */\n constructor(config?: FacilitatorConfig) {\n this.url = config?.url || DEFAULT_FACILITATOR_URL;\n this._createAuthHeaders = config?.createAuthHeaders;\n }\n\n /**\n * Verify a payment with the facilitator\n *\n * @param paymentPayload - The payment to verify\n * @param paymentRequirements - The requirements to verify against\n * @returns Verification response\n */\n async verify(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n ): Promise<VerifyResponse> {\n let headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (this._createAuthHeaders) {\n const authHeaders = await this.createAuthHeaders(\"verify\");\n headers = { ...headers, ...authHeaders.headers };\n }\n\n const response = await fetch(`${this.url}/verify`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n x402Version: paymentPayload.x402Version,\n paymentPayload: this.toJsonSafe(paymentPayload),\n paymentRequirements: this.toJsonSafe(paymentRequirements),\n }),\n });\n\n const data = await response.json();\n\n if (typeof data === \"object\" && data !== null && \"isValid\" in data) {\n const verifyResponse = data as VerifyResponse;\n if (!response.ok) {\n throw new VerifyError(response.status, verifyResponse);\n }\n return verifyResponse;\n }\n\n throw new Error(`Facilitator verify failed (${response.status}): ${JSON.stringify(data)}`);\n }\n\n /**\n * Settle a payment with the facilitator\n *\n * @param paymentPayload - The payment to settle\n * @param paymentRequirements - The requirements for settlement\n * @returns Settlement response\n */\n async settle(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n ): Promise<SettleResponse> {\n let headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (this._createAuthHeaders) {\n const authHeaders = await this.createAuthHeaders(\"settle\");\n headers = { ...headers, ...authHeaders.headers };\n }\n\n const response = await fetch(`${this.url}/settle`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n x402Version: paymentPayload.x402Version,\n paymentPayload: this.toJsonSafe(paymentPayload),\n paymentRequirements: this.toJsonSafe(paymentRequirements),\n }),\n });\n\n const data = await response.json();\n\n if (typeof data === \"object\" && data !== null && \"success\" in data) {\n const settleResponse = data as SettleResponse;\n if (!response.ok) {\n throw new SettleError(response.status, settleResponse);\n }\n return settleResponse;\n }\n\n throw new Error(`Facilitator settle failed (${response.status}): ${JSON.stringify(data)}`);\n }\n\n /**\n * Get supported payment kinds and extensions from the facilitator\n *\n * @returns Supported payment kinds and extensions\n */\n async getSupported(): Promise<SupportedResponse> {\n let headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (this._createAuthHeaders) {\n const authHeaders = await this.createAuthHeaders(\"supported\");\n headers = { ...headers, ...authHeaders.headers };\n }\n\n const response = await fetch(`${this.url}/supported`, {\n method: \"GET\",\n headers,\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => response.statusText);\n throw new Error(`Facilitator getSupported failed (${response.status}): ${errorText}`);\n }\n\n return (await response.json()) as SupportedResponse;\n }\n\n /**\n * Creates authentication headers for a specific path.\n *\n * @param path - The path to create authentication headers for (e.g., \"verify\", \"settle\", \"supported\")\n * @returns An object containing the authentication headers for the specified path\n */\n async createAuthHeaders(path: string): Promise<{\n headers: Record<string, string>;\n }> {\n if (this._createAuthHeaders) {\n const authHeaders = (await this._createAuthHeaders()) as Record<\n string,\n Record<string, string>\n >;\n return {\n headers: authHeaders[path] ?? {},\n };\n }\n return {\n headers: {},\n };\n }\n\n /**\n * Helper to convert objects to JSON-safe format.\n * Handles BigInt and other non-JSON types.\n *\n * @param obj - The object to convert\n * @returns The JSON-safe representation of the object\n */\n private toJsonSafe(obj: unknown): unknown {\n return JSON.parse(\n JSON.stringify(obj, (_, value) => (typeof value === \"bigint\" ? value.toString() : value)),\n );\n }\n}\n","import {\n decodePaymentRequiredHeader,\n decodePaymentResponseHeader,\n encodePaymentSignatureHeader,\n} from \".\";\nimport { SettleResponse } from \"../types\";\nimport { PaymentPayload, PaymentRequired } from \"../types/payments\";\nimport { x402Client } from \"../client/x402Client\";\n\n/**\n * HTTP-specific client for handling x402 payment protocol over HTTP.\n *\n * Wraps a x402Client to provide HTTP-specific encoding/decoding functionality\n * for payment headers and responses while maintaining the builder pattern.\n */\nexport class x402HTTPClient {\n /**\n * Creates a new x402HTTPClient instance.\n *\n * @param client - The underlying x402Client for payment logic\n */\n constructor(private readonly client: x402Client) {}\n\n /**\n * Encodes a payment payload into appropriate HTTP headers based on version.\n *\n * @param paymentPayload - The payment payload to encode\n * @returns HTTP headers containing the encoded payment signature\n */\n encodePaymentSignatureHeader(paymentPayload: PaymentPayload): Record<string, string> {\n switch (paymentPayload.x402Version) {\n case 2:\n return {\n \"PAYMENT-SIGNATURE\": encodePaymentSignatureHeader(paymentPayload),\n };\n case 1:\n return {\n \"X-PAYMENT\": encodePaymentSignatureHeader(paymentPayload),\n };\n default:\n throw new Error(\n `Unsupported x402 version: ${(paymentPayload as PaymentPayload).x402Version}`,\n );\n }\n }\n\n /**\n * Extracts payment required information from HTTP response.\n *\n * @param getHeader - Function to retrieve header value by name (case-insensitive)\n * @param body - Optional response body for v1 compatibility\n * @returns The payment required object\n */\n getPaymentRequiredResponse(\n getHeader: (name: string) => string | null | undefined,\n body?: unknown,\n ): PaymentRequired {\n // v2\n const paymentRequired = getHeader(\"PAYMENT-REQUIRED\");\n if (paymentRequired) {\n return decodePaymentRequiredHeader(paymentRequired);\n }\n\n // v1\n if (\n body &&\n body instanceof Object &&\n \"x402Version\" in body &&\n (body as PaymentRequired).x402Version === 1\n ) {\n return body as PaymentRequired;\n }\n\n throw new Error(\"Invalid payment required response\");\n }\n\n /**\n * Extracts payment settlement response from HTTP headers.\n *\n * @param getHeader - Function to retrieve header value by name (case-insensitive)\n * @returns The settlement response object\n */\n getPaymentSettleResponse(getHeader: (name: string) => string | null | undefined): SettleResponse {\n // v2\n const paymentResponse = getHeader(\"PAYMENT-RESPONSE\");\n if (paymentResponse) {\n return decodePaymentResponseHeader(paymentResponse);\n }\n\n // v1\n const xPaymentResponse = getHeader(\"X-PAYMENT-RESPONSE\");\n if (xPaymentResponse) {\n return decodePaymentResponseHeader(xPaymentResponse);\n }\n\n throw new Error(\"Payment response header not found\");\n }\n\n /**\n * Creates a payment payload for the given payment requirements.\n * Delegates to the underlying x402Client.\n *\n * @param paymentRequired - The payment required response from the server\n * @returns Promise resolving to the payment payload\n */\n async createPaymentPayload(paymentRequired: PaymentRequired): Promise<PaymentPayload> {\n return this.client.createPaymentPayload(paymentRequired);\n }\n}\n","import { SettleResponse } from \"../types\";\nimport { PaymentPayload, PaymentRequired } from \"../types/payments\";\nimport { Base64EncodedRegex, safeBase64Decode, safeBase64Encode } from \"../utils\";\n\n// HTTP Methods that typically use query parameters\nexport type QueryParamMethods = \"GET\" | \"HEAD\" | \"DELETE\";\n\n// HTTP Methods that typically use request body\nexport type BodyMethods = \"POST\" | \"PUT\" | \"PATCH\";\n\n/**\n * Encodes a payment payload as a base64 header value.\n *\n * @param paymentPayload - The payment payload to encode\n * @returns Base64 encoded string representation of the payment payload\n */\nexport function encodePaymentSignatureHeader(paymentPayload: PaymentPayload): string {\n return safeBase64Encode(JSON.stringify(paymentPayload));\n}\n\n/**\n * Decodes a base64 payment signature header into a payment payload.\n *\n * @param paymentSignatureHeader - The base64 encoded payment signature header\n * @returns The decoded payment payload\n */\nexport function decodePaymentSignatureHeader(paymentSignatureHeader: string): PaymentPayload {\n if (!Base64EncodedRegex.test(paymentSignatureHeader)) {\n throw new Error(\"Invalid payment signature header\");\n }\n return JSON.parse(safeBase64Decode(paymentSignatureHeader)) as PaymentPayload;\n}\n\n/**\n * Encodes a payment required object as a base64 header value.\n *\n * @param paymentRequired - The payment required object to encode\n * @returns Base64 encoded string representation of the payment required object\n */\nexport function encodePaymentRequiredHeader(paymentRequired: PaymentRequired): string {\n return safeBase64Encode(JSON.stringify(paymentRequired));\n}\n\n/**\n * Decodes a base64 payment required header into a payment required object.\n *\n * @param paymentRequiredHeader - The base64 encoded payment required header\n * @returns The decoded payment required object\n */\nexport function decodePaymentRequiredHeader(paymentRequiredHeader: string): PaymentRequired {\n if (!Base64EncodedRegex.test(paymentRequiredHeader)) {\n throw new Error(\"Invalid payment required header\");\n }\n return JSON.parse(safeBase64Decode(paymentRequiredHeader)) as PaymentRequired;\n}\n\n/**\n * Encodes a payment response as a base64 header value.\n *\n * @param paymentResponse - The payment response to encode\n * @returns Base64 encoded string representation of the payment response\n */\nexport function encodePaymentResponseHeader(paymentResponse: SettleResponse): string {\n return safeBase64Encode(JSON.stringify(paymentResponse));\n}\n\n/**\n * Decodes a base64 payment response header into a settle response.\n *\n * @param paymentResponseHeader - The base64 encoded payment response header\n * @returns The decoded settle response\n */\nexport function decodePaymentResponseHeader(paymentResponseHeader: string): SettleResponse {\n if (!Base64EncodedRegex.test(paymentResponseHeader)) {\n throw new Error(\"Invalid payment response header\");\n }\n return JSON.parse(safeBase64Decode(paymentResponseHeader)) as SettleResponse;\n}\n\n// Export HTTP service and types\nexport {\n x402HTTPResourceServer,\n HTTPAdapter,\n HTTPRequestContext,\n HTTPResponseInstructions,\n HTTPProcessResult,\n PaywallConfig,\n PaywallProvider,\n PaymentOption,\n RouteConfig,\n RoutesConfig,\n CompiledRoute,\n DynamicPayTo,\n DynamicPrice,\n UnpaidResponseBody,\n UnpaidResponseResult,\n ProcessSettleResultResponse,\n ProcessSettleSuccessResponse,\n ProcessSettleFailureResponse,\n RouteValidationError,\n RouteConfigurationError,\n} from \"./x402HTTPResourceServer\";\nexport {\n HTTPFacilitatorClient,\n FacilitatorClient,\n FacilitatorConfig,\n} from \"./httpFacilitatorClient\";\nexport { x402HTTPClient } from \"./x402HTTPClient\";\n"],"mappings":"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","names":["displayAmount","resource"]} |
| // src/types/facilitator.ts | ||
| var VerifyError = class extends Error { | ||
| /** | ||
| * Creates a VerifyError from a failed verification response. | ||
| * | ||
| * @param statusCode - HTTP status code from the facilitator | ||
| * @param response - The verify response containing error details | ||
| */ | ||
| constructor(statusCode, response) { | ||
| super(`verification failed: ${response.invalidReason || "unknown reason"}`); | ||
| this.name = "VerifyError"; | ||
| this.statusCode = statusCode; | ||
| this.invalidReason = response.invalidReason; | ||
| this.payer = response.payer; | ||
| } | ||
| }; | ||
| var SettleError = class extends Error { | ||
| /** | ||
| * Creates a SettleError from a failed settlement response. | ||
| * | ||
| * @param statusCode - HTTP status code from the facilitator | ||
| * @param response - The settle response containing error details | ||
| */ | ||
| constructor(statusCode, response) { | ||
| super(`settlement failed: ${response.errorReason || "unknown reason"}`); | ||
| this.name = "SettleError"; | ||
| this.statusCode = statusCode; | ||
| this.errorReason = response.errorReason; | ||
| this.payer = response.payer; | ||
| this.transaction = response.transaction; | ||
| this.network = response.network; | ||
| } | ||
| }; | ||
| export { | ||
| VerifyError, | ||
| SettleError | ||
| }; | ||
| //# sourceMappingURL=chunk-X4W4S5RB.mjs.map |
| {"version":3,"sources":["../../src/types/facilitator.ts"],"sourcesContent":["import { PaymentPayload, PaymentRequirements } from \"./payments\";\nimport { Network } from \"./\";\n\nexport type VerifyRequest = {\n paymentPayload: PaymentPayload;\n paymentRequirements: PaymentRequirements;\n};\n\nexport type VerifyResponse = {\n isValid: boolean;\n invalidReason?: string;\n payer?: string;\n};\n\nexport type SettleRequest = {\n paymentPayload: PaymentPayload;\n paymentRequirements: PaymentRequirements;\n};\n\nexport type SettleResponse = {\n success: boolean;\n errorReason?: string;\n payer?: string;\n transaction: string;\n network: Network;\n};\n\nexport type SupportedKind = {\n x402Version: number;\n scheme: string;\n network: Network;\n extra?: Record<string, unknown>;\n};\n\nexport type SupportedResponse = {\n kinds: SupportedKind[];\n extensions: string[];\n signers: Record<string, string[]>; // CAIP family pattern → Signer addresses\n};\n\n/**\n * Error thrown when payment verification fails.\n */\nexport class VerifyError extends Error {\n readonly invalidReason?: string;\n readonly payer?: string;\n readonly statusCode: number;\n\n /**\n * Creates a VerifyError from a failed verification response.\n *\n * @param statusCode - HTTP status code from the facilitator\n * @param response - The verify response containing error details\n */\n constructor(statusCode: number, response: VerifyResponse) {\n super(`verification failed: ${response.invalidReason || \"unknown reason\"}`);\n this.name = \"VerifyError\";\n this.statusCode = statusCode;\n this.invalidReason = response.invalidReason;\n this.payer = response.payer;\n }\n}\n\n/**\n * Error thrown when payment settlement fails.\n */\nexport class SettleError extends Error {\n readonly errorReason?: string;\n readonly payer?: string;\n readonly transaction: string;\n readonly network: Network;\n readonly statusCode: number;\n\n /**\n * Creates a SettleError from a failed settlement response.\n *\n * @param statusCode - HTTP status code from the facilitator\n * @param response - The settle response containing error details\n */\n constructor(statusCode: number, response: SettleResponse) {\n super(`settlement failed: ${response.errorReason || \"unknown reason\"}`);\n this.name = \"SettleError\";\n this.statusCode = statusCode;\n this.errorReason = response.errorReason;\n this.payer = response.payer;\n this.transaction = response.transaction;\n this.network = response.network;\n }\n}\n"],"mappings":";AA2CO,IAAM,cAAN,cAA0B,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWrC,YAAY,YAAoB,UAA0B;AACxD,UAAM,wBAAwB,SAAS,iBAAiB,gBAAgB,EAAE;AAC1E,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,SAAK,gBAAgB,SAAS;AAC9B,SAAK,QAAQ,SAAS;AAAA,EACxB;AACF;AAKO,IAAM,cAAN,cAA0B,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAarC,YAAY,YAAoB,UAA0B;AACxD,UAAM,sBAAsB,SAAS,eAAe,gBAAgB,EAAE;AACtE,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,SAAK,cAAc,SAAS;AAC5B,SAAK,QAAQ,SAAS;AACtB,SAAK,cAAc,SAAS;AAC5B,SAAK,UAAU,SAAS;AAAA,EAC1B;AACF;","names":[]} |
| type PaymentRequirementsV1 = { | ||
| scheme: string; | ||
| network: Network; | ||
| maxAmountRequired: string; | ||
| resource: string; | ||
| description: string; | ||
| mimeType: string; | ||
| outputSchema: Record<string, unknown>; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| asset: string; | ||
| extra: Record<string, unknown>; | ||
| }; | ||
| type PaymentRequiredV1 = { | ||
| x402Version: 1; | ||
| error?: string; | ||
| accepts: PaymentRequirementsV1[]; | ||
| }; | ||
| type PaymentPayloadV1 = { | ||
| x402Version: 1; | ||
| scheme: string; | ||
| network: Network; | ||
| payload: Record<string, unknown>; | ||
| }; | ||
| type VerifyRequestV1 = { | ||
| paymentPayload: PaymentPayloadV1; | ||
| paymentRequirements: PaymentRequirementsV1; | ||
| }; | ||
| type SettleRequestV1 = { | ||
| paymentPayload: PaymentPayloadV1; | ||
| paymentRequirements: PaymentRequirementsV1; | ||
| }; | ||
| type SettleResponseV1 = { | ||
| success: boolean; | ||
| errorReason?: string; | ||
| payer?: string; | ||
| transaction: string; | ||
| network: Network; | ||
| }; | ||
| type SupportedResponseV1 = { | ||
| kinds: { | ||
| x402Version: number; | ||
| scheme: string; | ||
| network: Network; | ||
| extra?: Record<string, unknown>; | ||
| }[]; | ||
| }; | ||
| interface ResourceServerExtension { | ||
| key: string; | ||
| enrichDeclaration?: (declaration: unknown, transportContext: unknown) => unknown; | ||
| } | ||
| type Network = `${string}:${string}`; | ||
| type Money = string | number; | ||
| type AssetAmount = { | ||
| asset: string; | ||
| amount: string; | ||
| extra?: Record<string, unknown>; | ||
| }; | ||
| type Price = Money | AssetAmount; | ||
| interface ResourceInfo { | ||
| url: string; | ||
| description: string; | ||
| mimeType: string; | ||
| } | ||
| type PaymentRequirements = { | ||
| scheme: string; | ||
| network: Network; | ||
| asset: string; | ||
| amount: string; | ||
| payTo: string; | ||
| maxTimeoutSeconds: number; | ||
| extra: Record<string, unknown>; | ||
| }; | ||
| type PaymentRequired = { | ||
| x402Version: number; | ||
| error?: string; | ||
| resource: ResourceInfo; | ||
| accepts: PaymentRequirements[]; | ||
| extensions?: Record<string, unknown>; | ||
| }; | ||
| type PaymentPayload = { | ||
| x402Version: number; | ||
| resource: ResourceInfo; | ||
| accepted: PaymentRequirements; | ||
| payload: Record<string, unknown>; | ||
| extensions?: Record<string, unknown>; | ||
| }; | ||
| type VerifyRequest = { | ||
| paymentPayload: PaymentPayload; | ||
| paymentRequirements: PaymentRequirements; | ||
| }; | ||
| type VerifyResponse = { | ||
| isValid: boolean; | ||
| invalidReason?: string; | ||
| payer?: string; | ||
| }; | ||
| type SettleRequest = { | ||
| paymentPayload: PaymentPayload; | ||
| paymentRequirements: PaymentRequirements; | ||
| }; | ||
| type SettleResponse = { | ||
| success: boolean; | ||
| errorReason?: string; | ||
| payer?: string; | ||
| transaction: string; | ||
| network: Network; | ||
| }; | ||
| type SupportedKind = { | ||
| x402Version: number; | ||
| scheme: string; | ||
| network: Network; | ||
| extra?: Record<string, unknown>; | ||
| }; | ||
| type SupportedResponse = { | ||
| kinds: SupportedKind[]; | ||
| extensions: string[]; | ||
| signers: Record<string, string[]>; | ||
| }; | ||
| /** | ||
| * Error thrown when payment verification fails. | ||
| */ | ||
| declare class VerifyError extends Error { | ||
| readonly invalidReason?: string; | ||
| readonly payer?: string; | ||
| readonly statusCode: number; | ||
| /** | ||
| * Creates a VerifyError from a failed verification response. | ||
| * | ||
| * @param statusCode - HTTP status code from the facilitator | ||
| * @param response - The verify response containing error details | ||
| */ | ||
| constructor(statusCode: number, response: VerifyResponse); | ||
| } | ||
| /** | ||
| * Error thrown when payment settlement fails. | ||
| */ | ||
| declare class SettleError extends Error { | ||
| readonly errorReason?: string; | ||
| readonly payer?: string; | ||
| readonly transaction: string; | ||
| readonly network: Network; | ||
| readonly statusCode: number; | ||
| /** | ||
| * Creates a SettleError from a failed settlement response. | ||
| * | ||
| * @param statusCode - HTTP status code from the facilitator | ||
| * @param response - The settle response containing error details | ||
| */ | ||
| constructor(statusCode: number, response: SettleResponse); | ||
| } | ||
| /** | ||
| * Money parser function that converts a numeric amount to an AssetAmount | ||
| * Receives the amount as a decimal number (e.g., 1.50 for $1.50) | ||
| * Returns null to indicate "cannot handle this amount", causing fallback to next parser | ||
| * Always returns a Promise for consistency - use async/await | ||
| * | ||
| * @param amount - The decimal amount (e.g., 1.50) | ||
| * @param network - The network identifier for context | ||
| * @returns AssetAmount or null to try next parser | ||
| */ | ||
| type MoneyParser = (amount: number, network: Network) => Promise<AssetAmount | null>; | ||
| interface SchemeNetworkClient { | ||
| readonly scheme: string; | ||
| createPaymentPayload(x402Version: number, paymentRequirements: PaymentRequirements): Promise<Pick<PaymentPayload, "x402Version" | "payload">>; | ||
| } | ||
| interface SchemeNetworkFacilitator { | ||
| readonly scheme: string; | ||
| /** | ||
| * CAIP family pattern that this facilitator supports. | ||
| * Used to group signers by blockchain family in the supported response. | ||
| * | ||
| * @example | ||
| * // EVM facilitators | ||
| * readonly caipFamily = "eip155:*"; | ||
| * | ||
| * @example | ||
| * // SVM facilitators | ||
| * readonly caipFamily = "solana:*"; | ||
| */ | ||
| readonly caipFamily: string; | ||
| /** | ||
| * Get mechanism-specific extra data needed for the supported kinds endpoint. | ||
| * This method is called when building the facilitator's supported response. | ||
| * | ||
| * @param network - The network identifier for context | ||
| * @returns Extra data object or undefined if no extra data is needed | ||
| * | ||
| * @example | ||
| * // EVM schemes return undefined (no extra data needed) | ||
| * getExtra(network: Network): undefined { | ||
| * return undefined; | ||
| * } | ||
| * | ||
| * @example | ||
| * // SVM schemes return feePayer address | ||
| * getExtra(network: Network): Record<string, unknown> | undefined { | ||
| * return { feePayer: this.signer.address }; | ||
| * } | ||
| */ | ||
| getExtra(network: Network): Record<string, unknown> | undefined; | ||
| /** | ||
| * Get signer addresses used by this facilitator for a given network. | ||
| * These are included in the supported response to help clients understand | ||
| * which addresses might sign/pay for transactions. | ||
| * | ||
| * Supports multiple addresses for load balancing, key rotation, and high availability. | ||
| * | ||
| * @param network - The network identifier | ||
| * @returns Array of signer addresses (wallet addresses, fee payer addresses, etc.) | ||
| * | ||
| * @example | ||
| * // EVM facilitator | ||
| * getSigners(network: string): string[] { | ||
| * return [...this.signer.getAddresses()]; | ||
| * } | ||
| * | ||
| * @example | ||
| * // SVM facilitator | ||
| * getSigners(network: string): string[] { | ||
| * return [...this.signer.getAddresses()]; | ||
| * } | ||
| */ | ||
| getSigners(network: string): string[]; | ||
| verify(payload: PaymentPayload, requirements: PaymentRequirements): Promise<VerifyResponse>; | ||
| settle(payload: PaymentPayload, requirements: PaymentRequirements): Promise<SettleResponse>; | ||
| } | ||
| interface SchemeNetworkServer { | ||
| readonly scheme: string; | ||
| /** | ||
| * Convert a user-friendly price to the scheme's specific amount and asset format | ||
| * Always returns a Promise for consistency | ||
| * | ||
| * @param price - User-friendly price (e.g., "$0.10", "0.10", { amount: "100000", asset: "USDC" }) | ||
| * @param network - The network identifier for context | ||
| * @returns Promise that resolves to the converted amount, asset identifier, and any extra metadata | ||
| * | ||
| * @example | ||
| * // For EVM networks with USDC: | ||
| * await parsePrice("$0.10", "eip155:8453") => { amount: "100000", asset: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913" } | ||
| * | ||
| * // For custom schemes: | ||
| * await parsePrice("10 points", "custom:network") => { amount: "10", asset: "points" } | ||
| */ | ||
| parsePrice(price: Price, network: Network): Promise<AssetAmount>; | ||
| /** | ||
| * Build payment requirements for this scheme/network combination | ||
| * | ||
| * @param paymentRequirements - Base payment requirements with amount/asset already set | ||
| * @param supportedKind - The supported kind from facilitator's /supported endpoint | ||
| * @param supportedKind.x402Version - The x402 version | ||
| * @param supportedKind.scheme - The payment scheme | ||
| * @param supportedKind.network - The network identifier | ||
| * @param supportedKind.extra - Optional extra metadata | ||
| * @param facilitatorExtensions - Extensions supported by the facilitator | ||
| * @returns Enhanced payment requirements ready to be sent to clients | ||
| */ | ||
| enhancePaymentRequirements(paymentRequirements: PaymentRequirements, supportedKind: { | ||
| x402Version: number; | ||
| scheme: string; | ||
| network: Network; | ||
| extra?: Record<string, unknown>; | ||
| }, facilitatorExtensions: string[]): Promise<PaymentRequirements>; | ||
| } | ||
| export { type AssetAmount as A, type Money as M, type Network as N, type PaymentPayload as P, type ResourceServerExtension as R, type SettleResponse as S, type VerifyResponse as V, type PaymentRequirements as a, type SchemeNetworkFacilitator as b, type PaymentRequired as c, type SchemeNetworkClient as d, type SupportedResponse as e, type SchemeNetworkServer as f, type SupportedKind as g, type Price as h, type PaymentRequirementsV1 as i, type PaymentRequiredV1 as j, type PaymentPayloadV1 as k, type VerifyRequestV1 as l, type SettleRequestV1 as m, type SettleResponseV1 as n, type SupportedResponseV1 as o, type VerifyRequest as p, type SettleRequest as q, VerifyError as r, SettleError as s, type MoneyParser as t }; |
| import { P as PaymentPayload, a as PaymentRequirements, V as VerifyResponse, S as SettleResponse, e as SupportedResponse, N as Network, f as SchemeNetworkServer, R as ResourceServerExtension, g as SupportedKind, h as Price, c as PaymentRequired } from './mechanisms-CzuGzYsS.mjs'; | ||
| interface FacilitatorConfig { | ||
| url?: string; | ||
| createAuthHeaders?: () => Promise<{ | ||
| verify: Record<string, string>; | ||
| settle: Record<string, string>; | ||
| supported: Record<string, string>; | ||
| }>; | ||
| } | ||
| /** | ||
| * Interface for facilitator clients | ||
| * Can be implemented for HTTP-based or local facilitators | ||
| */ | ||
| interface FacilitatorClient { | ||
| /** | ||
| * Verify a payment with the facilitator | ||
| * | ||
| * @param paymentPayload - The payment to verify | ||
| * @param paymentRequirements - The requirements to verify against | ||
| * @returns Verification response | ||
| */ | ||
| verify(paymentPayload: PaymentPayload, paymentRequirements: PaymentRequirements): Promise<VerifyResponse>; | ||
| /** | ||
| * Settle a payment with the facilitator | ||
| * | ||
| * @param paymentPayload - The payment to settle | ||
| * @param paymentRequirements - The requirements for settlement | ||
| * @returns Settlement response | ||
| */ | ||
| settle(paymentPayload: PaymentPayload, paymentRequirements: PaymentRequirements): Promise<SettleResponse>; | ||
| /** | ||
| * Get supported payment kinds and extensions from the facilitator | ||
| * | ||
| * @returns Supported payment kinds and extensions | ||
| */ | ||
| getSupported(): Promise<SupportedResponse>; | ||
| } | ||
| /** | ||
| * HTTP-based client for interacting with x402 facilitator services | ||
| * Handles HTTP communication with facilitator endpoints | ||
| */ | ||
| declare class HTTPFacilitatorClient implements FacilitatorClient { | ||
| readonly url: string; | ||
| private readonly _createAuthHeaders?; | ||
| /** | ||
| * Creates a new HTTPFacilitatorClient instance. | ||
| * | ||
| * @param config - Configuration options for the facilitator client | ||
| */ | ||
| constructor(config?: FacilitatorConfig); | ||
| /** | ||
| * Verify a payment with the facilitator | ||
| * | ||
| * @param paymentPayload - The payment to verify | ||
| * @param paymentRequirements - The requirements to verify against | ||
| * @returns Verification response | ||
| */ | ||
| verify(paymentPayload: PaymentPayload, paymentRequirements: PaymentRequirements): Promise<VerifyResponse>; | ||
| /** | ||
| * Settle a payment with the facilitator | ||
| * | ||
| * @param paymentPayload - The payment to settle | ||
| * @param paymentRequirements - The requirements for settlement | ||
| * @returns Settlement response | ||
| */ | ||
| settle(paymentPayload: PaymentPayload, paymentRequirements: PaymentRequirements): Promise<SettleResponse>; | ||
| /** | ||
| * Get supported payment kinds and extensions from the facilitator | ||
| * | ||
| * @returns Supported payment kinds and extensions | ||
| */ | ||
| getSupported(): Promise<SupportedResponse>; | ||
| /** | ||
| * Creates authentication headers for a specific path. | ||
| * | ||
| * @param path - The path to create authentication headers for (e.g., "verify", "settle", "supported") | ||
| * @returns An object containing the authentication headers for the specified path | ||
| */ | ||
| createAuthHeaders(path: string): Promise<{ | ||
| headers: Record<string, string>; | ||
| }>; | ||
| /** | ||
| * Helper to convert objects to JSON-safe format. | ||
| * Handles BigInt and other non-JSON types. | ||
| * | ||
| * @param obj - The object to convert | ||
| * @returns The JSON-safe representation of the object | ||
| */ | ||
| private toJsonSafe; | ||
| } | ||
| /** | ||
| * Configuration for a protected resource | ||
| * Only contains payment-specific configuration, not resource metadata | ||
| */ | ||
| interface ResourceConfig { | ||
| scheme: string; | ||
| payTo: string; | ||
| price: Price; | ||
| network: Network; | ||
| maxTimeoutSeconds?: number; | ||
| } | ||
| /** | ||
| * Resource information for PaymentRequired response | ||
| */ | ||
| interface ResourceInfo { | ||
| url: string; | ||
| description: string; | ||
| mimeType: string; | ||
| } | ||
| /** | ||
| * Lifecycle Hook Context Interfaces | ||
| */ | ||
| interface VerifyContext { | ||
| paymentPayload: PaymentPayload; | ||
| requirements: PaymentRequirements; | ||
| } | ||
| interface VerifyResultContext extends VerifyContext { | ||
| result: VerifyResponse; | ||
| } | ||
| interface VerifyFailureContext extends VerifyContext { | ||
| error: Error; | ||
| } | ||
| interface SettleContext { | ||
| paymentPayload: PaymentPayload; | ||
| requirements: PaymentRequirements; | ||
| } | ||
| interface SettleResultContext extends SettleContext { | ||
| result: SettleResponse; | ||
| } | ||
| interface SettleFailureContext extends SettleContext { | ||
| error: Error; | ||
| } | ||
| /** | ||
| * Lifecycle Hook Type Definitions | ||
| */ | ||
| type BeforeVerifyHook = (context: VerifyContext) => Promise<void | { | ||
| abort: true; | ||
| reason: string; | ||
| }>; | ||
| type AfterVerifyHook = (context: VerifyResultContext) => Promise<void>; | ||
| type OnVerifyFailureHook = (context: VerifyFailureContext) => Promise<void | { | ||
| recovered: true; | ||
| result: VerifyResponse; | ||
| }>; | ||
| type BeforeSettleHook = (context: SettleContext) => Promise<void | { | ||
| abort: true; | ||
| reason: string; | ||
| }>; | ||
| type AfterSettleHook = (context: SettleResultContext) => Promise<void>; | ||
| type OnSettleFailureHook = (context: SettleFailureContext) => Promise<void | { | ||
| recovered: true; | ||
| result: SettleResponse; | ||
| }>; | ||
| /** | ||
| * Core x402 protocol server for resource protection | ||
| * Transport-agnostic implementation of the x402 payment protocol | ||
| */ | ||
| declare class x402ResourceServer { | ||
| private facilitatorClients; | ||
| private registeredServerSchemes; | ||
| private supportedResponsesMap; | ||
| private facilitatorClientsMap; | ||
| private registeredExtensions; | ||
| private beforeVerifyHooks; | ||
| private afterVerifyHooks; | ||
| private onVerifyFailureHooks; | ||
| private beforeSettleHooks; | ||
| private afterSettleHooks; | ||
| private onSettleFailureHooks; | ||
| /** | ||
| * Creates a new x402ResourceServer instance. | ||
| * | ||
| * @param facilitatorClients - Optional facilitator client(s) for payment processing | ||
| */ | ||
| constructor(facilitatorClients?: FacilitatorClient | FacilitatorClient[]); | ||
| /** | ||
| * Register a scheme/network server implementation. | ||
| * | ||
| * @param network - The network identifier | ||
| * @param server - The scheme/network server implementation | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| register(network: Network, server: SchemeNetworkServer): x402ResourceServer; | ||
| /** | ||
| * Check if a scheme is registered for a given network. | ||
| * | ||
| * @param network - The network identifier | ||
| * @param scheme - The payment scheme name | ||
| * @returns True if the scheme is registered for the network, false otherwise | ||
| */ | ||
| hasRegisteredScheme(network: Network, scheme: string): boolean; | ||
| /** | ||
| * Registers a resource service extension that can enrich extension declarations. | ||
| * | ||
| * @param extension - The extension to register | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| registerExtension(extension: ResourceServerExtension): this; | ||
| /** | ||
| * Enriches declared extensions using registered extension hooks. | ||
| * | ||
| * @param declaredExtensions - Extensions declared on the route | ||
| * @param transportContext - Transport-specific context (HTTP, A2A, MCP, etc.) | ||
| * @returns Enriched extensions map | ||
| */ | ||
| enrichExtensions(declaredExtensions: Record<string, unknown>, transportContext: unknown): Record<string, unknown>; | ||
| /** | ||
| * Register a hook to execute before payment verification. | ||
| * Can abort verification by returning { abort: true, reason: string } | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| onBeforeVerify(hook: BeforeVerifyHook): x402ResourceServer; | ||
| /** | ||
| * Register a hook to execute after successful payment verification. | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| onAfterVerify(hook: AfterVerifyHook): x402ResourceServer; | ||
| /** | ||
| * Register a hook to execute when payment verification fails. | ||
| * Can recover from failure by returning { recovered: true, result: VerifyResponse } | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| onVerifyFailure(hook: OnVerifyFailureHook): x402ResourceServer; | ||
| /** | ||
| * Register a hook to execute before payment settlement. | ||
| * Can abort settlement by returning { abort: true, reason: string } | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| onBeforeSettle(hook: BeforeSettleHook): x402ResourceServer; | ||
| /** | ||
| * Register a hook to execute after successful payment settlement. | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| onAfterSettle(hook: AfterSettleHook): x402ResourceServer; | ||
| /** | ||
| * Register a hook to execute when payment settlement fails. | ||
| * Can recover from failure by returning { recovered: true, result: SettleResponse } | ||
| * | ||
| * @param hook - The hook function to register | ||
| * @returns The x402ResourceServer instance for chaining | ||
| */ | ||
| onSettleFailure(hook: OnSettleFailureHook): x402ResourceServer; | ||
| /** | ||
| * Initialize by fetching supported kinds from all facilitators | ||
| * Creates mappings for supported responses and facilitator clients | ||
| * Earlier facilitators in the array get precedence | ||
| */ | ||
| initialize(): Promise<void>; | ||
| /** | ||
| * Get supported kind for a specific version, network, and scheme | ||
| * | ||
| * @param x402Version - The x402 version | ||
| * @param network - The network identifier | ||
| * @param scheme - The payment scheme | ||
| * @returns The supported kind or undefined if not found | ||
| */ | ||
| getSupportedKind(x402Version: number, network: Network, scheme: string): SupportedKind | undefined; | ||
| /** | ||
| * Get facilitator extensions for a specific version, network, and scheme | ||
| * | ||
| * @param x402Version - The x402 version | ||
| * @param network - The network identifier | ||
| * @param scheme - The payment scheme | ||
| * @returns The facilitator extensions or empty array if not found | ||
| */ | ||
| getFacilitatorExtensions(x402Version: number, network: Network, scheme: string): string[]; | ||
| /** | ||
| * Build payment requirements for a protected resource | ||
| * | ||
| * @param resourceConfig - Configuration for the protected resource | ||
| * @returns Array of payment requirements | ||
| */ | ||
| buildPaymentRequirements(resourceConfig: ResourceConfig): Promise<PaymentRequirements[]>; | ||
| /** | ||
| * Build payment requirements from multiple payment options | ||
| * This method handles resolving dynamic payTo/price functions and builds requirements for each option | ||
| * | ||
| * @param paymentOptions - Array of payment options to convert | ||
| * @param context - HTTP request context for resolving dynamic functions | ||
| * @returns Array of payment requirements (one per option) | ||
| */ | ||
| buildPaymentRequirementsFromOptions<TContext = unknown>(paymentOptions: Array<{ | ||
| scheme: string; | ||
| payTo: string | ((context: TContext) => string | Promise<string>); | ||
| price: Price | ((context: TContext) => Price | Promise<Price>); | ||
| network: Network; | ||
| maxTimeoutSeconds?: number; | ||
| }>, context: TContext): Promise<PaymentRequirements[]>; | ||
| /** | ||
| * Create a payment required response | ||
| * | ||
| * @param requirements - Payment requirements | ||
| * @param resourceInfo - Resource information | ||
| * @param error - Error message | ||
| * @param extensions - Optional extensions | ||
| * @returns Payment required response object | ||
| */ | ||
| createPaymentRequiredResponse(requirements: PaymentRequirements[], resourceInfo: ResourceInfo, error?: string, extensions?: Record<string, unknown>): PaymentRequired; | ||
| /** | ||
| * Verify a payment against requirements | ||
| * | ||
| * @param paymentPayload - The payment payload to verify | ||
| * @param requirements - The payment requirements | ||
| * @returns Verification response | ||
| */ | ||
| verifyPayment(paymentPayload: PaymentPayload, requirements: PaymentRequirements): Promise<VerifyResponse>; | ||
| /** | ||
| * Settle a verified payment | ||
| * | ||
| * @param paymentPayload - The payment payload to settle | ||
| * @param requirements - The payment requirements | ||
| * @returns Settlement response | ||
| */ | ||
| settlePayment(paymentPayload: PaymentPayload, requirements: PaymentRequirements): Promise<SettleResponse>; | ||
| /** | ||
| * Find matching payment requirements for a payment | ||
| * | ||
| * @param availableRequirements - Array of available payment requirements | ||
| * @param paymentPayload - The payment payload | ||
| * @returns Matching payment requirements or undefined | ||
| */ | ||
| findMatchingRequirements(availableRequirements: PaymentRequirements[], paymentPayload: PaymentPayload): PaymentRequirements | undefined; | ||
| /** | ||
| * Process a payment request | ||
| * | ||
| * @param paymentPayload - Optional payment payload if provided | ||
| * @param resourceConfig - Configuration for the protected resource | ||
| * @param resourceInfo - Information about the resource being accessed | ||
| * @param extensions - Optional extensions to include in the response | ||
| * @returns Processing result | ||
| */ | ||
| processPaymentRequest(paymentPayload: PaymentPayload | null, resourceConfig: ResourceConfig, resourceInfo: ResourceInfo, extensions?: Record<string, unknown>): Promise<{ | ||
| success: boolean; | ||
| requiresPayment?: PaymentRequired; | ||
| verificationResult?: VerifyResponse; | ||
| settlementResult?: SettleResponse; | ||
| error?: string; | ||
| }>; | ||
| /** | ||
| * Get facilitator client for a specific version, network, and scheme | ||
| * | ||
| * @param x402Version - The x402 version | ||
| * @param network - The network identifier | ||
| * @param scheme - The payment scheme | ||
| * @returns The facilitator client or undefined if not found | ||
| */ | ||
| private getFacilitatorClient; | ||
| } | ||
| /** | ||
| * Framework-agnostic HTTP adapter interface | ||
| * Implementations provide framework-specific HTTP operations | ||
| */ | ||
| interface HTTPAdapter { | ||
| getHeader(name: string): string | undefined; | ||
| getMethod(): string; | ||
| getPath(): string; | ||
| getUrl(): string; | ||
| getAcceptHeader(): string; | ||
| getUserAgent(): string; | ||
| /** | ||
| * Get query parameters from the request URL | ||
| * | ||
| * @returns Record of query parameter key-value pairs | ||
| */ | ||
| getQueryParams?(): Record<string, string | string[]>; | ||
| /** | ||
| * Get a specific query parameter by name | ||
| * | ||
| * @param name - The query parameter name | ||
| * @returns The query parameter value(s) or undefined | ||
| */ | ||
| getQueryParam?(name: string): string | string[] | undefined; | ||
| /** | ||
| * Get the parsed request body | ||
| * Framework adapters should parse JSON/form data appropriately | ||
| * | ||
| * @returns The parsed request body | ||
| */ | ||
| getBody?(): unknown; | ||
| } | ||
| /** | ||
| * Paywall configuration for HTML responses | ||
| */ | ||
| interface PaywallConfig { | ||
| appName?: string; | ||
| appLogo?: string; | ||
| sessionTokenEndpoint?: string; | ||
| currentUrl?: string; | ||
| testnet?: boolean; | ||
| } | ||
| /** | ||
| * Paywall provider interface for generating HTML | ||
| */ | ||
| interface PaywallProvider { | ||
| generateHtml(paymentRequired: PaymentRequired, config?: PaywallConfig): string; | ||
| } | ||
| /** | ||
| * Dynamic payTo function that receives HTTP request context | ||
| */ | ||
| type DynamicPayTo = (context: HTTPRequestContext) => string | Promise<string>; | ||
| /** | ||
| * Dynamic price function that receives HTTP request context | ||
| */ | ||
| type DynamicPrice = (context: HTTPRequestContext) => Price | Promise<Price>; | ||
| /** | ||
| * Result of the unpaid response callback containing content type and body. | ||
| */ | ||
| interface UnpaidResponseResult { | ||
| /** | ||
| * The content type for the response (e.g., 'application/json', 'text/plain'). | ||
| */ | ||
| contentType: string; | ||
| /** | ||
| * The response body to include in the 402 response. | ||
| */ | ||
| body: unknown; | ||
| } | ||
| /** | ||
| * Dynamic function to generate a custom response for unpaid requests. | ||
| * Receives the HTTP request context and returns the content type and body to include in the 402 response. | ||
| */ | ||
| type UnpaidResponseBody = (context: HTTPRequestContext) => UnpaidResponseResult | Promise<UnpaidResponseResult>; | ||
| /** | ||
| * A single payment option for a route | ||
| * Represents one way a client can pay for access to the resource | ||
| */ | ||
| interface PaymentOption { | ||
| scheme: string; | ||
| payTo: string | DynamicPayTo; | ||
| price: Price | DynamicPrice; | ||
| network: Network; | ||
| maxTimeoutSeconds?: number; | ||
| extra?: Record<string, unknown>; | ||
| } | ||
| /** | ||
| * Route configuration for HTTP endpoints | ||
| * | ||
| * The 'accepts' field defines payment options for the route. | ||
| * Can be a single PaymentOption or an array of PaymentOptions for multiple payment methods. | ||
| */ | ||
| interface RouteConfig { | ||
| accepts: PaymentOption | PaymentOption[]; | ||
| resource?: string; | ||
| description?: string; | ||
| mimeType?: string; | ||
| customPaywallHtml?: string; | ||
| /** | ||
| * Optional callback to generate a custom response for unpaid API requests. | ||
| * This allows servers to return preview data, error messages, or other content | ||
| * when a request lacks payment. | ||
| * | ||
| * For browser requests (Accept: text/html), the paywall HTML takes precedence. | ||
| * This callback is only used for API clients. | ||
| * | ||
| * If not provided, defaults to { contentType: 'application/json', body: {} }. | ||
| * | ||
| * @param context - The HTTP request context | ||
| * @returns An object containing both contentType and body for the 402 response | ||
| */ | ||
| unpaidResponseBody?: UnpaidResponseBody; | ||
| extensions?: Record<string, unknown>; | ||
| } | ||
| /** | ||
| * Routes configuration - maps path patterns to route configs | ||
| */ | ||
| type RoutesConfig = Record<string, RouteConfig> | RouteConfig; | ||
| /** | ||
| * Compiled route for efficient matching | ||
| */ | ||
| interface CompiledRoute { | ||
| verb: string; | ||
| regex: RegExp; | ||
| config: RouteConfig; | ||
| } | ||
| /** | ||
| * HTTP request context that encapsulates all request data | ||
| */ | ||
| interface HTTPRequestContext { | ||
| adapter: HTTPAdapter; | ||
| path: string; | ||
| method: string; | ||
| paymentHeader?: string; | ||
| } | ||
| /** | ||
| * HTTP response instructions for the framework middleware | ||
| */ | ||
| interface HTTPResponseInstructions { | ||
| status: number; | ||
| headers: Record<string, string>; | ||
| body?: unknown; | ||
| isHtml?: boolean; | ||
| } | ||
| /** | ||
| * Result of processing an HTTP request for payment | ||
| */ | ||
| type HTTPProcessResult = { | ||
| type: "no-payment-required"; | ||
| } | { | ||
| type: "payment-verified"; | ||
| paymentPayload: PaymentPayload; | ||
| paymentRequirements: PaymentRequirements; | ||
| } | { | ||
| type: "payment-error"; | ||
| response: HTTPResponseInstructions; | ||
| }; | ||
| /** | ||
| * Result of processSettlement | ||
| */ | ||
| type ProcessSettleSuccessResponse = SettleResponse & { | ||
| success: true; | ||
| headers: Record<string, string>; | ||
| requirements: PaymentRequirements; | ||
| }; | ||
| type ProcessSettleFailureResponse = SettleResponse & { | ||
| success: false; | ||
| errorReason: string; | ||
| }; | ||
| type ProcessSettleResultResponse = ProcessSettleSuccessResponse | ProcessSettleFailureResponse; | ||
| /** | ||
| * Represents a validation error for a specific route's payment configuration. | ||
| */ | ||
| interface RouteValidationError { | ||
| /** The route pattern (e.g., "GET /api/weather") */ | ||
| routePattern: string; | ||
| /** The payment scheme that failed validation */ | ||
| scheme: string; | ||
| /** The network that failed validation */ | ||
| network: Network; | ||
| /** The type of validation failure */ | ||
| reason: "missing_scheme" | "missing_facilitator"; | ||
| /** Human-readable error message */ | ||
| message: string; | ||
| } | ||
| /** | ||
| * Error thrown when route configuration validation fails. | ||
| */ | ||
| declare class RouteConfigurationError extends Error { | ||
| /** The validation errors that caused this exception */ | ||
| readonly errors: RouteValidationError[]; | ||
| /** | ||
| * Creates a new RouteConfigurationError with the given validation errors. | ||
| * | ||
| * @param errors - The validation errors that caused this exception. | ||
| */ | ||
| constructor(errors: RouteValidationError[]); | ||
| } | ||
| /** | ||
| * HTTP-enhanced x402 resource server | ||
| * Provides framework-agnostic HTTP protocol handling | ||
| */ | ||
| declare class x402HTTPResourceServer { | ||
| private ResourceServer; | ||
| private compiledRoutes; | ||
| private routesConfig; | ||
| private paywallProvider?; | ||
| /** | ||
| * Creates a new x402HTTPResourceServer instance. | ||
| * | ||
| * @param ResourceServer - The core x402ResourceServer instance to use | ||
| * @param routes - Route configuration for payment-protected endpoints | ||
| */ | ||
| constructor(ResourceServer: x402ResourceServer, routes: RoutesConfig); | ||
| /** | ||
| * Initialize the HTTP resource server. | ||
| * | ||
| * This method initializes the underlying resource server (fetching facilitator support) | ||
| * and then validates that all route payment configurations have corresponding | ||
| * registered schemes and facilitator support. | ||
| * | ||
| * @throws RouteConfigurationError if any route's payment options don't have | ||
| * corresponding registered schemes or facilitator support | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const httpServer = new x402HTTPResourceServer(server, routes); | ||
| * await httpServer.initialize(); | ||
| * ``` | ||
| */ | ||
| initialize(): Promise<void>; | ||
| /** | ||
| * Register a custom paywall provider for generating HTML | ||
| * | ||
| * @param provider - PaywallProvider instance | ||
| * @returns This service instance for chaining | ||
| */ | ||
| registerPaywallProvider(provider: PaywallProvider): this; | ||
| /** | ||
| * Process HTTP request and return response instructions | ||
| * This is the main entry point for framework middleware | ||
| * | ||
| * @param context - HTTP request context | ||
| * @param paywallConfig - Optional paywall configuration | ||
| * @returns Process result indicating next action for middleware | ||
| */ | ||
| processHTTPRequest(context: HTTPRequestContext, paywallConfig?: PaywallConfig): Promise<HTTPProcessResult>; | ||
| /** | ||
| * Process settlement after successful response | ||
| * | ||
| * @param paymentPayload - The verified payment payload | ||
| * @param requirements - The matching payment requirements | ||
| * @returns ProcessSettleResultResponse - SettleResponse with headers if success or errorReason if failure | ||
| */ | ||
| processSettlement(paymentPayload: PaymentPayload, requirements: PaymentRequirements): Promise<ProcessSettleResultResponse>; | ||
| /** | ||
| * Check if a request requires payment based on route configuration | ||
| * | ||
| * @param context - HTTP request context | ||
| * @returns True if the route requires payment, false otherwise | ||
| */ | ||
| requiresPayment(context: HTTPRequestContext): boolean; | ||
| /** | ||
| * Normalizes a RouteConfig's accepts field into an array of PaymentOptions | ||
| * Handles both single PaymentOption and array formats | ||
| * | ||
| * @param routeConfig - Route configuration | ||
| * @returns Array of payment options | ||
| */ | ||
| private normalizePaymentOptions; | ||
| /** | ||
| * Validates that all payment options in routes have corresponding registered schemes | ||
| * and facilitator support. | ||
| * | ||
| * @returns Array of validation errors (empty if all routes are valid) | ||
| */ | ||
| private validateRouteConfiguration; | ||
| /** | ||
| * Get route configuration for a request | ||
| * | ||
| * @param path - Request path | ||
| * @param method - HTTP method | ||
| * @returns Route configuration or undefined if no match | ||
| */ | ||
| private getRouteConfig; | ||
| /** | ||
| * Extract payment from HTTP headers (handles v1 and v2) | ||
| * | ||
| * @param adapter - HTTP adapter | ||
| * @returns Decoded payment payload or null | ||
| */ | ||
| private extractPayment; | ||
| /** | ||
| * Check if request is from a web browser | ||
| * | ||
| * @param adapter - HTTP adapter | ||
| * @returns True if request appears to be from a browser | ||
| */ | ||
| private isWebBrowser; | ||
| /** | ||
| * Create HTTP response instructions from payment required | ||
| * | ||
| * @param paymentRequired - Payment requirements | ||
| * @param isWebBrowser - Whether request is from browser | ||
| * @param paywallConfig - Paywall configuration | ||
| * @param customHtml - Custom HTML template | ||
| * @param unpaidResponse - Optional custom response (content type and body) for unpaid API requests | ||
| * @returns Response instructions | ||
| */ | ||
| private createHTTPResponse; | ||
| /** | ||
| * Create HTTP payment required response (v1 puts in body, v2 puts in header) | ||
| * | ||
| * @param paymentRequired - Payment required object | ||
| * @returns Headers and body for the HTTP response | ||
| */ | ||
| private createHTTPPaymentRequiredResponse; | ||
| /** | ||
| * Create settlement response headers | ||
| * | ||
| * @param settleResponse - Settlement response | ||
| * @returns Headers to add to response | ||
| */ | ||
| private createSettlementHeaders; | ||
| /** | ||
| * Parse route pattern into verb and regex | ||
| * | ||
| * @param pattern - Route pattern like "GET /api/*" or "/api/[id]" | ||
| * @returns Parsed pattern with verb and regex | ||
| */ | ||
| private parseRoutePattern; | ||
| /** | ||
| * Normalize path for matching | ||
| * | ||
| * @param path - Raw path from request | ||
| * @returns Normalized path | ||
| */ | ||
| private normalizePath; | ||
| /** | ||
| * Generate paywall HTML for browser requests | ||
| * | ||
| * @param paymentRequired - Payment required response | ||
| * @param paywallConfig - Optional paywall configuration | ||
| * @param customHtml - Optional custom HTML template | ||
| * @returns HTML string | ||
| */ | ||
| private generatePaywallHTML; | ||
| /** | ||
| * Extract display amount from payment requirements. | ||
| * | ||
| * @param paymentRequired - The payment required object | ||
| * @returns The display amount in decimal format | ||
| */ | ||
| private getDisplayAmount; | ||
| } | ||
| export { type CompiledRoute as C, type DynamicPayTo as D, type FacilitatorClient as F, type HTTPAdapter as H, type PaywallConfig as P, type RouteConfig as R, type UnpaidResponseBody as U, type HTTPRequestContext as a, type HTTPResponseInstructions as b, type HTTPProcessResult as c, type PaywallProvider as d, type PaymentOption as e, type RoutesConfig as f, type DynamicPrice as g, type UnpaidResponseResult as h, type ProcessSettleResultResponse as i, type ProcessSettleSuccessResponse as j, type ProcessSettleFailureResponse as k, type RouteValidationError as l, RouteConfigurationError as m, HTTPFacilitatorClient as n, type FacilitatorConfig as o, x402ResourceServer as p, type ResourceConfig as q, type ResourceInfo as r, x402HTTPResourceServer as x }; |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 2 instances in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 2 instances in 1 package
834382
22.68%70
9.38%8560
26.37%