@okxweb3/app-x402-core 0.1.2 → 0.2.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 (57) hide show
  1. package/dist/cjs/OKXFacilitatorClient-Bqyw9fzj.d.ts +69 -0
  2. package/dist/cjs/client/index.d.ts +1 -1
  3. package/dist/cjs/client/index.js +34 -0
  4. package/dist/cjs/client/index.js.map +1 -1
  5. package/dist/cjs/facilitator/index.d.ts +2 -2
  6. package/dist/cjs/facilitator/index.js +166 -4
  7. package/dist/cjs/facilitator/index.js.map +1 -1
  8. package/dist/cjs/http/index.d.ts +5 -3
  9. package/dist/cjs/http/index.js +1241 -7
  10. package/dist/cjs/http/index.js.map +1 -1
  11. package/dist/cjs/index-2gWfiUbK.d.ts +713 -0
  12. package/dist/cjs/index.d.ts +2 -2
  13. package/dist/cjs/index.js +166 -4
  14. package/dist/cjs/index.js.map +1 -1
  15. package/dist/cjs/{mechanisms-sojpSwWW.d.ts → mechanisms-LhI9qkRo.d.ts} +509 -1
  16. package/dist/cjs/server/index.d.ts +4 -2
  17. package/dist/cjs/server/index.js +1256 -7
  18. package/dist/cjs/server/index.js.map +1 -1
  19. package/dist/cjs/subscription/index.d.ts +3 -0
  20. package/dist/cjs/subscription/index.js +600 -0
  21. package/dist/cjs/subscription/index.js.map +1 -0
  22. package/dist/cjs/types/index.d.ts +1 -1
  23. package/dist/cjs/utils/index.d.ts +1 -1
  24. package/dist/cjs/{x402HTTPResourceServer-CcsAkcgI.d.ts → x402HTTPResourceServer-B0mXzV8r.d.ts} +114 -1
  25. package/dist/esm/OKXFacilitatorClient-z-cCE5Db.d.mts +69 -0
  26. package/dist/esm/chunk-4KASWSSY.mjs +257 -0
  27. package/dist/esm/chunk-4KASWSSY.mjs.map +1 -0
  28. package/dist/esm/chunk-CKXR4QVD.mjs +274 -0
  29. package/dist/esm/chunk-CKXR4QVD.mjs.map +1 -0
  30. package/dist/esm/{chunk-XBQG2CDV.mjs → chunk-EYS4TWVA.mjs} +617 -9
  31. package/dist/esm/chunk-EYS4TWVA.mjs.map +1 -0
  32. package/dist/esm/client/index.d.mts +1 -1
  33. package/dist/esm/client/index.mjs +3 -2
  34. package/dist/esm/client/index.mjs.map +1 -1
  35. package/dist/esm/facilitator/index.d.mts +2 -2
  36. package/dist/esm/facilitator/index.mjs +2 -1
  37. package/dist/esm/facilitator/index.mjs.map +1 -1
  38. package/dist/esm/http/index.d.mts +5 -3
  39. package/dist/esm/http/index.mjs +3 -2
  40. package/dist/esm/index-DKbqlTu_.d.mts +713 -0
  41. package/dist/esm/index.d.mts +2 -2
  42. package/dist/esm/index.mjs +2 -1
  43. package/dist/esm/{mechanisms-sojpSwWW.d.mts → mechanisms-LhI9qkRo.d.mts} +509 -1
  44. package/dist/esm/server/index.d.mts +4 -2
  45. package/dist/esm/server/index.mjs +3 -2
  46. package/dist/esm/subscription/index.d.mts +3 -0
  47. package/dist/esm/subscription/index.mjs +309 -0
  48. package/dist/esm/subscription/index.mjs.map +1 -0
  49. package/dist/esm/types/index.d.mts +1 -1
  50. package/dist/esm/utils/index.d.mts +1 -1
  51. package/dist/esm/{x402HTTPResourceServer-DBeutKxq.d.mts → x402HTTPResourceServer-56Tq3Jup.d.mts} +114 -1
  52. package/package.json +12 -1
  53. package/dist/cjs/OKXFacilitatorClient-BvyQB1QM.d.ts +0 -59
  54. package/dist/esm/OKXFacilitatorClient-D5E3LX50.d.mts +0 -59
  55. package/dist/esm/chunk-O3IYMTNT.mjs +0 -118
  56. package/dist/esm/chunk-O3IYMTNT.mjs.map +0 -1
  57. package/dist/esm/chunk-XBQG2CDV.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/http/httpFacilitatorClient.ts","../../src/server/x402ResourceServer.ts","../../src/http/x402HTTPClient.ts","../../src/http/index.ts","../../src/http/x402HTTPResourceServer.ts"],"sourcesContent":["import { PaymentPayload, PaymentRequirements } from \"../types/payments\";\nimport {\n VerifyResponse,\n SettleResponse,\n SettleStatusResponse,\n SupportedResponse,\n VerifyError,\n SettleError,\n FacilitatorResponseError,\n} from \"../types/facilitator\";\nimport type {\n FacilitatorCancelData,\n FacilitatorCancelPendingData,\n FacilitatorChangeData,\n FacilitatorChargeData,\n FacilitatorEnvelope,\n FacilitatorFinalizeExpiredData,\n FacilitatorGetChargesData,\n FacilitatorGetSubscriptionData,\n FacilitatorPendingChangeRow,\n FacilitatorSubscribeData,\n} from \"../subscription/facilitator-client\";\nimport { parseChainIdFromNetwork } from \"../subscription/codec/typed-data\";\nimport { asSubscriptionPaymentInner } from \"../subscription/codec/payload\";\nimport type { CancelAuth, PendingChangeCancelAuth } from \"../subscription/types\";\nimport { z } from \"../schemas\";\n\nconst DEFAULT_FACILITATOR_URL = \"https://web3.okx.com/facilitator\";\n\nexport interface FacilitatorConfig {\n url?: string;\n createAuthHeaders?: () => Promise<{\n verify: Record<string, string>;\n settle: Record<string, string>;\n supported: Record<string, string>;\n }>;\n /**\n * Optional per-operation auth header generator for subscription endpoints.\n * Called with `subscribe` | `change` | `cancel` | `charge` | `getSubscription`.\n * If omitted, subscription requests go out without auth headers (suitable\n * for self-hosted facilitators or tests; for OKX use `OKXFacilitatorClient`).\n */\n createSubscriptionAuthHeaders?: (op: string) => Promise<Record<string, string>>;\n /**\n * Inject a fetch implementation (test mock / custom transport). Defaults\n * to the global `fetch`.\n */\n fetchFn?: typeof fetch;\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 * Query on-chain settlement status by transaction hash.\n * OKX extension: used for timeout recovery polling.\n *\n * @param txHash - The transaction hash to query\n * @returns Settlement status response\n */\n getSettleStatus?(txHash: string): Promise<SettleStatusResponse>;\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\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});\n\nconst settleResponseSchema: z.ZodType<SettleResponse, z.ZodTypeDef, unknown> = z.object({\n success: z.boolean(),\n // OKX extension: pending (async), success (immediate), timeout (on-chain timed out)\n status: z\n .enum([\"pending\", \"success\", \"timeout\"])\n .nullish()\n .transform(v => v ?? undefined)\n .optional(),\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});\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\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 private readonly _createSubscriptionAuthHeaders?: FacilitatorConfig[\"createSubscriptionAuthHeaders\"];\n private readonly _fetchFn: typeof fetch;\n\n /**\n * Creates a new HTTPFacilitatorClient instance.\n *\n * @param config - Configuration options for the facilitator client\n */\n constructor(config?: FacilitatorConfig) {\n this.url = config?.url || DEFAULT_FACILITATOR_URL;\n this._createAuthHeaders = config?.createAuthHeaders;\n this._createSubscriptionAuthHeaders = config?.createSubscriptionAuthHeaders;\n this._fetchFn = config?.fetchFn ?? fetch;\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 this._fetchFn(`${this.url}/verify`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n x402Version: paymentPayload.x402Version,\n paymentPayload: this.toJsonSafe(paymentPayload),\n paymentRequirements: this.toJsonSafe(paymentRequirements),\n }),\n });\n\n 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 return parseSuccessResponse(response, verifyResponseSchema, \"verify\");\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 this._fetchFn(`${this.url}/settle`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n x402Version: paymentPayload.x402Version,\n paymentPayload: this.toJsonSafe(paymentPayload),\n paymentRequirements: this.toJsonSafe(paymentRequirements),\n }),\n });\n\n 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 return parseSuccessResponse(response, settleResponseSchema, \"settle\");\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 this._fetchFn(`${this.url}/supported`, {\n method: \"GET\",\n headers,\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 rate limit errors with exponential backoff\n if (response.status === 429 && attempt < GET_SUPPORTED_RETRIES - 1) {\n const delay = GET_SUPPORTED_RETRY_DELAY_MS * Math.pow(2, 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 * Query on-chain settlement status by transaction hash.\n *\n * @param txHash - The transaction hash to query\n * @returns Settlement status response\n */\n async getSettleStatus(txHash: string): Promise<SettleStatusResponse> {\n let headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (this._createAuthHeaders) {\n const authHeaders = await this.createAuthHeaders(\"settle/status\");\n headers = { ...headers, ...authHeaders.headers };\n }\n\n const response = await this._fetchFn(\n `${this.url}/settle/status?txHash=${encodeURIComponent(txHash)}`,\n {\n method: \"GET\",\n headers,\n },\n );\n\n if (!response.ok) {\n const text = await response.text().catch(() => response.statusText);\n throw new Error(\n `Facilitator getSettleStatus failed (${response.status}): ${responseExcerpt(text)}`,\n );\n }\n\n const json = (await response.json()) as SettleStatusResponse;\n return json;\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 // ── SubscriptionFacilitatorClient (period) ─────────────\n //\n // Generic JSON POST / GET helpers parameterized by `op` so the same code\n // path covers all five subscription endpoints. The standard OKX envelope\n // `{ code, msg?, data? }` is returned to the caller unparsed (the\n // subscription scheme reads `code === \"0\"` and `data` directly).\n\n private async subscriptionAuthHeaders(op: string): Promise<Record<string, string>> {\n if (!this._createSubscriptionAuthHeaders) return {};\n return this._createSubscriptionAuthHeaders(op);\n }\n\n private async subscriptionPost<T>(\n op: string,\n path: string,\n body: unknown,\n ): Promise<FacilitatorEnvelope<T>> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(await this.subscriptionAuthHeaders(op)),\n };\n const resp = await this._fetchFn(`${this.url}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(this.toJsonSafe(body)),\n });\n if (!resp.ok) {\n throw new Error(`facilitator ${op} returned HTTP ${resp.status}: ${await resp.text()}`);\n }\n return (await resp.json()) as FacilitatorEnvelope<T>;\n }\n\n private async subscriptionGet<T>(op: string, path: string): Promise<FacilitatorEnvelope<T>> {\n const headers = await this.subscriptionAuthHeaders(op);\n const resp = await this._fetchFn(`${this.url}${path}`, { method: \"GET\", headers });\n if (!resp.ok) {\n throw new Error(`facilitator ${op} returned HTTP ${resp.status}: ${await resp.text()}`);\n }\n return (await resp.json()) as FacilitatorEnvelope<T>;\n }\n\n /**\n * Build the {chainIndex, terms, permit, termsSig, permitSig, syncSettle}\n * request body shared by subscribe / change endpoints.\n */\n private buildWriteBody(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n syncSettle?: boolean,\n ): Record<string, unknown> {\n const inner = asSubscriptionPaymentInner(payload);\n return {\n chainIndex: parseChainIdFromNetwork(requirements.network),\n terms: inner.terms,\n permit: inner.permitSingle,\n termsSig: inner.termsSignature,\n permitSig: inner.permitSingleSignature,\n syncSettle: syncSettle ?? true,\n };\n }\n\n async subscribe(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n syncSettle?: boolean,\n ): Promise<FacilitatorEnvelope<FacilitatorSubscribeData>> {\n return this.subscriptionPost<FacilitatorSubscribeData>(\n \"subscribe\",\n \"/api/v6/pay/x402/subscriptions\",\n this.buildWriteBody(paymentPayload, paymentRequirements, syncSettle),\n );\n }\n\n async changeSubscription(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n oldSubId: string,\n syncSettle?: boolean,\n ): Promise<FacilitatorEnvelope<FacilitatorChangeData>> {\n return this.subscriptionPost<FacilitatorChangeData>(\n \"change\",\n \"/api/v6/pay/x402/subscriptions/change\",\n {\n ...this.buildWriteBody(paymentPayload, paymentRequirements, syncSettle),\n // `oldSubId` is informational — server reads\n // newTerms.changeFromSubId for the authoritative value.\n oldSubId,\n // change body uses `newTerms` not `terms`.\n newTerms: asSubscriptionPaymentInner(paymentPayload).terms,\n terms: undefined,\n },\n );\n }\n\n async cancelSubscription(\n subId: string,\n cancelAuth: CancelAuth,\n syncSettle?: boolean,\n ): Promise<FacilitatorEnvelope<FacilitatorCancelData>> {\n return this.subscriptionPost<FacilitatorCancelData>(\n \"cancel\",\n \"/api/v6/pay/x402/subscriptions/cancel\",\n { subId, cancelAuth, syncSettle: syncSettle ?? true },\n );\n }\n\n async cancelPendingChange(\n subId: string,\n cancelAuth: PendingChangeCancelAuth,\n syncSettle?: boolean,\n ): Promise<FacilitatorEnvelope<FacilitatorCancelPendingData>> {\n return this.subscriptionPost<FacilitatorCancelPendingData>(\n \"cancel-pending-change\",\n \"/api/v6/pay/x402/subscriptions/cancel-pending-change\",\n { subId, cancelAuth, syncSettle: syncSettle ?? true },\n );\n }\n\n async chargeSubscription(\n subId: string,\n syncSettle?: boolean,\n ): Promise<FacilitatorEnvelope<FacilitatorChargeData>> {\n return this.subscriptionPost<FacilitatorChargeData>(\n \"charge\",\n \"/api/v6/pay/x402/subscriptions/charge\",\n { subId, syncSettle: syncSettle ?? true },\n );\n }\n\n async finalizeExpired(\n subId: string,\n syncSettle?: boolean,\n ): Promise<FacilitatorEnvelope<FacilitatorFinalizeExpiredData>> {\n return this.subscriptionPost<FacilitatorFinalizeExpiredData>(\n \"finalize-expired\",\n \"/api/v6/pay/x402/subscriptions/finalize-expired\",\n { subId, syncSettle: syncSettle ?? true },\n );\n }\n\n async getCharges(\n subId: string,\n limit = 50,\n offset = 0,\n ): Promise<FacilitatorEnvelope<FacilitatorGetChargesData>> {\n const q = new URLSearchParams({ subId, limit: String(limit), offset: String(offset) });\n return this.subscriptionGet<FacilitatorGetChargesData>(\n \"getCharges\",\n `/api/v6/pay/x402/subscriptions/charges?${q.toString()}`,\n );\n }\n\n async getPendingChange(\n subId: string,\n ): Promise<FacilitatorEnvelope<FacilitatorPendingChangeRow | null>> {\n return this.subscriptionGet<FacilitatorPendingChangeRow | null>(\n \"getPendingChange\",\n `/api/v6/pay/x402/subscriptions/pending?subId=${encodeURIComponent(subId)}`,\n );\n }\n\n async getSubscription(\n subId: string,\n ): Promise<FacilitatorEnvelope<FacilitatorGetSubscriptionData>> {\n return this.subscriptionGet<FacilitatorGetSubscriptionData>(\n \"getSubscription\",\n `/api/v6/pay/x402/subscriptions/detail?subId=${encodeURIComponent(subId)}`,\n );\n }\n}\n","import {\n SettleError,\n SettleResponse,\n SettleStatusResponse,\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 } from \"../types/mechanisms\";\nimport { Price, Network, ResourceServerExtension, VerifyError } from \"../types\";\nimport { deepEqual, findByNetworkAndScheme } from \"../utils\";\nimport { FacilitatorClient, HTTPFacilitatorClient } from \"../http/httpFacilitatorClient\";\nimport { x402Version } from \"..\";\n\n/** Default poll interval for settle/status queries (1 second). */\nexport const DEFAULT_POLL_INTERVAL_MS = 1_000;\n\n/** Default poll deadline for settle/status queries (5 seconds). */\nexport const DEFAULT_POLL_DEADLINE_MS = 5_000;\n\n/** Result of polling `GET /settle/status`. */\nexport type PollResult = \"success\" | \"failed\" | \"timeout\";\n\n/**\n * Configuration for a protected resource\n * Only contains payment-specific configuration, not resource metadata\n */\nexport interface ResourceConfig {\n scheme: string;\n payTo: string; // Payment recipient address\n price: Price;\n network: Network;\n maxTimeoutSeconds?: number;\n extra?: Record<string, unknown>; // Scheme-specific additional data\n}\n\n/**\n * Lifecycle Hook Context Interfaces\n */\n\nexport interface PaymentRequiredContext {\n requirements: PaymentRequirements[];\n resourceInfo: ResourceInfo;\n error?: string;\n paymentRequiredResponse: PaymentRequired;\n transportContext?: unknown;\n}\n\nexport interface VerifyContext {\n paymentPayload: PaymentPayload;\n requirements: PaymentRequirements;\n}\n\nexport interface VerifyResultContext extends VerifyContext {\n result: VerifyResponse;\n}\n\nexport interface VerifyFailureContext extends VerifyContext {\n error: Error;\n}\n\nexport interface SettleContext {\n paymentPayload: PaymentPayload;\n requirements: PaymentRequirements;\n}\n\nexport interface SettleResultContext extends SettleContext {\n result: SettleResponse;\n transportContext?: unknown;\n}\n\nexport interface SettleFailureContext extends SettleContext {\n error: Error;\n}\n\n/**\n * Lifecycle Hook Type Definitions\n */\n\nexport type BeforeVerifyHook = (\n context: VerifyContext,\n) => Promise<void | { abort: true; reason: string; message?: string }>;\n\nexport type AfterVerifyHook = (context: VerifyResultContext) => Promise<void>;\n\nexport type OnVerifyFailureHook = (\n context: VerifyFailureContext,\n) => Promise<void | { recovered: true; result: VerifyResponse }>;\n\nexport type BeforeSettleHook = (\n context: SettleContext,\n) => Promise<void | { abort: true; reason: string; message?: string }>;\n\nexport type AfterSettleHook = (context: SettleResultContext) => Promise<void>;\n\nexport type OnSettleFailureHook = (\n context: SettleFailureContext,\n) => Promise<void | { recovered: true; result: SettleResponse }>;\n\n/**\n * 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 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. Uses `PaymentRequirements.extra.decimals` if set; otherwise\n * defaults to 6 (standard for USDC stablecoins). The result is rounded to\n * 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\"` (uses `requirements.extra.decimals` or defaults to 6)\n *\n * @param rawAmount - The override amount string (e.g., `\"1000\"`, `\"50%\"`, `\"$0.05\"`)\n * @param requirements - The payment requirements containing the base amount and token decimals\n * @returns The resolved amount as an atomic-unit string\n */\nexport function resolveSettlementOverrideAmount(\n rawAmount: string,\n requirements: PaymentRequirements,\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 decimals =\n typeof requirements.extra?.decimals === \"number\" ? requirements.extra.decimals : 6;\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\n/**\n * Core x402 protocol server for resource protection\n * Transport-agnostic implementation of the x402 payment protocol\n */\nexport class x402ResourceServer {\n private facilitatorClients: FacilitatorClient[];\n private registeredServerSchemes: Map<string, Map<string, SchemeNetworkServer>> = new Map();\n private supportedResponsesMap: Map<number, Map<string, Map<string, SupportedResponse>>> =\n new Map();\n private facilitatorClientsMap: Map<number, Map<string, Map<string, FacilitatorClient>>> =\n new Map();\n private registeredExtensions: Map<string, ResourceServerExtension> = new Map();\n\n private beforeVerifyHooks: BeforeVerifyHook[] = [];\n private afterVerifyHooks: AfterVerifyHook[] = [];\n private onVerifyFailureHooks: OnVerifyFailureHook[] = [];\n private beforeSettleHooks: BeforeSettleHook[] = [];\n private afterSettleHooks: AfterSettleHook[] = [];\n private onSettleFailureHooks: OnSettleFailureHook[] = [];\n\n /**\n * Creates a new x402ResourceServer instance.\n *\n * @param facilitatorClients - Optional facilitator client(s) for payment processing\n */\n constructor(facilitatorClients?: FacilitatorClient | FacilitatorClient[]) {\n // Normalize facilitator clients to array\n if (!facilitatorClients) {\n // No clients provided, create a default HTTP client\n this.facilitatorClients = [new HTTPFacilitatorClient()];\n } else if (Array.isArray(facilitatorClients)) {\n // Array of clients provided\n this.facilitatorClients =\n facilitatorClients.length > 0 ? facilitatorClients : [new HTTPFacilitatorClient()];\n } else {\n // Single client provided\n this.facilitatorClients = [facilitatorClients];\n }\n }\n\n /**\n * Register a scheme/network server implementation.\n *\n * @param network - The network identifier\n * @param server - The scheme/network server implementation\n * @returns The x402ResourceServer instance for chaining\n */\n register(network: Network, server: SchemeNetworkServer): x402ResourceServer {\n if (!this.registeredServerSchemes.has(network)) {\n this.registeredServerSchemes.set(network, new Map());\n }\n\n const serverByScheme = this.registeredServerSchemes.get(network)!;\n if (!serverByScheme.has(server.scheme)) {\n serverByScheme.set(server.scheme, server);\n }\n\n return this;\n }\n\n /**\n * Check if a scheme is registered for a given network.\n *\n * @param network - The network identifier\n * @param scheme - The payment scheme name\n * @returns True if the scheme is registered for the network, false otherwise\n */\n hasRegisteredScheme(network: Network, scheme: string): boolean {\n return !!findByNetworkAndScheme(this.registeredServerSchemes, scheme, network);\n }\n\n /**\n * Look up the registered SchemeNetworkServer for a given network + scheme.\n * Exposed so the HTTP dispatch layer can perform capability detection\n * (e.g. `hasSubscriptionCapability(scheme)`) on the actual instance.\n *\n * Pattern matching follows the same CAIP-style rules as `verifyPayment`:\n * registered keys may use wildcards like `eip155:*`.\n *\n * @param network - The network identifier\n * @param scheme - The payment scheme name\n * @returns The registered scheme server, or undefined if none matches.\n */\n findScheme(network: Network, scheme: string): SchemeNetworkServer | undefined {\n return findByNetworkAndScheme(this.registeredServerSchemes, scheme, network);\n }\n\n /**\n * Registers a resource service extension that can enrich extension declarations.\n *\n * @param extension - The extension to register\n * @returns The x402ResourceServer instance for chaining\n */\n registerExtension(extension: ResourceServerExtension): this {\n this.registeredExtensions.set(extension.key, extension);\n return this;\n }\n\n /**\n * Check if an extension is registered.\n *\n * @param key - The extension key\n * @returns True if the extension is registered\n */\n hasExtension(key: string): boolean {\n return this.registeredExtensions.has(key);\n }\n\n /**\n * Get all registered extensions.\n *\n * @returns Array of registered extensions\n */\n getExtensions(): ResourceServerExtension[] {\n return Array.from(this.registeredExtensions.values());\n }\n\n /**\n * Enriches declared extensions using registered extension hooks.\n *\n * @param declaredExtensions - Extensions declared on the route\n * @param transportContext - Transport-specific context (HTTP, A2A, MCP, etc.)\n * @returns Enriched extensions map\n */\n enrichExtensions(\n declaredExtensions: Record<string, unknown>,\n transportContext: unknown,\n ): Record<string, unknown> {\n const enriched: Record<string, unknown> = {};\n\n for (const [key, declaration] of Object.entries(declaredExtensions)) {\n const extension = this.registeredExtensions.get(key);\n\n if (extension?.enrichDeclaration) {\n enriched[key] = extension.enrichDeclaration(declaration, transportContext);\n } else {\n enriched[key] = declaration;\n }\n }\n\n return enriched;\n }\n\n /**\n * Register a hook to execute before payment verification.\n * Can abort verification by returning { abort: true, reason: string }\n *\n * @param hook - The hook function to register\n * @returns The x402ResourceServer instance for chaining\n */\n onBeforeVerify(hook: BeforeVerifyHook): x402ResourceServer {\n this.beforeVerifyHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute after successful payment verification.\n *\n * @param hook - The hook function to register\n * @returns The x402ResourceServer instance for chaining\n */\n onAfterVerify(hook: AfterVerifyHook): x402ResourceServer {\n this.afterVerifyHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute when payment verification fails.\n * Can recover from failure by returning { recovered: true, result: VerifyResponse }\n *\n * @param hook - The hook function to register\n * @returns The x402ResourceServer instance for chaining\n */\n onVerifyFailure(hook: OnVerifyFailureHook): x402ResourceServer {\n this.onVerifyFailureHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute before payment settlement.\n * Can abort settlement by returning { abort: true, reason: string }\n *\n * @param hook - The hook function to register\n * @returns The x402ResourceServer instance for chaining\n */\n onBeforeSettle(hook: BeforeSettleHook): x402ResourceServer {\n this.beforeSettleHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute after successful payment settlement.\n *\n * @param hook - The hook function to register\n * @returns The x402ResourceServer instance for chaining\n */\n onAfterSettle(hook: AfterSettleHook): x402ResourceServer {\n this.afterSettleHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute when payment settlement fails.\n * Can recover from failure by returning { recovered: true, result: SettleResponse }\n *\n * @param hook - The hook function to register\n * @returns The x402ResourceServer instance for chaining\n */\n onSettleFailure(hook: OnSettleFailureHook): x402ResourceServer {\n this.onSettleFailureHooks.push(hook);\n return this;\n }\n\n /**\n * Initialize by fetching supported kinds from all facilitators\n * Creates mappings for supported responses and facilitator clients\n * Earlier facilitators in the array get precedence\n */\n async initialize(): Promise<void> {\n // Clear existing mappings\n this.supportedResponsesMap.clear();\n this.facilitatorClientsMap.clear();\n 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 // Note: enhancePaymentRequirements expects x402Version in the kind, so we add it back\n const requirement = await SchemeNetworkServer.enhancePaymentRequirements(\n baseRequirements,\n {\n ...supportedKind,\n x402Version,\n },\n facilitatorExtensions,\n );\n\n requirements.push(requirement);\n return requirements;\n }\n\n /**\n * Build payment requirements from multiple payment options\n * This method handles resolving dynamic payTo/price functions and builds requirements for each option\n *\n * @param paymentOptions - Array of payment options to convert\n * @param context - HTTP request context for resolving dynamic functions\n * @returns Array of payment requirements (one per option)\n */\n async buildPaymentRequirementsFromOptions<TContext = unknown>(\n paymentOptions: Array<{\n scheme: string;\n payTo: string | ((context: TContext) => string | Promise<string>);\n price: Price | ((context: TContext) => Price | Promise<Price>);\n network: Network;\n maxTimeoutSeconds?: number;\n 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 * @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 ): Promise<PaymentRequired> {\n // V2 response with resource at top level\n let response: PaymentRequired = {\n x402Version: 2,\n error,\n resource: resourceInfo,\n accepts: requirements as PaymentRequirements[],\n };\n\n // Add extensions if provided\n if (extensions && Object.keys(extensions).length > 0) {\n response.extensions = extensions;\n }\n\n // Let declared extensions add data to PaymentRequired response\n if (extensions) {\n for (const [key, declaration] of Object.entries(extensions)) {\n const extension = this.registeredExtensions.get(key);\n if (extension?.enrichPaymentRequiredResponse) {\n try {\n const context: PaymentRequiredContext = {\n requirements,\n resourceInfo,\n error,\n paymentRequiredResponse: response,\n 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 console.error(\n `Error in enrichPaymentRequiredResponse hook for extension ${key}:`,\n error,\n );\n }\n }\n }\n }\n\n return response;\n }\n\n /**\n * Verify a payment against requirements\n *\n * @param paymentPayload - The payment payload to verify\n * @param requirements - The payment requirements\n * @returns Verification response\n */\n async verifyPayment(\n paymentPayload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<VerifyResponse> {\n const context: VerifyContext = {\n paymentPayload,\n requirements,\n };\n\n // Execute beforeVerify hooks\n for (const hook of this.beforeVerifyHooks) {\n try {\n const result = await hook(context);\n if (result && \"abort\" in result && result.abort) {\n return {\n isValid: false,\n invalidReason: result.reason,\n invalidMessage: result.message,\n };\n }\n } catch (error) {\n throw new VerifyError(400, {\n isValid: false,\n invalidReason: \"before_verify_hook_error\",\n invalidMessage: error instanceof Error ? error.message : \"\",\n });\n }\n }\n\n try {\n // Find the facilitator that supports this payment type\n const facilitatorClient = this.getFacilitatorClient(\n paymentPayload.x402Version,\n requirements.network,\n requirements.scheme,\n );\n\n let verifyResult: VerifyResponse;\n\n if (!facilitatorClient) {\n // Fallback: try all facilitators if no specific support found\n let lastError: Error | undefined;\n\n for (const client of this.facilitatorClients) {\n try {\n verifyResult = await client.verify(paymentPayload, requirements);\n break;\n } catch (error) {\n lastError = error as Error;\n }\n }\n\n if (!verifyResult!) {\n throw (\n lastError ||\n new Error(\n `No facilitator supports ${requirements.scheme} on ${requirements.network} for v${paymentPayload.x402Version}`,\n )\n );\n }\n } else {\n // Use the specific facilitator that supports this payment\n verifyResult = await facilitatorClient.verify(paymentPayload, requirements);\n }\n\n // Execute afterVerify hooks\n const resultContext: VerifyResultContext = {\n ...context,\n result: verifyResult,\n };\n\n for (const hook of this.afterVerifyHooks) {\n await hook(resultContext);\n }\n\n return verifyResult;\n } catch (error) {\n const failureContext: VerifyFailureContext = {\n ...context,\n error: error as Error,\n };\n\n // Execute onVerifyFailure hooks\n for (const hook of this.onVerifyFailureHooks) {\n const result = await hook(failureContext);\n if (result && \"recovered\" in result && result.recovered) {\n return result.result;\n }\n }\n\n throw error;\n }\n }\n\n /**\n * Settle a verified payment\n *\n * @param paymentPayload - The payment payload to settle\n * @param requirements - The payment requirements\n * @param declaredExtensions - Optional declared extensions (for per-key enrichment)\n * @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 // Apply settlement overrides (e.g., partial settlement for upto scheme)\n let effectiveRequirements = requirements;\n if (settlementOverrides?.amount !== undefined) {\n effectiveRequirements = {\n ...requirements,\n amount: resolveSettlementOverrideAmount(settlementOverrides.amount, requirements),\n };\n }\n\n const context: SettleContext = {\n paymentPayload,\n requirements: effectiveRequirements,\n };\n\n // Execute beforeSettle hooks\n for (const hook of this.beforeSettleHooks) {\n try {\n const result = await hook(context);\n if (result && \"abort\" in result && result.abort) {\n throw new SettleError(400, {\n success: false,\n errorReason: result.reason,\n errorMessage: result.message,\n transaction: \"\",\n network: requirements.network,\n });\n }\n } catch (error) {\n if (error instanceof SettleError) {\n throw error;\n }\n throw new SettleError(400, {\n success: false,\n errorReason: \"before_settle_hook_error\",\n errorMessage: error instanceof Error ? error.message : \"\",\n transaction: \"\",\n network: requirements.network,\n });\n }\n }\n\n try {\n // Find the facilitator that supports this payment type\n const facilitatorClient = this.getFacilitatorClient(\n paymentPayload.x402Version,\n 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 transportContext,\n };\n\n for (const hook of this.afterSettleHooks) {\n await hook(resultContext);\n }\n\n // Let declared extensions add data to settlement response\n if (declaredExtensions) {\n for (const [key, declaration] of Object.entries(declaredExtensions)) {\n const extension = this.registeredExtensions.get(key);\n if (extension?.enrichSettlementResponse) {\n try {\n const extensionData = await extension.enrichSettlementResponse(\n declaration,\n resultContext,\n );\n if (extensionData !== undefined) {\n if (!settleResult.extensions) {\n settleResult.extensions = {};\n }\n settleResult.extensions[key] = extensionData;\n }\n } catch (error) {\n console.error(`Error in enrichSettlementResponse hook for extension ${key}:`, error);\n }\n }\n }\n }\n\n return settleResult;\n } catch (error) {\n const failureContext: SettleFailureContext = {\n ...context,\n error: error as Error,\n };\n\n // Execute onSettleFailure hooks\n for (const hook of this.onSettleFailureHooks) {\n const result = await hook(failureContext);\n if (result && \"recovered\" in result && result.recovered) {\n return result.result;\n }\n }\n\n throw error;\n }\n }\n\n /**\n * Find matching payment requirements for a payment\n *\n * @param availableRequirements - Array of available payment requirements\n * @param paymentPayload - The payment payload\n * @returns Matching payment requirements or undefined\n */\n findMatchingRequirements(\n availableRequirements: PaymentRequirements[],\n paymentPayload: PaymentPayload,\n ): PaymentRequirements | undefined {\n // Match by accepted requirements.\n // Per OKX spec, buyers may inject scheme-specific fields into accepted.extra\n // (e.g., sessionCert for aggr_deferred) that are not present in the server's\n // original PaymentRequirements. We use a superset check: all server-declared\n // fields must match, but accepted.extra may contain additional buyer fields.\n return availableRequirements.find(serverReq => {\n const { extra: serverExtra, ...serverBase } = serverReq;\n const { extra: buyerExtra, ...buyerBase } = paymentPayload.accepted ?? {};\n if (!deepEqual(serverBase, buyerBase)) return false;\n // Both have no extra — match\n if (!serverExtra && !buyerExtra) return true;\n // Server has no extra requirements — buyer may add whatever it wants\n if (!serverExtra) return true;\n // Server requires extra but buyer provided none — no match\n if (!buyerExtra) return false;\n // All server-required extra fields must match in buyer's accepted.extra\n for (const [key, value] of Object.entries(serverExtra)) {\n if (!deepEqual((buyerExtra as Record<string, unknown>)[key], value)) return false;\n }\n return true;\n });\n }\n\n /**\n * Process a payment request\n *\n * @param paymentPayload - Optional payment payload if provided\n * @param resourceConfig - Configuration for the protected resource\n * @param resourceInfo - Information about the resource being accessed\n * @param extensions - Optional extensions to include in the response\n * @returns Processing result\n */\n async processPaymentRequest(\n paymentPayload: PaymentPayload | null,\n resourceConfig: ResourceConfig,\n resourceInfo: ResourceInfo,\n extensions?: Record<string, unknown>,\n ): Promise<{\n success: boolean;\n requiresPayment?: PaymentRequired;\n verificationResult?: VerifyResponse;\n settlementResult?: SettleResponse;\n error?: string;\n }> {\n const requirements = await this.buildPaymentRequirements(resourceConfig);\n\n if (!paymentPayload) {\n return {\n success: false,\n requiresPayment: await this.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n \"Payment required\",\n extensions,\n ),\n };\n }\n\n // Find matching requirements\n const matchingRequirements = this.findMatchingRequirements(requirements, paymentPayload);\n if (!matchingRequirements) {\n return {\n success: false,\n requiresPayment: await this.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n \"No matching payment requirements found\",\n extensions,\n ),\n };\n }\n\n // Verify payment\n const verificationResult = await this.verifyPayment(paymentPayload, matchingRequirements);\n if (!verificationResult.isValid) {\n return {\n success: false,\n error: verificationResult.invalidReason,\n verificationResult,\n };\n }\n\n // Payment verified, ready for settlement\n return {\n success: true,\n verificationResult,\n };\n }\n\n /**\n * Poll `GET /settle/status` until a terminal state is reached or deadline expires.\n *\n * Used when settle returns `status=\"timeout\"` (exact + syncSettle=true).\n * Mirrors Rust: `X402ResourceServer::poll_settle_status`.\n *\n * @param txHash - Transaction hash to query\n * @param paymentPayload - The payment payload (used to find the correct facilitator client)\n * @param requirements - The payment requirements (used to find the correct facilitator client)\n * @param pollDeadlineMs - Max time to poll in ms (default 5000)\n * @returns Poll result: \"success\", \"failed\", or \"timeout\"\n */\n async pollSettleStatus(\n txHash: string,\n paymentPayload: PaymentPayload,\n requirements: PaymentRequirements,\n pollDeadlineMs: number = DEFAULT_POLL_DEADLINE_MS,\n ): Promise<PollResult> {\n const facilitatorClient =\n this.getFacilitatorClient(\n paymentPayload.x402Version,\n requirements.network,\n requirements.scheme,\n ) ?? this.facilitatorClients[0];\n\n if (!facilitatorClient?.getSettleStatus) {\n return \"timeout\";\n }\n\n const deadline = Date.now() + pollDeadlineMs;\n\n while (Date.now() < deadline) {\n try {\n const resp: SettleStatusResponse = await facilitatorClient.getSettleStatus(txHash);\n if (!resp.success) {\n return \"failed\";\n }\n if (resp.status === \"success\") {\n return \"success\";\n }\n // status=\"pending\" or unknown → continue polling\n } catch {\n // API error → continue polling if still within deadline\n }\n\n // Wait before next poll, but don't exceed deadline\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n await new Promise(resolve =>\n setTimeout(resolve, Math.min(DEFAULT_POLL_INTERVAL_MS, remaining)),\n );\n }\n return \"timeout\";\n }\n\n /**\n * Get facilitator client for a specific version, network, and scheme\n *\n * @param x402Version - The x402 version\n * @param network - The network identifier\n * @param scheme - The payment scheme\n * @returns The facilitator client or undefined if not found\n */\n private getFacilitatorClient(\n x402Version: number,\n network: Network,\n scheme: string,\n ): FacilitatorClient | undefined {\n const versionMap = this.facilitatorClientsMap.get(x402Version);\n if (!versionMap) return undefined;\n\n // Use findByNetworkAndScheme for pattern matching\n return findByNetworkAndScheme(versionMap, scheme, network);\n }\n}\n\nexport default x402ResourceServer;\n","import {\n decodePaymentRequiredHeader,\n decodePaymentResponseHeader,\n encodePaymentSignatureHeader,\n} from \".\";\nimport { SettleResponse } from \"../types\";\nimport { PaymentPayload, PaymentRequired } from \"../types/payments\";\nimport { x402Client } from \"../client/x402Client\";\n\n/**\n * Context provided to onPaymentRequired hooks.\n */\nexport interface PaymentRequiredContext {\n paymentRequired: PaymentRequired;\n}\n\n/**\n * Hook called when a 402 response is received, before payment processing.\n * Return headers to try before payment, or void to proceed directly to payment.\n */\nexport type PaymentRequiredHook = (\n context: PaymentRequiredContext,\n) => Promise<{ headers: Record<string, string> } | void>;\n\n/**\n * HTTP-specific client for handling x402 payment protocol over HTTP.\n *\n * Wraps a x402Client to provide HTTP-specific encoding/decoding functionality\n * for payment headers and responses while maintaining the builder pattern.\n */\nexport class x402HTTPClient {\n private paymentRequiredHooks: PaymentRequiredHook[] = [];\n\n /**\n * Creates a new x402HTTPClient instance.\n *\n * @param client - The underlying x402Client for payment logic\n */\n constructor(private readonly client: x402Client) {}\n\n /**\n * Register a hook to handle 402 responses before payment.\n * Hooks run in order; first to return headers wins.\n *\n * @param hook - The hook function to register\n * @returns This instance for chaining\n */\n onPaymentRequired(hook: PaymentRequiredHook): this {\n this.paymentRequiredHooks.push(hook);\n return this;\n }\n\n /**\n * Run hooks and return headers if any hook provides them.\n *\n * @param paymentRequired - The payment required response from the server\n * @returns Headers to use for retry, or null to proceed to payment\n */\n async handlePaymentRequired(\n paymentRequired: PaymentRequired,\n ): Promise<Record<string, string> | null> {\n for (const hook of this.paymentRequiredHooks) {\n const result = await hook({ paymentRequired });\n if (result?.headers) {\n return result.headers;\n }\n }\n return null;\n }\n\n /**\n * Encodes a payment payload into appropriate HTTP headers based on version.\n *\n * @param paymentPayload - The payment payload to encode\n * @returns HTTP headers containing the encoded payment signature\n */\n encodePaymentSignatureHeader(paymentPayload: PaymentPayload): Record<string, string> {\n return {\n \"PAYMENT-SIGNATURE\": encodePaymentSignatureHeader(paymentPayload),\n };\n }\n\n /**\n * Extracts payment required information from HTTP response.\n *\n * @param getHeader - Function to retrieve header value by name (case-insensitive)\n * @returns The payment required object\n */\n getPaymentRequiredResponse(\n getHeader: (name: string) => string | null | undefined,\n ): PaymentRequired {\n const paymentRequired = getHeader(\"PAYMENT-REQUIRED\");\n if (paymentRequired) {\n return decodePaymentRequiredHeader(paymentRequired);\n }\n\n throw new Error(\"Invalid payment required response\");\n }\n\n /**\n * Extracts payment settlement response from HTTP headers.\n *\n * @param getHeader - Function to retrieve header value by name (case-insensitive)\n * @returns The settlement response object\n */\n getPaymentSettleResponse(getHeader: (name: string) => string | null | undefined): SettleResponse {\n const paymentResponse = getHeader(\"PAYMENT-RESPONSE\");\n if (paymentResponse) {\n return decodePaymentResponseHeader(paymentResponse);\n }\n\n throw new Error(\"Payment response header not found\");\n }\n\n /**\n * Creates a payment payload for the given payment requirements.\n * Delegates to the underlying x402Client.\n *\n * @param paymentRequired - The payment required response from the server\n * @returns Promise resolving to the payment payload\n */\n async createPaymentPayload(paymentRequired: PaymentRequired): Promise<PaymentPayload> {\n return this.client.createPaymentPayload(paymentRequired);\n }\n}\n","import { SettleResponse } from \"../types\";\nimport { PaymentPayload, PaymentRequired } from \"../types/payments\";\nimport { Base64EncodedRegex, safeBase64Decode, safeBase64Encode } from \"../utils\";\n\n// HTTP Methods that typically use query parameters\nexport type QueryParamMethods = \"GET\" | \"HEAD\" | \"DELETE\";\n\n// HTTP Methods that typically use request body\nexport type BodyMethods = \"POST\" | \"PUT\" | \"PATCH\";\n\n/**\n * Encodes a payment payload as a base64 header value.\n *\n * @param paymentPayload - The payment payload to encode\n * @returns Base64 encoded string representation of the payment payload\n */\nexport function encodePaymentSignatureHeader(paymentPayload: PaymentPayload): string {\n return safeBase64Encode(JSON.stringify(paymentPayload));\n}\n\n/**\n * Decodes a base64 payment signature header into a payment payload.\n *\n * @param paymentSignatureHeader - The base64 encoded payment signature header\n * @returns The decoded payment payload\n */\nexport function decodePaymentSignatureHeader(paymentSignatureHeader: string): PaymentPayload {\n if (!Base64EncodedRegex.test(paymentSignatureHeader)) {\n throw new Error(\"Invalid payment signature header\");\n }\n return JSON.parse(safeBase64Decode(paymentSignatureHeader)) as PaymentPayload;\n}\n\n/**\n * Encodes a payment required object as a base64 header value.\n *\n * @param paymentRequired - The payment required object to encode\n * @returns Base64 encoded string representation of the payment required object\n */\nexport function encodePaymentRequiredHeader(paymentRequired: PaymentRequired): string {\n return safeBase64Encode(JSON.stringify(paymentRequired));\n}\n\n/**\n * Decodes a base64 payment required header into a payment required object.\n *\n * @param paymentRequiredHeader - The base64 encoded payment required header\n * @returns The decoded payment required object\n */\nexport function decodePaymentRequiredHeader(paymentRequiredHeader: string): PaymentRequired {\n if (!Base64EncodedRegex.test(paymentRequiredHeader)) {\n throw new Error(\"Invalid payment required header\");\n }\n return JSON.parse(safeBase64Decode(paymentRequiredHeader)) as PaymentRequired;\n}\n\n/**\n * Encodes a payment response as a base64 header value.\n *\n * @param paymentResponse - The payment response to encode\n * @returns Base64 encoded string representation of the payment response\n */\nexport function encodePaymentResponseHeader(paymentResponse: SettleResponse): string {\n return safeBase64Encode(JSON.stringify(paymentResponse));\n}\n\n/**\n * Decodes a base64 payment response header into a settle response.\n *\n * @param paymentResponseHeader - The base64 encoded payment response header\n * @returns The decoded settle response\n */\nexport function decodePaymentResponseHeader(paymentResponseHeader: string): SettleResponse {\n if (!Base64EncodedRegex.test(paymentResponseHeader)) {\n throw new Error(\"Invalid payment response header\");\n }\n return JSON.parse(safeBase64Decode(paymentResponseHeader)) as SettleResponse;\n}\n\n// Export HTTP service and types\nexport {\n x402HTTPResourceServer,\n HTTPAdapter,\n HTTPRequestContext,\n 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 OnSettlementTimeoutHook,\n} from \"./x402HTTPResourceServer\";\nexport {\n HTTPFacilitatorClient,\n FacilitatorClient,\n FacilitatorConfig,\n} from \"./httpFacilitatorClient\";\nexport { FacilitatorResponseError, getFacilitatorResponseError } from \"../types\";\nexport { x402HTTPClient, PaymentRequiredContext, PaymentRequiredHook } from \"./x402HTTPClient\";\n","import { x402ResourceServer, SettlementOverrides, DEFAULT_POLL_DEADLINE_MS } 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 \"..\";\nimport type { SubscriptionCapability } from \"../subscription\";\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 * Return the full request headers as a plain lowercase-keyed record.\n * Optional; adapters that don't implement it cause hooks like\n * `onBeforeAccess` to receive an empty headers map.\n */\n getHeaders?(): Record<string, 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 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 // ── period scheme additions (subscription-only) ──────────\n /**\n * When set, the route is a special-operation endpoint for the subscription\n * scheme:\n * - \"change\": two-stage upgrade/downgrade flow\n * - \"cancel\": cancel-subscription flow\n * Ignored by non-subscription schemes.\n */\n operation?: \"change\" | \"cancel\" | \"cancel-pending-change\";\n\n /**\n * Route-level hook fired AFTER `verifyAccess` succeeded (signature +\n * payer + plan allowlist + period math) but BEFORE the handler runs.\n * Seller uses it for custom access policy: rate limiting, quota, feature\n * flags, bans / blacklists (return `{ok:false, error:\"banned\"}`). Full\n * `Subscription` object is on the context so any field is inspectable.\n */\n onBeforeAccess?: import(\"../subscription\").OnBeforeAccessHook;\n}\n\n/**\n * Routes configuration - maps path patterns to route configs\n */\nexport type RoutesConfig = Record<string, RouteConfig> | RouteConfig;\n\n/**\n * Hook that runs on every request to a protected route, before payment processing.\n * Can grant access without payment, deny the request, or continue to payment flow.\n *\n * @returns\n * - `void` - Continue to payment processing (default behavior)\n * - `{ grantAccess: true }` - Grant access without requiring payment\n * - `{ abort: true; reason: string }` - Deny the request (returns 403)\n */\nexport type ProtectedRequestHook = (\n context: HTTPRequestContext,\n routeConfig: RouteConfig,\n) => Promise<void | { grantAccess: true } | { abort: true; reason: string }>;\n\n/**\n * Compiled route for efficient matching\n */\nexport interface CompiledRoute {\n verb: string;\n regex: RegExp;\n config: RouteConfig;\n 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 paymentPayload: PaymentPayload;\n paymentRequirements: PaymentRequirements;\n declaredExtensions?: Record<string, unknown>;\n }\n | { type: \"payment-error\"; response: HTTPResponseInstructions }\n // ── period dispatch results (produced by subscription-aware branches) ──\n | {\n type: \"payment-presettle\";\n paymentPayload: PaymentPayload;\n paymentRequirements: PaymentRequirements;\n /** Settle action to run AFTER verify; bound to scheme + operation. */\n settle: () => Promise<{\n success: boolean;\n headers?: Record<string, string>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data?: any;\n error?: string;\n }>;\n operation: \"subscribe\" | \"change\" | \"cancel\" | \"cancel-pending-change\";\n }\n | {\n type: \"access-verified\";\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n subscription: import(\"../subscription\").Subscription;\n headers?: Record<string, string>;\n };\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/**\n * Hook called when the facilitator returns status=\"timeout\".\n * Receives the tx hash and network so the server can verify on-chain.\n * Return { confirmed: true } to deliver the resource; { confirmed: false } to return 402.\n */\nexport type OnSettlementTimeoutHook = (\n txHash: string,\n network: string,\n) => Promise<{ confirmed: boolean }>;\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 private timeoutRecoveryHook?: OnSettlementTimeoutHook;\n private beforeAccessHooks: import(\"../subscription\").OnBeforeAccessHook[] = [];\n private pollDeadlineMs: number = DEFAULT_POLL_DEADLINE_MS;\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 * Register a seller-global `onBeforeAccess` hook fired on every access-\n * verified subscription request, AFTER `verifyAccess` (signature + payer\n * + plan allowlist + period math) but BEFORE the handler runs. Seller\n * uses it for cross-cutting access policy (quota / ban list / feature\n * gating). Hooks are executed in order of registration; the first one\n * to return `{ ok: false }` denies (→ 402). Route-level\n * `RouteConfig.onBeforeAccess` runs AFTER all global hooks.\n *\n * @param hook - The hook function\n * @returns The x402HTTPResourceServer instance for chaining\n */\n onBeforeAccess(hook: import(\"../subscription\").OnBeforeAccessHook): this {\n this.beforeAccessHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to call when the facilitator returns status=\"timeout\".\n * The hook should verify the tx on-chain and return { confirmed: boolean }.\n * If confirmed=true the resource is delivered (200); otherwise 402 is returned.\n *\n * @param hook - On-chain verification callback\n * @returns The x402HTTPResourceServer instance for chaining\n */\n onSettlementTimeout(hook: OnSettlementTimeoutHook): this {\n this.timeoutRecoveryHook = hook;\n return this;\n }\n\n /**\n * Set the poll deadline for settle/status polling on timeout recovery.\n * Default is 5000ms.\n *\n * @param deadlineMs - Maximum time to poll in milliseconds\n * @returns The x402HTTPResourceServer instance for chaining\n */\n setPollDeadline(deadlineMs: number): this {\n this.pollDeadlineMs = deadlineMs;\n return this;\n }\n\n /**\n * Process HTTP request and return response instructions\n * This is the main entry point for framework middleware\n *\n * @param context - HTTP request context\n * @param paywallConfig - Optional paywall configuration\n * @returns Process result indicating next action for middleware\n */\n async processHTTPRequest(\n context: HTTPRequestContext,\n paywallConfig?: PaywallConfig,\n ): Promise<HTTPProcessResult> {\n const { adapter, path, method } = context;\n\n // Find matching route\n const 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.protectedRequestHooks) {\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) — used by Branches A / B / D.\n const paymentPayload = this.extractPayment(adapter);\n\n // ── period Branch A: change endpoint ──────────────────\n // If the route is declared with operation:\"change\", drive the two-stage\n // Change route: no special dispatcher. Buyer follows the standard\n // x402 flow — GET the route → 402 with accepts → pick one → sign newTerms\n // with `changeFromSubId` set to the current sub → POST + APP-PAYMENT.\n // The presettle branch below routes to verifyChange / settleChange based\n // on routeConfig.operation.\n\n // ── period Branch B: cancel endpoint ──────────────────────────────────\n if (routeConfig.operation === \"cancel\") {\n const cancelResult = await this.tryDispatchCancelFlow(adapter, routeConfig, paymentOptions);\n if (cancelResult) return cancelResult;\n }\n\n // ── period Branch B2: cancel-pending-change endpoint ────────────────\n if (routeConfig.operation === \"cancel-pending-change\") {\n const r = await this.tryDispatchCancelPendingChangeFlow(adapter, routeConfig, paymentOptions);\n if (r) return r;\n }\n\n // ── period Branch C: APP-Access (access flow) ────────\n // Build PaymentRequired once. Subscribe presettle + classic verify path\n // both consume the same `accepts[]` — building it here (instead of inside\n // tryDispatchSubscriptionPresettle + again below) eliminates the duplicate\n // facilitator-supportedKinds lookup and parsePrice/enhance pipeline.\n //\n // access / change / cancel flows don't depend on this; they've already\n // short-circuited above. The cost of building requirements once on the\n // way to subscribe / classic dispatch is negligible.\n const resourceInfo = {\n url: routeConfig.resource || enrichedContext.adapter.getUrl(),\n description: routeConfig.description || \"\",\n mimeType: routeConfig.mimeType || \"\",\n };\n let requirements = await this.ResourceServer.buildPaymentRequirementsFromOptions(\n paymentOptions,\n enrichedContext,\n );\n\n // Change route: inject `extra.changeFrom` into each accept so the 402\n // tells the buyer exactly which sub they're switching from and which\n // direction (upgrade/downgrade). Same-tier accepts are filtered out\n // (a no-op change is illegal — `tier_same`).\n //\n // currentSubId source per phase:\n // - sniff phase (no PAYMENT-SIGNATURE) → APP-Access header carrying\n // a buyer-signed AccessProof; middleware ecrecovers it and reads\n // proof.subId. Prevents subId-only reconnaissance attacks.\n // - settle phase (PAYMENT-SIGNATURE) → `terms.changeFromSubId` from\n // the buyer-signed newTerms (tamper-proof, signature covers it).\n //\n // Both phases MUST produce the same enriched accepts so verifyChange's\n // `findMatchingRequirements` deepEqual succeeds.\n if (routeConfig.operation === \"change\") {\n // Resolve the subscription scheme first — both phases need it.\n let scheme: SubscriptionCapability | null = null;\n for (const opt of paymentOptions) {\n if (!opt.network || !opt.scheme) continue;\n scheme = await this.resolveSubscriptionScheme(opt.network, opt.scheme);\n if (scheme) break;\n }\n if (!scheme) {\n return {\n type: \"payment-error\",\n response: {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" },\n body: { error: \"change route: no subscription scheme registered\" },\n },\n };\n }\n\n let currentSubId: string | undefined;\n if (paymentPayload) {\n const innerTerms = (\n paymentPayload.payload as { terms?: { changeFromSubId?: string } } | undefined\n )?.terms;\n currentSubId = innerTerms?.changeFromSubId;\n } else {\n const accessHeader = this.extractAccessProofHeader(enrichedContext.adapter);\n if (!accessHeader) {\n return {\n type: \"payment-error\",\n response: {\n status: 401,\n headers: { \"Content-Type\": \"application/json\" },\n body: { error: \"change route: missing APP-Access header\" },\n },\n };\n }\n const { decodeAccessProof } = await this.loadSubscriptionModule();\n let proof;\n try {\n proof = decodeAccessProof(accessHeader);\n } catch {\n return {\n type: \"payment-error\",\n response: {\n status: 400,\n headers: { \"Content-Type\": \"application/json\" },\n body: { error: \"change route: invalid APP-Access header\" },\n },\n };\n }\n // change-route sniff: prove ownership only. `verifyAccess`'s\n // plan-allowlist + period-math gating is meant for resource\n // consumption — it would (wrongly) reject a buyer whose current\n // period hasn't been charged yet from even seeing change offers.\n // `verifyOwnership` does just sig + store + payer match.\n const verify = await scheme.verifyOwnership(proof);\n if (!verify.ok) {\n return {\n type: \"payment-error\",\n response: {\n status: 401,\n headers: { \"Content-Type\": \"application/json\" },\n body: { error: verify.error },\n },\n };\n }\n currentSubId = verify.subId;\n }\n if (!currentSubId) {\n return {\n type: \"payment-error\",\n response: {\n status: 400,\n headers: { \"Content-Type\": \"application/json\" },\n body: { error: \"change route: cannot resolve currentSubId\" },\n },\n };\n }\n const enriched = await scheme.enrichAcceptsForChange(requirements, currentSubId);\n if (enriched === null) {\n return {\n type: \"payment-error\",\n response: {\n status: 404,\n headers: { \"Content-Type\": \"application/json\" },\n body: { error: \"sub_not_active_for_change\" },\n },\n };\n }\n requirements = enriched;\n }\n\n let extensions = routeConfig.extensions;\n if (extensions) {\n extensions = this.ResourceServer.enrichExtensions(extensions, enrichedContext);\n }\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 // Access flow runs AFTER paymentRequired so that an AccessProof rejection\n // (sub not in this route's plan allowlist / expired / etc.) can return a\n // proper 402 + PAYMENT-REQUIRED body with the route's accepts — buyer\n // sees which plans they'd need to subscribe to gain access.\n //\n // Skip for change routes: APP-Access on a change route is the buyer's\n // identity for `extra.changeFrom` enrichment (above), NOT a request to\n // access the resource itself.\n if (routeConfig.operation !== \"change\") {\n const accessResult = await this.tryDispatchAccessFlow(\n adapter,\n routeConfig,\n paymentOptions,\n paymentRequired,\n );\n if (accessResult) return accessResult;\n }\n\n // ── period Branch D: APP-PAYMENT + scheme=\"pre\" ──────\n // If the buyer presented a subscription PaymentPayload (scheme tags itself\n // as `period` and the registered server declares\n // `settlementMode === \"pre\"`), run verify+settle BEFORE handler executes.\n if (paymentPayload) {\n const subResult = await this.tryDispatchSubscriptionPresettle(\n paymentPayload,\n paymentRequired.accepts,\n routeConfig.operation === \"change\" ? \"change\" : \"subscribe\",\n );\n if (subResult) return subResult;\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 routeConfig.extensions,\n transportContext,\n );\n return {\n type: \"payment-error\",\n response: this.createHTTPResponse(errorResponse, false, paywallConfig),\n };\n }\n\n const verifyResult = await this.ResourceServer.verifyPayment(\n paymentPayload,\n matchingRequirements,\n );\n\n if (!verifyResult.isValid) {\n const errorResponse = await this.ResourceServer.createPaymentRequiredResponse(\n requirements,\n resourceInfo,\n verifyResult.invalidReason,\n routeConfig.extensions,\n transportContext,\n );\n return {\n type: \"payment-error\",\n response: this.createHTTPResponse(errorResponse, false, paywallConfig),\n };\n }\n\n // Payment is valid, return data needed for settlement\n return {\n type: \"payment-verified\",\n paymentPayload,\n paymentRequirements: matchingRequirements,\n declaredExtensions: routeConfig.extensions,\n };\n } catch (error) {\n 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 routeConfig.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 try {\n // Resolve overrides: explicit param takes precedence, fall back to response header\n let resolvedOverrides = settlementOverrides;\n if (!resolvedOverrides && transportContext?.responseHeaders?.[SETTLEMENT_OVERRIDES_HEADER]) {\n try {\n resolvedOverrides = JSON.parse(\n transportContext.responseHeaders[SETTLEMENT_OVERRIDES_HEADER],\n );\n } catch {\n // Ignore malformed header\n }\n }\n\n const settleResponse = await this.ResourceServer.settlePayment(\n paymentPayload,\n requirements,\n declaredExtensions,\n transportContext,\n resolvedOverrides,\n );\n\n // status=\"timeout\" → facilitator gave up waiting for on-chain confirmation.\n // Step 1: Poll /settle/status (interval 1s, deadline from config).\n // Step 2: If polling fails/times out, try developer's timeout hook.\n if (settleResponse.status === \"timeout\") {\n if (settleResponse.transaction) {\n // Step 1: Poll settle/status\n const pollResult = await this.ResourceServer.pollSettleStatus(\n settleResponse.transaction,\n paymentPayload,\n requirements,\n this.pollDeadlineMs,\n );\n\n if (pollResult === \"success\") {\n // Poll confirmed on-chain → deliver resource\n const recovered = { ...settleResponse, status: \"success\" as const };\n return {\n ...recovered,\n success: true as const,\n headers: this.createSettlementHeaders(recovered),\n requirements,\n };\n }\n\n // Step 2: Poll unsuccessful → try developer's timeout hook\n if (this.timeoutRecoveryHook) {\n try {\n const { confirmed } = await this.timeoutRecoveryHook(\n settleResponse.transaction,\n settleResponse.network as string,\n );\n if (confirmed) {\n const recovered = { ...settleResponse, status: \"success\" as const };\n return {\n ...recovered,\n success: true as const,\n headers: this.createSettlementHeaders(recovered),\n requirements,\n };\n }\n } catch (err) {\n console.warn(\"[x402] onSettlementTimeout hook error:\", err);\n }\n }\n }\n\n // No transaction, or poll+hook both failed → 402\n const failure = {\n ...settleResponse,\n success: false as const,\n errorReason: \"settlement_timeout\",\n errorMessage: \"Settlement timed out waiting for on-chain confirmation\",\n headers: this.createSettlementHeaders(settleResponse),\n };\n const response = await this.buildSettlementFailureResponse(failure, transportContext);\n return { ...failure, response };\n }\n\n // status=\"success\" → on-chain confirmed (syncSettle=true), deliver resource\n // status=\"pending\" → async mode, Seller trusts Facilitator, deliver resource\n // no status → standard okx facilitator, check success field\n if (settleResponse.status === \"success\" || settleResponse.status === \"pending\") {\n return {\n ...settleResponse,\n success: true as const,\n headers: this.createSettlementHeaders(settleResponse),\n requirements,\n };\n }\n\n // Fallback: standard okx facilitator (no status field)\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 return this.getRouteConfig(context.path, context.method) !== undefined;\n }\n\n /**\n * Lazy loader for the subscription submodule. The `import()` cache makes\n * this effectively free after the first hit; isolating it in one place\n * keeps dispatch helpers free of dynamic-import boilerplate and lets\n * bundlers tree-shake the entire subscription path when no caller touches\n * it.\n */\n protected loadSubscriptionModule(): Promise<typeof import(\"../subscription\")> {\n return import(\"../subscription\");\n }\n\n /**\n * Single chokepoint for \"is this (network, scheme) backed by a\n * SubscriptionCapability-implementing scheme?\". Returns the narrowed\n * capability (so callers get full typing on `verifyAccess` / `verifySubscribe`\n * / etc.) or null if not registered or not a subscription scheme.\n */\n protected async resolveSubscriptionScheme(\n network: Network,\n schemeName: string,\n ): Promise<SubscriptionCapability | null> {\n const registered = this.ResourceServer.findScheme(network, schemeName);\n if (!registered) return null;\n const { hasSubscriptionCapability } = await this.loadSubscriptionModule();\n return hasSubscriptionCapability(registered) ? registered : null;\n }\n\n /**\n * period dispatch helper — Access flow.\n *\n * Returns an `access-verified` (or `payment-error`) HTTPProcessResult when\n * the request carries `APP-Access` AND a subscription-capable scheme is\n * registered for one of the route's accepted (scheme, network) pairs.\n * Returns `null` to indicate the dispatcher should fall through to classic\n * pay-per-request handling.\n */\n protected async tryDispatchAccessFlow(\n adapter: HTTPAdapter,\n routeConfig: RouteConfig,\n paymentOptions: PaymentOption[],\n paymentRequired: PaymentRequired,\n ): Promise<HTTPProcessResult | null> {\n const headerB64 = this.extractAccessProofHeader(adapter);\n if (!headerB64) return null;\n\n const { decodeAccessProof } = await this.loadSubscriptionModule();\n\n let proof;\n try {\n proof = decodeAccessProof(headerB64);\n } catch (err) {\n return {\n type: \"payment-error\",\n response: {\n status: 401,\n headers: { \"Content-Type\": \"application/json\" },\n body: { error: `invalid APP-Access: ${(err as Error).message}` },\n },\n };\n }\n\n // Derive the route's allowed plan-id allowlist from its `accepts` —\n // every accept entry's `extra.plan.id` is one acceptable plan. A\n // subscription's `planId` must appear here to satisfy this route.\n const acceptedPlanIds = collectAcceptedPlanIds(paymentOptions);\n\n // First (scheme, network) in the route's accepts that resolves to a\n // SubscriptionCapability wins. v1 assumes one subscription scheme per\n // route.\n for (const opt of paymentOptions) {\n if (!opt.network || !opt.scheme) continue;\n const scheme = await this.resolveSubscriptionScheme(opt.network, opt.scheme);\n if (!scheme) continue;\n const result = await scheme.verifyAccess(proof, { acceptedPlanIds });\n if (!result.ok) {\n // 402: PAYMENT-REQUIRED header carries the route's accepts (so buyer\n // can subscribe / change to a satisfying plan); body carries the\n // specific reason code (subscription_not_active / signature_invalid\n // / payer_mismatch / …).\n return {\n type: \"payment-error\",\n response: {\n status: 402,\n headers: {\n \"Content-Type\": \"application/json\",\n \"PAYMENT-REQUIRED\": encodePaymentRequiredHeader(paymentRequired),\n },\n body: { error: result.error },\n },\n };\n }\n\n // `onBeforeAccess` hooks: seller-defined access policy\n // (quota, ban list, feature gating…). Full Subscription is passed so\n // arbitrary fields (subId / payer / planId / lastChargedPeriod / …)\n // can drive the decision. Return `{ok:false}` to deny. Global hook\n // (set via `httpServer.onBeforeAccess()`) runs FIRST; if it passes,\n // route-level hook (in `RouteConfig.onBeforeAccess`) runs after.\n const hooks: import(\"../subscription\").OnBeforeAccessHook[] = [\n ...this.beforeAccessHooks,\n ...(routeConfig.onBeforeAccess ? [routeConfig.onBeforeAccess] : []),\n ];\n for (const hook of hooks) {\n const decision = await hook({\n subscription: result.subscription,\n request: {\n path: adapter.getPath(),\n method: adapter.getMethod(),\n headers: adapter.getHeaders?.() ?? {},\n },\n route: { acceptedPlanIds, accepts: paymentRequired.accepts },\n });\n if (!decision.ok) {\n return {\n type: \"payment-error\",\n response: {\n status: 402,\n headers: { \"Content-Type\": \"application/json\" },\n body: {\n error: decision.error ?? \"access_denied\",\n retryAfter: decision.retryAfter,\n upgradeOffers: decision.upgradeOffers,\n },\n },\n };\n }\n }\n\n return {\n type: \"access-verified\",\n subscription: result.subscription,\n headers: {},\n };\n }\n\n // No subscription-capable scheme registered for any of the route's\n // accepted networks. Treat as unauthorized rather than fall through to a\n // 402 paywall, since the buyer clearly tried the access path.\n return {\n type: \"payment-error\",\n response: {\n status: 401,\n headers: { \"Content-Type\": \"application/json\" },\n body: { error: \"no subscription scheme registered for this route\" },\n },\n };\n }\n\n /**\n * period dispatch helper — Subscribe presettle flow.\n *\n * When the buyer presents a PaymentPayload whose `accepted.scheme` is a\n * subscription scheme with `settlementMode === \"pre\"`, this runs verify +\n * (settle on demand) and returns `payment-presettle`. The middleware is\n * expected to call `result.settle()` AFTER decision-time but BEFORE\n * `next()` so handler only runs when the chain creation succeeded.\n *\n * Returns `null` to fall through to classic post-settle path-verified flow.\n */\n protected async tryDispatchSubscriptionPresettle(\n paymentPayload: PaymentPayload,\n serverAccepts: PaymentRequirements[],\n operation: \"subscribe\" | \"change\",\n ): Promise<HTTPProcessResult | null> {\n const { accepted } = paymentPayload;\n const scheme = await this.resolveSubscriptionScheme(accepted.network, accepted.scheme);\n if (!scheme) return null;\n\n // ★ Security gate (anti-tampering): caller passes already-built\n // `serverAccepts` (the seller's authoritative requirements from route\n // config). We look up which entry the buyer's PaymentPayload matches —\n // returning the SERVER copy, not the buyer's. Divergence on base fields\n // or server-declared extra → 402 here, well before any facilitator call.\n const serverReq = this.ResourceServer.findMatchingRequirements(serverAccepts, paymentPayload);\n if (!serverReq) {\n return {\n type: \"payment-error\",\n response: {\n status: 402,\n headers: { \"Content-Type\": \"application/json\" },\n body: { error: \"no_matching_requirements\" },\n },\n };\n }\n\n if (operation === \"change\") {\n const verifyResult = await scheme.verifyChange(paymentPayload, serverReq);\n if (!verifyResult.ok) {\n return {\n type: \"payment-error\",\n response: {\n status: 402,\n headers: { \"Content-Type\": \"application/json\" },\n body: { error: verifyResult.error },\n },\n };\n }\n return {\n type: \"payment-presettle\",\n paymentPayload,\n paymentRequirements: serverReq,\n operation: \"change\",\n settle: async () => {\n const r = await scheme.settleChange(paymentPayload, serverReq);\n return r.success\n ? {\n success: true,\n headers: r.headers,\n data: {\n newSubId: r.newSubId,\n oldSubId: r.oldSubId,\n operationType: r.operationType,\n scheduledFromPeriod: r.scheduledFromPeriod,\n },\n }\n : { success: false, error: r.error };\n },\n };\n }\n\n const verifyResult = await scheme.verifySubscribe(paymentPayload, serverReq);\n if (!verifyResult.ok) {\n return {\n type: \"payment-error\",\n response: {\n status: 402,\n headers: { \"Content-Type\": \"application/json\" },\n body: { error: verifyResult.error },\n },\n };\n }\n\n return {\n type: \"payment-presettle\",\n paymentPayload,\n paymentRequirements: serverReq,\n operation: \"subscribe\",\n settle: async () => {\n const r = await scheme.settleSubscribe(paymentPayload, serverReq);\n return r.success\n ? {\n success: true,\n headers: r.headers,\n data: { subId: r.subId, subscription: r.subscription },\n }\n : { success: false, error: r.error };\n },\n };\n }\n\n /**\n * period dispatch helper — Cancel flow.\n *\n * Reads JSON body { auth: CancelAuth, subId: string }, runs verifyCancel\n * then wraps settleCancel as a payment-presettle (settle-before-handler so\n * the cancelation is on-chain before the seller's response).\n */\n protected async tryDispatchCancelFlow(\n adapter: HTTPAdapter,\n routeConfig: RouteConfig,\n paymentOptions: PaymentOption[],\n ): Promise<HTTPProcessResult | null> {\n let scheme: SubscriptionCapability | null = null;\n for (const opt of paymentOptions) {\n if (!opt.network || !opt.scheme) continue;\n const resolved = await this.resolveSubscriptionScheme(opt.network as Network, opt.scheme);\n if (resolved) {\n scheme = resolved;\n break;\n }\n }\n if (!scheme) return null;\n\n const body = (adapter.getBody?.() ?? {}) as {\n auth?: import(\"../subscription\").CancelAuth;\n subId?: string;\n };\n if (!body.auth || !body.subId) {\n return {\n type: \"payment-error\",\n response: {\n status: 400,\n headers: { \"Content-Type\": \"application/json\" },\n body: { error: \"cancel: body must include auth and subId\" },\n },\n };\n }\n\n const verifyResult = await scheme.verifyCancel(body.auth, body.subId);\n if (!verifyResult.ok) {\n return {\n type: \"payment-error\",\n response: {\n status: 402,\n headers: { \"Content-Type\": \"application/json\" },\n body: { error: verifyResult.error },\n },\n };\n }\n\n void routeConfig;\n const settleScheme = scheme;\n const auth = body.auth;\n const subId = body.subId;\n return {\n type: \"payment-presettle\",\n paymentPayload: { x402Version: 2, accepted: null as never, payload: {} },\n paymentRequirements: null as never,\n operation: \"cancel\",\n settle: async () => {\n const r = await settleScheme.settleCancel(auth, subId);\n return r.success\n ? { success: true, headers: r.headers, data: { subId } }\n : { success: false, error: r.error };\n },\n };\n }\n\n /**\n * period dispatch helper — Cancel-Pending-Change flow.\n *\n * Reads JSON body `{ auth: PendingChangeCancelAuth, subId: string }`. The\n * auth must carry `newSubId` (matches the currently PENDING downgrade\n * target). Runs verifyCancelPendingChange then wraps\n * settleCancelPendingChange as a payment-presettle.\n */\n protected async tryDispatchCancelPendingChangeFlow(\n adapter: HTTPAdapter,\n routeConfig: RouteConfig,\n paymentOptions: PaymentOption[],\n ): Promise<HTTPProcessResult | null> {\n let scheme: SubscriptionCapability | null = null;\n for (const opt of paymentOptions) {\n if (!opt.network || !opt.scheme) continue;\n const resolved = await this.resolveSubscriptionScheme(opt.network as Network, opt.scheme);\n if (resolved) {\n scheme = resolved;\n break;\n }\n }\n if (!scheme) return null;\n\n const body = (adapter.getBody?.() ?? {}) as {\n auth?: import(\"../subscription\").PendingChangeCancelAuth;\n subId?: string;\n };\n if (!body.auth || !body.subId) {\n return {\n type: \"payment-error\",\n response: {\n status: 400,\n headers: { \"Content-Type\": \"application/json\" },\n body: { error: \"cancel-pending-change: body must include auth and subId\" },\n },\n };\n }\n if (!body.auth.newSubId) {\n // Facilitator requires newSubId — reject early with a clear code.\n return {\n type: \"payment-error\",\n response: {\n status: 400,\n headers: { \"Content-Type\": \"application/json\" },\n body: { error: \"cancel-pending-change: auth.newSubId is required\" },\n },\n };\n }\n\n const verifyResult = await scheme.verifyCancelPendingChange(body.auth, body.subId);\n if (!verifyResult.ok) {\n return {\n type: \"payment-error\",\n response: {\n status: 402,\n headers: { \"Content-Type\": \"application/json\" },\n body: { error: verifyResult.error },\n },\n };\n }\n\n void routeConfig;\n const settleScheme = scheme;\n const auth = body.auth;\n const subId = body.subId;\n return {\n type: \"payment-presettle\",\n paymentPayload: { x402Version: 2, accepted: null as never, payload: {} },\n paymentRequirements: null as never,\n operation: \"cancel-pending-change\",\n settle: async () => {\n const r = await settleScheme.settleCancelPendingChange(auth, subId);\n return r.success\n ? { success: true, headers: r.headers, data: { subId: r.subId } }\n : { success: false, error: r.error };\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 * 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 // period uses APP-PAYMENT (base64-encoded JSON).\n const subHeader = adapter.getHeader(\"app-payment\") || adapter.getHeader(\"APP-PAYMENT\");\n if (subHeader) {\n try {\n const json = Buffer.from(subHeader, \"base64\").toString(\"utf8\");\n return JSON.parse(json) as PaymentPayload;\n } catch (error) {\n console.warn(\"Failed to decode APP-PAYMENT header:\", error);\n }\n }\n\n return null;\n }\n\n /**\n * Extract `APP-Access` header (subscription access-flow). Returns the raw\n * base64 string so callers can pass it through to `decodeAccessProof` in\n * the subscription codec.\n */\n private extractAccessProofHeader(adapter: HTTPAdapter): string | null {\n return adapter.getHeader(\"app-access\") || adapter.getHeader(\"APP-Access\") || 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\n if (isWebBrowser) {\n const html = this.generatePaywallHTML(paymentRequired, paywallConfig, customHtml);\n return {\n status,\n headers: { \"Content-Type\": \"text/html\" },\n body: html,\n isHtml: true,\n };\n }\n\n const response = this.createHTTPPaymentRequiredResponse(paymentRequired);\n\n // Use callback result if provided, otherwise default to JSON with empty object\n const contentType = unpaidResponse ? unpaidResponse.contentType : \"application/json\";\n const body = unpaidResponse ? unpaidResponse.body : {};\n\n return {\n status,\n headers: {\n \"Content-Type\": contentType,\n ...response.headers,\n },\n body,\n };\n }\n\n /**\n * Create HTTP payment required response (v1 puts in body, v2 puts in header)\n *\n * @param paymentRequired - Payment required object\n * @returns Headers and body for the HTTP response\n */\n private createHTTPPaymentRequiredResponse(paymentRequired: PaymentRequired): {\n headers: Record<string, string>;\n } {\n return {\n headers: {\n \"PAYMENT-REQUIRED\": encodePaymentRequiredHeader(paymentRequired),\n },\n };\n }\n\n /**\n * Create settlement response headers\n *\n * @param settleResponse - Settlement response\n * @returns Headers to add to response\n */\n private createSettlementHeaders(settleResponse: SettleResponse): Record<string, string> {\n const encoded = encodePaymentResponseHeader(settleResponse);\n return { \"PAYMENT-RESPONSE\": encoded };\n }\n\n /**\n * Parse route pattern into verb and regex\n *\n * @param pattern - Route pattern like \"GET /api/*\", \"/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 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 let decodedOrRawPath: string;\n try {\n decodedOrRawPath = decodeURIComponent(pathWithoutQuery);\n } catch {\n decodedOrRawPath = pathWithoutQuery;\n }\n\n return decodedOrRawPath\n .replace(/\\\\/g, \"/\")\n .replace(/\\/+/g, \"/\")\n .replace(/(.+?)\\/+$/, \"$1\");\n }\n\n /**\n * Generate paywall HTML for browser requests\n *\n * @param paymentRequired - Payment required response\n * @param paywallConfig - Optional paywall configuration\n * @param customHtml - Optional custom HTML template\n * @returns HTML string\n */\n private generatePaywallHTML(\n paymentRequired: PaymentRequired,\n paywallConfig?: PaywallConfig,\n customHtml?: string,\n ): string {\n if (customHtml) {\n return customHtml;\n }\n\n // Use custom paywall provider if set\n if (this.paywallProvider) {\n return this.paywallProvider.generateHtml(paymentRequired, paywallConfig);\n }\n\n // Fallback: Basic HTML paywall\n const resource = paymentRequired.resource;\n const displayAmount = this.getDisplayAmount(paymentRequired);\n\n return `\n <!DOCTYPE html>\n <html>\n <head>\n <title>Payment Required</title>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n </head>\n <body>\n <div style=\"max-width: 600px; margin: 50px auto; padding: 20px; font-family: system-ui, -apple-system, sans-serif;\">\n ${paywallConfig?.appLogo ? `<img src=\"${paywallConfig.appLogo}\" alt=\"${paywallConfig.appName || \"App\"}\" style=\"max-width: 200px; margin-bottom: 20px;\">` : \"\"}\n <h1>Payment Required</h1>\n ${resource ? `<p><strong>Resource:</strong> ${resource.description || resource.url}</p>` : \"\"}\n <p><strong>Amount:</strong> $${displayAmount.toFixed(2)} USDC</p>\n <div id=\"payment-widget\" \n data-requirements='${JSON.stringify(paymentRequired)}'\n data-app-name=\"${paywallConfig?.appName || \"\"}\"\n data-testnet=\"${paywallConfig?.testnet || false}\">\n </div>\n </div>\n </body>\n </html>\n `;\n }\n\n /**\n * Extract display amount from payment requirements.\n *\n * @param paymentRequired - The payment required object\n * @returns The display amount in decimal format\n */\n private getDisplayAmount(paymentRequired: PaymentRequired): number {\n const accepts = paymentRequired.accepts;\n if (accepts && accepts.length > 0) {\n const firstReq = accepts[0];\n if (\"amount\" in firstReq) {\n // V2 format\n return parseFloat(firstReq.amount) / 1000000; // Assuming USDC with 6 decimals\n }\n }\n return 0;\n }\n}\n\n/**\n * Pull `extra.plan.id` out of every payment option, dedup, drop missing.\n * Used by the access-flow dispatcher to build the route's allowlist of\n * acceptable plans from `RouteConfig.accepts`.\n */\nfunction collectAcceptedPlanIds(options: PaymentOption[]): string[] {\n const seen = new Set<string>();\n for (const opt of options) {\n const extra = opt.extra as { plan?: { id?: unknown } } | undefined;\n const id = extra?.plan?.id;\n if (typeof id === \"string\" && id.length > 0) seen.add(id);\n }\n return Array.from(seen);\n}\n"],"mappings":"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","names":["x402Version","error","errorReason","settleResponse","failure","response","verifyResult"]}
@@ -1,4 +1,4 @@
1
- import { c as PaymentRequired, a as PaymentRequirements, P as PaymentPayload, N as Network, j as SchemeNetworkClient, S as SettleResponse } from '../mechanisms-sojpSwWW.mjs';
1
+ import { c as PaymentRequired, a as PaymentRequirements, P as PaymentPayload, N as Network, a9 as SchemeNetworkClient, S as SettleResponse } from '../mechanisms-LhI9qkRo.mjs';
2
2
 
3
3
  /**
4
4
  * Client Hook Context Interfaces
@@ -1,9 +1,10 @@
1
1
  import {
2
2
  x402HTTPClient
3
- } from "../chunk-XBQG2CDV.mjs";
3
+ } from "../chunk-EYS4TWVA.mjs";
4
4
  import {
5
5
  x402Version
6
- } from "../chunk-O3IYMTNT.mjs";
6
+ } from "../chunk-4KASWSSY.mjs";
7
+ import "../chunk-CKXR4QVD.mjs";
7
8
  import "../chunk-CAXWAW23.mjs";
8
9
  import {
9
10
  findByNetworkAndScheme,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/client/x402Client.ts"],"sourcesContent":["import { x402Version } from \"..\";\nimport { SchemeNetworkClient } from \"../types/mechanisms\";\nimport { PaymentPayload, PaymentRequirements } from \"../types/payments\";\nimport { Network, PaymentRequired } from \"../types\";\nimport { findByNetworkAndScheme, findSchemesByNetwork } from \"../utils\";\n\n/**\n * Client Hook Context Interfaces\n */\n\nexport interface PaymentCreationContext {\n paymentRequired: PaymentRequired;\n selectedRequirements: PaymentRequirements;\n}\n\nexport interface PaymentCreatedContext extends PaymentCreationContext {\n paymentPayload: PaymentPayload;\n}\n\nexport interface PaymentCreationFailureContext extends PaymentCreationContext {\n error: Error;\n}\n\n/**\n * Client Hook Type Definitions\n */\n\nexport type BeforePaymentCreationHook = (\n context: PaymentCreationContext,\n) => Promise<void | { abort: true; reason: string }>;\n\nexport type AfterPaymentCreationHook = (context: PaymentCreatedContext) => Promise<void>;\n\nexport type OnPaymentCreationFailureHook = (\n context: PaymentCreationFailureContext,\n) => Promise<void | { recovered: true; payload: PaymentPayload }>;\n\nexport type SelectPaymentRequirements = (x402Version: number, paymentRequirements: PaymentRequirements[]) => PaymentRequirements;\n\n/**\n * Extension that can enrich payment payloads on the client side.\n *\n * Client extensions are invoked after the scheme creates the base payment payload\n * but before it is returned. This allows mechanism-specific logic (e.g., EVM EIP-2612\n * permit signing) to enrich the payload's extensions data.\n */\nexport interface ClientExtension {\n /**\n * Unique key identifying this extension (e.g., \"eip2612GasSponsoring\").\n * Must match the extension key used in PaymentRequired.extensions.\n */\n key: string;\n\n /**\n * Called after payload creation when the extension key is present in\n * paymentRequired.extensions. Allows the extension to enrich the payload\n * with extension-specific data (e.g., signing an EIP-2612 permit).\n *\n * @param paymentPayload - The payment payload to enrich\n * @param paymentRequired - The original PaymentRequired response\n * @returns The enriched payment payload\n */\n enrichPaymentPayload?: (\n paymentPayload: PaymentPayload,\n paymentRequired: PaymentRequired,\n ) => Promise<PaymentPayload>;\n}\n\n/**\n * A policy function that filters or transforms payment requirements.\n * Policies are applied in order before the selector chooses the final option.\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - Array of payment requirements to filter/transform\n * @returns Filtered array of payment requirements\n */\nexport type PaymentPolicy = (x402Version: number, paymentRequirements: PaymentRequirements[]) => PaymentRequirements[];\n\n\n/**\n * Configuration for registering a payment scheme with a specific network\n */\nexport interface SchemeRegistration {\n /**\n * The network identifier (e.g., 'eip155:196', 'eip155:196')\n */\n network: Network;\n\n /**\n * The scheme client implementation for this network\n */\n client: SchemeNetworkClient;\n\n /**\n * The x402 protocol version to use for this scheme\n *\n * @default 2\n */\n x402Version?: number;\n}\n\n/**\n * Configuration options for the fetch wrapper\n */\nexport interface x402ClientConfig {\n /**\n * Array of scheme registrations defining which payment methods are supported\n */\n schemes: SchemeRegistration[];\n\n /**\n * Policies to apply to the client\n */\n policies?: PaymentPolicy[];\n\n /**\n * Custom payment requirements selector function\n * If not provided, uses the default selector (first available option)\n */\n paymentRequirementsSelector?: SelectPaymentRequirements;\n}\n\n/**\n * Core client for managing x402 payment schemes and creating payment payloads.\n *\n * Handles registration of payment schemes, policy-based filtering of payment requirements,\n * and creation of payment payloads based on server requirements.\n */\nexport class x402Client {\n private readonly paymentRequirementsSelector: SelectPaymentRequirements;\n private readonly registeredClientSchemes: Map<number, Map<string, Map<string, SchemeNetworkClient>>> = new Map();\n private readonly policies: PaymentPolicy[] = [];\n private readonly registeredExtensions: Map<string, ClientExtension> = new Map();\n\n private beforePaymentCreationHooks: BeforePaymentCreationHook[] = [];\n private afterPaymentCreationHooks: AfterPaymentCreationHook[] = [];\n private onPaymentCreationFailureHooks: OnPaymentCreationFailureHook[] = [];\n\n /**\n * Creates a new x402Client instance.\n *\n * @param paymentRequirementsSelector - Function to select payment requirements from available options\n */\n constructor(paymentRequirementsSelector?: SelectPaymentRequirements) {\n this.paymentRequirementsSelector = paymentRequirementsSelector || ((x402Version, accepts) => accepts[0]);\n }\n\n /**\n * Creates a new x402Client instance from a configuration object.\n *\n * @param config - The client configuration including schemes, policies, and payment requirements selector\n * @returns A configured x402Client instance\n */\n static fromConfig(config: x402ClientConfig): x402Client {\n const client = new x402Client(config.paymentRequirementsSelector);\n config.schemes.forEach(scheme => {\n client.register(scheme.network, scheme.client);\n });\n config.policies?.forEach(policy => {\n client.registerPolicy(policy);\n });\n return client;\n }\n\n /**\n * Registers a scheme client for the current x402 version.\n *\n * @param network - The network to register the client for\n * @param client - The scheme network client to register\n * @returns The x402Client instance for chaining\n */\n register(network: Network, client: SchemeNetworkClient): x402Client {\n return this._registerScheme(x402Version, network, client);\n }\n\n /**\n * Registers a policy to filter or transform payment requirements.\n *\n * Policies are applied in order after filtering by registered schemes\n * and before the selector chooses the final payment requirement.\n *\n * @param policy - Function to filter/transform payment requirements\n * @returns The x402Client instance for chaining\n *\n * @example\n * ```typescript\n * // Prefer cheaper options\n * client.registerPolicy((version, reqs) =>\n * reqs.filter(r => BigInt(r.value) < BigInt('1000000'))\n * );\n *\n * // Prefer specific networks\n * client.registerPolicy((version, reqs) =>\n * reqs.filter(r => r.network.startsWith('eip155:'))\n * );\n * ```\n */\n registerPolicy(policy: PaymentPolicy): x402Client {\n this.policies.push(policy);\n return this;\n }\n\n /**\n * Registers a client extension that can enrich payment payloads.\n *\n * Extensions are invoked after the scheme creates the base payload and the\n * payload is wrapped with extensions/resource/accepted data. If the extension's\n * key is present in `paymentRequired.extensions`, the extension's\n * `enrichPaymentPayload` hook is called to modify the payload.\n *\n * @param extension - The client extension to register\n * @returns The x402Client instance for chaining\n */\n registerExtension(extension: ClientExtension): x402Client {\n this.registeredExtensions.set(extension.key, extension);\n return this;\n }\n\n /**\n * Register a hook to execute before payment payload creation.\n * Can abort creation by returning { abort: true, reason: string }\n *\n * @param hook - The hook function to register\n * @returns The x402Client instance for chaining\n */\n onBeforePaymentCreation(hook: BeforePaymentCreationHook): x402Client {\n this.beforePaymentCreationHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute after successful payment payload creation.\n *\n * @param hook - The hook function to register\n * @returns The x402Client instance for chaining\n */\n onAfterPaymentCreation(hook: AfterPaymentCreationHook): x402Client {\n this.afterPaymentCreationHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute when payment payload creation fails.\n * Can recover from failure by returning { recovered: true, payload: PaymentPayload }\n *\n * @param hook - The hook function to register\n * @returns The x402Client instance for chaining\n */\n onPaymentCreationFailure(hook: OnPaymentCreationFailureHook): x402Client {\n this.onPaymentCreationFailureHooks.push(hook);\n return this;\n }\n\n /**\n * Creates a payment payload based on a PaymentRequired response.\n *\n * Automatically extracts x402Version, resource, and extensions from the PaymentRequired\n * response and constructs a complete PaymentPayload with the accepted requirements.\n *\n * @param paymentRequired - The PaymentRequired response from the server\n * @returns Promise resolving to the complete payment payload\n */\n async createPaymentPayload(\n paymentRequired: PaymentRequired,\n ): Promise<PaymentPayload> {\n const clientSchemesByNetwork = this.registeredClientSchemes.get(paymentRequired.x402Version);\n if (!clientSchemesByNetwork) {\n throw new Error(`No client registered for x402 version: ${paymentRequired.x402Version}`);\n }\n\n const requirements = this.selectPaymentRequirements(paymentRequired.x402Version, paymentRequired.accepts);\n\n const context: PaymentCreationContext = {\n paymentRequired,\n selectedRequirements: requirements,\n };\n\n // Execute beforePaymentCreation hooks\n for (const hook of this.beforePaymentCreationHooks) {\n const result = await hook(context);\n if (result && \"abort\" in result && result.abort) {\n throw new Error(`Payment creation aborted: ${result.reason}`);\n }\n }\n\n try {\n const schemeNetworkClient = findByNetworkAndScheme(clientSchemesByNetwork, requirements.scheme, requirements.network);\n if (!schemeNetworkClient) {\n throw new Error(`No client registered for scheme: ${requirements.scheme} and network: ${requirements.network}`);\n }\n\n const partialPayload = await schemeNetworkClient.createPaymentPayload(\n paymentRequired.x402Version,\n requirements,\n { extensions: paymentRequired.extensions },\n );\n\n // Merge server-declared extensions with any scheme-provided extensions.\n // Scheme extensions overlay on top (e.g., EIP-2612 info enriches server declaration).\n const mergedExtensions = this.mergeExtensions(\n paymentRequired.extensions,\n partialPayload.extensions,\n );\n\n // Apply acceptedExtraOverrides: OKX extension for injecting scheme-specific\n // fields (e.g. sessionCert) into accepted.extra per the OKX API spec.\n const acceptedRequirements =\n partialPayload.acceptedExtraOverrides && Object.keys(partialPayload.acceptedExtraOverrides).length > 0\n ? {\n ...requirements,\n extra: {\n ...requirements.extra,\n ...partialPayload.acceptedExtraOverrides,\n },\n }\n : requirements;\n\n let paymentPayload: PaymentPayload = {\n x402Version: partialPayload.x402Version,\n payload: partialPayload.payload,\n extensions: mergedExtensions,\n resource: paymentRequired.resource,\n accepted: acceptedRequirements,\n };\n\n // Enrich payload via registered client extensions (for non-scheme extensions)\n paymentPayload = await this.enrichPaymentPayloadWithExtensions(paymentPayload, paymentRequired);\n\n // Execute afterPaymentCreation hooks\n const createdContext: PaymentCreatedContext = {\n ...context,\n paymentPayload,\n };\n\n for (const hook of this.afterPaymentCreationHooks) {\n await hook(createdContext);\n }\n\n return paymentPayload;\n } catch (error) {\n const failureContext: PaymentCreationFailureContext = {\n ...context,\n error: error as Error,\n };\n\n // Execute onPaymentCreationFailure hooks\n for (const hook of this.onPaymentCreationFailureHooks) {\n const result = await hook(failureContext);\n if (result && \"recovered\" in result && result.recovered) {\n return result.payload;\n }\n }\n\n throw error;\n }\n }\n\n\n\n /**\n * Merges server-declared extensions with scheme-provided extensions.\n * Scheme extensions overlay on top of server extensions at each key,\n * preserving server-provided schema while overlaying scheme-provided info.\n *\n * @param serverExtensions - Extensions declared by the server in the 402 response\n * @param schemeExtensions - Extensions provided by the scheme client (e.g. EIP-2612)\n * @returns The merged extensions object, or undefined if both inputs are undefined\n */\n private mergeExtensions(\n serverExtensions?: Record<string, unknown>,\n schemeExtensions?: Record<string, unknown>,\n ): Record<string, unknown> | undefined {\n if (!schemeExtensions) return serverExtensions;\n if (!serverExtensions) return schemeExtensions;\n\n const merged = { ...serverExtensions };\n for (const [key, schemeValue] of Object.entries(schemeExtensions)) {\n const serverValue = merged[key];\n if (\n serverValue &&\n typeof serverValue === \"object\" &&\n schemeValue &&\n typeof schemeValue === \"object\"\n ) {\n // Deep merge: scheme info overlays server info, schema preserved\n merged[key] = { ...serverValue as Record<string, unknown>, ...schemeValue as Record<string, unknown> };\n } else {\n merged[key] = schemeValue;\n }\n }\n return merged;\n }\n\n /**\n * Enriches a payment payload by calling registered extension hooks.\n * For each extension key present in the PaymentRequired response,\n * invokes the corresponding extension's enrichPaymentPayload callback.\n *\n * @param paymentPayload - The payment payload to enrich with extension data\n * @param paymentRequired - The PaymentRequired response containing extension declarations\n * @returns The enriched payment payload with extension data applied\n */\n private async enrichPaymentPayloadWithExtensions(\n paymentPayload: PaymentPayload,\n paymentRequired: PaymentRequired,\n ): Promise<PaymentPayload> {\n if (!paymentRequired.extensions || this.registeredExtensions.size === 0) {\n return paymentPayload;\n }\n\n let enriched = paymentPayload;\n for (const [key, extension] of this.registeredExtensions) {\n if (key in paymentRequired.extensions && extension.enrichPaymentPayload) {\n enriched = await extension.enrichPaymentPayload(enriched, paymentRequired);\n }\n }\n\n return enriched;\n }\n\n /**\n * Selects appropriate payment requirements based on registered clients and policies.\n *\n * Selection process:\n * 1. Filter by registered schemes (network + scheme support)\n * 2. Apply all registered policies in order\n * 3. Use selector to choose final requirement\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - Array of available payment requirements\n * @returns The selected payment requirements\n */\n private selectPaymentRequirements(x402Version: number, paymentRequirements: PaymentRequirements[]): PaymentRequirements {\n const clientSchemesByNetwork = this.registeredClientSchemes.get(x402Version);\n if (!clientSchemesByNetwork) {\n throw new Error(`No client registered for x402 version: ${x402Version}`);\n }\n\n // Step 1: Filter by registered schemes\n const supportedPaymentRequirements = paymentRequirements.filter(requirement => {\n let clientSchemes = findSchemesByNetwork(clientSchemesByNetwork, requirement.network);\n if (!clientSchemes) {\n return false;\n }\n\n return clientSchemes.has(requirement.scheme);\n })\n\n if (supportedPaymentRequirements.length === 0) {\n throw new Error(`No network/scheme registered for x402 version: ${x402Version} which comply with the payment requirements. ${JSON.stringify({\n x402Version,\n paymentRequirements,\n x402Versions: Array.from(this.registeredClientSchemes.keys()),\n networks: Array.from(clientSchemesByNetwork.keys()),\n schemes: Array.from(clientSchemesByNetwork.values()).map(schemes => Array.from(schemes.keys())).flat(),\n })}`);\n }\n\n // Step 2: Apply all policies in order\n let filteredRequirements = supportedPaymentRequirements;\n for (const policy of this.policies) {\n filteredRequirements = policy(x402Version, filteredRequirements);\n\n if (filteredRequirements.length === 0) {\n throw new Error(`All payment requirements were filtered out by policies for x402 version: ${x402Version}`);\n }\n }\n\n // Step 3: Use selector to choose final requirement\n return this.paymentRequirementsSelector(x402Version, filteredRequirements);\n }\n\n /**\n * Internal method to register a scheme client.\n *\n * @param x402Version - The x402 protocol version\n * @param network - The network to register the client for\n * @param client - The scheme network client to register\n * @returns The x402Client instance for chaining\n */\n private _registerScheme(x402Version: number, network: Network, client: SchemeNetworkClient): x402Client {\n if (!this.registeredClientSchemes.has(x402Version)) {\n this.registeredClientSchemes.set(x402Version, new Map());\n }\n const clientSchemesByNetwork = this.registeredClientSchemes.get(x402Version)!;\n if (!clientSchemesByNetwork.has(network)) {\n clientSchemesByNetwork.set(network, new Map());\n }\n\n const clientByScheme = clientSchemesByNetwork.get(network)!;\n if (!clientByScheme.has(client.scheme)) {\n clientByScheme.set(client.scheme, client);\n }\n\n return this;\n }\n}\n"],"mappings":"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","names":["x402Version"]}
1
+ {"version":3,"sources":["../../../src/client/x402Client.ts"],"sourcesContent":["import { x402Version } from \"..\";\nimport { SchemeNetworkClient } from \"../types/mechanisms\";\nimport { PaymentPayload, PaymentRequirements } from \"../types/payments\";\nimport { Network, PaymentRequired } from \"../types\";\nimport { findByNetworkAndScheme, findSchemesByNetwork } from \"../utils\";\n\n/**\n * Client Hook Context Interfaces\n */\n\nexport interface PaymentCreationContext {\n paymentRequired: PaymentRequired;\n selectedRequirements: PaymentRequirements;\n}\n\nexport interface PaymentCreatedContext extends PaymentCreationContext {\n paymentPayload: PaymentPayload;\n}\n\nexport interface PaymentCreationFailureContext extends PaymentCreationContext {\n error: Error;\n}\n\n/**\n * Client Hook Type Definitions\n */\n\nexport type BeforePaymentCreationHook = (\n context: PaymentCreationContext,\n) => Promise<void | { abort: true; reason: string }>;\n\nexport type AfterPaymentCreationHook = (context: PaymentCreatedContext) => Promise<void>;\n\nexport type OnPaymentCreationFailureHook = (\n context: PaymentCreationFailureContext,\n) => Promise<void | { recovered: true; payload: PaymentPayload }>;\n\nexport type SelectPaymentRequirements = (x402Version: number, paymentRequirements: PaymentRequirements[]) => PaymentRequirements;\n\n/**\n * Extension that can enrich payment payloads on the client side.\n *\n * Client extensions are invoked after the scheme creates the base payment payload\n * but before it is returned. This allows mechanism-specific logic (e.g., EVM EIP-2612\n * permit signing) to enrich the payload's extensions data.\n */\nexport interface ClientExtension {\n /**\n * Unique key identifying this extension (e.g., \"eip2612GasSponsoring\").\n * Must match the extension key used in PaymentRequired.extensions.\n */\n key: string;\n\n /**\n * Called after payload creation when the extension key is present in\n * paymentRequired.extensions. Allows the extension to enrich the payload\n * with extension-specific data (e.g., signing an EIP-2612 permit).\n *\n * @param paymentPayload - The payment payload to enrich\n * @param paymentRequired - The original PaymentRequired response\n * @returns The enriched payment payload\n */\n enrichPaymentPayload?: (\n paymentPayload: PaymentPayload,\n paymentRequired: PaymentRequired,\n ) => Promise<PaymentPayload>;\n}\n\n/**\n * A policy function that filters or transforms payment requirements.\n * Policies are applied in order before the selector chooses the final option.\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - Array of payment requirements to filter/transform\n * @returns Filtered array of payment requirements\n */\nexport type PaymentPolicy = (x402Version: number, paymentRequirements: PaymentRequirements[]) => PaymentRequirements[];\n\n\n/**\n * Configuration for registering a payment scheme with a specific network\n */\nexport interface SchemeRegistration {\n /**\n * The network identifier (e.g., 'eip155:196', 'eip155:196')\n */\n network: Network;\n\n /**\n * The scheme client implementation for this network\n */\n client: SchemeNetworkClient;\n\n /**\n * The x402 protocol version to use for this scheme\n *\n * @default 2\n */\n x402Version?: number;\n}\n\n/**\n * Configuration options for the fetch wrapper\n */\nexport interface x402ClientConfig {\n /**\n * Array of scheme registrations defining which payment methods are supported\n */\n schemes: SchemeRegistration[];\n\n /**\n * Policies to apply to the client\n */\n policies?: PaymentPolicy[];\n\n /**\n * Custom payment requirements selector function\n * If not provided, uses the default selector (first available option)\n */\n paymentRequirementsSelector?: SelectPaymentRequirements;\n}\n\n/**\n * Core client for managing x402 payment schemes and creating payment payloads.\n *\n * Handles registration of payment schemes, policy-based filtering of payment requirements,\n * and creation of payment payloads based on server requirements.\n */\nexport class x402Client {\n private readonly paymentRequirementsSelector: SelectPaymentRequirements;\n private readonly registeredClientSchemes: Map<number, Map<string, Map<string, SchemeNetworkClient>>> = new Map();\n private readonly policies: PaymentPolicy[] = [];\n private readonly registeredExtensions: Map<string, ClientExtension> = new Map();\n\n private beforePaymentCreationHooks: BeforePaymentCreationHook[] = [];\n private afterPaymentCreationHooks: AfterPaymentCreationHook[] = [];\n private onPaymentCreationFailureHooks: OnPaymentCreationFailureHook[] = [];\n\n /**\n * Creates a new x402Client instance.\n *\n * @param paymentRequirementsSelector - Function to select payment requirements from available options\n */\n constructor(paymentRequirementsSelector?: SelectPaymentRequirements) {\n this.paymentRequirementsSelector = paymentRequirementsSelector || ((x402Version, accepts) => accepts[0]);\n }\n\n /**\n * Creates a new x402Client instance from a configuration object.\n *\n * @param config - The client configuration including schemes, policies, and payment requirements selector\n * @returns A configured x402Client instance\n */\n static fromConfig(config: x402ClientConfig): x402Client {\n const client = new x402Client(config.paymentRequirementsSelector);\n config.schemes.forEach(scheme => {\n client.register(scheme.network, scheme.client);\n });\n config.policies?.forEach(policy => {\n client.registerPolicy(policy);\n });\n return client;\n }\n\n /**\n * Registers a scheme client for the current x402 version.\n *\n * @param network - The network to register the client for\n * @param client - The scheme network client to register\n * @returns The x402Client instance for chaining\n */\n register(network: Network, client: SchemeNetworkClient): x402Client {\n return this._registerScheme(x402Version, network, client);\n }\n\n /**\n * Registers a policy to filter or transform payment requirements.\n *\n * Policies are applied in order after filtering by registered schemes\n * and before the selector chooses the final payment requirement.\n *\n * @param policy - Function to filter/transform payment requirements\n * @returns The x402Client instance for chaining\n *\n * @example\n * ```typescript\n * // Prefer cheaper options\n * client.registerPolicy((version, reqs) =>\n * reqs.filter(r => BigInt(r.value) < BigInt('1000000'))\n * );\n *\n * // Prefer specific networks\n * client.registerPolicy((version, reqs) =>\n * reqs.filter(r => r.network.startsWith('eip155:'))\n * );\n * ```\n */\n registerPolicy(policy: PaymentPolicy): x402Client {\n this.policies.push(policy);\n return this;\n }\n\n /**\n * Registers a client extension that can enrich payment payloads.\n *\n * Extensions are invoked after the scheme creates the base payload and the\n * payload is wrapped with extensions/resource/accepted data. If the extension's\n * key is present in `paymentRequired.extensions`, the extension's\n * `enrichPaymentPayload` hook is called to modify the payload.\n *\n * @param extension - The client extension to register\n * @returns The x402Client instance for chaining\n */\n registerExtension(extension: ClientExtension): x402Client {\n this.registeredExtensions.set(extension.key, extension);\n return this;\n }\n\n /**\n * Register a hook to execute before payment payload creation.\n * Can abort creation by returning { abort: true, reason: string }\n *\n * @param hook - The hook function to register\n * @returns The x402Client instance for chaining\n */\n onBeforePaymentCreation(hook: BeforePaymentCreationHook): x402Client {\n this.beforePaymentCreationHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute after successful payment payload creation.\n *\n * @param hook - The hook function to register\n * @returns The x402Client instance for chaining\n */\n onAfterPaymentCreation(hook: AfterPaymentCreationHook): x402Client {\n this.afterPaymentCreationHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute when payment payload creation fails.\n * Can recover from failure by returning { recovered: true, payload: PaymentPayload }\n *\n * @param hook - The hook function to register\n * @returns The x402Client instance for chaining\n */\n onPaymentCreationFailure(hook: OnPaymentCreationFailureHook): x402Client {\n this.onPaymentCreationFailureHooks.push(hook);\n return this;\n }\n\n /**\n * Creates a payment payload based on a PaymentRequired response.\n *\n * Automatically extracts x402Version, resource, and extensions from the PaymentRequired\n * response and constructs a complete PaymentPayload with the accepted requirements.\n *\n * @param paymentRequired - The PaymentRequired response from the server\n * @returns Promise resolving to the complete payment payload\n */\n async createPaymentPayload(\n paymentRequired: PaymentRequired,\n ): Promise<PaymentPayload> {\n const clientSchemesByNetwork = this.registeredClientSchemes.get(paymentRequired.x402Version);\n if (!clientSchemesByNetwork) {\n throw new Error(`No client registered for x402 version: ${paymentRequired.x402Version}`);\n }\n\n const requirements = this.selectPaymentRequirements(paymentRequired.x402Version, paymentRequired.accepts);\n\n const context: PaymentCreationContext = {\n paymentRequired,\n selectedRequirements: requirements,\n };\n\n // Execute beforePaymentCreation hooks\n for (const hook of this.beforePaymentCreationHooks) {\n const result = await hook(context);\n if (result && \"abort\" in result && result.abort) {\n throw new Error(`Payment creation aborted: ${result.reason}`);\n }\n }\n\n try {\n const schemeNetworkClient = findByNetworkAndScheme(clientSchemesByNetwork, requirements.scheme, requirements.network);\n if (!schemeNetworkClient) {\n throw new Error(`No client registered for scheme: ${requirements.scheme} and network: ${requirements.network}`);\n }\n\n const partialPayload = await schemeNetworkClient.createPaymentPayload(\n paymentRequired.x402Version,\n requirements,\n { extensions: paymentRequired.extensions },\n );\n\n // Merge server-declared extensions with any scheme-provided extensions.\n // Scheme extensions overlay on top (e.g., EIP-2612 info enriches server declaration).\n const mergedExtensions = this.mergeExtensions(\n paymentRequired.extensions,\n partialPayload.extensions,\n );\n\n // Apply acceptedExtraOverrides: OKX extension for injecting scheme-specific\n // fields (e.g. sessionCert) into accepted.extra per the OKX API spec.\n const acceptedRequirements =\n partialPayload.acceptedExtraOverrides && Object.keys(partialPayload.acceptedExtraOverrides).length > 0\n ? {\n ...requirements,\n extra: {\n ...requirements.extra,\n ...partialPayload.acceptedExtraOverrides,\n },\n }\n : requirements;\n\n let paymentPayload: PaymentPayload = {\n x402Version: partialPayload.x402Version,\n payload: partialPayload.payload,\n extensions: mergedExtensions,\n resource: paymentRequired.resource,\n accepted: acceptedRequirements,\n };\n\n // Enrich payload via registered client extensions (for non-scheme extensions)\n paymentPayload = await this.enrichPaymentPayloadWithExtensions(paymentPayload, paymentRequired);\n\n // Execute afterPaymentCreation hooks\n const createdContext: PaymentCreatedContext = {\n ...context,\n paymentPayload,\n };\n\n for (const hook of this.afterPaymentCreationHooks) {\n await hook(createdContext);\n }\n\n return paymentPayload;\n } catch (error) {\n const failureContext: PaymentCreationFailureContext = {\n ...context,\n error: error as Error,\n };\n\n // Execute onPaymentCreationFailure hooks\n for (const hook of this.onPaymentCreationFailureHooks) {\n const result = await hook(failureContext);\n if (result && \"recovered\" in result && result.recovered) {\n return result.payload;\n }\n }\n\n throw error;\n }\n }\n\n\n\n /**\n * Merges server-declared extensions with scheme-provided extensions.\n * Scheme extensions overlay on top of server extensions at each key,\n * preserving server-provided schema while overlaying scheme-provided info.\n *\n * @param serverExtensions - Extensions declared by the server in the 402 response\n * @param schemeExtensions - Extensions provided by the scheme client (e.g. EIP-2612)\n * @returns The merged extensions object, or undefined if both inputs are undefined\n */\n private mergeExtensions(\n serverExtensions?: Record<string, unknown>,\n schemeExtensions?: Record<string, unknown>,\n ): Record<string, unknown> | undefined {\n if (!schemeExtensions) return serverExtensions;\n if (!serverExtensions) return schemeExtensions;\n\n const merged = { ...serverExtensions };\n for (const [key, schemeValue] of Object.entries(schemeExtensions)) {\n const serverValue = merged[key];\n if (\n serverValue &&\n typeof serverValue === \"object\" &&\n schemeValue &&\n typeof schemeValue === \"object\"\n ) {\n // Deep merge: scheme info overlays server info, schema preserved\n merged[key] = { ...serverValue as Record<string, unknown>, ...schemeValue as Record<string, unknown> };\n } else {\n merged[key] = schemeValue;\n }\n }\n return merged;\n }\n\n /**\n * Enriches a payment payload by calling registered extension hooks.\n * For each extension key present in the PaymentRequired response,\n * invokes the corresponding extension's enrichPaymentPayload callback.\n *\n * @param paymentPayload - The payment payload to enrich with extension data\n * @param paymentRequired - The PaymentRequired response containing extension declarations\n * @returns The enriched payment payload with extension data applied\n */\n private async enrichPaymentPayloadWithExtensions(\n paymentPayload: PaymentPayload,\n paymentRequired: PaymentRequired,\n ): Promise<PaymentPayload> {\n if (!paymentRequired.extensions || this.registeredExtensions.size === 0) {\n return paymentPayload;\n }\n\n let enriched = paymentPayload;\n for (const [key, extension] of this.registeredExtensions) {\n if (key in paymentRequired.extensions && extension.enrichPaymentPayload) {\n enriched = await extension.enrichPaymentPayload(enriched, paymentRequired);\n }\n }\n\n return enriched;\n }\n\n /**\n * Selects appropriate payment requirements based on registered clients and policies.\n *\n * Selection process:\n * 1. Filter by registered schemes (network + scheme support)\n * 2. Apply all registered policies in order\n * 3. Use selector to choose final requirement\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - Array of available payment requirements\n * @returns The selected payment requirements\n */\n private selectPaymentRequirements(x402Version: number, paymentRequirements: PaymentRequirements[]): PaymentRequirements {\n const clientSchemesByNetwork = this.registeredClientSchemes.get(x402Version);\n if (!clientSchemesByNetwork) {\n throw new Error(`No client registered for x402 version: ${x402Version}`);\n }\n\n // Step 1: Filter by registered schemes\n const supportedPaymentRequirements = paymentRequirements.filter(requirement => {\n let clientSchemes = findSchemesByNetwork(clientSchemesByNetwork, requirement.network);\n if (!clientSchemes) {\n return false;\n }\n\n return clientSchemes.has(requirement.scheme);\n })\n\n if (supportedPaymentRequirements.length === 0) {\n throw new Error(`No network/scheme registered for x402 version: ${x402Version} which comply with the payment requirements. ${JSON.stringify({\n x402Version,\n paymentRequirements,\n x402Versions: Array.from(this.registeredClientSchemes.keys()),\n networks: Array.from(clientSchemesByNetwork.keys()),\n schemes: Array.from(clientSchemesByNetwork.values()).map(schemes => Array.from(schemes.keys())).flat(),\n })}`);\n }\n\n // Step 2: Apply all policies in order\n let filteredRequirements = supportedPaymentRequirements;\n for (const policy of this.policies) {\n filteredRequirements = policy(x402Version, filteredRequirements);\n\n if (filteredRequirements.length === 0) {\n throw new Error(`All payment requirements were filtered out by policies for x402 version: ${x402Version}`);\n }\n }\n\n // Step 3: Use selector to choose final requirement\n return this.paymentRequirementsSelector(x402Version, filteredRequirements);\n }\n\n /**\n * Internal method to register a scheme client.\n *\n * @param x402Version - The x402 protocol version\n * @param network - The network to register the client for\n * @param client - The scheme network client to register\n * @returns The x402Client instance for chaining\n */\n private _registerScheme(x402Version: number, network: Network, client: SchemeNetworkClient): x402Client {\n if (!this.registeredClientSchemes.has(x402Version)) {\n this.registeredClientSchemes.set(x402Version, new Map());\n }\n const clientSchemesByNetwork = this.registeredClientSchemes.get(x402Version)!;\n if (!clientSchemesByNetwork.has(network)) {\n clientSchemesByNetwork.set(network, new Map());\n }\n\n const clientByScheme = clientSchemesByNetwork.get(network)!;\n if (!clientByScheme.has(client.scheme)) {\n clientByScheme.set(client.scheme, client);\n }\n\n return this;\n }\n}\n"],"mappings":"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","names":["x402Version"]}
@@ -1,5 +1,5 @@
1
- import { P as PaymentPayload, a as PaymentRequirements, S as SettleResponse, V as VerifyResponse, N as Network, b as SchemeNetworkFacilitator, F as FacilitatorExtension } from '../mechanisms-sojpSwWW.mjs';
2
- export { O as OKXConfig, a as OKXFacilitatorClient } from '../OKXFacilitatorClient-D5E3LX50.mjs';
1
+ import { P as PaymentPayload, a as PaymentRequirements, S as SettleResponse, V as VerifyResponse, N as Network, b as SchemeNetworkFacilitator, F as FacilitatorExtension } from '../mechanisms-LhI9qkRo.mjs';
2
+ export { O as OKXConfig, a as OKXFacilitatorClient } from '../OKXFacilitatorClient-z-cCE5Db.mjs';
3
3
 
4
4
  /**
5
5
  * Facilitator Hook Context Interfaces
@@ -1,7 +1,8 @@
1
1
  import {
2
2
  OKXFacilitatorClient,
3
3
  x402Version
4
- } from "../chunk-O3IYMTNT.mjs";
4
+ } from "../chunk-4KASWSSY.mjs";
5
+ import "../chunk-CKXR4QVD.mjs";
5
6
 
6
7
  // src/facilitator/x402Facilitator.ts
7
8
  var x402Facilitator = class {