x402-express-mantle 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +155 -0
- package/lib/cjs/client/index.d.ts +243 -0
- package/lib/cjs/client/index.js +413 -0
- package/lib/cjs/client/index.js.map +1 -0
- package/lib/cjs/exact/client/index.d.ts +37 -0
- package/lib/cjs/exact/client/index.js +281 -0
- package/lib/cjs/exact/client/index.js.map +1 -0
- package/lib/cjs/exact/facilitator/index.d.ts +110 -0
- package/lib/cjs/exact/facilitator/index.js +714 -0
- package/lib/cjs/exact/facilitator/index.js.map +1 -0
- package/lib/cjs/exact/server/index.d.ts +87 -0
- package/lib/cjs/exact/server/index.js +209 -0
- package/lib/cjs/exact/server/index.js.map +1 -0
- package/lib/cjs/exact/v1/client/index.d.ts +33 -0
- package/lib/cjs/exact/v1/client/index.js +169 -0
- package/lib/cjs/exact/v1/client/index.js.map +1 -0
- package/lib/cjs/exact/v1/facilitator/index.d.ts +71 -0
- package/lib/cjs/exact/v1/facilitator/index.js +384 -0
- package/lib/cjs/exact/v1/facilitator/index.js.map +1 -0
- package/lib/cjs/facilitator/index.d.ts +192 -0
- package/lib/cjs/facilitator/index.js +398 -0
- package/lib/cjs/facilitator/index.js.map +1 -0
- package/lib/cjs/http/index.d.ts +52 -0
- package/lib/cjs/http/index.js +827 -0
- package/lib/cjs/http/index.js.map +1 -0
- package/lib/cjs/index.d.ts +145 -0
- package/lib/cjs/index.js +314 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/cjs/mechanisms-CzuGzYsS.d.ts +270 -0
- package/lib/cjs/scheme-MoBRXFM8.d.ts +29 -0
- package/lib/cjs/server/index.d.ts +2 -0
- package/lib/cjs/server/index.js +1305 -0
- package/lib/cjs/server/index.js.map +1 -0
- package/lib/cjs/signer-5OVDxViv.d.ts +79 -0
- package/lib/cjs/signer-BMkbhFYE.d.ts +123 -0
- package/lib/cjs/types/index.d.ts +1 -0
- package/lib/cjs/types/index.js +66 -0
- package/lib/cjs/types/index.js.map +1 -0
- package/lib/cjs/types/v1/index.d.ts +1 -0
- package/lib/cjs/types/v1/index.js +19 -0
- package/lib/cjs/types/v1/index.js.map +1 -0
- package/lib/cjs/utils/index.d.ts +48 -0
- package/lib/cjs/utils/index.js +116 -0
- package/lib/cjs/utils/index.js.map +1 -0
- package/lib/cjs/v1/index.d.ts +12 -0
- package/lib/cjs/v1/index.js +180 -0
- package/lib/cjs/v1/index.js.map +1 -0
- package/lib/cjs/x402HTTPResourceServer-D1YtlH_r.d.ts +719 -0
- package/lib/esm/chunk-3CEIVWNN.mjs +339 -0
- package/lib/esm/chunk-3CEIVWNN.mjs.map +1 -0
- package/lib/esm/chunk-BJTO5JO5.mjs +11 -0
- package/lib/esm/chunk-BJTO5JO5.mjs.map +1 -0
- package/lib/esm/chunk-EEA7DKZI.mjs +111 -0
- package/lib/esm/chunk-EEA7DKZI.mjs.map +1 -0
- package/lib/esm/chunk-FOUXRQAV.mjs +88 -0
- package/lib/esm/chunk-FOUXRQAV.mjs.map +1 -0
- package/lib/esm/chunk-IKSTWKEM.mjs +157 -0
- package/lib/esm/chunk-IKSTWKEM.mjs.map +1 -0
- package/lib/esm/chunk-JYZWCLMP.mjs +305 -0
- package/lib/esm/chunk-JYZWCLMP.mjs.map +1 -0
- package/lib/esm/chunk-PNSAJQCF.mjs +108 -0
- package/lib/esm/chunk-PNSAJQCF.mjs.map +1 -0
- package/lib/esm/chunk-PSA4YVU2.mjs +92 -0
- package/lib/esm/chunk-PSA4YVU2.mjs.map +1 -0
- package/lib/esm/chunk-QLXM7BIB.mjs +23 -0
- package/lib/esm/chunk-QLXM7BIB.mjs.map +1 -0
- package/lib/esm/chunk-TDLQZ6MP.mjs +86 -0
- package/lib/esm/chunk-TDLQZ6MP.mjs.map +1 -0
- package/lib/esm/chunk-VE37GDG2.mjs +7 -0
- package/lib/esm/chunk-VE37GDG2.mjs.map +1 -0
- package/lib/esm/chunk-WWACQNRQ.mjs +7 -0
- package/lib/esm/chunk-WWACQNRQ.mjs.map +1 -0
- package/lib/esm/chunk-X4W4S5RB.mjs +39 -0
- package/lib/esm/chunk-X4W4S5RB.mjs.map +1 -0
- package/lib/esm/chunk-Z4QX3O5V.mjs +748 -0
- package/lib/esm/chunk-Z4QX3O5V.mjs.map +1 -0
- package/lib/esm/chunk-ZYXTTU74.mjs +88 -0
- package/lib/esm/chunk-ZYXTTU74.mjs.map +1 -0
- package/lib/esm/client/index.d.mts +243 -0
- package/lib/esm/client/index.mjs +260 -0
- package/lib/esm/client/index.mjs.map +1 -0
- package/lib/esm/exact/client/index.d.mts +37 -0
- package/lib/esm/exact/client/index.mjs +36 -0
- package/lib/esm/exact/client/index.mjs.map +1 -0
- package/lib/esm/exact/facilitator/index.d.mts +110 -0
- package/lib/esm/exact/facilitator/index.mjs +350 -0
- package/lib/esm/exact/facilitator/index.mjs.map +1 -0
- package/lib/esm/exact/server/index.d.mts +87 -0
- package/lib/esm/exact/server/index.mjs +129 -0
- package/lib/esm/exact/server/index.mjs.map +1 -0
- package/lib/esm/exact/v1/client/index.d.mts +33 -0
- package/lib/esm/exact/v1/client/index.mjs +8 -0
- package/lib/esm/exact/v1/client/index.mjs.map +1 -0
- package/lib/esm/exact/v1/facilitator/index.d.mts +71 -0
- package/lib/esm/exact/v1/facilitator/index.mjs +8 -0
- package/lib/esm/exact/v1/facilitator/index.mjs.map +1 -0
- package/lib/esm/facilitator/index.d.mts +192 -0
- package/lib/esm/facilitator/index.mjs +373 -0
- package/lib/esm/facilitator/index.mjs.map +1 -0
- package/lib/esm/http/index.d.mts +52 -0
- package/lib/esm/http/index.mjs +29 -0
- package/lib/esm/http/index.mjs.map +1 -0
- package/lib/esm/index.d.mts +145 -0
- package/lib/esm/index.mjs +277 -0
- package/lib/esm/index.mjs.map +1 -0
- package/lib/esm/mechanisms-CzuGzYsS.d.mts +270 -0
- package/lib/esm/scheme-fjF-9LhT.d.mts +29 -0
- package/lib/esm/server/index.d.mts +2 -0
- package/lib/esm/server/index.mjs +563 -0
- package/lib/esm/server/index.mjs.map +1 -0
- package/lib/esm/signer-5OVDxViv.d.mts +79 -0
- package/lib/esm/signer-BMkbhFYE.d.mts +123 -0
- package/lib/esm/types/index.d.mts +1 -0
- package/lib/esm/types/index.mjs +10 -0
- package/lib/esm/types/index.mjs.map +1 -0
- package/lib/esm/types/v1/index.d.mts +1 -0
- package/lib/esm/types/v1/index.mjs +1 -0
- package/lib/esm/types/v1/index.mjs.map +1 -0
- package/lib/esm/utils/index.d.mts +48 -0
- package/lib/esm/utils/index.mjs +20 -0
- package/lib/esm/utils/index.mjs.map +1 -0
- package/lib/esm/v1/index.d.mts +12 -0
- package/lib/esm/v1/index.mjs +13 -0
- package/lib/esm/v1/index.mjs.map +1 -0
- package/lib/esm/x402HTTPResourceServer-BIfIK5HS.d.mts +719 -0
- package/package.json +39 -0
- package/src/index.js +4 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/facilitator/x402Facilitator.ts"],"sourcesContent":["import { x402Version } from \"..\";\nimport { SettleResponse, VerifyResponse } from \"../types/facilitator\";\nimport { SchemeNetworkFacilitator } from \"../types/mechanisms\";\nimport { PaymentPayload, PaymentRequirements } from \"../types/payments\";\nimport { Network } from \"../types\";\nimport { type SchemeData } from \"../utils\";\n\n/**\n * Facilitator Hook Context Interfaces\n */\n\nexport interface FacilitatorVerifyContext {\n paymentPayload: PaymentPayload;\n requirements: PaymentRequirements;\n}\n\nexport interface FacilitatorVerifyResultContext extends FacilitatorVerifyContext {\n result: VerifyResponse;\n}\n\nexport interface FacilitatorVerifyFailureContext extends FacilitatorVerifyContext {\n error: Error;\n}\n\nexport interface FacilitatorSettleContext {\n paymentPayload: PaymentPayload;\n requirements: PaymentRequirements;\n}\n\nexport interface FacilitatorSettleResultContext extends FacilitatorSettleContext {\n result: SettleResponse;\n}\n\nexport interface FacilitatorSettleFailureContext extends FacilitatorSettleContext {\n error: Error;\n}\n\n/**\n * Facilitator Hook Type Definitions\n */\n\nexport type FacilitatorBeforeVerifyHook = (\n context: FacilitatorVerifyContext,\n) => Promise<void | { abort: true; reason: string }>;\n\nexport type FacilitatorAfterVerifyHook = (context: FacilitatorVerifyResultContext) => Promise<void>;\n\nexport type FacilitatorOnVerifyFailureHook = (\n context: FacilitatorVerifyFailureContext,\n) => Promise<void | { recovered: true; result: VerifyResponse }>;\n\nexport type FacilitatorBeforeSettleHook = (\n context: FacilitatorSettleContext,\n) => Promise<void | { abort: true; reason: string }>;\n\nexport type FacilitatorAfterSettleHook = (context: FacilitatorSettleResultContext) => Promise<void>;\n\nexport type FacilitatorOnSettleFailureHook = (\n context: FacilitatorSettleFailureContext,\n) => Promise<void | { recovered: true; result: SettleResponse }>;\n\n/**\n * Facilitator client for the x402 payment protocol.\n * Manages payment scheme registration, verification, and settlement.\n */\nexport class x402Facilitator {\n private readonly registeredFacilitatorSchemes: Map<\n number,\n SchemeData<SchemeNetworkFacilitator>[] // Array to support multiple facilitators per version\n > = new Map();\n private readonly extensions: string[] = [];\n\n private beforeVerifyHooks: FacilitatorBeforeVerifyHook[] = [];\n private afterVerifyHooks: FacilitatorAfterVerifyHook[] = [];\n private onVerifyFailureHooks: FacilitatorOnVerifyFailureHook[] = [];\n private beforeSettleHooks: FacilitatorBeforeSettleHook[] = [];\n private afterSettleHooks: FacilitatorAfterSettleHook[] = [];\n private onSettleFailureHooks: FacilitatorOnSettleFailureHook[] = [];\n\n /**\n * Registers a scheme facilitator for the current x402 version.\n * Networks are stored and used for getSupported() - no need to specify them later.\n *\n * @param networks - Single network or array of networks this facilitator supports\n * @param facilitator - The scheme network facilitator to register\n * @returns The x402Facilitator instance for chaining\n */\n register(networks: Network | Network[], facilitator: SchemeNetworkFacilitator): x402Facilitator {\n const networksArray = Array.isArray(networks) ? networks : [networks];\n return this._registerScheme(x402Version, networksArray, facilitator);\n }\n\n /**\n * Registers a scheme facilitator for x402 version 1.\n * Networks are stored and used for getSupported() - no need to specify them later.\n *\n * @param networks - Single network or array of networks this facilitator supports\n * @param facilitator - The scheme network facilitator to register\n * @returns The x402Facilitator instance for chaining\n */\n registerV1(\n networks: Network | Network[],\n facilitator: SchemeNetworkFacilitator,\n ): x402Facilitator {\n const networksArray = Array.isArray(networks) ? networks : [networks];\n return this._registerScheme(1, networksArray, facilitator);\n }\n\n /**\n * Registers a protocol extension.\n *\n * @param extension - The extension name to register (e.g., \"bazaar\", \"sign_in_with_x\")\n * @returns The x402Facilitator instance for chaining\n */\n registerExtension(extension: string): x402Facilitator {\n // Check if already registered\n if (!this.extensions.includes(extension)) {\n this.extensions.push(extension);\n }\n return this;\n }\n\n /**\n * Gets the list of registered extensions.\n *\n * @returns Array of extension names\n */\n getExtensions(): string[] {\n return [...this.extensions];\n }\n\n /**\n * Register a hook to execute before facilitator payment verification.\n * Can abort verification by returning { abort: true, reason: string }\n *\n * @param hook - The hook function to register\n * @returns The x402Facilitator instance for chaining\n */\n onBeforeVerify(hook: FacilitatorBeforeVerifyHook): x402Facilitator {\n this.beforeVerifyHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute after successful facilitator payment verification (isValid: true).\n * This hook is NOT called when verification fails (isValid: false) - use onVerifyFailure for that.\n *\n * @param hook - The hook function to register\n * @returns The x402Facilitator instance for chaining\n */\n onAfterVerify(hook: FacilitatorAfterVerifyHook): x402Facilitator {\n this.afterVerifyHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute when facilitator payment verification fails.\n * Called when: verification returns isValid: false, or an exception is thrown during verification.\n * Can recover from failure by returning { recovered: true, result: VerifyResponse }\n *\n * @param hook - The hook function to register\n * @returns The x402Facilitator instance for chaining\n */\n onVerifyFailure(hook: FacilitatorOnVerifyFailureHook): x402Facilitator {\n this.onVerifyFailureHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute before facilitator payment settlement.\n * Can abort settlement by returning { abort: true, reason: string }\n *\n * @param hook - The hook function to register\n * @returns The x402Facilitator instance for chaining\n */\n onBeforeSettle(hook: FacilitatorBeforeSettleHook): x402Facilitator {\n this.beforeSettleHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute after successful facilitator payment settlement.\n *\n * @param hook - The hook function to register\n * @returns The x402Facilitator instance for chaining\n */\n onAfterSettle(hook: FacilitatorAfterSettleHook): x402Facilitator {\n this.afterSettleHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute when facilitator 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 x402Facilitator instance for chaining\n */\n onSettleFailure(hook: FacilitatorOnSettleFailureHook): x402Facilitator {\n this.onSettleFailureHooks.push(hook);\n return this;\n }\n\n /**\n * Gets supported payment kinds, extensions, and signers.\n * Uses networks registered during register() calls - no parameters needed.\n * Returns flat array format for backward compatibility with V1 clients.\n *\n * @returns Supported response with kinds as array (with version in each element), extensions, and signers\n */\n getSupported(): {\n kinds: Array<{\n x402Version: number;\n scheme: string;\n network: string;\n extra?: Record<string, unknown>;\n }>;\n extensions: string[];\n signers: Record<string, string[]>;\n } {\n const kinds: Array<{\n x402Version: number;\n scheme: string;\n network: string;\n extra?: Record<string, unknown>;\n }> = [];\n const signersByFamily: Record<string, Set<string>> = {};\n\n // Iterate over registered scheme data (array supports multiple facilitators per version)\n for (const [version, schemeDataArray] of this.registeredFacilitatorSchemes) {\n for (const schemeData of schemeDataArray) {\n const { facilitator, networks } = schemeData;\n const scheme = facilitator.scheme;\n\n // Iterate over stored concrete networks\n for (const network of networks) {\n const extra = facilitator.getExtra(network);\n kinds.push({\n x402Version: version,\n scheme,\n network,\n ...(extra && { extra }),\n });\n\n // Collect signers by CAIP family for this network\n const family = facilitator.caipFamily;\n if (!signersByFamily[family]) {\n signersByFamily[family] = new Set();\n }\n facilitator.getSigners(network).forEach(signer => signersByFamily[family].add(signer));\n }\n }\n }\n\n // Convert signer sets to arrays\n const signers: Record<string, string[]> = {};\n for (const [family, signerSet] of Object.entries(signersByFamily)) {\n signers[family] = Array.from(signerSet);\n }\n\n return {\n kinds,\n extensions: this.extensions,\n signers,\n };\n }\n\n /**\n * Verifies a payment payload against requirements.\n *\n * @param paymentPayload - The payment payload to verify\n * @param paymentRequirements - The payment requirements to verify against\n * @returns Promise resolving to the verification response\n */\n async verify(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n ): Promise<VerifyResponse> {\n const context: FacilitatorVerifyContext = {\n paymentPayload,\n requirements: paymentRequirements,\n };\n\n // Execute beforeVerify hooks\n for (const hook of this.beforeVerifyHooks) {\n const result = await hook(context);\n if (result && \"abort\" in result && result.abort) {\n return {\n isValid: false,\n invalidReason: result.reason,\n };\n }\n }\n\n try {\n const schemeDataArray = this.registeredFacilitatorSchemes.get(paymentPayload.x402Version);\n if (!schemeDataArray) {\n throw new Error(\n `No facilitator registered for x402 version: ${paymentPayload.x402Version}`,\n );\n }\n\n // Find matching facilitator from array\n let schemeNetworkFacilitator: SchemeNetworkFacilitator | undefined;\n for (const schemeData of schemeDataArray) {\n if (schemeData.facilitator.scheme === paymentRequirements.scheme) {\n // Check if network matches\n if (schemeData.networks.has(paymentRequirements.network)) {\n schemeNetworkFacilitator = schemeData.facilitator;\n break;\n }\n // Try pattern matching\n const patternRegex = new RegExp(\"^\" + schemeData.pattern.replace(\"*\", \".*\") + \"$\");\n if (patternRegex.test(paymentRequirements.network)) {\n schemeNetworkFacilitator = schemeData.facilitator;\n break;\n }\n }\n }\n\n if (!schemeNetworkFacilitator) {\n throw new Error(\n `No facilitator registered for scheme: ${paymentRequirements.scheme} and network: ${paymentRequirements.network}`,\n );\n }\n\n const verifyResult = await schemeNetworkFacilitator.verify(\n paymentPayload,\n paymentRequirements,\n );\n\n // Check if verification failed (isValid: false)\n if (!verifyResult.isValid) {\n const failureContext: FacilitatorVerifyFailureContext = {\n ...context,\n error: new Error(verifyResult.invalidReason || \"Verification failed\"),\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 // If recovered, execute afterVerify hooks with recovered result\n const recoveredContext: FacilitatorVerifyResultContext = {\n ...context,\n result: result.result,\n };\n for (const hook of this.afterVerifyHooks) {\n await hook(recoveredContext);\n }\n return result.result;\n }\n }\n\n return verifyResult;\n }\n\n // Execute afterVerify hooks only for successful verification\n const resultContext: FacilitatorVerifyResultContext = {\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: FacilitatorVerifyFailureContext = {\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 * Settles a payment based on the payload and requirements.\n *\n * @param paymentPayload - The payment payload to settle\n * @param paymentRequirements - The payment requirements for settlement\n * @returns Promise resolving to the settlement response\n */\n async settle(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n ): Promise<SettleResponse> {\n const context: FacilitatorSettleContext = {\n paymentPayload,\n requirements: paymentRequirements,\n };\n\n // Execute beforeSettle hooks\n for (const hook of this.beforeSettleHooks) {\n const result = await hook(context);\n if (result && \"abort\" in result && result.abort) {\n throw new Error(`Settlement aborted: ${result.reason}`);\n }\n }\n\n try {\n const schemeDataArray = this.registeredFacilitatorSchemes.get(paymentPayload.x402Version);\n if (!schemeDataArray) {\n throw new Error(\n `No facilitator registered for x402 version: ${paymentPayload.x402Version}`,\n );\n }\n\n // Find matching facilitator from array\n let schemeNetworkFacilitator: SchemeNetworkFacilitator | undefined;\n for (const schemeData of schemeDataArray) {\n if (schemeData.facilitator.scheme === paymentRequirements.scheme) {\n // Check if network matches\n if (schemeData.networks.has(paymentRequirements.network)) {\n schemeNetworkFacilitator = schemeData.facilitator;\n break;\n }\n // Try pattern matching\n const patternRegex = new RegExp(\"^\" + schemeData.pattern.replace(\"*\", \".*\") + \"$\");\n if (patternRegex.test(paymentRequirements.network)) {\n schemeNetworkFacilitator = schemeData.facilitator;\n break;\n }\n }\n }\n\n if (!schemeNetworkFacilitator) {\n throw new Error(\n `No facilitator registered for scheme: ${paymentRequirements.scheme} and network: ${paymentRequirements.network}`,\n );\n }\n\n const settleResult = await schemeNetworkFacilitator.settle(\n paymentPayload,\n paymentRequirements,\n );\n\n // Execute afterSettle hooks\n const resultContext: FacilitatorSettleResultContext = {\n ...context,\n result: settleResult,\n };\n\n for (const hook of this.afterSettleHooks) {\n await hook(resultContext);\n }\n\n return settleResult;\n } catch (error) {\n const failureContext: FacilitatorSettleFailureContext = {\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 * Internal method to register a scheme facilitator.\n *\n * @param x402Version - The x402 protocol version\n * @param networks - Array of concrete networks this facilitator supports\n * @param facilitator - The scheme network facilitator to register\n * @returns The x402Facilitator instance for chaining\n */\n private _registerScheme(\n x402Version: number,\n networks: Network[],\n facilitator: SchemeNetworkFacilitator,\n ): x402Facilitator {\n if (!this.registeredFacilitatorSchemes.has(x402Version)) {\n this.registeredFacilitatorSchemes.set(x402Version, []);\n }\n const schemeDataArray = this.registeredFacilitatorSchemes.get(x402Version)!;\n\n // Add new scheme data (supports multiple facilitators with same scheme name)\n schemeDataArray.push({\n facilitator,\n networks: new Set(networks),\n pattern: this.derivePattern(networks),\n });\n\n return this;\n }\n\n /**\n * Derives a wildcard pattern from an array of networks.\n * If all networks share the same namespace, returns wildcard pattern.\n * Otherwise returns the first network for exact matching.\n *\n * @param networks - Array of networks\n * @returns Derived pattern for matching\n */\n private derivePattern(networks: Network[]): Network {\n if (networks.length === 0) return \"\" as Network;\n if (networks.length === 1) return networks[0];\n\n // Extract namespaces (e.g., \"eip155\" from \"eip155:84532\")\n const namespaces = networks.map(n => n.split(\":\")[0]);\n const uniqueNamespaces = new Set(namespaces);\n\n // If all same namespace, use wildcard\n if (uniqueNamespaces.size === 1) {\n return `${namespaces[0]}:*` as Network;\n }\n\n // Mixed namespaces - use first network for exact matching\n return networks[0];\n }\n}\n"],"mappings":"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","names":["hook","x402Version"]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { P as PaymentPayload, c as PaymentRequired, S as SettleResponse, a as PaymentRequirements } from '../mechanisms-CzuGzYsS.mjs';
|
|
2
|
+
export { C as CompiledRoute, D as DynamicPayTo, g as DynamicPrice, F as FacilitatorClient, o as FacilitatorConfig, H as HTTPAdapter, n as HTTPFacilitatorClient, c as HTTPProcessResult, a as HTTPRequestContext, b as HTTPResponseInstructions, e as PaymentOption, P as PaywallConfig, d as PaywallProvider, k as ProcessSettleFailureResponse, i as ProcessSettleResultResponse, j as ProcessSettleSuccessResponse, R as RouteConfig, m as RouteConfigurationError, l as RouteValidationError, f as RoutesConfig, U as UnpaidResponseBody, h as UnpaidResponseResult, x as x402HTTPResourceServer } from '../x402HTTPResourceServer-BIfIK5HS.mjs';
|
|
3
|
+
export { x402HTTPClient } from '../client/index.mjs';
|
|
4
|
+
|
|
5
|
+
type QueryParamMethods = "GET" | "HEAD" | "DELETE";
|
|
6
|
+
type BodyMethods = "POST" | "PUT" | "PATCH";
|
|
7
|
+
/**
|
|
8
|
+
* Encodes a payment payload as a base64 header value.
|
|
9
|
+
*
|
|
10
|
+
* @param paymentPayload - The payment payload to encode
|
|
11
|
+
* @returns Base64 encoded string representation of the payment payload
|
|
12
|
+
*/
|
|
13
|
+
declare function encodePaymentSignatureHeader(paymentPayload: PaymentPayload): string;
|
|
14
|
+
/**
|
|
15
|
+
* Decodes a base64 payment signature header into a payment payload.
|
|
16
|
+
*
|
|
17
|
+
* @param paymentSignatureHeader - The base64 encoded payment signature header
|
|
18
|
+
* @returns The decoded payment payload
|
|
19
|
+
*/
|
|
20
|
+
declare function decodePaymentSignatureHeader(paymentSignatureHeader: string): PaymentPayload;
|
|
21
|
+
/**
|
|
22
|
+
* Encodes a payment required object as a base64 header value.
|
|
23
|
+
*
|
|
24
|
+
* @param paymentRequired - The payment required object to encode
|
|
25
|
+
* @returns Base64 encoded string representation of the payment required object
|
|
26
|
+
*/
|
|
27
|
+
declare function encodePaymentRequiredHeader(paymentRequired: PaymentRequired): string;
|
|
28
|
+
/**
|
|
29
|
+
* Decodes a base64 payment required header into a payment required object.
|
|
30
|
+
*
|
|
31
|
+
* @param paymentRequiredHeader - The base64 encoded payment required header
|
|
32
|
+
* @returns The decoded payment required object
|
|
33
|
+
*/
|
|
34
|
+
declare function decodePaymentRequiredHeader(paymentRequiredHeader: string): PaymentRequired;
|
|
35
|
+
/**
|
|
36
|
+
* Encodes a payment response as a base64 header value.
|
|
37
|
+
*
|
|
38
|
+
* @param paymentResponse - The payment response to encode
|
|
39
|
+
* @returns Base64 encoded string representation of the payment response
|
|
40
|
+
*/
|
|
41
|
+
declare function encodePaymentResponseHeader(paymentResponse: SettleResponse & {
|
|
42
|
+
requirements: PaymentRequirements;
|
|
43
|
+
}): string;
|
|
44
|
+
/**
|
|
45
|
+
* Decodes a base64 payment response header into a settle response.
|
|
46
|
+
*
|
|
47
|
+
* @param paymentResponseHeader - The base64 encoded payment response header
|
|
48
|
+
* @returns The decoded settle response
|
|
49
|
+
*/
|
|
50
|
+
declare function decodePaymentResponseHeader(paymentResponseHeader: string): SettleResponse;
|
|
51
|
+
|
|
52
|
+
export { type BodyMethods, type QueryParamMethods, decodePaymentRequiredHeader, decodePaymentResponseHeader, decodePaymentSignatureHeader, encodePaymentRequiredHeader, encodePaymentResponseHeader, encodePaymentSignatureHeader };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import {
|
|
2
|
+
HTTPFacilitatorClient,
|
|
3
|
+
RouteConfigurationError,
|
|
4
|
+
decodePaymentRequiredHeader,
|
|
5
|
+
decodePaymentResponseHeader,
|
|
6
|
+
decodePaymentSignatureHeader,
|
|
7
|
+
encodePaymentRequiredHeader,
|
|
8
|
+
encodePaymentResponseHeader,
|
|
9
|
+
encodePaymentSignatureHeader,
|
|
10
|
+
x402HTTPClient,
|
|
11
|
+
x402HTTPResourceServer
|
|
12
|
+
} from "../chunk-Z4QX3O5V.mjs";
|
|
13
|
+
import "../chunk-VE37GDG2.mjs";
|
|
14
|
+
import "../chunk-X4W4S5RB.mjs";
|
|
15
|
+
import "../chunk-TDLQZ6MP.mjs";
|
|
16
|
+
import "../chunk-BJTO5JO5.mjs";
|
|
17
|
+
export {
|
|
18
|
+
HTTPFacilitatorClient,
|
|
19
|
+
RouteConfigurationError,
|
|
20
|
+
decodePaymentRequiredHeader,
|
|
21
|
+
decodePaymentResponseHeader,
|
|
22
|
+
decodePaymentSignatureHeader,
|
|
23
|
+
encodePaymentRequiredHeader,
|
|
24
|
+
encodePaymentResponseHeader,
|
|
25
|
+
encodePaymentSignatureHeader,
|
|
26
|
+
x402HTTPClient,
|
|
27
|
+
x402HTTPResourceServer
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { HTTPAdapter, RoutesConfig, x402ResourceServer, PaywallConfig, PaywallProvider, FacilitatorClient } from '@x402/core/server';
|
|
2
|
+
export { PaywallConfig, PaywallProvider, RouteConfigurationError, RouteValidationError, x402HTTPResourceServer, x402ResourceServer } from '@x402/core/server';
|
|
3
|
+
import { Network, SchemeNetworkServer } from '@x402/core/types';
|
|
4
|
+
export { Network, PaymentPayload, PaymentRequired, PaymentRequirements, SchemeNetworkServer } from '@x402/core/types';
|
|
5
|
+
import { Request, Response, NextFunction } from 'express';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Express adapter implementation
|
|
9
|
+
*/
|
|
10
|
+
declare class ExpressAdapter implements HTTPAdapter {
|
|
11
|
+
private req;
|
|
12
|
+
/**
|
|
13
|
+
* Creates a new ExpressAdapter instance.
|
|
14
|
+
*
|
|
15
|
+
* @param req - The Express request object
|
|
16
|
+
*/
|
|
17
|
+
constructor(req: Request);
|
|
18
|
+
/**
|
|
19
|
+
* Gets a header value from the request.
|
|
20
|
+
*
|
|
21
|
+
* @param name - The header name
|
|
22
|
+
* @returns The header value or undefined
|
|
23
|
+
*/
|
|
24
|
+
getHeader(name: string): string | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Gets the HTTP method of the request.
|
|
27
|
+
*
|
|
28
|
+
* @returns The HTTP method
|
|
29
|
+
*/
|
|
30
|
+
getMethod(): string;
|
|
31
|
+
/**
|
|
32
|
+
* Gets the path of the request.
|
|
33
|
+
*
|
|
34
|
+
* @returns The request path
|
|
35
|
+
*/
|
|
36
|
+
getPath(): string;
|
|
37
|
+
/**
|
|
38
|
+
* Gets the full URL of the request.
|
|
39
|
+
*
|
|
40
|
+
* @returns The full request URL
|
|
41
|
+
*/
|
|
42
|
+
getUrl(): string;
|
|
43
|
+
/**
|
|
44
|
+
* Gets the Accept header from the request.
|
|
45
|
+
*
|
|
46
|
+
* @returns The Accept header value or empty string
|
|
47
|
+
*/
|
|
48
|
+
getAcceptHeader(): string;
|
|
49
|
+
/**
|
|
50
|
+
* Gets the User-Agent header from the request.
|
|
51
|
+
*
|
|
52
|
+
* @returns The User-Agent header value or empty string
|
|
53
|
+
*/
|
|
54
|
+
getUserAgent(): string;
|
|
55
|
+
/**
|
|
56
|
+
* Gets all query parameters from the request URL.
|
|
57
|
+
*
|
|
58
|
+
* @returns Record of query parameter key-value pairs
|
|
59
|
+
*/
|
|
60
|
+
getQueryParams(): Record<string, string | string[]>;
|
|
61
|
+
/**
|
|
62
|
+
* Gets a specific query parameter by name.
|
|
63
|
+
*
|
|
64
|
+
* @param name - The query parameter name
|
|
65
|
+
* @returns The query parameter value(s) or undefined
|
|
66
|
+
*/
|
|
67
|
+
getQueryParam(name: string): string | string[] | undefined;
|
|
68
|
+
/**
|
|
69
|
+
* Gets the parsed request body.
|
|
70
|
+
* Requires express.json() or express.urlencoded() middleware.
|
|
71
|
+
*
|
|
72
|
+
* @returns The parsed request body
|
|
73
|
+
*/
|
|
74
|
+
getBody(): unknown;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Configuration for registering a payment scheme with a specific network
|
|
79
|
+
*/
|
|
80
|
+
interface SchemeRegistration {
|
|
81
|
+
/**
|
|
82
|
+
* The network identifier (e.g., 'eip155:84532', 'solana:mainnet')
|
|
83
|
+
*/
|
|
84
|
+
network: Network;
|
|
85
|
+
/**
|
|
86
|
+
* The scheme server implementation for this network
|
|
87
|
+
*/
|
|
88
|
+
server: SchemeNetworkServer;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Express payment middleware for x402 protocol (direct server instance).
|
|
92
|
+
*
|
|
93
|
+
* Use this when you want to pass a pre-configured x402ResourceServer instance.
|
|
94
|
+
* This provides more flexibility for testing, custom configuration, and reusing
|
|
95
|
+
* server instances across multiple middlewares.
|
|
96
|
+
*
|
|
97
|
+
* @param routes - Route configurations for protected endpoints
|
|
98
|
+
* @param server - Pre-configured x402ResourceServer instance
|
|
99
|
+
* @param paywallConfig - Optional configuration for the built-in paywall UI
|
|
100
|
+
* @param paywall - Optional custom paywall provider (overrides default)
|
|
101
|
+
* @param syncFacilitatorOnStart - Whether to sync with the facilitator on startup (defaults to true)
|
|
102
|
+
* @returns Express middleware handler
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```typescript
|
|
106
|
+
* import { paymentMiddleware } from "@x402/express";
|
|
107
|
+
* import { x402ResourceServer } from "@x402/core/server";
|
|
108
|
+
* import { registerExactEvmScheme } from "@x402/evm/exact/server";
|
|
109
|
+
*
|
|
110
|
+
* const server = new x402ResourceServer(myFacilitatorClient);
|
|
111
|
+
* registerExactEvmScheme(server, { signer: myServerSigner });
|
|
112
|
+
*
|
|
113
|
+
* app.use(paymentMiddleware(routes, server, paywallConfig));
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
declare function paymentMiddleware(routes: RoutesConfig, server: x402ResourceServer, paywallConfig?: PaywallConfig, paywall?: PaywallProvider, syncFacilitatorOnStart?: boolean): (req: Request, res: Response, next: NextFunction) => Promise<void>;
|
|
117
|
+
/**
|
|
118
|
+
* Express payment middleware for x402 protocol (configuration-based).
|
|
119
|
+
*
|
|
120
|
+
* Use this when you want to quickly set up middleware with simple configuration.
|
|
121
|
+
* This function creates and configures the x402ResourceServer internally.
|
|
122
|
+
*
|
|
123
|
+
* @param routes - Route configurations for protected endpoints
|
|
124
|
+
* @param facilitatorClients - Optional facilitator client(s) for payment processing
|
|
125
|
+
* @param schemes - Optional array of scheme registrations for server-side payment processing
|
|
126
|
+
* @param paywallConfig - Optional configuration for the built-in paywall UI
|
|
127
|
+
* @param paywall - Optional custom paywall provider (overrides default)
|
|
128
|
+
* @param syncFacilitatorOnStart - Whether to sync with the facilitator on startup (defaults to true)
|
|
129
|
+
* @returns Express middleware handler
|
|
130
|
+
*
|
|
131
|
+
* @example
|
|
132
|
+
* ```typescript
|
|
133
|
+
* import { paymentMiddlewareFromConfig } from "@x402/express";
|
|
134
|
+
*
|
|
135
|
+
* app.use(paymentMiddlewareFromConfig(
|
|
136
|
+
* routes,
|
|
137
|
+
* myFacilitatorClient,
|
|
138
|
+
* [{ network: "eip155:8453", server: evmSchemeServer }],
|
|
139
|
+
* paywallConfig
|
|
140
|
+
* ));
|
|
141
|
+
* ```
|
|
142
|
+
*/
|
|
143
|
+
declare function paymentMiddlewareFromConfig(routes: RoutesConfig, facilitatorClients?: FacilitatorClient | FacilitatorClient[], schemes?: SchemeRegistration[], paywallConfig?: PaywallConfig, paywall?: PaywallProvider, syncFacilitatorOnStart?: boolean): (req: Request, res: Response, next: NextFunction) => Promise<void>;
|
|
144
|
+
|
|
145
|
+
export { ExpressAdapter, type SchemeRegistration, paymentMiddleware, paymentMiddlewareFromConfig };
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
import {
|
|
3
|
+
x402HTTPResourceServer,
|
|
4
|
+
x402ResourceServer
|
|
5
|
+
} from "@x402/core/server";
|
|
6
|
+
|
|
7
|
+
// src/adapter.ts
|
|
8
|
+
var ExpressAdapter = class {
|
|
9
|
+
/**
|
|
10
|
+
* Creates a new ExpressAdapter instance.
|
|
11
|
+
*
|
|
12
|
+
* @param req - The Express request object
|
|
13
|
+
*/
|
|
14
|
+
constructor(req) {
|
|
15
|
+
this.req = req;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Gets a header value from the request.
|
|
19
|
+
*
|
|
20
|
+
* @param name - The header name
|
|
21
|
+
* @returns The header value or undefined
|
|
22
|
+
*/
|
|
23
|
+
getHeader(name) {
|
|
24
|
+
const value = this.req.header(name);
|
|
25
|
+
return Array.isArray(value) ? value[0] : value;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Gets the HTTP method of the request.
|
|
29
|
+
*
|
|
30
|
+
* @returns The HTTP method
|
|
31
|
+
*/
|
|
32
|
+
getMethod() {
|
|
33
|
+
return this.req.method;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Gets the path of the request.
|
|
37
|
+
*
|
|
38
|
+
* @returns The request path
|
|
39
|
+
*/
|
|
40
|
+
getPath() {
|
|
41
|
+
return this.req.path;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Gets the full URL of the request.
|
|
45
|
+
*
|
|
46
|
+
* @returns The full request URL
|
|
47
|
+
*/
|
|
48
|
+
getUrl() {
|
|
49
|
+
return `${this.req.protocol}://${this.req.headers.host}${this.req.path}`;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Gets the Accept header from the request.
|
|
53
|
+
*
|
|
54
|
+
* @returns The Accept header value or empty string
|
|
55
|
+
*/
|
|
56
|
+
getAcceptHeader() {
|
|
57
|
+
return this.req.header("Accept") || "";
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Gets the User-Agent header from the request.
|
|
61
|
+
*
|
|
62
|
+
* @returns The User-Agent header value or empty string
|
|
63
|
+
*/
|
|
64
|
+
getUserAgent() {
|
|
65
|
+
return this.req.header("User-Agent") || "";
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Gets all query parameters from the request URL.
|
|
69
|
+
*
|
|
70
|
+
* @returns Record of query parameter key-value pairs
|
|
71
|
+
*/
|
|
72
|
+
getQueryParams() {
|
|
73
|
+
return this.req.query;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Gets a specific query parameter by name.
|
|
77
|
+
*
|
|
78
|
+
* @param name - The query parameter name
|
|
79
|
+
* @returns The query parameter value(s) or undefined
|
|
80
|
+
*/
|
|
81
|
+
getQueryParam(name) {
|
|
82
|
+
const value = this.req.query[name];
|
|
83
|
+
return value;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Gets the parsed request body.
|
|
87
|
+
* Requires express.json() or express.urlencoded() middleware.
|
|
88
|
+
*
|
|
89
|
+
* @returns The parsed request body
|
|
90
|
+
*/
|
|
91
|
+
getBody() {
|
|
92
|
+
return this.req.body;
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
// src/index.ts
|
|
97
|
+
import { x402ResourceServer as x402ResourceServer2, x402HTTPResourceServer as x402HTTPResourceServer2 } from "@x402/core/server";
|
|
98
|
+
import { RouteConfigurationError } from "@x402/core/server";
|
|
99
|
+
function checkIfBazaarNeeded(routes) {
|
|
100
|
+
if ("accepts" in routes) {
|
|
101
|
+
return !!(routes.extensions && "bazaar" in routes.extensions);
|
|
102
|
+
}
|
|
103
|
+
return Object.values(routes).some((routeConfig) => {
|
|
104
|
+
return !!(routeConfig.extensions && "bazaar" in routeConfig.extensions);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
function paymentMiddleware(routes, server, paywallConfig, paywall, syncFacilitatorOnStart = true) {
|
|
108
|
+
const httpServer = new x402HTTPResourceServer(server, routes);
|
|
109
|
+
if (paywall) {
|
|
110
|
+
httpServer.registerPaywallProvider(paywall);
|
|
111
|
+
}
|
|
112
|
+
let initPromise = syncFacilitatorOnStart ? httpServer.initialize() : null;
|
|
113
|
+
let bazaarPromise = null;
|
|
114
|
+
if (checkIfBazaarNeeded(routes)) {
|
|
115
|
+
bazaarPromise = import("@x402/extensions/bazaar").then(({ bazaarResourceServerExtension }) => {
|
|
116
|
+
server.registerExtension(bazaarResourceServerExtension);
|
|
117
|
+
}).catch((err) => {
|
|
118
|
+
console.error("Failed to load bazaar extension:", err);
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
return async (req, res, next) => {
|
|
122
|
+
const adapter = new ExpressAdapter(req);
|
|
123
|
+
const context = {
|
|
124
|
+
adapter,
|
|
125
|
+
path: req.path,
|
|
126
|
+
method: req.method,
|
|
127
|
+
paymentHeader: adapter.getHeader("payment-signature") || adapter.getHeader("x-payment")
|
|
128
|
+
};
|
|
129
|
+
if (!httpServer.requiresPayment(context)) {
|
|
130
|
+
return next();
|
|
131
|
+
}
|
|
132
|
+
if (initPromise) {
|
|
133
|
+
await initPromise;
|
|
134
|
+
initPromise = null;
|
|
135
|
+
}
|
|
136
|
+
if (bazaarPromise) {
|
|
137
|
+
await bazaarPromise;
|
|
138
|
+
bazaarPromise = null;
|
|
139
|
+
}
|
|
140
|
+
const result = await httpServer.processHTTPRequest(context, paywallConfig);
|
|
141
|
+
switch (result.type) {
|
|
142
|
+
case "no-payment-required":
|
|
143
|
+
return next();
|
|
144
|
+
case "payment-error":
|
|
145
|
+
const { response } = result;
|
|
146
|
+
res.status(response.status);
|
|
147
|
+
Object.entries(response.headers).forEach(([key, value]) => {
|
|
148
|
+
res.setHeader(key, value);
|
|
149
|
+
});
|
|
150
|
+
if (response.isHtml) {
|
|
151
|
+
res.send(response.body);
|
|
152
|
+
} else {
|
|
153
|
+
res.json(response.body || {});
|
|
154
|
+
}
|
|
155
|
+
return;
|
|
156
|
+
case "payment-verified":
|
|
157
|
+
const { paymentPayload, paymentRequirements } = result;
|
|
158
|
+
const originalWriteHead = res.writeHead.bind(res);
|
|
159
|
+
const originalWrite = res.write.bind(res);
|
|
160
|
+
const originalEnd = res.end.bind(res);
|
|
161
|
+
const originalFlushHeaders = res.flushHeaders.bind(res);
|
|
162
|
+
let bufferedCalls = [];
|
|
163
|
+
let settled = false;
|
|
164
|
+
let endCalled;
|
|
165
|
+
const endPromise = new Promise((resolve) => {
|
|
166
|
+
endCalled = resolve;
|
|
167
|
+
});
|
|
168
|
+
res.writeHead = function(...args) {
|
|
169
|
+
if (!settled) {
|
|
170
|
+
bufferedCalls.push(["writeHead", args]);
|
|
171
|
+
return res;
|
|
172
|
+
}
|
|
173
|
+
return originalWriteHead(...args);
|
|
174
|
+
};
|
|
175
|
+
res.write = function(...args) {
|
|
176
|
+
if (!settled) {
|
|
177
|
+
bufferedCalls.push(["write", args]);
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
180
|
+
return originalWrite(...args);
|
|
181
|
+
};
|
|
182
|
+
res.end = function(...args) {
|
|
183
|
+
if (!settled) {
|
|
184
|
+
bufferedCalls.push(["end", args]);
|
|
185
|
+
endCalled();
|
|
186
|
+
return res;
|
|
187
|
+
}
|
|
188
|
+
return originalEnd(...args);
|
|
189
|
+
};
|
|
190
|
+
res.flushHeaders = function() {
|
|
191
|
+
if (!settled) {
|
|
192
|
+
bufferedCalls.push(["flushHeaders", []]);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
return originalFlushHeaders();
|
|
196
|
+
};
|
|
197
|
+
next();
|
|
198
|
+
await endPromise;
|
|
199
|
+
if (res.statusCode >= 400) {
|
|
200
|
+
settled = true;
|
|
201
|
+
res.writeHead = originalWriteHead;
|
|
202
|
+
res.write = originalWrite;
|
|
203
|
+
res.end = originalEnd;
|
|
204
|
+
res.flushHeaders = originalFlushHeaders;
|
|
205
|
+
for (const [method, args] of bufferedCalls) {
|
|
206
|
+
if (method === "writeHead")
|
|
207
|
+
originalWriteHead(...args);
|
|
208
|
+
else if (method === "write")
|
|
209
|
+
originalWrite(...args);
|
|
210
|
+
else if (method === "end") originalEnd(...args);
|
|
211
|
+
else if (method === "flushHeaders") originalFlushHeaders();
|
|
212
|
+
}
|
|
213
|
+
bufferedCalls = [];
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
try {
|
|
217
|
+
const settleResult = await httpServer.processSettlement(
|
|
218
|
+
paymentPayload,
|
|
219
|
+
paymentRequirements
|
|
220
|
+
);
|
|
221
|
+
if (!settleResult.success) {
|
|
222
|
+
bufferedCalls = [];
|
|
223
|
+
res.status(402).json({
|
|
224
|
+
error: "Settlement failed",
|
|
225
|
+
details: settleResult.errorReason
|
|
226
|
+
});
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
Object.entries(settleResult.headers).forEach(([key, value]) => {
|
|
230
|
+
res.setHeader(key, value);
|
|
231
|
+
});
|
|
232
|
+
} catch (error) {
|
|
233
|
+
console.error(error);
|
|
234
|
+
bufferedCalls = [];
|
|
235
|
+
res.status(402).json({
|
|
236
|
+
error: "Settlement failed",
|
|
237
|
+
details: error instanceof Error ? error.message : "Unknown error"
|
|
238
|
+
});
|
|
239
|
+
return;
|
|
240
|
+
} finally {
|
|
241
|
+
settled = true;
|
|
242
|
+
res.writeHead = originalWriteHead;
|
|
243
|
+
res.write = originalWrite;
|
|
244
|
+
res.end = originalEnd;
|
|
245
|
+
res.flushHeaders = originalFlushHeaders;
|
|
246
|
+
for (const [method, args] of bufferedCalls) {
|
|
247
|
+
if (method === "writeHead")
|
|
248
|
+
originalWriteHead(...args);
|
|
249
|
+
else if (method === "write")
|
|
250
|
+
originalWrite(...args);
|
|
251
|
+
else if (method === "end") originalEnd(...args);
|
|
252
|
+
else if (method === "flushHeaders") originalFlushHeaders();
|
|
253
|
+
}
|
|
254
|
+
bufferedCalls = [];
|
|
255
|
+
}
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
function paymentMiddlewareFromConfig(routes, facilitatorClients, schemes, paywallConfig, paywall, syncFacilitatorOnStart = true) {
|
|
261
|
+
const ResourceServer = new x402ResourceServer(facilitatorClients);
|
|
262
|
+
if (schemes) {
|
|
263
|
+
schemes.forEach(({ network, server: schemeServer }) => {
|
|
264
|
+
ResourceServer.register(network, schemeServer);
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
return paymentMiddleware(routes, ResourceServer, paywallConfig, paywall, syncFacilitatorOnStart);
|
|
268
|
+
}
|
|
269
|
+
export {
|
|
270
|
+
ExpressAdapter,
|
|
271
|
+
RouteConfigurationError,
|
|
272
|
+
paymentMiddleware,
|
|
273
|
+
paymentMiddlewareFromConfig,
|
|
274
|
+
x402HTTPResourceServer2 as x402HTTPResourceServer,
|
|
275
|
+
x402ResourceServer2 as x402ResourceServer
|
|
276
|
+
};
|
|
277
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/adapter.ts"],"sourcesContent":["import {\n HTTPRequestContext,\n PaywallConfig,\n PaywallProvider,\n x402HTTPResourceServer,\n x402ResourceServer,\n RoutesConfig,\n FacilitatorClient,\n} from \"@x402/core/server\";\nimport { SchemeNetworkServer, Network } from \"@x402/core/types\";\nimport { NextFunction, Request, Response } from \"express\";\nimport { ExpressAdapter } from \"./adapter\";\n\n/**\n * Check if any routes in the configuration declare bazaar extensions\n *\n * @param routes - Route configuration\n * @returns True if any route has extensions.bazaar defined\n */\nfunction checkIfBazaarNeeded(routes: RoutesConfig): boolean {\n // Handle single route config\n if (\"accepts\" in routes) {\n return !!(routes.extensions && \"bazaar\" in routes.extensions);\n }\n\n // Handle multiple routes\n return Object.values(routes).some(routeConfig => {\n return !!(routeConfig.extensions && \"bazaar\" in routeConfig.extensions);\n });\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:84532', 'solana:mainnet')\n */\n network: Network;\n\n /**\n * The scheme server implementation for this network\n */\n server: SchemeNetworkServer;\n}\n\n/**\n * Express payment middleware for x402 protocol (direct server instance).\n *\n * Use this when you want to pass a pre-configured x402ResourceServer instance.\n * This provides more flexibility for testing, custom configuration, and reusing\n * server instances across multiple middlewares.\n *\n * @param routes - Route configurations for protected endpoints\n * @param server - Pre-configured x402ResourceServer instance\n * @param paywallConfig - Optional configuration for the built-in paywall UI\n * @param paywall - Optional custom paywall provider (overrides default)\n * @param syncFacilitatorOnStart - Whether to sync with the facilitator on startup (defaults to true)\n * @returns Express middleware handler\n *\n * @example\n * ```typescript\n * import { paymentMiddleware } from \"@x402/express\";\n * import { x402ResourceServer } from \"@x402/core/server\";\n * import { registerExactEvmScheme } from \"@x402/evm/exact/server\";\n *\n * const server = new x402ResourceServer(myFacilitatorClient);\n * registerExactEvmScheme(server, { signer: myServerSigner });\n *\n * app.use(paymentMiddleware(routes, server, paywallConfig));\n * ```\n */\nexport function paymentMiddleware(\n routes: RoutesConfig,\n server: x402ResourceServer,\n paywallConfig?: PaywallConfig,\n paywall?: PaywallProvider,\n syncFacilitatorOnStart: boolean = true,\n) {\n // Create the x402 HTTP server instance with the resource server\n const httpServer = new x402HTTPResourceServer(server, routes);\n\n // Register custom paywall provider if provided\n if (paywall) {\n httpServer.registerPaywallProvider(paywall);\n }\n\n // Store initialization promise (not the result)\n // httpServer.initialize() fetches facilitator support and validates routes\n let initPromise: Promise<void> | null = syncFacilitatorOnStart ? httpServer.initialize() : null;\n\n // Dynamically register bazaar extension if routes declare it\n let bazaarPromise: Promise<void> | null = null;\n if (checkIfBazaarNeeded(routes)) {\n bazaarPromise = import(\"@x402/extensions/bazaar\")\n .then(({ bazaarResourceServerExtension }) => {\n server.registerExtension(bazaarResourceServerExtension);\n })\n .catch(err => {\n console.error(\"Failed to load bazaar extension:\", err);\n });\n }\n\n return async (req: Request, res: Response, next: NextFunction) => {\n // Create adapter and context\n const adapter = new ExpressAdapter(req);\n const context: HTTPRequestContext = {\n adapter,\n path: req.path,\n method: req.method,\n paymentHeader: adapter.getHeader(\"payment-signature\") || adapter.getHeader(\"x-payment\"),\n };\n\n // Check if route requires payment before initializing facilitator\n if (!httpServer.requiresPayment(context)) {\n return next();\n }\n\n // Only initialize when processing a protected route\n if (initPromise) {\n await initPromise;\n initPromise = null; // Clear after first await\n }\n\n // Await bazaar extension loading if needed\n if (bazaarPromise) {\n await bazaarPromise;\n bazaarPromise = null;\n }\n\n // Process payment requirement check\n const result = await httpServer.processHTTPRequest(context, paywallConfig);\n\n // Handle the different result types\n switch (result.type) {\n case \"no-payment-required\":\n // No payment needed, proceed directly to the route handler\n return next();\n\n case \"payment-error\":\n // Payment required but not provided or invalid\n const { response } = result;\n res.status(response.status);\n Object.entries(response.headers).forEach(([key, value]) => {\n res.setHeader(key, value);\n });\n if (response.isHtml) {\n res.send(response.body);\n } else {\n res.json(response.body || {});\n }\n return;\n\n case \"payment-verified\":\n // Payment is valid, need to wrap response for settlement\n const { paymentPayload, paymentRequirements } = result;\n\n // Intercept and buffer all core methods that can commit response to client\n const originalWriteHead = res.writeHead.bind(res);\n const originalWrite = res.write.bind(res);\n const originalEnd = res.end.bind(res);\n const originalFlushHeaders = res.flushHeaders.bind(res);\n\n type BufferedCall =\n | [\"writeHead\", Parameters<typeof originalWriteHead>]\n | [\"write\", Parameters<typeof originalWrite>]\n | [\"end\", Parameters<typeof originalEnd>]\n | [\"flushHeaders\", []];\n let bufferedCalls: BufferedCall[] = [];\n let settled = false;\n\n // Create a promise that resolves when the handler finishes and calls res.end()\n let endCalled: () => void;\n const endPromise = new Promise<void>(resolve => {\n endCalled = resolve;\n });\n\n res.writeHead = function (...args: Parameters<typeof originalWriteHead>) {\n if (!settled) {\n bufferedCalls.push([\"writeHead\", args]);\n return res;\n }\n return originalWriteHead(...args);\n } as typeof originalWriteHead;\n\n res.write = function (...args: Parameters<typeof originalWrite>) {\n if (!settled) {\n bufferedCalls.push([\"write\", args]);\n return true;\n }\n return originalWrite(...args);\n } as typeof originalWrite;\n\n res.end = function (...args: Parameters<typeof originalEnd>) {\n if (!settled) {\n bufferedCalls.push([\"end\", args]);\n // Signal that the handler has finished\n endCalled();\n return res;\n }\n return originalEnd(...args);\n } as typeof originalEnd;\n\n res.flushHeaders = function () {\n if (!settled) {\n bufferedCalls.push([\"flushHeaders\", []]);\n return;\n }\n return originalFlushHeaders();\n };\n\n // Proceed to the next middleware or route handler\n next();\n\n // Wait for the handler to actually call res.end() before checking status\n await endPromise;\n\n // If the response from the protected route is >= 400, do not settle payment\n if (res.statusCode >= 400) {\n settled = true;\n res.writeHead = originalWriteHead;\n res.write = originalWrite;\n res.end = originalEnd;\n res.flushHeaders = originalFlushHeaders;\n // Replay all buffered calls in order\n for (const [method, args] of bufferedCalls) {\n if (method === \"writeHead\")\n originalWriteHead(...(args as Parameters<typeof originalWriteHead>));\n else if (method === \"write\")\n originalWrite(...(args as Parameters<typeof originalWrite>));\n else if (method === \"end\") originalEnd(...(args as Parameters<typeof originalEnd>));\n else if (method === \"flushHeaders\") originalFlushHeaders();\n }\n bufferedCalls = [];\n return;\n }\n\n try {\n const settleResult = await httpServer.processSettlement(\n paymentPayload,\n paymentRequirements,\n );\n\n // If settlement fails, return an error and do not send the buffered response\n if (!settleResult.success) {\n bufferedCalls = [];\n res.status(402).json({\n error: \"Settlement failed\",\n details: settleResult.errorReason,\n });\n return;\n }\n\n // Settlement succeeded - add headers to response\n Object.entries(settleResult.headers).forEach(([key, value]) => {\n res.setHeader(key, value);\n });\n } catch (error) {\n console.error(error);\n // If settlement fails, don't send the buffered response\n bufferedCalls = [];\n res.status(402).json({\n error: \"Settlement failed\",\n details: error instanceof Error ? error.message : \"Unknown error\",\n });\n return;\n } finally {\n settled = true;\n res.writeHead = originalWriteHead;\n res.write = originalWrite;\n res.end = originalEnd;\n res.flushHeaders = originalFlushHeaders;\n\n // Replay all buffered calls in order\n for (const [method, args] of bufferedCalls) {\n if (method === \"writeHead\")\n originalWriteHead(...(args as Parameters<typeof originalWriteHead>));\n else if (method === \"write\")\n originalWrite(...(args as Parameters<typeof originalWrite>));\n else if (method === \"end\") originalEnd(...(args as Parameters<typeof originalEnd>));\n else if (method === \"flushHeaders\") originalFlushHeaders();\n }\n bufferedCalls = [];\n }\n return;\n }\n };\n}\n\n/**\n * Express payment middleware for x402 protocol (configuration-based).\n *\n * Use this when you want to quickly set up middleware with simple configuration.\n * This function creates and configures the x402ResourceServer internally.\n *\n * @param routes - Route configurations for protected endpoints\n * @param facilitatorClients - Optional facilitator client(s) for payment processing\n * @param schemes - Optional array of scheme registrations for server-side payment processing\n * @param paywallConfig - Optional configuration for the built-in paywall UI\n * @param paywall - Optional custom paywall provider (overrides default)\n * @param syncFacilitatorOnStart - Whether to sync with the facilitator on startup (defaults to true)\n * @returns Express middleware handler\n *\n * @example\n * ```typescript\n * import { paymentMiddlewareFromConfig } from \"@x402/express\";\n *\n * app.use(paymentMiddlewareFromConfig(\n * routes,\n * myFacilitatorClient,\n * [{ network: \"eip155:8453\", server: evmSchemeServer }],\n * paywallConfig\n * ));\n * ```\n */\nexport function paymentMiddlewareFromConfig(\n routes: RoutesConfig,\n facilitatorClients?: FacilitatorClient | FacilitatorClient[],\n schemes?: SchemeRegistration[],\n paywallConfig?: PaywallConfig,\n paywall?: PaywallProvider,\n syncFacilitatorOnStart: boolean = true,\n) {\n const ResourceServer = new x402ResourceServer(facilitatorClients);\n\n if (schemes) {\n schemes.forEach(({ network, server: schemeServer }) => {\n ResourceServer.register(network, schemeServer);\n });\n }\n\n // Use the direct paymentMiddleware with the configured server\n // Note: paymentMiddleware handles dynamic bazaar registration\n return paymentMiddleware(routes, ResourceServer, paywallConfig, paywall, syncFacilitatorOnStart);\n}\n\nexport { x402ResourceServer, x402HTTPResourceServer } from \"@x402/core/server\";\n\nexport type {\n PaymentRequired,\n PaymentRequirements,\n PaymentPayload,\n Network,\n SchemeNetworkServer,\n} from \"@x402/core/types\";\n\nexport type { PaywallProvider, PaywallConfig } from \"@x402/core/server\";\n\nexport { RouteConfigurationError } from \"@x402/core/server\";\n\nexport type { RouteValidationError } from \"@x402/core/server\";\n\nexport { ExpressAdapter } from \"./adapter\";\n","import { HTTPAdapter } from \"@x402/core/server\";\nimport { Request } from \"express\";\n\n/**\n * Express adapter implementation\n */\nexport class ExpressAdapter implements HTTPAdapter {\n /**\n * Creates a new ExpressAdapter instance.\n *\n * @param req - The Express request object\n */\n constructor(private req: Request) {}\n\n /**\n * Gets a header value from the request.\n *\n * @param name - The header name\n * @returns The header value or undefined\n */\n getHeader(name: string): string | undefined {\n const value = this.req.header(name);\n return Array.isArray(value) ? value[0] : value;\n }\n\n /**\n * Gets the HTTP method of the request.\n *\n * @returns The HTTP method\n */\n getMethod(): string {\n return this.req.method;\n }\n\n /**\n * Gets the path of the request.\n *\n * @returns The request path\n */\n getPath(): string {\n return this.req.path;\n }\n\n /**\n * Gets the full URL of the request.\n *\n * @returns The full request URL\n */\n getUrl(): string {\n return `${this.req.protocol}://${this.req.headers.host}${this.req.path}`;\n }\n\n /**\n * Gets the Accept header from the request.\n *\n * @returns The Accept header value or empty string\n */\n getAcceptHeader(): string {\n return this.req.header(\"Accept\") || \"\";\n }\n\n /**\n * Gets the User-Agent header from the request.\n *\n * @returns The User-Agent header value or empty string\n */\n getUserAgent(): string {\n return this.req.header(\"User-Agent\") || \"\";\n }\n\n /**\n * Gets all query parameters from the request URL.\n *\n * @returns Record of query parameter key-value pairs\n */\n getQueryParams(): Record<string, string | string[]> {\n return this.req.query as Record<string, string | string[]>;\n }\n\n /**\n * Gets 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 const value = this.req.query[name];\n return value as string | string[] | undefined;\n }\n\n /**\n * Gets the parsed request body.\n * Requires express.json() or express.urlencoded() middleware.\n *\n * @returns The parsed request body\n */\n getBody(): unknown {\n return this.req.body;\n }\n}\n"],"mappings":"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","names":["x402ResourceServer","x402HTTPResourceServer"]}
|