@bankofai/x402-core 1.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +294 -0
  2. package/dist/cjs/client/index.d.ts +149 -0
  3. package/dist/cjs/client/index.js +909 -0
  4. package/dist/cjs/client/index.js.map +1 -0
  5. package/dist/cjs/facilitator/index.d.ts +206 -0
  6. package/dist/cjs/facilitator/index.js +431 -0
  7. package/dist/cjs/facilitator/index.js.map +1 -0
  8. package/dist/cjs/http/index.d.ts +50 -0
  9. package/dist/cjs/http/index.js +1452 -0
  10. package/dist/cjs/http/index.js.map +1 -0
  11. package/dist/cjs/index.d.ts +3 -0
  12. package/dist/cjs/index.js +31 -0
  13. package/dist/cjs/index.js.map +1 -0
  14. package/dist/cjs/schemas/index.d.ts +891 -0
  15. package/dist/cjs/schemas/index.js +216 -0
  16. package/dist/cjs/schemas/index.js.map +1 -0
  17. package/dist/cjs/server/index.d.ts +79 -0
  18. package/dist/cjs/server/index.js +2568 -0
  19. package/dist/cjs/server/index.js.map +1 -0
  20. package/dist/cjs/types/index.d.ts +1 -0
  21. package/dist/cjs/types/index.js +97 -0
  22. package/dist/cjs/types/index.js.map +1 -0
  23. package/dist/cjs/types/v1/index.d.ts +1 -0
  24. package/dist/cjs/types/v1/index.js +19 -0
  25. package/dist/cjs/types/v1/index.js.map +1 -0
  26. package/dist/cjs/utils/index.d.ts +77 -0
  27. package/dist/cjs/utils/index.js +179 -0
  28. package/dist/cjs/utils/index.js.map +1 -0
  29. package/dist/cjs/x402Client-BgegfQgE.d.ts +1807 -0
  30. package/dist/cjs/x402Client-TQHctrG7.d.ts +1807 -0
  31. package/dist/esm/chunk-ABS7D6VX.mjs +145 -0
  32. package/dist/esm/chunk-ABS7D6VX.mjs.map +1 -0
  33. package/dist/esm/chunk-AGOUMC4P.mjs +68 -0
  34. package/dist/esm/chunk-AGOUMC4P.mjs.map +1 -0
  35. package/dist/esm/chunk-BJTO5JO5.mjs +11 -0
  36. package/dist/esm/chunk-BJTO5JO5.mjs.map +1 -0
  37. package/dist/esm/chunk-FPXAE3OS.mjs +161 -0
  38. package/dist/esm/chunk-FPXAE3OS.mjs.map +1 -0
  39. package/dist/esm/chunk-IL77TMJL.mjs +1275 -0
  40. package/dist/esm/chunk-IL77TMJL.mjs.map +1 -0
  41. package/dist/esm/chunk-VE37GDG2.mjs +7 -0
  42. package/dist/esm/chunk-VE37GDG2.mjs.map +1 -0
  43. package/dist/esm/client/index.d.mts +149 -0
  44. package/dist/esm/client/index.mjs +504 -0
  45. package/dist/esm/client/index.mjs.map +1 -0
  46. package/dist/esm/facilitator/index.d.mts +206 -0
  47. package/dist/esm/facilitator/index.mjs +399 -0
  48. package/dist/esm/facilitator/index.mjs.map +1 -0
  49. package/dist/esm/http/index.d.mts +50 -0
  50. package/dist/esm/http/index.mjs +35 -0
  51. package/dist/esm/http/index.mjs.map +1 -0
  52. package/dist/esm/index.d.mts +3 -0
  53. package/dist/esm/index.mjs +8 -0
  54. package/dist/esm/index.mjs.map +1 -0
  55. package/dist/esm/schemas/index.d.mts +891 -0
  56. package/dist/esm/schemas/index.mjs +70 -0
  57. package/dist/esm/schemas/index.mjs.map +1 -0
  58. package/dist/esm/server/index.d.mts +79 -0
  59. package/dist/esm/server/index.mjs +1318 -0
  60. package/dist/esm/server/index.mjs.map +1 -0
  61. package/dist/esm/types/index.d.mts +1 -0
  62. package/dist/esm/types/index.mjs +14 -0
  63. package/dist/esm/types/index.mjs.map +1 -0
  64. package/dist/esm/types/v1/index.d.mts +1 -0
  65. package/dist/esm/types/v1/index.mjs +1 -0
  66. package/dist/esm/types/v1/index.mjs.map +1 -0
  67. package/dist/esm/utils/index.d.mts +77 -0
  68. package/dist/esm/utils/index.mjs +28 -0
  69. package/dist/esm/utils/index.mjs.map +1 -0
  70. package/dist/esm/x402Client-BgegfQgE.d.mts +1807 -0
  71. package/dist/esm/x402Client-TQHctrG7.d.mts +1807 -0
  72. package/package.json +142 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/server/index.ts","../../../src/types/facilitator.ts","../../../src/utils/index.ts","../../../src/server/hookPolicy.ts","../../../src/schemas/index.ts","../../../src/http/httpFacilitatorClient.ts","../../../src/index.ts","../../../src/server/x402ResourceServer.ts","../../../src/http/index.ts","../../../src/http/x402HTTPResourceServer.ts"],"sourcesContent":["export { x402ResourceServer } from \"./x402ResourceServer\";\nexport type {\n ResourceConfig,\n PaymentRequiredContext,\n VerifyContext,\n VerifyResultContext,\n VerifyFailureContext,\n SettleContext,\n SettleResultContext,\n SettleFailureContext,\n VerifiedPaymentCanceledContext,\n VerifiedPaymentCancellationReason,\n VerifiedPaymentCancelOptions,\n PaymentCancellationDispatcher,\n SettlementOverrides,\n ExtensionValidationResult,\n SkipHandlerDirective,\n ResourceVerifyRespone,\n BeforeVerifyHook,\n AfterVerifyHook,\n OnVerifyFailureHook,\n BeforeSettleHook,\n AfterSettleHook,\n OnSettleFailureHook,\n OnVerifiedPaymentCanceledHook,\n} from \"./x402ResourceServer\";\nexport type {\n SchemeEnrichPaymentRequiredResponseHook,\n SchemePaymentRequiredContext,\n SchemeEnrichSettlementPayloadHook,\n SchemeEnrichSettlementResponseHook,\n} from \"../types/mechanisms\";\n\nexport {\n assertAdditivePayloadEnrichment,\n assertAdditiveSettlementExtra,\n assertAcceptsAdditiveExtraAfterSchemeEnrich,\n assertAcceptsAllowlistedAfterExtensionEnrich,\n assertSettleResponseCoreUnchanged,\n isVacantStringField,\n snapshotPaymentRequirementsList,\n snapshotSettleResponseCore,\n} from \"./hookPolicy\";\nexport type { SettleResponseCoreSnapshot } from \"./hookPolicy\";\n\nexport { HTTPFacilitatorClient } from \"../http/httpFacilitatorClient\";\nexport type { FacilitatorClient, FacilitatorConfig } from \"../http/httpFacilitatorClient\";\nexport { FacilitatorResponseError, getFacilitatorResponseError } from \"../types\";\n\nexport {\n x402HTTPResourceServer,\n RouteConfigurationError,\n SETTLEMENT_OVERRIDES_HEADER,\n checkIfBazaarNeeded,\n} from \"../http/x402HTTPResourceServer\";\nexport type {\n HTTPRequestContext,\n HTTPTransportContext,\n HTTPResponseInstructions,\n HTTPProcessResult,\n PaywallConfig,\n PaywallProvider,\n RouteConfig,\n CompiledRoute,\n HTTPAdapter,\n RoutesConfig,\n UnpaidResponseBody,\n HTTPResponseBody,\n SettlementFailedResponseBody,\n ProcessSettleResultResponse,\n ProcessSettleSuccessResponse,\n ProcessSettleFailureResponse,\n RouteValidationError,\n ProtectedRequestHook,\n} from \"../http/x402HTTPResourceServer\";\n","import { PaymentPayload, PaymentRequirements } from \"./payments\";\nimport { Network } from \"./\";\n\nexport type VerifyRequest = {\n x402Version: number;\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 extra?: Record<string, unknown>;\n};\n\nexport type SettleRequest = {\n x402Version: number;\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 /** Actual amount settled in atomic token units. Present for schemes like `upto` where settlement amount may differ from the authorized maximum. */\n amount?: string;\n extensions?: Record<string, unknown>;\n extra?: 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 failure 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\n/**\n * Error thrown when a facilitator returns malformed success payload data.\n */\nexport class FacilitatorResponseError extends Error {\n /**\n * Creates a FacilitatorResponseError for malformed facilitator responses.\n *\n * @param message - The boundary error message\n */\n constructor(message: string) {\n super(message);\n this.name = \"FacilitatorResponseError\";\n }\n}\n\n/**\n * Walks an error cause chain to find the first facilitator response error.\n *\n * @param error - The thrown value to inspect\n * @returns The nested facilitator response error, if present\n */\nexport function getFacilitatorResponseError(error: unknown): FacilitatorResponseError | null {\n let current = error;\n\n while (current instanceof Error) {\n if (current instanceof FacilitatorResponseError) {\n return current;\n }\n current = current.cause;\n }\n\n return null;\n}\n","import { Network } from \"../types\";\n\n/**\n * Converts a JavaScript number to a plain decimal string, expanding scientific notation\n * via string manipulation rather than parseFloat round-tripping.\n *\n * e.g. 1e-7 → \"0.0000001\", 4.02 → \"4.02\"\n *\n * @param n - The number to convert\n * @returns A plain decimal string representation with no scientific notation\n */\nexport function numberToDecimalString(n: number): string {\n const str = n.toString();\n if (!/[eE]/.test(str)) return str;\n\n const [significand, exponentStr] = str.split(/[eE]/);\n const exp = parseInt(exponentStr, 10);\n const negative = significand.startsWith(\"-\");\n const abs = negative ? significand.slice(1) : significand;\n const [intDigits, fracDigits = \"\"] = abs.split(\".\");\n const allDigits = intDigits + fracDigits;\n const decimalPos = intDigits.length + exp;\n\n let result: string;\n if (decimalPos <= 0) {\n result = \"0.\" + \"0\".repeat(-decimalPos) + allDigits;\n } else if (decimalPos >= allDigits.length) {\n result = allDigits + \"0\".repeat(decimalPos - allDigits.length);\n } else {\n result = allDigits.slice(0, decimalPos) + \".\" + allDigits.slice(decimalPos);\n }\n return (negative ? \"-\" : \"\") + result;\n}\n\n/**\n * Parses a money string into a finite, non-negative decimal number.\n * Accepts plain decimal strings with an optional leading dollar sign.\n *\n * @param money - The money string to parse\n * @returns Decimal number\n */\nexport function parseMoneyString(money: string): number {\n const cleaned = money.replace(/^\\$/, \"\").trim();\n if (!/^-?\\d+(?:\\.\\d+)?$/.test(cleaned) || /[eE]/.test(cleaned)) {\n throw new Error(`Invalid money format: ${money}`);\n }\n\n const amount = Number(cleaned);\n if (!Number.isFinite(amount) || amount < 0) {\n throw new Error(`Invalid money format: ${money}`);\n }\n return amount;\n}\n\n/**\n * Convert a decimal amount to token smallest units.\n * Accepts only plain decimal strings — scientific notation is not allowed.\n * Throws if the amount is non-zero but too small to represent with the given decimal precision.\n *\n * @param decimalAmount - The decimal amount as a plain string (e.g., \"0.10\")\n * @param decimals - The number of decimals for the token (e.g., 6 for USDC)\n * @returns The amount in smallest units as a string\n */\nexport function convertToTokenAmount(decimalAmount: string, decimals: number): string {\n if (/[eE]/.test(decimalAmount)) {\n throw new Error(\n `Invalid amount: ${decimalAmount} — use decimal notation, not scientific notation`,\n );\n }\n if (!/^-?\\d+\\.?\\d*$/.test(decimalAmount)) {\n throw new Error(`Invalid amount: ${decimalAmount}`);\n }\n const [intPart, decPart = \"\"] = decimalAmount.split(\".\");\n const paddedDec = decPart.padEnd(decimals, \"0\").slice(0, decimals);\n const tokenAmount = (intPart + paddedDec).replace(/^0+/, \"\") || \"0\";\n if (tokenAmount === \"0\" && /[1-9]/.test(decimalAmount)) {\n throw new Error(\n `Amount ${decimalAmount} is too small to represent with ${decimals} decimal places`,\n );\n }\n return tokenAmount;\n}\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\nconst escapeRegExp = (value: string): string => value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\nconst networkPatternToRegExp = (pattern: Network): RegExp => {\n const source = escapeRegExp(pattern).replace(/\\\\\\*/g, \".*\");\n return new RegExp(`^${source}$`);\n};\n\nexport const networkMatchesPattern = (pattern: Network, network: Network): boolean => {\n return networkPatternToRegExp(pattern).test(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 if (networkMatchesPattern(registeredNetworkPattern as Network, 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 if (networkMatchesPattern(schemeData.pattern, 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 type { SettleResponse } from \"../types/facilitator\";\nimport type { PaymentRequirements } from \"../types/payments\";\nimport { deepEqual } from \"../utils\";\n\n/**\n * True when a string field is treated as unset and may be filled by `enrichPaymentRequiredResponse`.\n *\n * @param value - Candidate string from `PaymentRequirements` (e.g. `payTo`, `amount`, `asset`)\n * @returns Whether the field counts as vacant (empty or whitespace-only)\n */\nexport function isVacantStringField(value: string): boolean {\n return value.trim() === \"\";\n}\n\n/**\n * Deep snapshot of `accepts` entries before any `enrichPaymentRequiredResponse` runs.\n *\n * @param requirements - Payment requirement rows to clone\n * @returns Cloned requirements suitable as an immutable baseline for policy checks\n */\nexport function snapshotPaymentRequirementsList(\n requirements: PaymentRequirements[],\n): PaymentRequirements[] {\n return requirements.map(req => ({\n ...req,\n extra: structuredClone(req.extra),\n }));\n}\n\n/**\n * After extension enrichment, each `accepts[i]` must still match the baseline except that\n * **`payTo`**, **`amount`**, and **`asset`** may change only when the baseline value is vacant\n * (whitespace-only string). **`scheme`**, **`network`**, and **`maxTimeoutSeconds`** are never\n * writable by extensions. **`extra`** may gain new keys; values for keys present in the baseline\n * must be unchanged (deep-equal).\n *\n * @param baseline - Snapshot taken before any enrich hooks for this response\n * @param current - Live `accepts` entries after an extension enrich step\n * @param extensionKey - Registered extension key (for error messages)\n * @returns Nothing; throws if the policy is violated\n */\nexport function assertAcceptsAllowlistedAfterExtensionEnrich(\n baseline: PaymentRequirements[],\n current: PaymentRequirements[],\n extensionKey: string,\n): void {\n if (baseline.length !== current.length) {\n throw new Error(\n `[x402] extension \"${extensionKey}\" violated accepts mutation policy: accepts length changed (${baseline.length} → ${current.length})`,\n );\n }\n\n for (let i = 0; i < baseline.length; i++) {\n const b = baseline[i];\n const c = current[i];\n\n if (b.scheme !== c.scheme || b.network !== c.network) {\n throw new Error(\n `[x402] extension \"${extensionKey}\" violated accepts mutation policy: scheme/network are immutable (index ${i})`,\n );\n }\n if (b.maxTimeoutSeconds !== c.maxTimeoutSeconds) {\n throw new Error(\n `[x402] extension \"${extensionKey}\" violated accepts mutation policy: maxTimeoutSeconds is immutable (index ${i})`,\n );\n }\n\n for (const field of [\"payTo\", \"amount\", \"asset\"] as const) {\n const bv = b[field];\n const cv = c[field];\n if (!isVacantStringField(bv) && cv !== bv) {\n throw new Error(\n `[x402] extension \"${extensionKey}\" violated accepts mutation policy: \"${field}\" may only be set when the resource left it vacant (\"\"); non-vacant values are immutable (index ${i})`,\n );\n }\n }\n\n for (const key of Object.keys(b.extra)) {\n if (!Object.prototype.hasOwnProperty.call(c.extra, key)) {\n throw new Error(\n `[x402] extension \"${extensionKey}\" violated accepts mutation policy: extra[\"${key}\"] was removed (index ${i})`,\n );\n }\n if (!deepEqual(c.extra[key], b.extra[key])) {\n throw new Error(\n `[x402] extension \"${extensionKey}\" violated accepts mutation policy: extra[\"${key}\"] may not be changed (index ${i})`,\n );\n }\n }\n }\n}\n\n/**\n * Ensures scheme 402 enrichment only adds `extra` keys to matching accepts.\n *\n * @param baseline - Snapshot before the scheme enrich step\n * @param current - Live `accepts` entries after scheme enrichment\n * @param scheme - Scheme whose hook was invoked\n * @param network - Network whose hook was invoked\n */\nexport function assertAcceptsAdditiveExtraAfterSchemeEnrich(\n baseline: PaymentRequirements[],\n current: PaymentRequirements[],\n scheme: string,\n network: string,\n): void {\n if (baseline.length !== current.length) {\n throw new Error(\n `[x402] scheme \"${scheme}\" violated accepts mutation policy: accepts length changed (${baseline.length} → ${current.length})`,\n );\n }\n\n for (let i = 0; i < baseline.length; i++) {\n const b = baseline[i];\n const c = current[i];\n const isMatchingAccept = b.scheme === scheme && b.network === network;\n\n if (b.scheme !== c.scheme || b.network !== c.network) {\n throw new Error(\n `[x402] scheme \"${scheme}\" violated accepts mutation policy: scheme/network are immutable (index ${i})`,\n );\n }\n if (\n b.maxTimeoutSeconds !== c.maxTimeoutSeconds ||\n b.payTo !== c.payTo ||\n b.amount !== c.amount ||\n b.asset !== c.asset\n ) {\n throw new Error(\n `[x402] scheme \"${scheme}\" violated accepts mutation policy: payment terms are immutable (index ${i})`,\n );\n }\n\n for (const key of Object.keys(b.extra)) {\n if (!Object.prototype.hasOwnProperty.call(c.extra, key)) {\n throw new Error(\n `[x402] scheme \"${scheme}\" violated accepts mutation policy: extra[\"${key}\"] was removed (index ${i})`,\n );\n }\n if (!deepEqual(c.extra[key], b.extra[key])) {\n throw new Error(\n `[x402] scheme \"${scheme}\" violated accepts mutation policy: extra[\"${key}\"] may not be changed (index ${i})`,\n );\n }\n }\n\n if (!isMatchingAccept && Object.keys(c.extra).length !== Object.keys(b.extra).length) {\n throw new Error(\n `[x402] scheme \"${scheme}\" violated accepts mutation policy: only matching accepts may receive new extra fields (index ${i})`,\n );\n }\n }\n}\n\n/**\n * Immutable subset of {@link SettleResponse} compared across settlement extension enrich.\n */\nexport type SettleResponseCoreSnapshot = Pick<\n SettleResponse,\n \"success\" | \"transaction\" | \"network\" | \"amount\" | \"payer\" | \"errorReason\" | \"errorMessage\"\n>;\n\n/**\n * Captures facilitator-settled fields that extensions must not rewrite.\n *\n * @param result - Settlement response from the facilitator\n * @returns Plain snapshot of core fields for later comparison\n */\nexport function snapshotSettleResponseCore(result: SettleResponse): SettleResponseCoreSnapshot {\n return {\n success: result.success,\n transaction: result.transaction,\n network: result.network,\n amount: result.amount,\n payer: result.payer,\n errorReason: result.errorReason,\n errorMessage: result.errorMessage,\n };\n}\n\n/**\n * Ensures `enrichSettlementResponse` did not rewrite facilitator outcome fields; only\n * `extensions` may be populated via the merger (in addition to in-place adds on `extensions`).\n *\n * @param before - Snapshot taken before extension settlement enrich\n * @param after - Live settlement result after an extension enrich step\n * @param extensionKey - Registered extension key (for error messages)\n * @returns Nothing; throws if a core field changed\n */\nexport function assertSettleResponseCoreUnchanged(\n before: SettleResponseCoreSnapshot,\n after: SettleResponse,\n extensionKey: string,\n): void {\n const keys: (keyof SettleResponseCoreSnapshot)[] = [\n \"success\",\n \"transaction\",\n \"network\",\n \"amount\",\n \"payer\",\n \"errorReason\",\n \"errorMessage\",\n ];\n for (const k of keys) {\n if (!deepEqual(after[k], before[k])) {\n throw new Error(\n `[x402] extension \"${extensionKey}\" violated settlement mutation policy: field \"${String(k)}\" is immutable after facilitator settle`,\n );\n }\n }\n}\n\n/**\n * Ensures scheme settlement-payload enrichment only adds server-owned fields.\n *\n * @param payload - Existing scheme payload before enrichment\n * @param enrichment - Fields returned by the scheme enrichment hook\n * @param callerLabel - Hook source label used in policy error messages\n */\nexport function assertAdditivePayloadEnrichment(\n payload: Record<string, unknown>,\n enrichment: Record<string, unknown>,\n callerLabel: string,\n): void {\n for (const key of Object.keys(enrichment)) {\n if (!Object.prototype.hasOwnProperty.call(payload, key)) continue;\n\n throw new Error(\n `[x402] ${callerLabel} violated settlement payload enrichment policy: \"${key}\" already exists on the client payload`,\n );\n }\n}\n\n/**\n * Whether `value` is a plain object record (not null or an array).\n *\n * @param value - Value to inspect\n * @returns True when `value` is a non-null object and not an array\n */\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * Ensures scheme response enrichment only adds new `extra` fields, including nested fields\n * below existing objects.\n *\n * @param extra - Existing settlement extra fields\n * @param enrichment - Fields returned by the scheme response enrichment hook\n * @param callerLabel - Hook label used in policy error messages\n */\nexport function assertAdditiveSettlementExtra(\n extra: Record<string, unknown>,\n enrichment: Record<string, unknown>,\n callerLabel: string,\n): void {\n assertAdditiveRecord(extra, enrichment, callerLabel, \"extra\");\n}\n\n/**\n * Merges server-owned settlement response fields after additive policy validation.\n *\n * @param extra - Existing settlement extra fields\n * @param enrichment - Additive fields returned by the scheme response enrichment hook\n * @returns A merged extra object\n */\nexport function mergeAdditiveSettlementExtra(\n extra: Record<string, unknown>,\n enrichment: Record<string, unknown>,\n): Record<string, unknown> {\n return mergeAdditiveRecord(extra, enrichment);\n}\n\n/**\n * Throws if enrichment would overwrite or collide with keys already present on `target`,\n * recursively for nested plain objects.\n *\n * @param target - Existing record fields before enrichment\n * @param enrichment - Fields proposed by the hook to merge into `target`\n * @param callerLabel - Hook label used in policy error messages\n * @param path - Dot-style path segment for nested keys (for error messages)\n */\nfunction assertAdditiveRecord(\n target: Record<string, unknown>,\n enrichment: Record<string, unknown>,\n callerLabel: string,\n path: string,\n): void {\n for (const [key, enrichmentValue] of Object.entries(enrichment)) {\n const nextPath = `${path}[\"${key}\"]`;\n if (!Object.prototype.hasOwnProperty.call(target, key)) continue;\n\n const targetValue = target[key];\n if (isPlainRecord(targetValue) && isPlainRecord(enrichmentValue)) {\n assertAdditiveRecord(targetValue, enrichmentValue, callerLabel, nextPath);\n continue;\n }\n\n throw new Error(\n `[x402] ${callerLabel} violated settlement response enrichment policy: ${nextPath} already exists on the settlement result`,\n );\n }\n}\n\n/**\n * Deep-merges `enrichment` into `target`, recursively merging nested plain objects.\n *\n * @param target - Base record to merge into\n * @param enrichment - Additive fields to merge (caller must enforce additive policy first)\n * @returns Shallow copy of `target` with `enrichment` applied\n */\nfunction mergeAdditiveRecord(\n target: Record<string, unknown>,\n enrichment: Record<string, unknown>,\n): Record<string, unknown> {\n const merged = { ...target };\n for (const [key, enrichmentValue] of Object.entries(enrichment)) {\n const targetValue = merged[key];\n if (isPlainRecord(targetValue) && isPlainRecord(enrichmentValue)) {\n merged[key] = mergeAdditiveRecord(targetValue, enrichmentValue);\n continue;\n }\n merged[key] = enrichmentValue;\n }\n return merged;\n}\n","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().nullable();\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 */\n// Printable ASCII (U+0020–U+007E) — matches the bazaar-facilitator\n// `isValidServiceName` / `sanitizeTags` regex. Constraining to ASCII keeps\n// the length cap consistent across TS / Python / Go (where String.length /\n// len() / len() otherwise diverge for multi-byte input).\nconst PRINTABLE_ASCII_REGEX = /^[\\x20-\\x7e]+$/;\n\nexport const ResourceInfoSchema = z.object({\n url: NonEmptyString,\n description: z.string().optional(),\n mimeType: z.string().optional(),\n serviceName: z.string().min(1).max(32).regex(PRINTABLE_ASCII_REGEX).optional(),\n tags: z.array(z.string().min(1).max(32).regex(PRINTABLE_ASCII_REGEX)).max(5).optional(),\n iconUrl: z.string().max(2048).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","import { PaymentPayload, PaymentRequirements } from \"../types/payments\";\nimport {\n VerifyResponse,\n SettleResponse,\n SupportedResponse,\n VerifyError,\n SettleError,\n FacilitatorResponseError,\n} from \"../types/facilitator\";\nimport { z } from \"../schemas\";\nimport { safeBase64Decode } from \"../utils\";\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 bazaar?: 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/** Number of retries for getSupported() on 429 rate limit errors */\nconst GET_SUPPORTED_RETRIES = 3;\n/** Base delay in ms for exponential backoff on retries */\nconst GET_SUPPORTED_RETRY_DELAY_MS = 1000;\n/** Upper bound on retry delay to prevent pathological waits from a misbehaving server */\nconst MAX_RETRY_DELAY_MS = 30_000;\n\n/**\n * Resolves the delay before the next 429 retry. Parses Retry-After per RFC 7231 §7.1.3\n * (delta-seconds or HTTP-date) and falls back to exponential backoff when the header\n * is absent, unparseable, or non-positive. The result is clamped to MAX_RETRY_DELAY_MS.\n *\n * @param retryAfter - Raw `Retry-After` header value, or null if not present\n * @param attempt - Zero-based retry attempt index used for exponential backoff\n * @returns Delay in milliseconds to wait before the next attempt\n */\nexport function computeRetryDelay(retryAfter: string | null, attempt: number): number {\n let delay: number | null = null;\n\n if (retryAfter !== null) {\n const seconds = Number(retryAfter);\n if (!isNaN(seconds)) {\n // delta-seconds form\n delay = seconds * 1000;\n } else {\n // HTTP-date form\n const retryDate = Date.parse(retryAfter);\n if (!isNaN(retryDate)) {\n delay = retryDate - Date.now();\n }\n }\n }\n\n // Fall back to exponential backoff for missing, invalid, or non-positive values\n if (delay === null || delay <= 0) {\n delay = GET_SUPPORTED_RETRY_DELAY_MS * Math.pow(2, attempt);\n }\n\n return Math.min(delay, MAX_RETRY_DELAY_MS);\n}\n\nconst verifyResponseSchema: z.ZodType<VerifyResponse, z.ZodTypeDef, unknown> = z.object({\n isValid: z.boolean(),\n invalidReason: z\n .string()\n .nullish()\n .transform(v => v ?? undefined),\n invalidMessage: z\n .string()\n .nullish()\n .transform(v => v ?? undefined),\n payer: z\n .string()\n .nullish()\n .transform(v => v ?? undefined),\n extensions: z\n .record(z.string(), z.unknown())\n .nullish()\n .transform(v => v ?? undefined),\n extra: z\n .record(z.string(), z.unknown())\n .nullish()\n .transform(v => v ?? undefined),\n});\n\nconst settleResponseSchema: z.ZodType<SettleResponse, z.ZodTypeDef, unknown> = z.object({\n success: z.boolean(),\n errorReason: z\n .string()\n .nullish()\n .transform(v => v ?? undefined),\n errorMessage: z\n .string()\n .nullish()\n .transform(v => v ?? undefined),\n payer: z\n .string()\n .nullish()\n .transform(v => v ?? undefined),\n transaction: z.string(),\n network: z.custom<SettleResponse[\"network\"]>(value => typeof value === \"string\"),\n amount: z\n .string()\n .nullish()\n .transform(v => v ?? undefined),\n extensions: z\n .record(z.string(), z.unknown())\n .nullish()\n .transform(v => v ?? undefined),\n extra: z\n .record(z.string(), z.unknown())\n .nullish()\n .transform(v => v ?? undefined),\n});\n\nconst supportedKindSchema: z.ZodType<SupportedResponse[\"kinds\"][number], z.ZodTypeDef, unknown> =\n z.object({\n x402Version: z.number(),\n scheme: z.string(),\n network: z.custom<SupportedResponse[\"kinds\"][number][\"network\"]>(\n value => typeof value === \"string\",\n ),\n extra: z\n .record(z.string(), z.unknown())\n .nullish()\n .transform(v => v ?? undefined),\n });\n\nconst supportedResponseSchema: z.ZodType<SupportedResponse, z.ZodTypeDef, unknown> = z.object({\n kinds: z.array(supportedKindSchema),\n extensions: z.array(z.string()).default([]),\n signers: z.record(z.string(), z.array(z.string())).default({}),\n});\n\n/**\n * Produces a compact excerpt of a facilitator response body for error messages.\n *\n * @param text - The raw response body text\n * @param limit - The maximum number of characters to include\n * @returns A normalized excerpt suitable for logs and thrown errors\n */\nfunction responseExcerpt(text: string, limit: number = 200): string {\n const compact = text.trim().replace(/\\s+/g, \" \");\n if (!compact) {\n return \"<empty response>\";\n }\n\n if (compact.length <= limit) {\n return compact;\n }\n\n return `${compact.slice(0, limit - 3)}...`;\n}\n\nconst EXTENSION_RESPONSE_LOG_FIELD_ALLOWLIST = [\"status\", \"rejectedReason\", \"reason\", \"code\"];\n\n/**\n * Reads the `EXTENSION-RESPONSES` header from a facilitator HTTP response and logs\n * allowlisted fields. Silently ignores malformed headers.\n *\n * @param response - The HTTP response from the facilitator\n */\nfunction logExtensionResponsesHeader(response: Response): void {\n const header = response.headers.get(\"EXTENSION-RESPONSES\");\n if (!header) return;\n try {\n const decoded = JSON.parse(safeBase64Decode(header));\n if (!decoded || typeof decoded !== \"object\" || Array.isArray(decoded)) return;\n const sanitized: Record<string, Record<string, unknown>> = {};\n for (const [extensionKey, payload] of Object.entries(decoded as Record<string, unknown>)) {\n const source =\n payload && typeof payload === \"object\" && !Array.isArray(payload)\n ? (payload as Record<string, unknown>)\n : {};\n const filtered: Record<string, unknown> = {};\n for (const key of EXTENSION_RESPONSE_LOG_FIELD_ALLOWLIST) {\n if (source[key] !== undefined) {\n filtered[key] = source[key];\n }\n }\n sanitized[extensionKey] = filtered;\n }\n console.log(`[x402] extension responses: ${JSON.stringify(sanitized)}`);\n } catch {\n // Ignore malformed header\n }\n}\n\n/**\n * Parses and validates a successful facilitator response body.\n *\n * @param response - The HTTP response returned by the facilitator\n * @param schema - The schema used to validate the response payload\n * @param operation - The facilitator operation name for error reporting\n * @returns The validated facilitator payload\n */\nasync function parseSuccessResponse<T>(\n response: Response,\n schema: z.ZodType<T, z.ZodTypeDef, unknown>,\n operation: string,\n): Promise<T> {\n const text = await response.text();\n\n let data: unknown;\n try {\n data = JSON.parse(text);\n } catch {\n throw new FacilitatorResponseError(\n `Facilitator ${operation} returned invalid JSON: ${responseExcerpt(text)}`,\n );\n }\n\n const parsed = schema.safeParse(data);\n if (!parsed.success) {\n throw new FacilitatorResponseError(\n `Facilitator ${operation} returned invalid data: ${responseExcerpt(text)}`,\n );\n }\n\n return parsed.data;\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 // Normalize URL: strip trailing slashes to prevent redirect loops (e.g. 308)\n // when constructing endpoint paths like `${url}/supported`\n this.url = (config?.url || DEFAULT_FACILITATOR_URL).replace(/\\/+$/, \"\");\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 redirect: \"follow\",\n body: JSON.stringify({\n x402Version: paymentPayload.x402Version,\n paymentPayload: this.toJsonSafe(paymentPayload),\n paymentRequirements: this.toJsonSafe(paymentRequirements),\n }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n let data: unknown;\n try {\n data = JSON.parse(text);\n } catch {\n throw new Error(`Facilitator verify failed (${response.status}): ${responseExcerpt(text)}`);\n }\n\n if (typeof data === \"object\" && data !== null && \"isValid\" in data) {\n throw new VerifyError(response.status, data as VerifyResponse);\n }\n\n throw new Error(\n `Facilitator verify failed (${response.status}): ${responseExcerpt(JSON.stringify(data))}`,\n );\n }\n\n const verifyResult = await parseSuccessResponse(response, verifyResponseSchema, \"verify\");\n logExtensionResponsesHeader(response);\n return verifyResult;\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 redirect: \"follow\",\n body: JSON.stringify({\n x402Version: paymentPayload.x402Version,\n paymentPayload: this.toJsonSafe(paymentPayload),\n paymentRequirements: this.toJsonSafe(paymentRequirements),\n }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n let data: unknown;\n try {\n data = JSON.parse(text);\n } catch {\n throw new Error(`Facilitator settle failed (${response.status}): ${responseExcerpt(text)}`);\n }\n\n if (typeof data === \"object\" && data !== null && \"success\" in data) {\n throw new SettleError(response.status, data as SettleResponse);\n }\n\n throw new Error(\n `Facilitator settle failed (${response.status}): ${responseExcerpt(JSON.stringify(data))}`,\n );\n }\n\n const settleResult = await parseSuccessResponse(response, settleResponseSchema, \"settle\");\n logExtensionResponsesHeader(response);\n return settleResult;\n }\n\n /**\n * Get supported payment kinds and extensions from the facilitator.\n * Retries with exponential backoff on 429 rate limit errors.\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 let lastError: Error | null = null;\n for (let attempt = 0; attempt < GET_SUPPORTED_RETRIES; attempt++) {\n const response = await fetch(`${this.url}/supported`, {\n method: \"GET\",\n headers,\n redirect: \"follow\",\n });\n\n if (response.ok) {\n return parseSuccessResponse(response, supportedResponseSchema, \"supported\");\n }\n\n const errorText = await response.text().catch(() => response.statusText);\n lastError = new Error(\n `Facilitator getSupported failed (${response.status}): ${responseExcerpt(errorText)}`,\n );\n\n // Retry on 429, honoring the server's Retry-After when available.\n if (response.status === 429 && attempt < GET_SUPPORTED_RETRIES - 1) {\n const delay = computeRetryDelay(response.headers.get(\"Retry-After\"), attempt);\n await new Promise(resolve => setTimeout(resolve, delay));\n continue;\n }\n\n throw lastError;\n }\n\n throw lastError ?? new Error(\"Facilitator getSupported failed after retries\");\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","export const x402Version = 2;\n","import {\n SettleError,\n SettleResponse,\n VerifyResponse,\n SupportedResponse,\n SupportedKind,\n} from \"../types/facilitator\";\nimport {\n PaymentPayload,\n PaymentRequirements,\n PaymentRequired,\n ResourceInfo,\n} from \"../types/payments\";\nimport { SchemeNetworkServer, SchemePaymentRequiredContext } from \"../types/mechanisms\";\nimport { Price, Network, ResourceServerExtension, ResourceServerExtensionHooks } from \"../types\";\nimport type { DeepReadonly } from \"../types/readonly\";\nimport { deepEqual, findByNetworkAndScheme } from \"../utils\";\nimport {\n assertAcceptsAllowlistedAfterExtensionEnrich,\n assertAcceptsAdditiveExtraAfterSchemeEnrich,\n assertAdditivePayloadEnrichment,\n assertAdditiveSettlementExtra,\n assertSettleResponseCoreUnchanged,\n mergeAdditiveSettlementExtra,\n snapshotPaymentRequirementsList,\n snapshotSettleResponseCore,\n} from \"./hookPolicy\";\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 /**\n * Payment recipient. Use a **vacant** value (`\"\"` or whitespace-only) when an extension must\n * fill `payTo` during `enrichPaymentRequiredResponse`; non-vacant values are **immutable** there\n * so extensions cannot redirect funds to an arbitrary address.\n */\n payTo: string;\n price: Price;\n network: Network;\n maxTimeoutSeconds?: number;\n extra?: Record<string, unknown>; // Scheme-specific additional data\n}\n\n/**\n * Context for `enrichPaymentRequiredResponse`. Extensions may merge extension payload via the\n * return value. In-place edits to `paymentRequiredResponse.accepts` are **allowlisted** only\n * (see {@link assertAcceptsAllowlistedAfterExtensionEnrich}): `scheme`, `network`, and\n * `maxTimeoutSeconds` are immutable; `payTo`, `amount`, and `asset` may change only when the\n * baseline value was vacant; `extra` may add keys but must not change or remove baseline keys.\n */\nexport interface PaymentRequiredContext {\n requirements: PaymentRequirements[];\n resourceInfo: ResourceInfo;\n error?: string;\n paymentRequiredResponse: PaymentRequired;\n transportContext?: unknown;\n}\n\n/**\n * Verify / settle lifecycle hook context: treat as **read-only** for core protocol fields.\n * Control flow uses **abort** / **recover** return values only, not in-place mutation.\n */\nexport interface VerifyContext {\n paymentPayload: DeepReadonly<PaymentPayload>;\n requirements: DeepReadonly<PaymentRequirements>;\n declaredExtensions: DeepReadonly<Record<string, unknown>>;\n transportContext?: unknown;\n}\n\nexport interface VerifyResultContext extends VerifyContext {\n result: DeepReadonly<VerifyResponse>;\n}\n\n/**\n * Optional acknowledgement body returned to the caller when an `AfterVerifyHook`\n * requests that the resource handler be skipped for a self-contained operation\n * (e.g. cooperative refund). Travels in-process only — never on the facilitator wire.\n */\nexport interface SkipHandlerDirective {\n contentType?: string;\n body?: unknown;\n}\n\nexport type ResourceVerifyRespone = VerifyResponse & {\n skipHandler?: SkipHandlerDirective;\n};\n\nexport interface VerifyFailureContext extends VerifyContext {\n error: Error;\n}\n\nexport interface SettleContext {\n paymentPayload: DeepReadonly<PaymentPayload>;\n requirements: DeepReadonly<PaymentRequirements>;\n declaredExtensions: DeepReadonly<Record<string, unknown>>;\n transportContext?: unknown;\n}\n\nexport interface SettleResultContext extends SettleContext {\n result: DeepReadonly<SettleResponse>;\n}\n\nexport interface SettleFailureContext extends SettleContext {\n error: Error;\n}\n\nexport type VerifiedPaymentCancellationReason = \"handler_threw\" | \"handler_failed\";\n\nexport interface VerifiedPaymentCanceledContext extends SettleContext {\n reason: VerifiedPaymentCancellationReason;\n error?: unknown;\n responseStatus?: number;\n}\n\nexport interface VerifiedPaymentCancelOptions {\n reason: VerifiedPaymentCancellationReason;\n error?: unknown;\n responseStatus?: number;\n}\n\nexport interface PaymentCancellationDispatcher {\n cancel(options: VerifiedPaymentCancelOptions): Promise<void>;\n}\n\nexport type BeforeVerifyHook = (\n context: VerifyContext,\n) => Promise<\n void | { abort: true; reason: string; message?: string } | { skip: true; result: VerifyResponse }\n>;\n\nexport type AfterVerifyHook = (\n context: VerifyResultContext,\n) => Promise<void | { skipHandler: true; response?: SkipHandlerDirective }>;\n\nexport type OnVerifyFailureHook = (\n context: VerifyFailureContext,\n) => Promise<void | { recovered: true; result: VerifyResponse }>;\n\nexport type BeforeSettleHook = (\n context: SettleContext,\n) => Promise<\n void | { abort: true; reason: string; message?: string } | { skip: true; result: SettleResponse }\n>;\n\nexport type AfterSettleHook = (context: SettleResultContext) => Promise<void>;\n\nexport type OnSettleFailureHook = (\n context: SettleFailureContext,\n) => Promise<void | { recovered: true; result: SettleResponse }>;\n\nexport type OnVerifiedPaymentCanceledHook = (\n context: VerifiedPaymentCanceledContext,\n) => Promise<void>;\n\n/**\n * Optional overrides for settlement parameters.\n * Used to support partial settlement (e.g., upto scheme billing by actual usage).\n *\n * Note: Overriding the amount to a value different from the agreed-upon\n * `PaymentRequirements.amount` is only valid in schemes that explicitly support\n * partial settlement, such as the `upto` scheme. Using this with standard\n * x402 schemes (e.g., `exact`) will likely cause settlement verification to fail.\n */\nexport type ExtensionValidationResult =\n | { valid: true }\n | { valid: false; invalidReason: \"extension_echo_mismatch\"; extensionKey: string };\n\nexport interface SettlementOverrides {\n /**\n * Amount to settle. Supports three formats:\n *\n * - **Raw atomic units** — e.g., `\"1000\"` settles exactly 1000 atomic units.\n * - **Percent** — e.g., `\"50%\"` settles 50% of `PaymentRequirements.amount`.\n * Supports up to two decimal places (e.g., `\"33.33%\"`). The result is floored\n * to the nearest atomic unit.\n * - **Dollar price** — e.g., `\"$0.05\"` converts a USD-denominated price to\n * atomic units. Decimals are determined from the registered scheme's\n * `getAssetDecimals` method, falling back to 6 (standard for USDC stablecoins).\n * The result is rounded to the nearest atomic unit.\n *\n * The resolved amount must be <= the authorized maximum in `PaymentRequirements`.\n *\n * Note: Setting this to an amount other than `PaymentRequirements.amount` is\n * only valid in schemes that support partial settlement, such as `upto`.\n */\n amount?: string;\n}\n\n/**\n * Resolves a settlement override amount string to a final atomic-unit string.\n *\n * Supports three input formats (see {@link SettlementOverrides.amount}):\n * - Raw atomic units: `\"1000\"`\n * - Percent of `PaymentRequirements.amount`: `\"50%\"`\n * - Dollar price: `\"$0.05\"` (converted using the provided decimals)\n *\n * @param rawAmount - The override amount string (e.g., `\"1000\"`, `\"50%\"`, `\"$0.05\"`)\n * @param requirements - The payment requirements containing the base amount\n * @param decimals - Decimal precision to use for dollar-format conversion (default 6)\n * @returns The resolved amount as an atomic-unit string\n */\nexport function resolveSettlementOverrideAmount(\n rawAmount: string,\n requirements: PaymentRequirements,\n decimals: number = 6,\n): string {\n // Percent format: \"50%\" or \"33.33%\"\n const percentMatch = rawAmount.match(/^(\\d+(?:\\.\\d{0,2})?)%$/);\n if (percentMatch) {\n const [intPart, decPart = \"\"] = percentMatch[1].split(\".\");\n const scaledPercent = BigInt(intPart) * 100n + BigInt(decPart.padEnd(2, \"0\").slice(0, 2));\n const base = BigInt(requirements.amount);\n return ((base * scaledPercent) / 10000n).toString();\n }\n\n // Dollar price format: \"$0.05\"\n const dollarMatch = rawAmount.match(/^\\$(\\d+(?:\\.\\d+)?)$/);\n if (dollarMatch) {\n const dollars = parseFloat(dollarMatch[1]);\n return Math.round(dollars * 10 ** decimals).toString();\n }\n\n // Raw atomic units (existing behavior)\n return rawAmount;\n}\n\ntype HookAdapterHandles = {\n beforeVerify?: BeforeVerifyHook;\n afterVerify?: AfterVerifyHook;\n onVerifyFailure?: OnVerifyFailureHook;\n beforeSettle?: BeforeSettleHook;\n afterSettle?: AfterSettleHook;\n onSettleFailure?: OnSettleFailureHook;\n onVerifiedPaymentCanceled?: OnVerifiedPaymentCanceledHook;\n};\n\ntype ExtensionAdapterHandles = HookAdapterHandles;\ntype SchemeAdapterHandles = HookAdapterHandles;\n\n/** Keys shared by adapter handles and manual `*Hooks` arrays on the server. */\ntype ResourceServerHookPhase = keyof HookAdapterHandles;\n\ntype ResourceServerManualHookArrayKey = `${ResourceServerHookPhase}Hooks`;\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 schemeHookAdapters: Map<string, Map<string, SchemeAdapterHandles>> = 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 private extensionHookAdapters = new Map<string, ExtensionAdapterHandles>();\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 private onVerifiedPaymentCanceledHooks: OnVerifiedPaymentCanceledHook[] = [];\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 serverByScheme.set(server.scheme, server);\n\n if (!this.schemeHookAdapters.has(network)) {\n this.schemeHookAdapters.set(network, new Map());\n }\n\n const hooksByScheme = this.schemeHookAdapters.get(network)!;\n const hooks = server.schemeHooks;\n if (!hooks) {\n hooksByScheme.delete(server.scheme);\n return this;\n }\n\n const handles: SchemeAdapterHandles = {};\n if (hooks.onBeforeVerify) handles.beforeVerify = hooks.onBeforeVerify;\n if (hooks.onAfterVerify) handles.afterVerify = hooks.onAfterVerify;\n if (hooks.onVerifyFailure) handles.onVerifyFailure = hooks.onVerifyFailure;\n if (hooks.onBeforeSettle) handles.beforeSettle = hooks.onBeforeSettle;\n if (hooks.onAfterSettle) handles.afterSettle = hooks.onAfterSettle;\n if (hooks.onSettleFailure) handles.onSettleFailure = hooks.onSettleFailure;\n if (hooks.onVerifiedPaymentCanceled) {\n handles.onVerifiedPaymentCanceled = hooks.onVerifiedPaymentCanceled;\n }\n\n if (Object.keys(handles).length > 0) {\n hooksByScheme.set(server.scheme, handles);\n } else {\n hooksByScheme.delete(server.scheme);\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 * Returns the decimal precision for the asset specified in the given payment requirements.\n * Looks up the registered scheme for the network and delegates to its getAssetDecimals\n * method if available. Falls back to 6 (standard for USDC stablecoins) when the scheme\n * does not implement getAssetDecimals or is not registered.\n *\n * @param requirements - The payment requirements containing scheme, network, and asset\n * @returns The number of decimal places for the asset\n */\n getAssetDecimalsForRequirements(requirements: PaymentRequirements): number {\n const scheme = findByNetworkAndScheme(\n this.registeredServerSchemes,\n requirements.scheme,\n requirements.network as Network,\n );\n return (\n scheme?.getAssetDecimals?.(requirements.asset ?? \"\", requirements.network as Network) ?? 6\n );\n }\n\n /**\n * Registers a resource server extension (enrichment and optional verify/settle hooks).\n * Re-registering the same key overwrites; omitting `hooks` removes adapter handles for that key.\n *\n * @param extension - Extension definition including `key` and optional `hooks`\n * @returns This server instance for chaining\n */\n registerExtension(extension: ResourceServerExtension): this {\n this.registeredExtensions.set(extension.key, extension);\n const extensionKey = extension.key;\n const extensionHooks = extension.hooks;\n if (!extensionHooks) {\n this.extensionHookAdapters.delete(extensionKey);\n return this;\n }\n const handles: ExtensionAdapterHandles = {};\n\n const bindExtensionHookAdapter = <\n ExtKey extends keyof ResourceServerExtensionHooks,\n Phase extends ResourceServerHookPhase,\n >(\n extensionHookKey: ExtKey,\n adapterPhase: Phase,\n ): void => {\n const impl = extensionHooks[extensionHookKey];\n if (!impl) return;\n\n type AdapterContext = Parameters<NonNullable<ExtensionAdapterHandles[Phase]>>[0];\n\n handles[adapterPhase] = (async (ctx: AdapterContext) => {\n if (ctx.declaredExtensions[extensionKey] === undefined) return;\n return (impl as (declaration: unknown, context: AdapterContext) => Promise<unknown>)(\n ctx.declaredExtensions[extensionKey],\n ctx,\n );\n }) as ExtensionAdapterHandles[Phase];\n };\n\n bindExtensionHookAdapter(\"onBeforeVerify\", \"beforeVerify\");\n bindExtensionHookAdapter(\"onAfterVerify\", \"afterVerify\");\n bindExtensionHookAdapter(\"onVerifyFailure\", \"onVerifyFailure\");\n bindExtensionHookAdapter(\"onBeforeSettle\", \"beforeSettle\");\n bindExtensionHookAdapter(\"onAfterSettle\", \"afterSettle\");\n bindExtensionHookAdapter(\"onSettleFailure\", \"onSettleFailure\");\n bindExtensionHookAdapter(\"onVerifiedPaymentCanceled\", \"onVerifiedPaymentCanceled\");\n if (Object.keys(handles).length > 0) {\n this.extensionHookAdapters.set(extensionKey, handles);\n } else {\n this.extensionHookAdapters.delete(extensionKey);\n }\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 try {\n enriched[key] = extension.enrichDeclaration(declaration, transportContext);\n } catch (error) {\n this.warnExtensionHookFailure(key, \"enrichDeclaration\", error);\n enriched[key] = declaration;\n }\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 * Register a hook to execute when verified payment work is canceled before settlement.\n *\n * @param hook - The hook function to register\n * @returns The x402ResourceServer instance for chaining\n */\n onVerifiedPaymentCanceled(hook: OnVerifiedPaymentCanceledHook): x402ResourceServer {\n this.onVerifiedPaymentCanceledHooks.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 let lastError: Error | undefined;\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 lastError = error as Error;\n // Log error but continue with other facilitators\n console.warn(`Failed to fetch supported kinds from facilitator: ${error}`);\n }\n }\n\n if (this.supportedResponsesMap.size === 0) {\n throw lastError\n ? new Error(\n \"Failed to initialize: no supported payment kinds loaded from any facilitator.\",\n {\n cause: lastError,\n },\n )\n : new Error(\n \"Failed to initialize: no supported payment kinds loaded from any facilitator.\",\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 const requirement = await SchemeNetworkServer.enhancePaymentRequirements(\n baseRequirements,\n supportedKind,\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 extra?: Record<string, unknown>;\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 extra: option.extra,\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 * @param transportContext - Optional transport-specific context (e.g., HTTP request, MCP tool context)\n * @param paymentPayload - Optional failed payment payload for response-time scheme 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 transportContext?: unknown,\n paymentPayload?: PaymentPayload,\n ): Promise<PaymentRequired> {\n const acceptsClone = requirements.map(req => ({\n ...req,\n extra: structuredClone(req.extra),\n }));\n let workingAccepts = acceptsClone;\n let baselineAccepts = snapshotPaymentRequirementsList(workingAccepts);\n\n // V2 response with resource at top level\n let response: PaymentRequired = {\n x402Version: 2,\n error,\n resource: resourceInfo,\n accepts: workingAccepts,\n };\n\n // Add extensions if provided\n if (extensions && Object.keys(extensions).length > 0) {\n response.extensions = extensions;\n }\n\n for (let i = 0; i < workingAccepts.length; i++) {\n const accept = workingAccepts[i];\n const scheme = findByNetworkAndScheme(\n this.registeredServerSchemes,\n accept.scheme,\n accept.network as Network,\n );\n if (!scheme?.enrichPaymentRequiredResponse) {\n continue;\n }\n\n const context: SchemePaymentRequiredContext = {\n requirements: workingAccepts,\n paymentPayload,\n resourceInfo,\n error,\n paymentRequiredResponse: response,\n transportContext,\n };\n const enrichedAccepts = await scheme.enrichPaymentRequiredResponse(context);\n if (enrichedAccepts !== undefined) {\n workingAccepts = enrichedAccepts;\n response.accepts = workingAccepts;\n }\n assertAcceptsAdditiveExtraAfterSchemeEnrich(\n baselineAccepts,\n response.accepts,\n accept.scheme,\n accept.network,\n );\n baselineAccepts = snapshotPaymentRequirementsList(response.accepts);\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: workingAccepts,\n resourceInfo,\n error,\n paymentRequiredResponse: response,\n transportContext,\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 this.warnExtensionHookFailure(key, \"enrichPaymentRequiredResponse\", error);\n }\n assertAcceptsAllowlistedAfterExtensionEnrich(baselineAccepts, workingAccepts, key);\n baselineAccepts = snapshotPaymentRequirementsList(workingAccepts);\n }\n }\n }\n\n return response;\n }\n\n /**\n * Verifies a payment against requirements, running manual and in-use extension hooks.\n *\n * @param paymentPayload - Signed payment payload from the client\n * @param requirements - Requirements matched to the payload\n * @param declaredExtensions - Optional per-extension declarations for the request\n * @param transportContext - Optional transport-specific context (e.g. HTTP, MCP)\n * @returns Facilitator verify outcome (optionally carrying a `skipHandler` directive),\n * or abort/recovery as driven by hooks\n */\n async verifyPayment(\n paymentPayload: PaymentPayload,\n requirements: PaymentRequirements,\n declaredExtensions?: Record<string, unknown>,\n transportContext?: unknown,\n ): Promise<ResourceVerifyRespone> {\n const resolvedDeclaredExtensions = declaredExtensions ?? {};\n const extensionKeysInUse = Object.keys(resolvedDeclaredExtensions);\n const matchedScheme = {\n network: requirements.network as Network,\n scheme: requirements.scheme,\n };\n\n const context: VerifyContext = {\n paymentPayload,\n requirements,\n declaredExtensions: resolvedDeclaredExtensions,\n transportContext,\n };\n\n for (const { label, hook } of this.getLabeledHooks(\n \"beforeVerify\",\n extensionKeysInUse,\n matchedScheme,\n )) {\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 if (result && \"skip\" in result && result.skip) {\n return this.runAfterVerifyHooks(\n result.result,\n context,\n extensionKeysInUse,\n matchedScheme,\n );\n }\n } catch (error) {\n this.warnResourceServerHookFailure(\"beforeVerify\", label, error);\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 return this.runAfterVerifyHooks(verifyResult, context, extensionKeysInUse, matchedScheme);\n } catch (error) {\n const failureContext: VerifyFailureContext = {\n ...context,\n error: error as Error,\n };\n\n for (const { label, hook } of this.getLabeledHooks(\n \"onVerifyFailure\",\n extensionKeysInUse,\n matchedScheme,\n )) {\n try {\n const result = await hook(failureContext);\n if (result && \"recovered\" in result && result.recovered) {\n return result.result;\n }\n } catch (error) {\n this.warnResourceServerHookFailure(\"onVerifyFailure\", label, error);\n }\n }\n\n throw error;\n }\n }\n\n /**\n * Create cancellation controls for a verified payment attempt.\n *\n * @param paymentPayload - Signed payment payload from the client\n * @param requirements - Requirements matched to the payload\n * @param declaredExtensions - Optional per-extension declarations for the request\n * @param transportContext - Optional transport-specific context\n * @returns Cancellation controls for the verified payment attempt\n */\n createPaymentCancellationDispatcher(\n paymentPayload: PaymentPayload,\n requirements: PaymentRequirements,\n declaredExtensions?: Record<string, unknown>,\n transportContext?: unknown,\n ): PaymentCancellationDispatcher {\n const resolvedDeclaredExtensions = declaredExtensions ?? {};\n let cancelPromise: Promise<void> | undefined;\n\n return {\n cancel: (options: VerifiedPaymentCancelOptions) => {\n if (!cancelPromise) {\n cancelPromise = this.dispatchVerifiedPaymentCanceled(\n paymentPayload,\n requirements,\n resolvedDeclaredExtensions,\n options,\n transportContext,\n );\n }\n return cancelPromise;\n },\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 * @param transportContext - Optional transport-specific context (e.g., HTTP request/response, MCP tool context)\n * @param settlementOverrides - Optional overrides for settlement parameters (e.g., partial settlement amount)\n * @returns Settlement response\n */\n async settlePayment(\n paymentPayload: PaymentPayload,\n requirements: PaymentRequirements,\n declaredExtensions?: Record<string, unknown>,\n transportContext?: unknown,\n settlementOverrides?: SettlementOverrides,\n ): Promise<SettleResponse> {\n const resolvedDeclaredExtensions = declaredExtensions ?? {};\n const extensionKeysInUse = Object.keys(resolvedDeclaredExtensions);\n\n // Apply settlement overrides (e.g., partial settlement for upto scheme)\n let effectiveRequirements = requirements;\n if (settlementOverrides?.amount !== undefined) {\n const scheme = findByNetworkAndScheme(\n this.registeredServerSchemes,\n requirements.scheme,\n requirements.network as Network,\n );\n const decimals =\n scheme?.getAssetDecimals?.(requirements.asset ?? \"\", requirements.network as Network) ?? 6;\n effectiveRequirements = {\n ...requirements,\n amount: resolveSettlementOverrideAmount(settlementOverrides.amount, requirements, decimals),\n };\n }\n\n const context: SettleContext = {\n paymentPayload,\n requirements: effectiveRequirements,\n declaredExtensions: resolvedDeclaredExtensions,\n transportContext,\n };\n const matchedScheme = {\n network: effectiveRequirements.network as Network,\n scheme: effectiveRequirements.scheme,\n };\n\n for (const { label, hook } of this.getLabeledHooks(\n \"beforeSettle\",\n extensionKeysInUse,\n matchedScheme,\n )) {\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 if (result && \"skip\" in result && result.skip) {\n const settleResult = result.result;\n const skipResultContext: SettleResultContext = {\n ...context,\n result: settleResult,\n transportContext,\n };\n for (const { label, hook } of this.getLabeledHooks(\n \"afterSettle\",\n extensionKeysInUse,\n matchedScheme,\n )) {\n try {\n await hook(skipResultContext);\n } catch (error) {\n this.warnResourceServerHookFailure(\"afterSettle\", label, error);\n }\n }\n await this.enrichSettlementResponse(\n settleResult,\n skipResultContext,\n resolvedDeclaredExtensions,\n matchedScheme,\n );\n return settleResult;\n }\n } catch (error) {\n if (error instanceof SettleError) {\n throw error;\n }\n this.warnResourceServerHookFailure(\"beforeSettle\", label, error);\n }\n }\n\n try {\n const scheme = findByNetworkAndScheme(\n this.registeredServerSchemes,\n matchedScheme.scheme,\n matchedScheme.network,\n );\n const payloadEnrichmentHook = scheme?.enrichSettlementPayload;\n if (payloadEnrichmentHook) {\n const label = `scheme \"${matchedScheme.scheme}\" enrichSettlementPayload`;\n const enrichment = await payloadEnrichmentHook(context);\n if (enrichment !== undefined) {\n assertAdditivePayloadEnrichment(paymentPayload.payload, enrichment, label);\n paymentPayload.payload = { ...paymentPayload.payload, ...enrichment };\n }\n }\n\n // Find the facilitator that supports this payment type\n const facilitatorClient = this.getFacilitatorClient(\n paymentPayload.x402Version,\n effectiveRequirements.network,\n effectiveRequirements.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, effectiveRequirements);\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 ${effectiveRequirements.scheme} on ${effectiveRequirements.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, effectiveRequirements);\n }\n\n // Execute afterSettle hooks\n const resultContext: SettleResultContext = {\n ...context,\n result: settleResult,\n };\n\n for (const { label, hook } of this.getLabeledHooks(\n \"afterSettle\",\n extensionKeysInUse,\n matchedScheme,\n )) {\n try {\n await hook(resultContext);\n } catch (error) {\n this.warnResourceServerHookFailure(\"afterSettle\", label, error);\n }\n }\n\n await this.enrichSettlementResponse(\n settleResult,\n resultContext,\n resolvedDeclaredExtensions,\n matchedScheme,\n );\n\n return settleResult;\n } catch (error) {\n const failureContext: SettleFailureContext = {\n ...context,\n error: error as Error,\n };\n\n for (const { label, hook } of this.getLabeledHooks(\n \"onSettleFailure\",\n extensionKeysInUse,\n matchedScheme,\n )) {\n try {\n const result = await hook(failureContext);\n if (result && \"recovered\" in result && result.recovered) {\n return result.result;\n }\n } catch (error) {\n this.warnResourceServerHookFailure(\"onSettleFailure\", label, error);\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 /**\n * Validates optional client extension echoes against server-advertised extension info.\n * When the client omits extensions entirely, validation passes.\n *\n * @param paymentRequired - Server payment required response used for matching\n * @param paymentPayload - Client payment payload\n * @returns Whether echoed extension info preserves server-advertised values\n */\n validateExtensions(\n paymentRequired: PaymentRequired,\n paymentPayload: PaymentPayload,\n ): ExtensionValidationResult {\n if (paymentPayload.x402Version !== 2) {\n return { valid: true };\n }\n\n const serverExtensions = paymentRequired.extensions;\n if (!serverExtensions || Object.keys(serverExtensions).length === 0) {\n return { valid: true };\n }\n\n const clientExtensions = paymentPayload.extensions;\n if (!clientExtensions || Object.keys(clientExtensions).length === 0) {\n return { valid: true };\n }\n\n for (const [key, echoedValue] of Object.entries(clientExtensions)) {\n if (!Object.prototype.hasOwnProperty.call(serverExtensions, key)) {\n continue;\n }\n\n const advertisedInfo = getExtensionInfo(serverExtensions[key]);\n const echoedInfo = getExtensionInfo(echoedValue);\n if (!extensionInfoMatchesAdvertised(advertisedInfo, echoedInfo)) {\n return {\n valid: false,\n invalidReason: \"extension_echo_mismatch\",\n extensionKey: key,\n };\n }\n }\n\n return { valid: true };\n }\n\n /**\n * Finds the server-advertised requirement that matches a client payment payload.\n *\n * @param availableRequirements - Payment requirements advertised for the resource.\n * @param paymentPayload - Signed payment payload from the client.\n * @returns The matching requirement, or undefined when none match.\n */\n findMatchingRequirements(\n availableRequirements: PaymentRequirements[],\n paymentPayload: PaymentPayload,\n ): PaymentRequirements | undefined {\n switch (paymentPayload.x402Version) {\n case 2:\n // For v2, all server-declared requirements must match.\n // The client may include additive scheme-specific metadata under `accepted.extra`.\n return availableRequirements.find(paymentRequirements =>\n paymentRequirementsMatchAccepted(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 * Logs a warning when a manual or extension adapter lifecycle hook throws.\n *\n * @param phase - Lifecycle phase name (e.g. `beforeVerify`)\n * @param label - Hook source label from {@link getLabeledHooks} (manual index or extension key)\n * @param error - Thrown value or rejection reason\n */\n private warnResourceServerHookFailure(phase: string, label: string, error: unknown): void {\n const detail = error instanceof Error ? error.message : String(error);\n console.warn(`[x402] Resource server ${phase} hook threw (${label}): ${detail}`);\n }\n\n /**\n * Logs a warning when a registered extension enrichment hook throws.\n *\n * @param extensionKey - Registered extension identifier\n * @param hookName - Hook method name (e.g. `enrichDeclaration`)\n * @param error - Thrown value or rejection reason\n */\n private warnExtensionHookFailure(extensionKey: string, hookName: string, error: unknown): void {\n const detail = error instanceof Error ? error.message : String(error);\n console.warn(`[x402] extension \"${extensionKey}\" ${hookName} threw: ${detail}`);\n }\n\n /**\n * Executes after-verify hooks for facilitator and hook-provided verify results.\n *\n * @param verifyResult - Verify response passed to after-verify hooks.\n * @param context - Verify context shared with before-verify hooks.\n * @param extensionKeysInUse - Declared extension keys for this request.\n * @param matchedScheme - Scheme/network selected for this payment.\n * @param matchedScheme.network - Matched payment network.\n * @param matchedScheme.scheme - Matched payment scheme.\n * @returns Verify response with any in-process skip handler directive.\n */\n private async runAfterVerifyHooks(\n verifyResult: VerifyResponse,\n context: VerifyContext,\n extensionKeysInUse: readonly string[],\n matchedScheme: { network: Network; scheme: string },\n ): Promise<ResourceVerifyRespone> {\n const resultContext: VerifyResultContext = {\n ...context,\n result: verifyResult,\n };\n\n let skipHandler: SkipHandlerDirective | undefined;\n for (const { label, hook } of this.getLabeledHooks(\n \"afterVerify\",\n extensionKeysInUse,\n matchedScheme,\n )) {\n try {\n const directive = await hook(resultContext);\n if (directive && \"skipHandler\" in directive && directive.skipHandler) {\n skipHandler = directive.response ?? {};\n }\n } catch (error) {\n this.warnResourceServerHookFailure(\"afterVerify\", label, error);\n }\n }\n\n return skipHandler ? { ...verifyResult, skipHandler } : verifyResult;\n }\n\n /**\n * Runs response enrichment after settlement lifecycle hooks complete.\n *\n * @param settleResult - Mutable settlement result being returned to the caller\n * @param context - Read-only hook context for enrichment callbacks\n * @param declaredExtensions - Extension declarations present on this payment\n * @param matchedScheme - Scheme/network selected for this settlement\n * @param matchedScheme.network - Matched payment network\n * @param matchedScheme.scheme - Matched payment scheme\n */\n private async enrichSettlementResponse(\n settleResult: SettleResponse,\n context: SettleResultContext,\n declaredExtensions: Record<string, unknown>,\n matchedScheme: { network: Network; scheme: string },\n ): Promise<void> {\n if (Object.keys(declaredExtensions).length > 0) {\n const settleCoreSnapshot = snapshotSettleResponseCore(settleResult);\n for (const [key, declaration] of Object.entries(declaredExtensions)) {\n const extension = this.registeredExtensions.get(key);\n if (!extension?.enrichSettlementResponse) continue;\n\n try {\n const extensionData = await extension.enrichSettlementResponse(declaration, context);\n if (extensionData !== undefined) {\n if (!settleResult.extensions) {\n settleResult.extensions = {};\n }\n settleResult.extensions[key] = extensionData;\n }\n } catch (error) {\n this.warnExtensionHookFailure(key, \"enrichSettlementResponse\", error);\n }\n assertSettleResponseCoreUnchanged(settleCoreSnapshot, settleResult, key);\n }\n }\n\n const scheme = findByNetworkAndScheme(\n this.registeredServerSchemes,\n matchedScheme.scheme,\n matchedScheme.network,\n );\n const hook = scheme?.enrichSettlementResponse;\n if (!hook) return;\n\n const label = `scheme \"${matchedScheme.scheme}\" enrichSettlementResponse`;\n try {\n const enrichment = await hook(context);\n if (enrichment === undefined) return;\n\n assertAdditiveSettlementExtra(settleResult.extra ?? {}, enrichment, label);\n settleResult.extra = mergeAdditiveSettlementExtra(settleResult.extra ?? {}, enrichment);\n } catch (error) {\n this.warnResourceServerHookFailure(\"enrichSettlementResponse\", label, error);\n }\n }\n\n /**\n * Notify hooks that verified work ended before settlement.\n *\n * @param paymentPayload - Signed payment payload from the client\n * @param requirements - Requirements matched to the payload\n * @param declaredExtensions - Optional per-extension declarations for the request\n * @param options - Cancellation reason and optional diagnostics\n * @param fallbackTransportContext - Optional transport-specific context\n */\n private async dispatchVerifiedPaymentCanceled(\n paymentPayload: PaymentPayload,\n requirements: PaymentRequirements,\n declaredExtensions: Record<string, unknown>,\n options: VerifiedPaymentCancelOptions,\n fallbackTransportContext?: unknown,\n ): Promise<void> {\n const extensionKeysInUse = Object.keys(declaredExtensions);\n const matchedScheme = {\n network: requirements.network as Network,\n scheme: requirements.scheme,\n };\n const context: VerifiedPaymentCanceledContext = {\n paymentPayload,\n requirements,\n declaredExtensions,\n transportContext: fallbackTransportContext,\n reason: options.reason,\n error: options.error,\n responseStatus: options.responseStatus,\n };\n\n for (const { label, hook } of this.getLabeledHooks(\n \"onVerifiedPaymentCanceled\",\n extensionKeysInUse,\n matchedScheme,\n )) {\n try {\n await hook(context);\n } catch (error) {\n this.warnResourceServerHookFailure(\"onVerifiedPaymentCanceled\", label, error);\n }\n }\n }\n\n /**\n * Manual hooks first, then the matched scheme adapter, then extension adapters for keys in use.\n * Each entry carries a stable label for logging when a hook throws.\n *\n * @param phase - Hook slot (e.g. `beforeVerify`)\n * @param extensionKeysInUse - Declared extension keys for this request\n * @param matchedScheme - Scheme/network selected for this payment\n * @param matchedScheme.network - Matched payment network\n * @param matchedScheme.scheme - Matched payment scheme\n * @returns Hooks in invocation order with source labels\n */\n private getLabeledHooks<P extends ResourceServerHookPhase>(\n phase: P,\n extensionKeysInUse: readonly string[],\n matchedScheme?: { network: Network; scheme: string },\n ): Array<{\n label: string;\n hook: NonNullable<ExtensionAdapterHandles[P]>;\n }> {\n type HookFn = NonNullable<ExtensionAdapterHandles[P]>;\n const manualKey = `${phase}Hooks` as ResourceServerManualHookArrayKey;\n const manual = (this as Record<ResourceServerManualHookArrayKey, HookFn[]>)[manualKey];\n\n const out: Array<{ label: string; hook: HookFn }> = [];\n manual.forEach((hook, index) => {\n out.push({ label: `manual ${phase} hook #${index}`, hook });\n });\n\n if (matchedScheme) {\n const schemeHandles = findByNetworkAndScheme(\n this.schemeHookAdapters,\n matchedScheme.scheme,\n matchedScheme.network,\n );\n const hook = schemeHandles?.[phase];\n if (hook !== undefined) {\n out.push({\n label: `scheme \"${matchedScheme.scheme}\" ${phase}`,\n hook,\n });\n }\n }\n\n const inUse = new Set(extensionKeysInUse);\n for (const [extensionKey, adapterHandles] of this.extensionHookAdapters.entries()) {\n if (!inUse.has(extensionKey)) continue;\n const hook = adapterHandles[phase];\n if (hook !== undefined) {\n out.push({ label: `extension \"${extensionKey}\" ${phase}`, hook });\n }\n }\n\n return out;\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\n/**\n * Normalizes an extension declaration or echo to its comparable `info` payload.\n *\n * @param value - Extension value that may wrap its payload under `info`.\n * @returns The nested `info` value when present; otherwise `value` unchanged.\n */\nfunction getExtensionInfo(value: unknown): unknown {\n if (\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n Object.prototype.hasOwnProperty.call(value, \"info\")\n ) {\n return (value as Record<string, unknown>).info;\n }\n return value;\n}\n\n/**\n * Returns whether a client-echoed extension payload preserves the server advertisement.\n *\n * @param advertised - Extension info advertised by the server.\n * @param echoed - Extension info echoed back by the client.\n * @returns True when `echoed` contains every field from `advertised`.\n */\nfunction extensionInfoMatchesAdvertised(advertised: unknown, echoed: unknown): boolean {\n return objectContainsSubset(advertised, echoed);\n}\n\n/**\n * Returns whether a client-selected requirement satisfies a server-advertised requirement.\n *\n * Core payment terms and all server-declared `extra` fields must match exactly,\n * but clients may include additive scheme-specific metadata under `accepted.extra`.\n *\n * @param required - Server-advertised payment requirement.\n * @param accepted - Client-selected payment requirement from the payment payload.\n * @returns True when `accepted` preserves every server-declared requirement.\n */\nfunction paymentRequirementsMatchAccepted(\n required: PaymentRequirements,\n accepted: PaymentRequirements,\n): boolean {\n const { extra: requiredExtra, ...requiredCore } = required;\n const { extra: acceptedExtra, ...acceptedCore } = accepted;\n\n if (!deepEqual(requiredCore, acceptedCore)) {\n return false;\n }\n\n if (requiredExtra === undefined) {\n return true;\n }\n\n return objectContainsSubset(requiredExtra, acceptedExtra);\n}\n\n/**\n * Recursively checks that `actual` contains every field and value from `expected`.\n * Object values may contain additional fields; arrays and primitives must match exactly.\n *\n * @param expected - Required subset.\n * @param actual - Candidate object.\n * @returns True when `actual` contains `expected`.\n */\nfunction objectContainsSubset(expected: unknown, actual: unknown): boolean {\n if (expected === null || typeof expected !== \"object\" || Array.isArray(expected)) {\n return deepEqual(expected, actual);\n }\n\n if (actual === null || typeof actual !== \"object\" || Array.isArray(actual)) {\n return false;\n }\n\n const actualRecord = actual as Record<string, unknown>;\n return Object.entries(expected as Record<string, unknown>).every(([key, value]) => {\n const hasActualKey = Object.prototype.hasOwnProperty.call(actualRecord, key);\n if (!hasActualKey) {\n return value === undefined;\n }\n return objectContainsSubset(value, actualRecord[key]);\n });\n}\n\nexport default x402ResourceServer;\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 HTTPTransportContext,\n HTTPResponseInstructions,\n HTTPProcessResult,\n PaywallConfig,\n PaywallProvider,\n PaymentOption,\n RouteConfig,\n RoutesConfig,\n CompiledRoute,\n DynamicPayTo,\n DynamicPrice,\n UnpaidResponseBody,\n HTTPResponseBody,\n SettlementFailedResponseBody,\n ProcessSettleResultResponse,\n ProcessSettleSuccessResponse,\n ProcessSettleFailureResponse,\n RouteValidationError,\n RouteConfigurationError,\n ProtectedRequestHook,\n HTTPResourceServerExtensionHooks,\n ResourceServerTransportExtensionHooks,\n} from \"./x402HTTPResourceServer\";\nexport {\n HTTPFacilitatorClient,\n FacilitatorClient,\n FacilitatorConfig,\n} from \"./httpFacilitatorClient\";\nexport { FacilitatorResponseError, getFacilitatorResponseError } from \"../types\";\nexport {\n x402HTTPClient,\n PaymentRequiredContext,\n PaymentRequiredHook,\n HTTPClientExtensionHooks,\n HTTPResourceResponse,\n HTTPPaymentStatus,\n} from \"./x402HTTPClient\";\n","import {\n x402ResourceServer,\n SettlementOverrides,\n SkipHandlerDirective,\n PaymentCancellationDispatcher,\n} from \"../server\";\nimport {\n decodePaymentSignatureHeader,\n encodePaymentRequiredHeader,\n encodePaymentResponseHeader,\n} from \".\";\nimport {\n PaymentPayload,\n PaymentRequired,\n SettleResponse,\n SettleError,\n FacilitatorResponseError,\n Price,\n Network,\n PaymentRequirements,\n} from \"../types\";\nimport { x402Version } from \"..\";\n\nexport const SETTLEMENT_OVERRIDES_HEADER = \"Settlement-Overrides\";\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 response body callbacks containing content type and body.\n */\nexport interface HTTPResponseBody {\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) => HTTPResponseBody | Promise<HTTPResponseBody>;\n\n/**\n * Dynamic function to generate a custom response for settlement failures.\n * Receives the HTTP request context and settle failure result, returns the content type and body.\n */\nexport type SettlementFailedResponseBody = (\n context: HTTPRequestContext,\n settleResult: Omit<ProcessSettleFailureResponse, \"response\">,\n) => HTTPResponseBody | Promise<HTTPResponseBody>;\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 serviceName?: string;\n tags?: string[];\n iconUrl?: 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 /**\n * Optional callback to generate a custom response for settlement failures.\n * If not provided, defaults to { contentType: 'application/json', body: {} }.\n *\n * @param context - The HTTP request context\n * @param settleResult - The settlement failure result\n * @returns An object containing both contentType and body for the 402 response\n */\n settlementFailedResponseBody?: SettlementFailedResponseBody;\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 * Check if any routes in the configuration declare bazaar extensions.\n *\n * @param routes - Route configuration\n * @returns True if any route has extensions.bazaar defined\n */\nexport function checkIfBazaarNeeded(routes: RoutesConfig): boolean {\n if (\"accepts\" in routes) {\n return !!(routes.extensions && \"bazaar\" in routes.extensions);\n }\n\n return Object.values(routes).some(routeConfig => {\n return !!(routeConfig.extensions && \"bazaar\" in routeConfig.extensions);\n });\n}\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\nexport interface HTTPResourceServerExtensionHooks {\n onProtectedRequest?: (\n declaration: unknown,\n context: HTTPRequestContext,\n routeConfig: RouteConfig,\n ) => Promise<void | { grantAccess: true } | { abort: true; reason: string }>;\n}\n\nexport interface ResourceServerTransportExtensionHooks {\n http?: HTTPResourceServerExtensionHooks;\n}\n\n/**\n * Compiled route for efficient matching\n */\nexport interface CompiledRoute {\n verb: string;\n regex: RegExp;\n config: RouteConfig;\n pattern: string;\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 routePattern?: string;\n}\n\n/**\n * HTTP transport context contains both request context and optional response data.\n */\nexport interface HTTPTransportContext {\n /** The HTTP request context */\n request: HTTPRequestContext;\n /** The response body buffer */\n responseBody?: Buffer;\n /** Response headers set by the route handler (used for settlement overrides) */\n responseHeaders?: Record<string, 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 cancellationDispatcher: PaymentCancellationDispatcher;\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 headers: Record<string, string>;\n response: HTTPResponseInstructions;\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// Static fallback paywall served when @bankofai/x402-paywall is not installed.\n// Intentionally contains zero request- or config-derived interpolation:\n// the protocol-level payment requirements still ship in response headers\n// and the JSON 402 body for non-browser clients, so any agent or SDK can\n// read them without us reflecting attacker-controlled bytes into HTML.\n// Browser-end-user payment requires installing @bankofai/x402-paywall.\nconst FALLBACK_PAYWALL_HTML = `<!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 <h1>Payment Required</h1>\n <p>This resource is protected by the x402 payment protocol.</p>\n <p style=\"margin-top: 2rem; padding: 1rem; background: #fef3c7; border-radius: 0.5rem;\">\n <strong>Note to developers:</strong> install <code>@bankofai/x402-paywall</code> to enable\n the in-browser wallet connection and payment UI. Programmatic clients should read\n the payment requirements from the 402 response headers and JSON body.\n </p>\n </div>\n </body>\n</html>`;\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 pattern: parsed.path,\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 method = context.method || context.adapter.getMethod();\n context = { ...context, method };\n const { adapter, path } = context;\n\n // Find matching route\n const routeMatch = this.getRouteConfig(path, method);\n if (!routeMatch) {\n return { type: \"no-payment-required\" }; // No payment required for this route\n }\n const { config: routeConfig, pattern: routePattern } = routeMatch;\n const enrichedContext: HTTPRequestContext = { ...context, routePattern };\n\n // Execute request hooks before any payment processing\n for (const hook of this.getProtectedRequestHooks(routeConfig)) {\n const result = await hook(enrichedContext, 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 || enrichedContext.adapter.getUrl(),\n description: routeConfig.description || \"\",\n mimeType: routeConfig.mimeType || \"\",\n ...(routeConfig.serviceName !== undefined && { serviceName: routeConfig.serviceName }),\n ...(routeConfig.tags !== undefined && { tags: routeConfig.tags }),\n ...(routeConfig.iconUrl !== undefined && { iconUrl: routeConfig.iconUrl }),\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 enrichedContext,\n );\n\n let extensions = routeConfig.extensions;\n if (extensions) {\n extensions = this.ResourceServer.enrichExtensions(extensions, enrichedContext);\n }\n\n // createPaymentRequiredResponse already handles extension enrichment in the core layer\n const transportContext: HTTPTransportContext = { request: enrichedContext };\n const paymentRequired = await this.ResourceServer.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n !paymentPayload ? \"Payment required\" : undefined,\n extensions,\n transportContext,\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(enrichedContext)\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 extensions,\n transportContext,\n );\n return {\n type: \"payment-error\",\n response: this.createHTTPResponse(errorResponse, false, paywallConfig),\n };\n }\n\n const extensionResult = this.ResourceServer.validateExtensions(\n paymentRequired,\n paymentPayload,\n );\n if (!extensionResult.valid) {\n const errorResponse = await this.ResourceServer.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n extensionResult.invalidReason,\n extensions,\n transportContext,\n paymentPayload,\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 extensions,\n transportContext,\n );\n\n if (!verifyResult.isValid) {\n const errorResponse = await this.ResourceServer.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n verifyResult.invalidReason,\n extensions,\n transportContext,\n paymentPayload,\n );\n return {\n type: \"payment-error\",\n response: this.createHTTPResponse(errorResponse, false, paywallConfig),\n };\n }\n\n // Bypass the resource handler\n if (verifyResult.skipHandler) {\n return await this.processSkipHandlerSettlement(\n paymentPayload,\n matchingRequirements,\n extensions,\n transportContext,\n verifyResult.skipHandler,\n );\n }\n\n const cancellationDispatcher = this.ResourceServer.createPaymentCancellationDispatcher(\n paymentPayload,\n matchingRequirements,\n extensions,\n transportContext,\n );\n\n // Payment is valid, return data needed for settlement\n return {\n type: \"payment-verified\",\n cancellationDispatcher,\n paymentPayload,\n paymentRequirements: matchingRequirements,\n declaredExtensions: extensions,\n };\n } catch (error) {\n if (error instanceof FacilitatorResponseError) {\n throw error;\n }\n const errorResponse = await this.ResourceServer.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n error instanceof Error ? error.message : \"Payment verification failed\",\n extensions,\n transportContext,\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 * @param transportContext - Optional HTTP transport context\n * @param settlementOverrides - Optional settlement overrides (e.g., partial settlement amount)\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 transportContext?: HTTPTransportContext,\n settlementOverrides?: SettlementOverrides,\n ): Promise<ProcessSettleResultResponse> {\n if (transportContext?.request && !transportContext.request.method) {\n transportContext = {\n ...transportContext,\n request: {\n ...transportContext.request,\n method: transportContext.request.adapter.getMethod(),\n },\n };\n }\n try {\n // Resolve overrides: explicit param takes precedence, fall back to response header\n let resolvedOverrides = settlementOverrides;\n if (!resolvedOverrides && transportContext?.responseHeaders) {\n const overridesKey = SETTLEMENT_OVERRIDES_HEADER.toLowerCase();\n const rawValue = Object.entries(transportContext.responseHeaders).find(\n ([key]) => key.toLowerCase() === overridesKey,\n )?.[1];\n if (rawValue) {\n try {\n resolvedOverrides = JSON.parse(rawValue);\n } catch {\n // Ignore malformed header\n }\n }\n }\n\n const settleResponse = await this.ResourceServer.settlePayment(\n paymentPayload,\n requirements,\n declaredExtensions,\n transportContext,\n resolvedOverrides,\n );\n\n if (!settleResponse.success) {\n const failure = {\n ...settleResponse,\n success: false as const,\n errorReason: settleResponse.errorReason || \"Settlement failed\",\n errorMessage:\n settleResponse.errorMessage || settleResponse.errorReason || \"Settlement failed\",\n headers: this.createSettlementHeaders(settleResponse),\n };\n const response = await this.buildSettlementFailureResponse(failure, transportContext);\n return { ...failure, response };\n }\n\n return {\n ...settleResponse,\n success: true,\n headers: this.createSettlementHeaders(settleResponse),\n requirements,\n };\n } catch (error) {\n if (error instanceof FacilitatorResponseError) {\n throw error;\n }\n if (error instanceof SettleError) {\n const errorReason = error.errorReason || error.message;\n const settleResponse: SettleResponse = {\n success: false,\n errorReason,\n errorMessage: error.errorMessage || errorReason,\n payer: error.payer,\n network: error.network,\n transaction: error.transaction,\n };\n const failure = {\n ...settleResponse,\n success: false as const,\n errorReason,\n headers: this.createSettlementHeaders(settleResponse),\n };\n const response = await this.buildSettlementFailureResponse(failure, transportContext);\n return { ...failure, response };\n }\n const errorReason = error instanceof Error ? error.message : \"Settlement failed\";\n const settleResponse: SettleResponse = {\n success: false,\n errorReason,\n errorMessage: errorReason,\n network: requirements.network as Network,\n transaction: \"\",\n };\n const failure = {\n ...settleResponse,\n success: false as const,\n errorReason,\n headers: this.createSettlementHeaders(settleResponse),\n };\n const response = await this.buildSettlementFailureResponse(failure, transportContext);\n return { ...failure, response };\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 method = context.method || context.adapter.getMethod();\n return this.getRouteConfig(context.path, method) !== undefined;\n }\n\n /**\n * Settle a verified payment that requested `skipHandler`, packaging the\n * result as a `payment-error` HTTPProcessResult so framework adapters can\n * write the response without invoking the route handler.\n *\n * - On success: status 200 + PAYMENT-RESPONSE header + configured body.\n * - On failure: the standard 402 settlement-failure response.\n *\n * @param paymentPayload - Verified payment payload.\n * @param requirements - Matched payment requirements.\n * @param declaredExtensions - Optional declared extensions for the route.\n * @param transportContext - Optional HTTP transport context.\n * @param skipHandlerResponse - Optional content type + body to return on success.\n * @returns A `payment-error` HTTPProcessResult carrying the final response.\n */\n private async processSkipHandlerSettlement(\n paymentPayload: PaymentPayload,\n requirements: PaymentRequirements,\n declaredExtensions: Record<string, unknown> | undefined,\n transportContext: HTTPTransportContext,\n skipHandlerResponse: SkipHandlerDirective | undefined,\n ): Promise<HTTPProcessResult> {\n const settleResult = await this.processSettlement(\n paymentPayload,\n requirements,\n declaredExtensions,\n transportContext,\n );\n\n if (!settleResult.success) {\n return { type: \"payment-error\", response: settleResult.response };\n }\n\n const contentType = skipHandlerResponse?.contentType ?? \"application/json\";\n const body = skipHandlerResponse?.body ?? {};\n\n return {\n type: \"payment-error\",\n response: {\n status: 200,\n headers: {\n \"Content-Type\": contentType,\n ...settleResult.headers,\n },\n body,\n isHtml: contentType.includes(\"text/html\"),\n },\n };\n }\n\n /**\n * Build HTTPResponseInstructions for settlement failure.\n * Uses settlementFailedResponseBody hook if configured, otherwise defaults to empty body.\n *\n * @param failure - Settlement failure result with headers\n * @param transportContext - Optional HTTP transport context for the request\n * @returns HTTP response instructions for the 402 settlement failure response\n */\n private async buildSettlementFailureResponse(\n failure: Omit<ProcessSettleFailureResponse, \"response\">,\n transportContext?: HTTPTransportContext,\n ): Promise<HTTPResponseInstructions> {\n const settlementHeaders = failure.headers;\n const routeConfig = transportContext\n ? this.getRouteConfig(transportContext.request.path, transportContext.request.method)\n : undefined;\n\n const customBody = routeConfig?.config.settlementFailedResponseBody\n ? await routeConfig.config.settlementFailedResponseBody(transportContext!.request, failure)\n : undefined;\n\n const contentType = customBody ? customBody.contentType : \"application/json\";\n const body = customBody ? customBody.body : {};\n\n return {\n status: 402,\n headers: {\n \"Content-Type\": contentType,\n ...settlementHeaders,\n },\n body,\n isHtml: contentType.includes(\"text/html\"),\n };\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 * Manual request hooks run before extension transport hooks for declared extensions.\n *\n * @param routeConfig - Route configuration for the matched request\n * @returns Hooks in invocation order\n */\n private getProtectedRequestHooks(routeConfig: RouteConfig): ProtectedRequestHook[] {\n const hooks = [...this.protectedRequestHooks];\n const declaredExtensions = routeConfig.extensions;\n if (!declaredExtensions) return hooks;\n\n for (const extension of this.ResourceServer.getExtensions()) {\n const hook = extension.transportHooks?.http?.onProtectedRequest;\n if (!hook || !(extension.key in declaredExtensions)) continue;\n\n hooks.push((context, routeConfig) =>\n hook(declaredExtensions[extension.key], context, routeConfig),\n );\n }\n\n return hooks;\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 // Warn if wildcard routes are used with discovery extensions\n const pathPart = pattern.includes(\" \") ? pattern.split(/\\s+/)[1] : pattern;\n if (\n pathPart &&\n pathPart.includes(\"*\") &&\n config.extensions &&\n \"bazaar\" in config.extensions\n ) {\n console.warn(\n `[x402] Route \"${pattern}\": Wildcard (*) patterns with bazaar discovery extensions ` +\n `will auto-generate parameter names (var1, var2, ...). ` +\n `Consider using named parameters instead (e.g. /weather/:city) for better discovery metadata.`,\n );\n }\n\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 and pattern, or undefined if no match\n */\n private getRouteConfig(\n path: string,\n method: string,\n ): { config: RouteConfig; pattern: string } | 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 if (!matchingRoute) return undefined;\n return { config: matchingRoute.config, pattern: matchingRoute.pattern };\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?: HTTPResponseBody,\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 const response = this.createHTTPPaymentRequiredResponse(paymentRequired);\n\n if (isWebBrowser) {\n const html = this.generatePaywallHTML(paymentRequired, paywallConfig, customHtml);\n return {\n status,\n headers: {\n \"Content-Type\": \"text/html\",\n ...response.headers,\n },\n body: html,\n isHtml: true,\n };\n }\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/*\", \"/api/[id]\", or \"/api/:id\"\n * @returns Parsed pattern with verb and regex\n */\n private parseRoutePattern(pattern: string): { verb: string; regex: RegExp; path: string } {\n const [verb, path] = pattern.includes(\" \") ? pattern.split(/\\s+/) : [\"*\", pattern];\n\n const regex = new RegExp(\n `^${\n path\n .replace(/\\\\/g, \"\\\\\\\\\") // Escape backslashes first\n .replace(/[$()+.?^{|}]/g, \"\\\\$&\") // Escape regex special chars\n .replace(/\\*/g, \".*?\") // Wildcards\n .replace(/\\[([^\\]]+)\\]/g, \"[^/]+\") // Parameters (Next.js style [param])\n .replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, \"[^/]+\") // Parameters (Express style :param)\n .replace(/\\//g, \"\\\\/\") // Escape slashes\n }$`,\n \"i\",\n );\n\n return { verb: verb.toUpperCase(), regex, path };\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 // Decode percent-escapes per segment, preserving encoded path separators\n // (%2F, %5C) as their literal escaped form. Otherwise an attacker could\n // hide a \"/\" inside a single segment (e.g. /api/report/a%2Fb), bypassing\n // a :param route whose regex compiles to [^/]+ while the framework still\n // dispatches the request as a single-segment match.\n const parts = pathWithoutQuery.split(/(%2[fF]|%5[cC])/);\n const decoded = parts\n .map((part, i) => {\n if (i % 2 === 1) return part;\n try {\n return decodeURIComponent(part);\n } catch {\n return part;\n }\n })\n .join(\"\");\n\n return decoded\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 @bankofai/x402-paywall if available (optional dependency)\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const paywall = require(\"@bankofai/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 // @bankofai/x402-paywall not installed, fall back to basic HTML\n }\n\n return FALLBACK_PAYWALL_HTML;\n }\n\n /**\n * Extract display amount from payment requirements.\n * Uses the registered scheme's decimal precision for the asset, falling back to 6.\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 const decimals = this.ResourceServer.getAssetDecimalsForRequirements(firstReq);\n return parseFloat(firstReq.amount) / 10 ** decimals;\n }\n }\n return 0;\n }\n}\n"],"mappings":"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","names":["import_zod","x402Version","error","label","hook","errorReason","settleResponse","failure","response","routeConfig"]}
@@ -0,0 +1 @@
1
+ export { aC as AssetAmount, aV as DeepReadonly, aS as FacilitatorContext, F as FacilitatorExtension, A as FacilitatorResponseError, u as HTTPResourceServerExtensionHooks, aB as Money, aP as MoneyParser, N as Network, P as PaymentPayload, aR as PaymentPayloadContext, aQ as PaymentPayloadResult, aw as PaymentPayloadV1, c as PaymentRequired, I as PaymentRequiredContext, av as PaymentRequiredV1, a as PaymentRequirements, au as PaymentRequirementsV1, aD as Price, aK as ResourceInfo, aT as ResourceServerExtension, aU as ResourceServerExtensionHooks, v as ResourceServerTransportExtensionHooks, aM as SchemeClientHooks, a8 as SchemeEnrichPaymentRequiredResponseHook, aL as SchemeNetworkClient, b as SchemeNetworkFacilitator, aN as SchemeNetworkServer, a9 as SchemePaymentRequiredContext, aO as SchemeServerHooks, M as SettleContext, aJ as SettleError, Q as SettleFailureContext, aF as SettleRequest, S as SettleResponse, O as SettleResultContext, aH as SupportedKind, aG as SupportedResponse, T as VerifiedPaymentCanceledContext, J as VerifyContext, aI as VerifyError, L as VerifyFailureContext, aE as VerifyRequest, V as VerifyResponse, K as VerifyResultContext, B as getFacilitatorResponseError } from '../x402Client-TQHctrG7.js';
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/types/index.ts
21
+ var types_exports = {};
22
+ __export(types_exports, {
23
+ FacilitatorResponseError: () => FacilitatorResponseError,
24
+ SettleError: () => SettleError,
25
+ VerifyError: () => VerifyError,
26
+ getFacilitatorResponseError: () => getFacilitatorResponseError
27
+ });
28
+ module.exports = __toCommonJS(types_exports);
29
+
30
+ // src/types/facilitator.ts
31
+ var VerifyError = class extends Error {
32
+ /**
33
+ * Creates a VerifyError from a failed verification response.
34
+ *
35
+ * @param statusCode - HTTP status code from the facilitator
36
+ * @param response - The verify response containing failure details
37
+ */
38
+ constructor(statusCode, response) {
39
+ const reason = response.invalidReason || "unknown reason";
40
+ const message = response.invalidMessage;
41
+ super(message ? `${reason}: ${message}` : reason);
42
+ this.name = "VerifyError";
43
+ this.statusCode = statusCode;
44
+ this.invalidReason = response.invalidReason;
45
+ this.invalidMessage = response.invalidMessage;
46
+ this.payer = response.payer;
47
+ }
48
+ };
49
+ var SettleError = class extends Error {
50
+ /**
51
+ * Creates a SettleError from a failed settlement response.
52
+ *
53
+ * @param statusCode - HTTP status code from the facilitator
54
+ * @param response - The settle response containing error details
55
+ */
56
+ constructor(statusCode, response) {
57
+ const reason = response.errorReason || "unknown reason";
58
+ const message = response.errorMessage;
59
+ super(message ? `${reason}: ${message}` : reason);
60
+ this.name = "SettleError";
61
+ this.statusCode = statusCode;
62
+ this.errorReason = response.errorReason;
63
+ this.errorMessage = response.errorMessage;
64
+ this.payer = response.payer;
65
+ this.transaction = response.transaction;
66
+ this.network = response.network;
67
+ }
68
+ };
69
+ var FacilitatorResponseError = class extends Error {
70
+ /**
71
+ * Creates a FacilitatorResponseError for malformed facilitator responses.
72
+ *
73
+ * @param message - The boundary error message
74
+ */
75
+ constructor(message) {
76
+ super(message);
77
+ this.name = "FacilitatorResponseError";
78
+ }
79
+ };
80
+ function getFacilitatorResponseError(error) {
81
+ let current = error;
82
+ while (current instanceof Error) {
83
+ if (current instanceof FacilitatorResponseError) {
84
+ return current;
85
+ }
86
+ current = current.cause;
87
+ }
88
+ return null;
89
+ }
90
+ // Annotate the CommonJS export names for ESM import in node:
91
+ 0 && (module.exports = {
92
+ FacilitatorResponseError,
93
+ SettleError,
94
+ VerifyError,
95
+ getFacilitatorResponseError
96
+ });
97
+ //# sourceMappingURL=index.js.map