@x402/next 2.1.0 → 2.3.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.
@@ -31,10 +31,14 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  var src_exports = {};
32
32
  __export(src_exports, {
33
33
  NextAdapter: () => NextAdapter,
34
- RouteConfigurationError: () => import_server5.RouteConfigurationError,
34
+ RouteConfigurationError: () => import_server6.RouteConfigurationError,
35
35
  paymentProxy: () => paymentProxy,
36
36
  paymentProxyFromConfig: () => paymentProxyFromConfig,
37
- withX402: () => withX402
37
+ paymentProxyFromHTTPServer: () => paymentProxyFromHTTPServer,
38
+ withX402: () => withX402,
39
+ withX402FromHTTPServer: () => withX402FromHTTPServer,
40
+ x402HTTPResourceServer: () => import_server6.x402HTTPResourceServer,
41
+ x402ResourceServer: () => import_server6.x402ResourceServer
38
42
  });
39
43
  module.exports = __toCommonJS(src_exports);
40
44
  var import_server3 = require("@x402/core/server");
@@ -151,8 +155,7 @@ var NextAdapter = class {
151
155
  };
152
156
 
153
157
  // src/utils.ts
154
- function createHttpServer(routes, server, paywall, syncFacilitatorOnStart = true) {
155
- const httpServer = new import_server2.x402HTTPResourceServer(server, routes);
158
+ function prepareHttpServer(httpServer, paywall, syncFacilitatorOnStart = true) {
156
159
  if (paywall) {
157
160
  httpServer.registerPaywallProvider(paywall);
158
161
  }
@@ -191,12 +194,16 @@ function handlePaymentError(response) {
191
194
  headers
192
195
  });
193
196
  }
194
- async function handleSettlement(httpServer, response, paymentPayload, paymentRequirements) {
197
+ async function handleSettlement(httpServer, response, paymentPayload, paymentRequirements, declaredExtensions) {
195
198
  if (response.status >= 400) {
196
199
  return response;
197
200
  }
198
201
  try {
199
- const result = await httpServer.processSettlement(paymentPayload, paymentRequirements);
202
+ const result = await httpServer.processSettlement(
203
+ paymentPayload,
204
+ paymentRequirements,
205
+ declaredExtensions
206
+ );
200
207
  if (!result.success) {
201
208
  return new import_server.NextResponse(
202
209
  JSON.stringify({
@@ -230,15 +237,16 @@ async function handleSettlement(httpServer, response, paymentPayload, paymentReq
230
237
 
231
238
  // src/index.ts
232
239
  var import_server5 = require("@x402/core/server");
233
- function paymentProxy(routes, server, paywallConfig, paywall, syncFacilitatorOnStart = true) {
234
- const { httpServer, init } = createHttpServer(routes, server, paywall, syncFacilitatorOnStart);
240
+ var import_server6 = require("@x402/core/server");
241
+ function paymentProxyFromHTTPServer(httpServer, paywallConfig, paywall, syncFacilitatorOnStart = true) {
242
+ const { init } = prepareHttpServer(httpServer, paywall, syncFacilitatorOnStart);
235
243
  let bazaarPromise = null;
236
- if (checkIfBazaarNeeded(routes)) {
244
+ if (checkIfBazaarNeeded(httpServer.routes) && !httpServer.server.hasExtension("bazaar")) {
237
245
  bazaarPromise = import(
238
246
  /* webpackIgnore: true */
239
247
  "@x402/extensions/bazaar"
240
248
  ).then(({ bazaarResourceServerExtension }) => {
241
- server.registerExtension(bazaarResourceServerExtension);
249
+ httpServer.server.registerExtension(bazaarResourceServerExtension);
242
250
  }).catch((err) => {
243
251
  console.error("Failed to load bazaar extension:", err);
244
252
  });
@@ -260,13 +268,23 @@ function paymentProxy(routes, server, paywallConfig, paywall, syncFacilitatorOnS
260
268
  case "payment-error":
261
269
  return handlePaymentError(result.response);
262
270
  case "payment-verified": {
263
- const { paymentPayload, paymentRequirements } = result;
271
+ const { paymentPayload, paymentRequirements, declaredExtensions } = result;
264
272
  const nextResponse = import_server4.NextResponse.next();
265
- return handleSettlement(httpServer, nextResponse, paymentPayload, paymentRequirements);
273
+ return handleSettlement(
274
+ httpServer,
275
+ nextResponse,
276
+ paymentPayload,
277
+ paymentRequirements,
278
+ declaredExtensions
279
+ );
266
280
  }
267
281
  }
268
282
  };
269
283
  }
284
+ function paymentProxy(routes, server, paywallConfig, paywall, syncFacilitatorOnStart = true) {
285
+ const httpServer = new import_server5.x402HTTPResourceServer(server, routes);
286
+ return paymentProxyFromHTTPServer(httpServer, paywallConfig, paywall, syncFacilitatorOnStart);
287
+ }
270
288
  function paymentProxyFromConfig(routes, facilitatorClients, schemes, paywallConfig, paywall, syncFacilitatorOnStart = true) {
271
289
  const ResourceServer = new import_server3.x402ResourceServer(facilitatorClients);
272
290
  if (schemes) {
@@ -276,16 +294,15 @@ function paymentProxyFromConfig(routes, facilitatorClients, schemes, paywallConf
276
294
  }
277
295
  return paymentProxy(routes, ResourceServer, paywallConfig, paywall, syncFacilitatorOnStart);
278
296
  }
279
- function withX402(routeHandler, routeConfig, server, paywallConfig, paywall, syncFacilitatorOnStart = true) {
280
- const routes = { "*": routeConfig };
281
- const { httpServer, init } = createHttpServer(routes, server, paywall, syncFacilitatorOnStart);
297
+ function withX402FromHTTPServer(routeHandler, httpServer, paywallConfig, paywall, syncFacilitatorOnStart = true) {
298
+ const { init } = prepareHttpServer(httpServer, paywall, syncFacilitatorOnStart);
282
299
  let bazaarPromise = null;
283
- if (checkIfBazaarNeeded(routes)) {
300
+ if (checkIfBazaarNeeded(httpServer.routes) && !httpServer.server.hasExtension("bazaar")) {
284
301
  bazaarPromise = import(
285
302
  /* webpackIgnore: true */
286
303
  "@x402/extensions/bazaar"
287
304
  ).then(({ bazaarResourceServerExtension }) => {
288
- server.registerExtension(bazaarResourceServerExtension);
305
+ httpServer.server.registerExtension(bazaarResourceServerExtension);
289
306
  }).catch((err) => {
290
307
  console.error("Failed to load bazaar extension:", err);
291
308
  });
@@ -304,18 +321,30 @@ function withX402(routeHandler, routeConfig, server, paywallConfig, paywall, syn
304
321
  case "payment-error":
305
322
  return handlePaymentError(result.response);
306
323
  case "payment-verified": {
307
- const { paymentPayload, paymentRequirements } = result;
324
+ const { paymentPayload, paymentRequirements, declaredExtensions } = result;
308
325
  const handlerResponse = await routeHandler(request);
309
326
  return handleSettlement(
310
327
  httpServer,
311
328
  handlerResponse,
312
329
  paymentPayload,
313
- paymentRequirements
330
+ paymentRequirements,
331
+ declaredExtensions
314
332
  );
315
333
  }
316
334
  }
317
335
  };
318
336
  }
337
+ function withX402(routeHandler, routeConfig, server, paywallConfig, paywall, syncFacilitatorOnStart = true) {
338
+ const routes = { "*": routeConfig };
339
+ const httpServer = new import_server5.x402HTTPResourceServer(server, routes);
340
+ return withX402FromHTTPServer(
341
+ routeHandler,
342
+ httpServer,
343
+ paywallConfig,
344
+ paywall,
345
+ syncFacilitatorOnStart
346
+ );
347
+ }
319
348
  function checkIfBazaarNeeded(routes) {
320
349
  if ("accepts" in routes) {
321
350
  return !!(routes.extensions && "bazaar" in routes.extensions);
@@ -330,6 +359,10 @@ function checkIfBazaarNeeded(routes) {
330
359
  RouteConfigurationError,
331
360
  paymentProxy,
332
361
  paymentProxyFromConfig,
333
- withX402
362
+ paymentProxyFromHTTPServer,
363
+ withX402,
364
+ withX402FromHTTPServer,
365
+ x402HTTPResourceServer,
366
+ x402ResourceServer
334
367
  });
335
368
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/utils.ts","../../src/adapter.ts"],"sourcesContent":["import {\n PaywallConfig,\n PaywallProvider,\n x402ResourceServer,\n RoutesConfig,\n RouteConfig,\n FacilitatorClient,\n} from \"@x402/core/server\";\nimport { SchemeNetworkServer, Network } from \"@x402/core/types\";\nimport { NextRequest, NextResponse } from \"next/server\";\nimport {\n createHttpServer,\n createRequestContext,\n handlePaymentError,\n handleSettlement,\n} from \"./utils\";\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 * Next.js payment proxy 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 proxies.\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 Next.js proxy handler\n *\n * @example\n * ```typescript\n * import { paymentProxy } from \"@x402/next\";\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, {});\n *\n * export const proxy = paymentProxy(routes, server, paywallConfig);\n * ```\n */\nexport function paymentProxy(\n routes: RoutesConfig,\n server: x402ResourceServer,\n paywallConfig?: PaywallConfig,\n paywall?: PaywallProvider,\n syncFacilitatorOnStart: boolean = true,\n) {\n const { httpServer, init } = createHttpServer(routes, server, paywall, syncFacilitatorOnStart);\n\n // Dynamically register bazaar extension if routes declare it\n let bazaarPromise: Promise<void> | null = null;\n if (checkIfBazaarNeeded(routes)) {\n bazaarPromise = import(/* webpackIgnore: true */ \"@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: NextRequest) => {\n const context = createRequestContext(req);\n\n // Check if route requires payment before initializing facilitator\n if (!httpServer.requiresPayment(context)) {\n return NextResponse.next();\n }\n\n // Only initialize when processing a protected route\n await init();\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 NextResponse.next();\n\n case \"payment-error\":\n return handlePaymentError(result.response);\n\n case \"payment-verified\": {\n // Payment is valid, need to wrap response for settlement\n const { paymentPayload, paymentRequirements } = result;\n\n // Proceed to the next proxy or route handler\n const nextResponse = NextResponse.next();\n return handleSettlement(httpServer, nextResponse, paymentPayload, paymentRequirements);\n }\n }\n };\n}\n\n/**\n * Next.js payment proxy for x402 protocol (configuration-based).\n *\n * Use this when you want to quickly set up proxy 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 Next.js proxy handler\n *\n * @example\n * ```typescript\n * import { paymentProxyFromConfig } from \"@x402/next\";\n *\n * export const proxy = paymentProxyFromConfig(\n * routes,\n * myFacilitatorClient,\n * [{ network: \"eip155:8453\", server: evmSchemeServer }],\n * paywallConfig\n * );\n * ```\n */\nexport function paymentProxyFromConfig(\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 paymentProxy with the configured server\n // Note: paymentProxy handles dynamic bazaar registration\n return paymentProxy(routes, ResourceServer, paywallConfig, paywall, syncFacilitatorOnStart);\n}\n\n/**\n * Wraps a Next.js App Router API route handler with x402 payment protection.\n *\n * Unlike `paymentProxy` which works as middleware, `withX402` wraps individual route handlers\n * and guarantees that payment settlement only occurs after the handler returns a successful\n * response (status < 400). This provides more precise control over when payments are settled.\n *\n * @param routeHandler - The API route handler function to wrap\n * @param routeConfig - Payment configuration for this specific route\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 A wrapped Next.js route handler\n *\n * @example\n * ```typescript\n * import { NextRequest, NextResponse } from \"next/server\";\n * import { withX402 } from \"@x402/next\";\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, {});\n *\n * const handler = async (request: NextRequest) => {\n * return NextResponse.json({ data: \"protected content\" });\n * };\n *\n * export const GET = withX402(\n * handler,\n * {\n * accepts: {\n * scheme: \"exact\",\n * payTo: \"0x123...\",\n * price: \"$0.01\",\n * network: \"eip155:84532\",\n * },\n * description: \"Access to protected API\",\n * },\n * server,\n * );\n * ```\n */\nexport function withX402<T = unknown>(\n routeHandler: (request: NextRequest) => Promise<NextResponse<T>>,\n routeConfig: RouteConfig,\n server: x402ResourceServer,\n paywallConfig?: PaywallConfig,\n paywall?: PaywallProvider,\n syncFacilitatorOnStart: boolean = true,\n): (request: NextRequest) => Promise<NextResponse<T>> {\n const routes = { \"*\": routeConfig };\n const { httpServer, init } = createHttpServer(routes, server, paywall, syncFacilitatorOnStart);\n\n // Dynamically register bazaar extension if route declares it\n let bazaarPromise: Promise<void> | null = null;\n if (checkIfBazaarNeeded(routes)) {\n bazaarPromise = import(/* webpackIgnore: true */ \"@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 (request: NextRequest): Promise<NextResponse<T>> => {\n await init();\n\n // Await bazaar extension loading if needed\n if (bazaarPromise) {\n await bazaarPromise;\n bazaarPromise = null;\n }\n\n const context = createRequestContext(request);\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 routeHandler(request);\n\n case \"payment-error\":\n return handlePaymentError(result.response) as NextResponse<T>;\n\n case \"payment-verified\": {\n // Payment is valid, need to wrap response for settlement\n const { paymentPayload, paymentRequirements } = result;\n const handlerResponse = await routeHandler(request);\n return handleSettlement(\n httpServer,\n handlerResponse,\n paymentPayload,\n paymentRequirements,\n ) as Promise<NextResponse<T>>;\n }\n }\n };\n}\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\nexport type {\n PaymentRequired,\n PaymentRequirements,\n PaymentPayload,\n Network,\n SchemeNetworkServer,\n} from \"@x402/core/types\";\n\nexport type { PaywallProvider, PaywallConfig, RouteConfig } from \"@x402/core/server\";\n\nexport { RouteConfigurationError } from \"@x402/core/server\";\n\nexport type { RouteValidationError } from \"@x402/core/server\";\n\nexport { NextAdapter } from \"./adapter\";\n","import { NextRequest, NextResponse } from \"next/server\";\nimport {\n HTTPRequestContext,\n HTTPResponseInstructions,\n PaywallProvider,\n x402HTTPResourceServer,\n x402ResourceServer,\n RoutesConfig,\n} from \"@x402/core/server\";\nimport { PaymentPayload, PaymentRequirements } from \"@x402/core/types\";\nimport { NextAdapter } from \"./adapter\";\n\n/**\n * Result of createHttpServer\n */\nexport interface HttpServerInstance {\n httpServer: x402HTTPResourceServer;\n init: () => Promise<void>;\n}\n\n/**\n * Creates and configures the x402 HTTP server with initialization logic\n *\n * @param routes - The route configuration for the server\n * @param server - The x402 resource server instance\n * @param paywall - Optional paywall provider for custom payment UI\n * @param syncFacilitatorOnStart - Whether to sync with the facilitator on start (defaults to true)\n * @returns The HTTP server instance with initialization function\n */\nexport function createHttpServer(\n routes: RoutesConfig,\n server: x402ResourceServer,\n paywall?: PaywallProvider,\n syncFacilitatorOnStart: boolean = true,\n): HttpServerInstance {\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 return {\n httpServer,\n async init() {\n // Ensure initialization completes before processing\n if (initPromise) {\n await initPromise;\n initPromise = null; // Clear after first await\n }\n },\n };\n}\n\n/**\n * Creates HTTP request context from a Next.js request\n *\n * @param request - The Next.js request object\n * @returns The HTTP request context for x402 processing\n */\nexport function createRequestContext(request: NextRequest): HTTPRequestContext {\n // Create adapter and context\n const adapter = new NextAdapter(request);\n return {\n adapter,\n path: request.nextUrl.pathname,\n method: request.method,\n paymentHeader: adapter.getHeader(\"payment-signature\") || adapter.getHeader(\"x-payment\"),\n };\n}\n\n/**\n * Handles payment error result by creating a 402 response\n *\n * @param response - The HTTP response instructions from payment verification\n * @returns A Next.js response with the appropriate 402 status and headers\n */\nexport function handlePaymentError(response: HTTPResponseInstructions): NextResponse {\n // Payment required but not provided or invalid\n const headers = new Headers(response.headers);\n if (response.isHtml) {\n headers.set(\"Content-Type\", \"text/html\");\n return new NextResponse(response.body as string, {\n status: response.status,\n headers,\n });\n }\n headers.set(\"Content-Type\", \"application/json\");\n return new NextResponse(JSON.stringify(response.body || {}), {\n status: response.status,\n headers,\n });\n}\n\n/**\n * Handles settlement after a successful response\n *\n * @param httpServer - The x402 HTTP resource server instance\n * @param response - The Next.js response from the protected route\n * @param paymentPayload - The payment payload from the client\n * @param paymentRequirements - The payment requirements for the route\n * @returns The response with settlement headers or an error response if settlement fails\n */\nexport async function handleSettlement(\n httpServer: x402HTTPResourceServer,\n response: NextResponse,\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n): Promise<NextResponse> {\n // If the response from the protected route is >= 400, do not settle payment\n if (response.status >= 400) {\n return response;\n }\n\n try {\n const result = await httpServer.processSettlement(paymentPayload, paymentRequirements);\n\n if (!result.success) {\n // Settlement failed - do not return the protected resource\n return new NextResponse(\n JSON.stringify({\n error: \"Settlement failed\",\n details: result.errorReason,\n }),\n {\n status: 402,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n\n // Settlement succeeded - add headers and return original response\n Object.entries(result.headers).forEach(([key, value]) => {\n response.headers.set(key, value);\n });\n\n return response;\n } catch (error) {\n console.error(\"Settlement failed:\", error);\n // If settlement fails, return an error response\n return new NextResponse(\n JSON.stringify({\n error: \"Settlement failed\",\n details: error instanceof Error ? error.message : \"Unknown error\",\n }),\n {\n status: 402,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n}\n","import { HTTPAdapter } from \"@x402/core/server\";\nimport { NextRequest } from \"next/server\";\n\n/**\n * Next.js adapter implementation\n */\nexport class NextAdapter implements HTTPAdapter {\n /**\n * Creates a new NextAdapter instance.\n *\n * @param req - The Next.js request object\n */\n constructor(private req: NextRequest) {}\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 return this.req.headers.get(name) || undefined;\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.nextUrl.pathname;\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.url;\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.headers.get(\"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.headers.get(\"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 const params: Record<string, string | string[]> = {};\n this.req.nextUrl.searchParams.forEach((value, key) => {\n const existing = params[key];\n if (existing) {\n if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n params[key] = [existing, value];\n }\n } else {\n params[key] = value;\n }\n });\n return params;\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 all = this.req.nextUrl.searchParams.getAll(name);\n if (all.length === 0) return undefined;\n if (all.length === 1) return all[0];\n return all;\n }\n\n /**\n * Gets the parsed request body.\n *\n * @returns Promise resolving to the parsed request body\n */\n async getBody(): Promise<unknown> {\n try {\n return await this.req.json();\n } catch {\n return undefined;\n }\n }\n}\n"],"mappings":"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","names":["import_server","import_server","import_server"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/utils.ts","../../src/adapter.ts"],"sourcesContent":["import {\n PaywallConfig,\n PaywallProvider,\n x402ResourceServer,\n RoutesConfig,\n RouteConfig,\n FacilitatorClient,\n} from \"@x402/core/server\";\nimport { SchemeNetworkServer, Network } from \"@x402/core/types\";\nimport { NextRequest, NextResponse } from \"next/server\";\nimport {\n prepareHttpServer,\n createRequestContext,\n handlePaymentError,\n handleSettlement,\n} from \"./utils\";\nimport { x402HTTPResourceServer } from \"@x402/core/server\";\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 * Next.js payment proxy for x402 protocol (direct HTTP server instance).\n *\n * Use this when you need to configure HTTP-level hooks.\n *\n * @param httpServer - Pre-configured x402HTTPResourceServer 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 Next.js proxy handler\n *\n * @example\n * ```typescript\n * import { paymentProxyFromHTTPServer, x402ResourceServer, x402HTTPResourceServer } from \"@x402/next\";\n *\n * const resourceServer = new x402ResourceServer(facilitatorClient)\n * .register(NETWORK, new ExactEvmScheme());\n *\n * const httpServer = new x402HTTPResourceServer(resourceServer, routes)\n * .onProtectedRequest(requestHook);\n *\n * export const proxy = paymentProxyFromHTTPServer(httpServer);\n * ```\n */\nexport function paymentProxyFromHTTPServer(\n httpServer: x402HTTPResourceServer,\n paywallConfig?: PaywallConfig,\n paywall?: PaywallProvider,\n syncFacilitatorOnStart: boolean = true,\n) {\n const { init } = prepareHttpServer(httpServer, paywall, syncFacilitatorOnStart);\n\n // Dynamically register bazaar extension if routes declare it and not already registered\n // Skip if pre-registered (e.g., in serverless environments where static imports are used)\n let bazaarPromise: Promise<void> | null = null;\n if (checkIfBazaarNeeded(httpServer.routes) && !httpServer.server.hasExtension(\"bazaar\")) {\n bazaarPromise = import(/* webpackIgnore: true */ \"@x402/extensions/bazaar\")\n .then(({ bazaarResourceServerExtension }) => {\n httpServer.server.registerExtension(bazaarResourceServerExtension);\n })\n .catch(err => {\n console.error(\"Failed to load bazaar extension:\", err);\n });\n }\n\n return async (req: NextRequest) => {\n const context = createRequestContext(req);\n\n // Check if route requires payment before initializing facilitator\n if (!httpServer.requiresPayment(context)) {\n return NextResponse.next();\n }\n\n // Only initialize when processing a protected route\n await init();\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 NextResponse.next();\n\n case \"payment-error\":\n return handlePaymentError(result.response);\n\n case \"payment-verified\": {\n // Payment is valid, need to wrap response for settlement\n const { paymentPayload, paymentRequirements, declaredExtensions } = result;\n\n // Proceed to the next proxy or route handler\n const nextResponse = NextResponse.next();\n return handleSettlement(\n httpServer,\n nextResponse,\n paymentPayload,\n paymentRequirements,\n declaredExtensions,\n );\n }\n }\n };\n}\n\n/**\n * Next.js payment proxy 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 proxies.\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 Next.js proxy handler\n *\n * @example\n * ```typescript\n * import { paymentProxy } from \"@x402/next\";\n *\n * const server = new x402ResourceServer(myFacilitatorClient)\n * .register(NETWORK, new ExactEvmScheme());\n *\n * export const proxy = paymentProxy(routes, server, paywallConfig);\n * ```\n */\nexport function paymentProxy(\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 return paymentProxyFromHTTPServer(httpServer, paywallConfig, paywall, syncFacilitatorOnStart);\n}\n\n/**\n * Next.js payment proxy for x402 protocol (configuration-based).\n *\n * Use this when you want to quickly set up proxy 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 Next.js proxy handler\n *\n * @example\n * ```typescript\n * import { paymentProxyFromConfig } from \"@x402/next\";\n *\n * export const proxy = paymentProxyFromConfig(\n * routes,\n * myFacilitatorClient,\n * [{ network: \"eip155:8453\", server: evmSchemeServer }],\n * paywallConfig\n * );\n * ```\n */\nexport function paymentProxyFromConfig(\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 paymentProxy with the configured server\n // Note: paymentProxy handles dynamic bazaar registration\n return paymentProxy(routes, ResourceServer, paywallConfig, paywall, syncFacilitatorOnStart);\n}\n\n/**\n * Wraps a Next.js App Router API route handler with x402 payment protection (HTTP server instance).\n *\n * Use this when you need to configure HTTP-level hooks.\n *\n * @param routeHandler - The API route handler function to wrap\n * @param httpServer - Pre-configured x402HTTPResourceServer 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 A wrapped Next.js route handler\n *\n * @example\n * ```typescript\n * import { NextRequest, NextResponse } from \"next/server\";\n * import { withX402FromHTTPServer, x402ResourceServer, x402HTTPResourceServer } from \"@x402/next\";\n *\n * const resourceServer = new x402ResourceServer(facilitatorClient)\n * .register(NETWORK, new ExactEvmScheme());\n *\n * const httpServer = new x402HTTPResourceServer(resourceServer, { \"*\": routeConfig })\n * .onProtectedRequest(requestHook);\n *\n * const handler = async (request: NextRequest) => {\n * return NextResponse.json({ data: \"protected content\" });\n * };\n *\n * export const GET = withX402FromHTTPServer(handler, httpServer);\n * ```\n */\nexport function withX402FromHTTPServer<T = unknown>(\n routeHandler: (request: NextRequest) => Promise<NextResponse<T>>,\n httpServer: x402HTTPResourceServer,\n paywallConfig?: PaywallConfig,\n paywall?: PaywallProvider,\n syncFacilitatorOnStart: boolean = true,\n): (request: NextRequest) => Promise<NextResponse<T>> {\n const { init } = prepareHttpServer(httpServer, paywall, syncFacilitatorOnStart);\n\n // Dynamically register bazaar extension if route declares it and not already registered\n // Skip if pre-registered (e.g., in serverless environments where static imports are used)\n let bazaarPromise: Promise<void> | null = null;\n if (checkIfBazaarNeeded(httpServer.routes) && !httpServer.server.hasExtension(\"bazaar\")) {\n bazaarPromise = import(/* webpackIgnore: true */ \"@x402/extensions/bazaar\")\n .then(({ bazaarResourceServerExtension }) => {\n httpServer.server.registerExtension(bazaarResourceServerExtension);\n })\n .catch(err => {\n console.error(\"Failed to load bazaar extension:\", err);\n });\n }\n\n return async (request: NextRequest): Promise<NextResponse<T>> => {\n // Only initialize when processing a protected route\n await init();\n\n // Await bazaar extension loading if needed\n if (bazaarPromise) {\n await bazaarPromise;\n bazaarPromise = null;\n }\n\n const context = createRequestContext(request);\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 routeHandler(request);\n\n case \"payment-error\":\n return handlePaymentError(result.response) as NextResponse<T>;\n\n case \"payment-verified\": {\n // Payment is valid, need to wrap response for settlement\n const { paymentPayload, paymentRequirements, declaredExtensions } = result;\n const handlerResponse = await routeHandler(request);\n return handleSettlement(\n httpServer,\n handlerResponse,\n paymentPayload,\n paymentRequirements,\n declaredExtensions,\n ) as Promise<NextResponse<T>>;\n }\n }\n };\n}\n\n/**\n * Wraps a Next.js App Router API route handler with x402 payment protection.\n *\n * Unlike `paymentProxy` which works as middleware, `withX402` wraps individual route handlers\n * and guarantees that payment settlement only occurs after the handler returns a successful\n * response (status < 400). This provides more precise control over when payments are settled.\n *\n * @param routeHandler - The API route handler function to wrap\n * @param routeConfig - Payment configuration for this specific route\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 A wrapped Next.js route handler\n *\n * @example\n * ```typescript\n * import { NextRequest, NextResponse } from \"next/server\";\n * import { withX402 } from \"@x402/next\";\n *\n * const server = new x402ResourceServer(myFacilitatorClient)\n * .register(NETWORK, new ExactEvmScheme());\n *\n * const handler = async (request: NextRequest) => {\n * return NextResponse.json({ data: \"protected content\" });\n * };\n *\n * export const GET = withX402(\n * handler,\n * {\n * accepts: {\n * scheme: \"exact\",\n * payTo: \"0x123...\",\n * price: \"$0.01\",\n * network: \"eip155:84532\",\n * },\n * description: \"Access to protected API\",\n * },\n * server,\n * );\n * ```\n */\nexport function withX402<T = unknown>(\n routeHandler: (request: NextRequest) => Promise<NextResponse<T>>,\n routeConfig: RouteConfig,\n server: x402ResourceServer,\n paywallConfig?: PaywallConfig,\n paywall?: PaywallProvider,\n syncFacilitatorOnStart: boolean = true,\n): (request: NextRequest) => Promise<NextResponse<T>> {\n const routes = { \"*\": routeConfig };\n // Create the x402 HTTP server instance with the resource server\n const httpServer = new x402HTTPResourceServer(server, routes);\n\n return withX402FromHTTPServer(\n routeHandler,\n httpServer,\n paywallConfig,\n paywall,\n syncFacilitatorOnStart,\n );\n}\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\nexport type {\n PaymentRequired,\n PaymentRequirements,\n PaymentPayload,\n Network,\n SchemeNetworkServer,\n} from \"@x402/core/types\";\n\nexport type { PaywallProvider, PaywallConfig, RouteConfig } from \"@x402/core/server\";\n\nexport {\n x402ResourceServer,\n x402HTTPResourceServer,\n RouteConfigurationError,\n} from \"@x402/core/server\";\n\nexport type { RouteValidationError } from \"@x402/core/server\";\n\nexport { NextAdapter } from \"./adapter\";\n","import { NextRequest, NextResponse } from \"next/server\";\nimport {\n HTTPRequestContext,\n HTTPResponseInstructions,\n PaywallProvider,\n x402HTTPResourceServer,\n x402ResourceServer,\n RoutesConfig,\n} from \"@x402/core/server\";\nimport { PaymentPayload, PaymentRequirements } from \"@x402/core/types\";\nimport { NextAdapter } from \"./adapter\";\n\n/**\n * Result of createHttpServer\n */\nexport interface HttpServerInstance {\n httpServer: x402HTTPResourceServer;\n init: () => Promise<void>;\n}\n\n/**\n * Prepares an existing x402HTTPResourceServer with initialization logic\n *\n * @param httpServer - Pre-configured x402HTTPResourceServer instance\n * @param paywall - Optional paywall provider for custom payment UI\n * @param syncFacilitatorOnStart - Whether to sync with the facilitator on start (defaults to true)\n * @returns The HTTP server instance with initialization function\n */\nexport function prepareHttpServer(\n httpServer: x402HTTPResourceServer,\n paywall?: PaywallProvider,\n syncFacilitatorOnStart: boolean = true,\n): HttpServerInstance {\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 return {\n httpServer,\n async init() {\n // Ensure initialization completes before processing\n if (initPromise) {\n await initPromise;\n initPromise = null; // Clear after first await\n }\n },\n };\n}\n\n/**\n * Creates and configures the x402 HTTP server with initialization logic\n *\n * @param routes - The route configuration for the server\n * @param server - The x402 resource server instance\n * @param paywall - Optional paywall provider for custom payment UI\n * @param syncFacilitatorOnStart - Whether to sync with the facilitator on start (defaults to true)\n * @returns The HTTP server instance with initialization function\n */\nexport function createHttpServer(\n routes: RoutesConfig,\n server: x402ResourceServer,\n paywall?: PaywallProvider,\n syncFacilitatorOnStart: boolean = true,\n): HttpServerInstance {\n // Create the x402 HTTP server instance with the resource server\n const httpServer = new x402HTTPResourceServer(server, routes);\n\n return prepareHttpServer(httpServer, paywall, syncFacilitatorOnStart);\n}\n\n/**\n * Creates HTTP request context from a Next.js request\n *\n * @param request - The Next.js request object\n * @returns The HTTP request context for x402 processing\n */\nexport function createRequestContext(request: NextRequest): HTTPRequestContext {\n // Create adapter and context\n const adapter = new NextAdapter(request);\n return {\n adapter,\n path: request.nextUrl.pathname,\n method: request.method,\n paymentHeader: adapter.getHeader(\"payment-signature\") || adapter.getHeader(\"x-payment\"),\n };\n}\n\n/**\n * Handles payment error result by creating a 402 response\n *\n * @param response - The HTTP response instructions from payment verification\n * @returns A Next.js response with the appropriate 402 status and headers\n */\nexport function handlePaymentError(response: HTTPResponseInstructions): NextResponse {\n // Payment required but not provided or invalid\n const headers = new Headers(response.headers);\n if (response.isHtml) {\n headers.set(\"Content-Type\", \"text/html\");\n return new NextResponse(response.body as string, {\n status: response.status,\n headers,\n });\n }\n headers.set(\"Content-Type\", \"application/json\");\n return new NextResponse(JSON.stringify(response.body || {}), {\n status: response.status,\n headers,\n });\n}\n\n/**\n * Handles settlement after a successful response\n *\n * @param httpServer - The x402 HTTP resource server instance\n * @param response - The Next.js response from the protected route\n * @param paymentPayload - The payment payload from the client\n * @param paymentRequirements - The payment requirements for the route\n * @param declaredExtensions - Optional declared extensions (for per-key enrichment)\n * @returns The response with settlement headers or an error response if settlement fails\n */\nexport async function handleSettlement(\n httpServer: x402HTTPResourceServer,\n response: NextResponse,\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n declaredExtensions?: Record<string, unknown>,\n): Promise<NextResponse> {\n // If the response from the protected route is >= 400, do not settle payment\n if (response.status >= 400) {\n return response;\n }\n\n try {\n const result = await httpServer.processSettlement(\n paymentPayload,\n paymentRequirements,\n declaredExtensions,\n );\n\n if (!result.success) {\n // Settlement failed - do not return the protected resource\n return new NextResponse(\n JSON.stringify({\n error: \"Settlement failed\",\n details: result.errorReason,\n }),\n {\n status: 402,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n\n // Settlement succeeded - add headers and return original response\n Object.entries(result.headers).forEach(([key, value]) => {\n response.headers.set(key, value);\n });\n\n return response;\n } catch (error) {\n console.error(\"Settlement failed:\", error);\n // If settlement fails, return an error response\n return new NextResponse(\n JSON.stringify({\n error: \"Settlement failed\",\n details: error instanceof Error ? error.message : \"Unknown error\",\n }),\n {\n status: 402,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n}\n","import { HTTPAdapter } from \"@x402/core/server\";\nimport { NextRequest } from \"next/server\";\n\n/**\n * Next.js adapter implementation\n */\nexport class NextAdapter implements HTTPAdapter {\n /**\n * Creates a new NextAdapter instance.\n *\n * @param req - The Next.js request object\n */\n constructor(private req: NextRequest) {}\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 return this.req.headers.get(name) || undefined;\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.nextUrl.pathname;\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.url;\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.headers.get(\"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.headers.get(\"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 const params: Record<string, string | string[]> = {};\n this.req.nextUrl.searchParams.forEach((value, key) => {\n const existing = params[key];\n if (existing) {\n if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n params[key] = [existing, value];\n }\n } else {\n params[key] = value;\n }\n });\n return params;\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 all = this.req.nextUrl.searchParams.getAll(name);\n if (all.length === 0) return undefined;\n if (all.length === 1) return all[0];\n return all;\n }\n\n /**\n * Gets the parsed request body.\n *\n * @returns Promise resolving to the parsed request body\n */\n async getBody(): Promise<unknown> {\n try {\n return await this.req.json();\n } catch {\n return undefined;\n }\n }\n}\n"],"mappings":"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","names":["import_server","import_server","import_server"]}
@@ -1,5 +1,5 @@
1
- import { HTTPAdapter, RoutesConfig, x402ResourceServer, PaywallConfig, PaywallProvider, FacilitatorClient, RouteConfig } from '@x402/core/server';
2
- export { PaywallConfig, PaywallProvider, RouteConfig, RouteConfigurationError, RouteValidationError } from '@x402/core/server';
1
+ import { HTTPAdapter, RoutesConfig, x402ResourceServer, PaywallConfig, PaywallProvider, FacilitatorClient, x402HTTPResourceServer, RouteConfig } from '@x402/core/server';
2
+ export { PaywallConfig, PaywallProvider, RouteConfig, RouteConfigurationError, RouteValidationError, x402HTTPResourceServer, x402ResourceServer } from '@x402/core/server';
3
3
  import { Network, SchemeNetworkServer } from '@x402/core/types';
4
4
  export { Network, PaymentPayload, PaymentRequired, PaymentRequirements, SchemeNetworkServer } from '@x402/core/types';
5
5
  import { NextRequest, NextResponse } from 'next/server';
@@ -86,6 +86,31 @@ interface SchemeRegistration {
86
86
  */
87
87
  server: SchemeNetworkServer;
88
88
  }
89
+ /**
90
+ * Next.js payment proxy for x402 protocol (direct HTTP server instance).
91
+ *
92
+ * Use this when you need to configure HTTP-level hooks.
93
+ *
94
+ * @param httpServer - Pre-configured x402HTTPResourceServer instance
95
+ * @param paywallConfig - Optional configuration for the built-in paywall UI
96
+ * @param paywall - Optional custom paywall provider (overrides default)
97
+ * @param syncFacilitatorOnStart - Whether to sync with the facilitator on startup (defaults to true)
98
+ * @returns Next.js proxy handler
99
+ *
100
+ * @example
101
+ * ```typescript
102
+ * import { paymentProxyFromHTTPServer, x402ResourceServer, x402HTTPResourceServer } from "@x402/next";
103
+ *
104
+ * const resourceServer = new x402ResourceServer(facilitatorClient)
105
+ * .register(NETWORK, new ExactEvmScheme());
106
+ *
107
+ * const httpServer = new x402HTTPResourceServer(resourceServer, routes)
108
+ * .onProtectedRequest(requestHook);
109
+ *
110
+ * export const proxy = paymentProxyFromHTTPServer(httpServer);
111
+ * ```
112
+ */
113
+ declare function paymentProxyFromHTTPServer(httpServer: x402HTTPResourceServer, paywallConfig?: PaywallConfig, paywall?: PaywallProvider, syncFacilitatorOnStart?: boolean): (req: NextRequest) => Promise<NextResponse<unknown>>;
89
114
  /**
90
115
  * Next.js payment proxy for x402 protocol (direct server instance).
91
116
  *
@@ -103,11 +128,9 @@ interface SchemeRegistration {
103
128
  * @example
104
129
  * ```typescript
105
130
  * import { paymentProxy } from "@x402/next";
106
- * import { x402ResourceServer } from "@x402/core/server";
107
- * import { registerExactEvmScheme } from "@x402/evm/exact/server";
108
131
  *
109
- * const server = new x402ResourceServer(myFacilitatorClient);
110
- * registerExactEvmScheme(server, {});
132
+ * const server = new x402ResourceServer(myFacilitatorClient)
133
+ * .register(NETWORK, new ExactEvmScheme());
111
134
  *
112
135
  * export const proxy = paymentProxy(routes, server, paywallConfig);
113
136
  * ```
@@ -140,6 +163,37 @@ declare function paymentProxy(routes: RoutesConfig, server: x402ResourceServer,
140
163
  * ```
141
164
  */
142
165
  declare function paymentProxyFromConfig(routes: RoutesConfig, facilitatorClients?: FacilitatorClient | FacilitatorClient[], schemes?: SchemeRegistration[], paywallConfig?: PaywallConfig, paywall?: PaywallProvider, syncFacilitatorOnStart?: boolean): (req: NextRequest) => Promise<NextResponse<unknown>>;
166
+ /**
167
+ * Wraps a Next.js App Router API route handler with x402 payment protection (HTTP server instance).
168
+ *
169
+ * Use this when you need to configure HTTP-level hooks.
170
+ *
171
+ * @param routeHandler - The API route handler function to wrap
172
+ * @param httpServer - Pre-configured x402HTTPResourceServer instance
173
+ * @param paywallConfig - Optional configuration for the built-in paywall UI
174
+ * @param paywall - Optional custom paywall provider (overrides default)
175
+ * @param syncFacilitatorOnStart - Whether to sync with the facilitator on startup (defaults to true)
176
+ * @returns A wrapped Next.js route handler
177
+ *
178
+ * @example
179
+ * ```typescript
180
+ * import { NextRequest, NextResponse } from "next/server";
181
+ * import { withX402FromHTTPServer, x402ResourceServer, x402HTTPResourceServer } from "@x402/next";
182
+ *
183
+ * const resourceServer = new x402ResourceServer(facilitatorClient)
184
+ * .register(NETWORK, new ExactEvmScheme());
185
+ *
186
+ * const httpServer = new x402HTTPResourceServer(resourceServer, { "*": routeConfig })
187
+ * .onProtectedRequest(requestHook);
188
+ *
189
+ * const handler = async (request: NextRequest) => {
190
+ * return NextResponse.json({ data: "protected content" });
191
+ * };
192
+ *
193
+ * export const GET = withX402FromHTTPServer(handler, httpServer);
194
+ * ```
195
+ */
196
+ declare function withX402FromHTTPServer<T = unknown>(routeHandler: (request: NextRequest) => Promise<NextResponse<T>>, httpServer: x402HTTPResourceServer, paywallConfig?: PaywallConfig, paywall?: PaywallProvider, syncFacilitatorOnStart?: boolean): (request: NextRequest) => Promise<NextResponse<T>>;
143
197
  /**
144
198
  * Wraps a Next.js App Router API route handler with x402 payment protection.
145
199
  *
@@ -159,11 +213,9 @@ declare function paymentProxyFromConfig(routes: RoutesConfig, facilitatorClients
159
213
  * ```typescript
160
214
  * import { NextRequest, NextResponse } from "next/server";
161
215
  * import { withX402 } from "@x402/next";
162
- * import { x402ResourceServer } from "@x402/core/server";
163
- * import { registerExactEvmScheme } from "@x402/evm/exact/server";
164
216
  *
165
- * const server = new x402ResourceServer(myFacilitatorClient);
166
- * registerExactEvmScheme(server, {});
217
+ * const server = new x402ResourceServer(myFacilitatorClient)
218
+ * .register(NETWORK, new ExactEvmScheme());
167
219
  *
168
220
  * const handler = async (request: NextRequest) => {
169
221
  * return NextResponse.json({ data: "protected content" });
@@ -186,4 +238,4 @@ declare function paymentProxyFromConfig(routes: RoutesConfig, facilitatorClients
186
238
  */
187
239
  declare function withX402<T = unknown>(routeHandler: (request: NextRequest) => Promise<NextResponse<T>>, routeConfig: RouteConfig, server: x402ResourceServer, paywallConfig?: PaywallConfig, paywall?: PaywallProvider, syncFacilitatorOnStart?: boolean): (request: NextRequest) => Promise<NextResponse<T>>;
188
240
 
189
- export { NextAdapter, type SchemeRegistration, paymentProxy, paymentProxyFromConfig, withX402 };
241
+ export { NextAdapter, type SchemeRegistration, paymentProxy, paymentProxyFromConfig, paymentProxyFromHTTPServer, withX402, withX402FromHTTPServer };
@@ -1,5 +1,5 @@
1
- import { HTTPAdapter, RoutesConfig, x402ResourceServer, PaywallConfig, PaywallProvider, FacilitatorClient, RouteConfig } from '@x402/core/server';
2
- export { PaywallConfig, PaywallProvider, RouteConfig, RouteConfigurationError, RouteValidationError } from '@x402/core/server';
1
+ import { HTTPAdapter, RoutesConfig, x402ResourceServer, PaywallConfig, PaywallProvider, FacilitatorClient, x402HTTPResourceServer, RouteConfig } from '@x402/core/server';
2
+ export { PaywallConfig, PaywallProvider, RouteConfig, RouteConfigurationError, RouteValidationError, x402HTTPResourceServer, x402ResourceServer } from '@x402/core/server';
3
3
  import { Network, SchemeNetworkServer } from '@x402/core/types';
4
4
  export { Network, PaymentPayload, PaymentRequired, PaymentRequirements, SchemeNetworkServer } from '@x402/core/types';
5
5
  import { NextRequest, NextResponse } from 'next/server';
@@ -86,6 +86,31 @@ interface SchemeRegistration {
86
86
  */
87
87
  server: SchemeNetworkServer;
88
88
  }
89
+ /**
90
+ * Next.js payment proxy for x402 protocol (direct HTTP server instance).
91
+ *
92
+ * Use this when you need to configure HTTP-level hooks.
93
+ *
94
+ * @param httpServer - Pre-configured x402HTTPResourceServer instance
95
+ * @param paywallConfig - Optional configuration for the built-in paywall UI
96
+ * @param paywall - Optional custom paywall provider (overrides default)
97
+ * @param syncFacilitatorOnStart - Whether to sync with the facilitator on startup (defaults to true)
98
+ * @returns Next.js proxy handler
99
+ *
100
+ * @example
101
+ * ```typescript
102
+ * import { paymentProxyFromHTTPServer, x402ResourceServer, x402HTTPResourceServer } from "@x402/next";
103
+ *
104
+ * const resourceServer = new x402ResourceServer(facilitatorClient)
105
+ * .register(NETWORK, new ExactEvmScheme());
106
+ *
107
+ * const httpServer = new x402HTTPResourceServer(resourceServer, routes)
108
+ * .onProtectedRequest(requestHook);
109
+ *
110
+ * export const proxy = paymentProxyFromHTTPServer(httpServer);
111
+ * ```
112
+ */
113
+ declare function paymentProxyFromHTTPServer(httpServer: x402HTTPResourceServer, paywallConfig?: PaywallConfig, paywall?: PaywallProvider, syncFacilitatorOnStart?: boolean): (req: NextRequest) => Promise<NextResponse<unknown>>;
89
114
  /**
90
115
  * Next.js payment proxy for x402 protocol (direct server instance).
91
116
  *
@@ -103,11 +128,9 @@ interface SchemeRegistration {
103
128
  * @example
104
129
  * ```typescript
105
130
  * import { paymentProxy } from "@x402/next";
106
- * import { x402ResourceServer } from "@x402/core/server";
107
- * import { registerExactEvmScheme } from "@x402/evm/exact/server";
108
131
  *
109
- * const server = new x402ResourceServer(myFacilitatorClient);
110
- * registerExactEvmScheme(server, {});
132
+ * const server = new x402ResourceServer(myFacilitatorClient)
133
+ * .register(NETWORK, new ExactEvmScheme());
111
134
  *
112
135
  * export const proxy = paymentProxy(routes, server, paywallConfig);
113
136
  * ```
@@ -140,6 +163,37 @@ declare function paymentProxy(routes: RoutesConfig, server: x402ResourceServer,
140
163
  * ```
141
164
  */
142
165
  declare function paymentProxyFromConfig(routes: RoutesConfig, facilitatorClients?: FacilitatorClient | FacilitatorClient[], schemes?: SchemeRegistration[], paywallConfig?: PaywallConfig, paywall?: PaywallProvider, syncFacilitatorOnStart?: boolean): (req: NextRequest) => Promise<NextResponse<unknown>>;
166
+ /**
167
+ * Wraps a Next.js App Router API route handler with x402 payment protection (HTTP server instance).
168
+ *
169
+ * Use this when you need to configure HTTP-level hooks.
170
+ *
171
+ * @param routeHandler - The API route handler function to wrap
172
+ * @param httpServer - Pre-configured x402HTTPResourceServer instance
173
+ * @param paywallConfig - Optional configuration for the built-in paywall UI
174
+ * @param paywall - Optional custom paywall provider (overrides default)
175
+ * @param syncFacilitatorOnStart - Whether to sync with the facilitator on startup (defaults to true)
176
+ * @returns A wrapped Next.js route handler
177
+ *
178
+ * @example
179
+ * ```typescript
180
+ * import { NextRequest, NextResponse } from "next/server";
181
+ * import { withX402FromHTTPServer, x402ResourceServer, x402HTTPResourceServer } from "@x402/next";
182
+ *
183
+ * const resourceServer = new x402ResourceServer(facilitatorClient)
184
+ * .register(NETWORK, new ExactEvmScheme());
185
+ *
186
+ * const httpServer = new x402HTTPResourceServer(resourceServer, { "*": routeConfig })
187
+ * .onProtectedRequest(requestHook);
188
+ *
189
+ * const handler = async (request: NextRequest) => {
190
+ * return NextResponse.json({ data: "protected content" });
191
+ * };
192
+ *
193
+ * export const GET = withX402FromHTTPServer(handler, httpServer);
194
+ * ```
195
+ */
196
+ declare function withX402FromHTTPServer<T = unknown>(routeHandler: (request: NextRequest) => Promise<NextResponse<T>>, httpServer: x402HTTPResourceServer, paywallConfig?: PaywallConfig, paywall?: PaywallProvider, syncFacilitatorOnStart?: boolean): (request: NextRequest) => Promise<NextResponse<T>>;
143
197
  /**
144
198
  * Wraps a Next.js App Router API route handler with x402 payment protection.
145
199
  *
@@ -159,11 +213,9 @@ declare function paymentProxyFromConfig(routes: RoutesConfig, facilitatorClients
159
213
  * ```typescript
160
214
  * import { NextRequest, NextResponse } from "next/server";
161
215
  * import { withX402 } from "@x402/next";
162
- * import { x402ResourceServer } from "@x402/core/server";
163
- * import { registerExactEvmScheme } from "@x402/evm/exact/server";
164
216
  *
165
- * const server = new x402ResourceServer(myFacilitatorClient);
166
- * registerExactEvmScheme(server, {});
217
+ * const server = new x402ResourceServer(myFacilitatorClient)
218
+ * .register(NETWORK, new ExactEvmScheme());
167
219
  *
168
220
  * const handler = async (request: NextRequest) => {
169
221
  * return NextResponse.json({ data: "protected content" });
@@ -186,4 +238,4 @@ declare function paymentProxyFromConfig(routes: RoutesConfig, facilitatorClients
186
238
  */
187
239
  declare function withX402<T = unknown>(routeHandler: (request: NextRequest) => Promise<NextResponse<T>>, routeConfig: RouteConfig, server: x402ResourceServer, paywallConfig?: PaywallConfig, paywall?: PaywallProvider, syncFacilitatorOnStart?: boolean): (request: NextRequest) => Promise<NextResponse<T>>;
188
240
 
189
- export { NextAdapter, type SchemeRegistration, paymentProxy, paymentProxyFromConfig, withX402 };
241
+ export { NextAdapter, type SchemeRegistration, paymentProxy, paymentProxyFromConfig, paymentProxyFromHTTPServer, withX402, withX402FromHTTPServer };
package/dist/esm/index.js CHANGED
@@ -117,8 +117,7 @@ var NextAdapter = class {
117
117
  };
118
118
 
119
119
  // src/utils.ts
120
- function createHttpServer(routes, server, paywall, syncFacilitatorOnStart = true) {
121
- const httpServer = new x402HTTPResourceServer(server, routes);
120
+ function prepareHttpServer(httpServer, paywall, syncFacilitatorOnStart = true) {
122
121
  if (paywall) {
123
122
  httpServer.registerPaywallProvider(paywall);
124
123
  }
@@ -157,12 +156,16 @@ function handlePaymentError(response) {
157
156
  headers
158
157
  });
159
158
  }
160
- async function handleSettlement(httpServer, response, paymentPayload, paymentRequirements) {
159
+ async function handleSettlement(httpServer, response, paymentPayload, paymentRequirements, declaredExtensions) {
161
160
  if (response.status >= 400) {
162
161
  return response;
163
162
  }
164
163
  try {
165
- const result = await httpServer.processSettlement(paymentPayload, paymentRequirements);
164
+ const result = await httpServer.processSettlement(
165
+ paymentPayload,
166
+ paymentRequirements,
167
+ declaredExtensions
168
+ );
166
169
  if (!result.success) {
167
170
  return new NextResponse(
168
171
  JSON.stringify({
@@ -195,16 +198,21 @@ async function handleSettlement(httpServer, response, paymentPayload, paymentReq
195
198
  }
196
199
 
197
200
  // src/index.ts
198
- import { RouteConfigurationError } from "@x402/core/server";
199
- function paymentProxy(routes, server, paywallConfig, paywall, syncFacilitatorOnStart = true) {
200
- const { httpServer, init } = createHttpServer(routes, server, paywall, syncFacilitatorOnStart);
201
+ import { x402HTTPResourceServer as x402HTTPResourceServer2 } from "@x402/core/server";
202
+ import {
203
+ x402ResourceServer as x402ResourceServer3,
204
+ x402HTTPResourceServer as x402HTTPResourceServer3,
205
+ RouteConfigurationError
206
+ } from "@x402/core/server";
207
+ function paymentProxyFromHTTPServer(httpServer, paywallConfig, paywall, syncFacilitatorOnStart = true) {
208
+ const { init } = prepareHttpServer(httpServer, paywall, syncFacilitatorOnStart);
201
209
  let bazaarPromise = null;
202
- if (checkIfBazaarNeeded(routes)) {
210
+ if (checkIfBazaarNeeded(httpServer.routes) && !httpServer.server.hasExtension("bazaar")) {
203
211
  bazaarPromise = import(
204
212
  /* webpackIgnore: true */
205
213
  "@x402/extensions/bazaar"
206
214
  ).then(({ bazaarResourceServerExtension }) => {
207
- server.registerExtension(bazaarResourceServerExtension);
215
+ httpServer.server.registerExtension(bazaarResourceServerExtension);
208
216
  }).catch((err) => {
209
217
  console.error("Failed to load bazaar extension:", err);
210
218
  });
@@ -226,13 +234,23 @@ function paymentProxy(routes, server, paywallConfig, paywall, syncFacilitatorOnS
226
234
  case "payment-error":
227
235
  return handlePaymentError(result.response);
228
236
  case "payment-verified": {
229
- const { paymentPayload, paymentRequirements } = result;
237
+ const { paymentPayload, paymentRequirements, declaredExtensions } = result;
230
238
  const nextResponse = NextResponse2.next();
231
- return handleSettlement(httpServer, nextResponse, paymentPayload, paymentRequirements);
239
+ return handleSettlement(
240
+ httpServer,
241
+ nextResponse,
242
+ paymentPayload,
243
+ paymentRequirements,
244
+ declaredExtensions
245
+ );
232
246
  }
233
247
  }
234
248
  };
235
249
  }
250
+ function paymentProxy(routes, server, paywallConfig, paywall, syncFacilitatorOnStart = true) {
251
+ const httpServer = new x402HTTPResourceServer2(server, routes);
252
+ return paymentProxyFromHTTPServer(httpServer, paywallConfig, paywall, syncFacilitatorOnStart);
253
+ }
236
254
  function paymentProxyFromConfig(routes, facilitatorClients, schemes, paywallConfig, paywall, syncFacilitatorOnStart = true) {
237
255
  const ResourceServer = new x402ResourceServer2(facilitatorClients);
238
256
  if (schemes) {
@@ -242,16 +260,15 @@ function paymentProxyFromConfig(routes, facilitatorClients, schemes, paywallConf
242
260
  }
243
261
  return paymentProxy(routes, ResourceServer, paywallConfig, paywall, syncFacilitatorOnStart);
244
262
  }
245
- function withX402(routeHandler, routeConfig, server, paywallConfig, paywall, syncFacilitatorOnStart = true) {
246
- const routes = { "*": routeConfig };
247
- const { httpServer, init } = createHttpServer(routes, server, paywall, syncFacilitatorOnStart);
263
+ function withX402FromHTTPServer(routeHandler, httpServer, paywallConfig, paywall, syncFacilitatorOnStart = true) {
264
+ const { init } = prepareHttpServer(httpServer, paywall, syncFacilitatorOnStart);
248
265
  let bazaarPromise = null;
249
- if (checkIfBazaarNeeded(routes)) {
266
+ if (checkIfBazaarNeeded(httpServer.routes) && !httpServer.server.hasExtension("bazaar")) {
250
267
  bazaarPromise = import(
251
268
  /* webpackIgnore: true */
252
269
  "@x402/extensions/bazaar"
253
270
  ).then(({ bazaarResourceServerExtension }) => {
254
- server.registerExtension(bazaarResourceServerExtension);
271
+ httpServer.server.registerExtension(bazaarResourceServerExtension);
255
272
  }).catch((err) => {
256
273
  console.error("Failed to load bazaar extension:", err);
257
274
  });
@@ -270,18 +287,30 @@ function withX402(routeHandler, routeConfig, server, paywallConfig, paywall, syn
270
287
  case "payment-error":
271
288
  return handlePaymentError(result.response);
272
289
  case "payment-verified": {
273
- const { paymentPayload, paymentRequirements } = result;
290
+ const { paymentPayload, paymentRequirements, declaredExtensions } = result;
274
291
  const handlerResponse = await routeHandler(request);
275
292
  return handleSettlement(
276
293
  httpServer,
277
294
  handlerResponse,
278
295
  paymentPayload,
279
- paymentRequirements
296
+ paymentRequirements,
297
+ declaredExtensions
280
298
  );
281
299
  }
282
300
  }
283
301
  };
284
302
  }
303
+ function withX402(routeHandler, routeConfig, server, paywallConfig, paywall, syncFacilitatorOnStart = true) {
304
+ const routes = { "*": routeConfig };
305
+ const httpServer = new x402HTTPResourceServer2(server, routes);
306
+ return withX402FromHTTPServer(
307
+ routeHandler,
308
+ httpServer,
309
+ paywallConfig,
310
+ paywall,
311
+ syncFacilitatorOnStart
312
+ );
313
+ }
285
314
  function checkIfBazaarNeeded(routes) {
286
315
  if ("accepts" in routes) {
287
316
  return !!(routes.extensions && "bazaar" in routes.extensions);
@@ -295,6 +324,10 @@ export {
295
324
  RouteConfigurationError,
296
325
  paymentProxy,
297
326
  paymentProxyFromConfig,
298
- withX402
327
+ paymentProxyFromHTTPServer,
328
+ withX402,
329
+ withX402FromHTTPServer,
330
+ x402HTTPResourceServer3 as x402HTTPResourceServer,
331
+ x402ResourceServer3 as x402ResourceServer
299
332
  };
300
333
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/utils.ts","../../src/adapter.ts"],"sourcesContent":["import {\n PaywallConfig,\n PaywallProvider,\n x402ResourceServer,\n RoutesConfig,\n RouteConfig,\n FacilitatorClient,\n} from \"@x402/core/server\";\nimport { SchemeNetworkServer, Network } from \"@x402/core/types\";\nimport { NextRequest, NextResponse } from \"next/server\";\nimport {\n createHttpServer,\n createRequestContext,\n handlePaymentError,\n handleSettlement,\n} from \"./utils\";\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 * Next.js payment proxy 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 proxies.\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 Next.js proxy handler\n *\n * @example\n * ```typescript\n * import { paymentProxy } from \"@x402/next\";\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, {});\n *\n * export const proxy = paymentProxy(routes, server, paywallConfig);\n * ```\n */\nexport function paymentProxy(\n routes: RoutesConfig,\n server: x402ResourceServer,\n paywallConfig?: PaywallConfig,\n paywall?: PaywallProvider,\n syncFacilitatorOnStart: boolean = true,\n) {\n const { httpServer, init } = createHttpServer(routes, server, paywall, syncFacilitatorOnStart);\n\n // Dynamically register bazaar extension if routes declare it\n let bazaarPromise: Promise<void> | null = null;\n if (checkIfBazaarNeeded(routes)) {\n bazaarPromise = import(/* webpackIgnore: true */ \"@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: NextRequest) => {\n const context = createRequestContext(req);\n\n // Check if route requires payment before initializing facilitator\n if (!httpServer.requiresPayment(context)) {\n return NextResponse.next();\n }\n\n // Only initialize when processing a protected route\n await init();\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 NextResponse.next();\n\n case \"payment-error\":\n return handlePaymentError(result.response);\n\n case \"payment-verified\": {\n // Payment is valid, need to wrap response for settlement\n const { paymentPayload, paymentRequirements } = result;\n\n // Proceed to the next proxy or route handler\n const nextResponse = NextResponse.next();\n return handleSettlement(httpServer, nextResponse, paymentPayload, paymentRequirements);\n }\n }\n };\n}\n\n/**\n * Next.js payment proxy for x402 protocol (configuration-based).\n *\n * Use this when you want to quickly set up proxy 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 Next.js proxy handler\n *\n * @example\n * ```typescript\n * import { paymentProxyFromConfig } from \"@x402/next\";\n *\n * export const proxy = paymentProxyFromConfig(\n * routes,\n * myFacilitatorClient,\n * [{ network: \"eip155:8453\", server: evmSchemeServer }],\n * paywallConfig\n * );\n * ```\n */\nexport function paymentProxyFromConfig(\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 paymentProxy with the configured server\n // Note: paymentProxy handles dynamic bazaar registration\n return paymentProxy(routes, ResourceServer, paywallConfig, paywall, syncFacilitatorOnStart);\n}\n\n/**\n * Wraps a Next.js App Router API route handler with x402 payment protection.\n *\n * Unlike `paymentProxy` which works as middleware, `withX402` wraps individual route handlers\n * and guarantees that payment settlement only occurs after the handler returns a successful\n * response (status < 400). This provides more precise control over when payments are settled.\n *\n * @param routeHandler - The API route handler function to wrap\n * @param routeConfig - Payment configuration for this specific route\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 A wrapped Next.js route handler\n *\n * @example\n * ```typescript\n * import { NextRequest, NextResponse } from \"next/server\";\n * import { withX402 } from \"@x402/next\";\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, {});\n *\n * const handler = async (request: NextRequest) => {\n * return NextResponse.json({ data: \"protected content\" });\n * };\n *\n * export const GET = withX402(\n * handler,\n * {\n * accepts: {\n * scheme: \"exact\",\n * payTo: \"0x123...\",\n * price: \"$0.01\",\n * network: \"eip155:84532\",\n * },\n * description: \"Access to protected API\",\n * },\n * server,\n * );\n * ```\n */\nexport function withX402<T = unknown>(\n routeHandler: (request: NextRequest) => Promise<NextResponse<T>>,\n routeConfig: RouteConfig,\n server: x402ResourceServer,\n paywallConfig?: PaywallConfig,\n paywall?: PaywallProvider,\n syncFacilitatorOnStart: boolean = true,\n): (request: NextRequest) => Promise<NextResponse<T>> {\n const routes = { \"*\": routeConfig };\n const { httpServer, init } = createHttpServer(routes, server, paywall, syncFacilitatorOnStart);\n\n // Dynamically register bazaar extension if route declares it\n let bazaarPromise: Promise<void> | null = null;\n if (checkIfBazaarNeeded(routes)) {\n bazaarPromise = import(/* webpackIgnore: true */ \"@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 (request: NextRequest): Promise<NextResponse<T>> => {\n await init();\n\n // Await bazaar extension loading if needed\n if (bazaarPromise) {\n await bazaarPromise;\n bazaarPromise = null;\n }\n\n const context = createRequestContext(request);\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 routeHandler(request);\n\n case \"payment-error\":\n return handlePaymentError(result.response) as NextResponse<T>;\n\n case \"payment-verified\": {\n // Payment is valid, need to wrap response for settlement\n const { paymentPayload, paymentRequirements } = result;\n const handlerResponse = await routeHandler(request);\n return handleSettlement(\n httpServer,\n handlerResponse,\n paymentPayload,\n paymentRequirements,\n ) as Promise<NextResponse<T>>;\n }\n }\n };\n}\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\nexport type {\n PaymentRequired,\n PaymentRequirements,\n PaymentPayload,\n Network,\n SchemeNetworkServer,\n} from \"@x402/core/types\";\n\nexport type { PaywallProvider, PaywallConfig, RouteConfig } from \"@x402/core/server\";\n\nexport { RouteConfigurationError } from \"@x402/core/server\";\n\nexport type { RouteValidationError } from \"@x402/core/server\";\n\nexport { NextAdapter } from \"./adapter\";\n","import { NextRequest, NextResponse } from \"next/server\";\nimport {\n HTTPRequestContext,\n HTTPResponseInstructions,\n PaywallProvider,\n x402HTTPResourceServer,\n x402ResourceServer,\n RoutesConfig,\n} from \"@x402/core/server\";\nimport { PaymentPayload, PaymentRequirements } from \"@x402/core/types\";\nimport { NextAdapter } from \"./adapter\";\n\n/**\n * Result of createHttpServer\n */\nexport interface HttpServerInstance {\n httpServer: x402HTTPResourceServer;\n init: () => Promise<void>;\n}\n\n/**\n * Creates and configures the x402 HTTP server with initialization logic\n *\n * @param routes - The route configuration for the server\n * @param server - The x402 resource server instance\n * @param paywall - Optional paywall provider for custom payment UI\n * @param syncFacilitatorOnStart - Whether to sync with the facilitator on start (defaults to true)\n * @returns The HTTP server instance with initialization function\n */\nexport function createHttpServer(\n routes: RoutesConfig,\n server: x402ResourceServer,\n paywall?: PaywallProvider,\n syncFacilitatorOnStart: boolean = true,\n): HttpServerInstance {\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 return {\n httpServer,\n async init() {\n // Ensure initialization completes before processing\n if (initPromise) {\n await initPromise;\n initPromise = null; // Clear after first await\n }\n },\n };\n}\n\n/**\n * Creates HTTP request context from a Next.js request\n *\n * @param request - The Next.js request object\n * @returns The HTTP request context for x402 processing\n */\nexport function createRequestContext(request: NextRequest): HTTPRequestContext {\n // Create adapter and context\n const adapter = new NextAdapter(request);\n return {\n adapter,\n path: request.nextUrl.pathname,\n method: request.method,\n paymentHeader: adapter.getHeader(\"payment-signature\") || adapter.getHeader(\"x-payment\"),\n };\n}\n\n/**\n * Handles payment error result by creating a 402 response\n *\n * @param response - The HTTP response instructions from payment verification\n * @returns A Next.js response with the appropriate 402 status and headers\n */\nexport function handlePaymentError(response: HTTPResponseInstructions): NextResponse {\n // Payment required but not provided or invalid\n const headers = new Headers(response.headers);\n if (response.isHtml) {\n headers.set(\"Content-Type\", \"text/html\");\n return new NextResponse(response.body as string, {\n status: response.status,\n headers,\n });\n }\n headers.set(\"Content-Type\", \"application/json\");\n return new NextResponse(JSON.stringify(response.body || {}), {\n status: response.status,\n headers,\n });\n}\n\n/**\n * Handles settlement after a successful response\n *\n * @param httpServer - The x402 HTTP resource server instance\n * @param response - The Next.js response from the protected route\n * @param paymentPayload - The payment payload from the client\n * @param paymentRequirements - The payment requirements for the route\n * @returns The response with settlement headers or an error response if settlement fails\n */\nexport async function handleSettlement(\n httpServer: x402HTTPResourceServer,\n response: NextResponse,\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n): Promise<NextResponse> {\n // If the response from the protected route is >= 400, do not settle payment\n if (response.status >= 400) {\n return response;\n }\n\n try {\n const result = await httpServer.processSettlement(paymentPayload, paymentRequirements);\n\n if (!result.success) {\n // Settlement failed - do not return the protected resource\n return new NextResponse(\n JSON.stringify({\n error: \"Settlement failed\",\n details: result.errorReason,\n }),\n {\n status: 402,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n\n // Settlement succeeded - add headers and return original response\n Object.entries(result.headers).forEach(([key, value]) => {\n response.headers.set(key, value);\n });\n\n return response;\n } catch (error) {\n console.error(\"Settlement failed:\", error);\n // If settlement fails, return an error response\n return new NextResponse(\n JSON.stringify({\n error: \"Settlement failed\",\n details: error instanceof Error ? error.message : \"Unknown error\",\n }),\n {\n status: 402,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n}\n","import { HTTPAdapter } from \"@x402/core/server\";\nimport { NextRequest } from \"next/server\";\n\n/**\n * Next.js adapter implementation\n */\nexport class NextAdapter implements HTTPAdapter {\n /**\n * Creates a new NextAdapter instance.\n *\n * @param req - The Next.js request object\n */\n constructor(private req: NextRequest) {}\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 return this.req.headers.get(name) || undefined;\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.nextUrl.pathname;\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.url;\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.headers.get(\"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.headers.get(\"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 const params: Record<string, string | string[]> = {};\n this.req.nextUrl.searchParams.forEach((value, key) => {\n const existing = params[key];\n if (existing) {\n if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n params[key] = [existing, value];\n }\n } else {\n params[key] = value;\n }\n });\n return params;\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 all = this.req.nextUrl.searchParams.getAll(name);\n if (all.length === 0) return undefined;\n if (all.length === 1) return all[0];\n return all;\n }\n\n /**\n * Gets the parsed request body.\n *\n * @returns Promise resolving to the parsed request body\n */\n async getBody(): Promise<unknown> {\n try {\n return await this.req.json();\n } catch {\n return undefined;\n }\n }\n}\n"],"mappings":"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","names":["x402ResourceServer","NextResponse","NextResponse","x402ResourceServer"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/utils.ts","../../src/adapter.ts"],"sourcesContent":["import {\n PaywallConfig,\n PaywallProvider,\n x402ResourceServer,\n RoutesConfig,\n RouteConfig,\n FacilitatorClient,\n} from \"@x402/core/server\";\nimport { SchemeNetworkServer, Network } from \"@x402/core/types\";\nimport { NextRequest, NextResponse } from \"next/server\";\nimport {\n prepareHttpServer,\n createRequestContext,\n handlePaymentError,\n handleSettlement,\n} from \"./utils\";\nimport { x402HTTPResourceServer } from \"@x402/core/server\";\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 * Next.js payment proxy for x402 protocol (direct HTTP server instance).\n *\n * Use this when you need to configure HTTP-level hooks.\n *\n * @param httpServer - Pre-configured x402HTTPResourceServer 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 Next.js proxy handler\n *\n * @example\n * ```typescript\n * import { paymentProxyFromHTTPServer, x402ResourceServer, x402HTTPResourceServer } from \"@x402/next\";\n *\n * const resourceServer = new x402ResourceServer(facilitatorClient)\n * .register(NETWORK, new ExactEvmScheme());\n *\n * const httpServer = new x402HTTPResourceServer(resourceServer, routes)\n * .onProtectedRequest(requestHook);\n *\n * export const proxy = paymentProxyFromHTTPServer(httpServer);\n * ```\n */\nexport function paymentProxyFromHTTPServer(\n httpServer: x402HTTPResourceServer,\n paywallConfig?: PaywallConfig,\n paywall?: PaywallProvider,\n syncFacilitatorOnStart: boolean = true,\n) {\n const { init } = prepareHttpServer(httpServer, paywall, syncFacilitatorOnStart);\n\n // Dynamically register bazaar extension if routes declare it and not already registered\n // Skip if pre-registered (e.g., in serverless environments where static imports are used)\n let bazaarPromise: Promise<void> | null = null;\n if (checkIfBazaarNeeded(httpServer.routes) && !httpServer.server.hasExtension(\"bazaar\")) {\n bazaarPromise = import(/* webpackIgnore: true */ \"@x402/extensions/bazaar\")\n .then(({ bazaarResourceServerExtension }) => {\n httpServer.server.registerExtension(bazaarResourceServerExtension);\n })\n .catch(err => {\n console.error(\"Failed to load bazaar extension:\", err);\n });\n }\n\n return async (req: NextRequest) => {\n const context = createRequestContext(req);\n\n // Check if route requires payment before initializing facilitator\n if (!httpServer.requiresPayment(context)) {\n return NextResponse.next();\n }\n\n // Only initialize when processing a protected route\n await init();\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 NextResponse.next();\n\n case \"payment-error\":\n return handlePaymentError(result.response);\n\n case \"payment-verified\": {\n // Payment is valid, need to wrap response for settlement\n const { paymentPayload, paymentRequirements, declaredExtensions } = result;\n\n // Proceed to the next proxy or route handler\n const nextResponse = NextResponse.next();\n return handleSettlement(\n httpServer,\n nextResponse,\n paymentPayload,\n paymentRequirements,\n declaredExtensions,\n );\n }\n }\n };\n}\n\n/**\n * Next.js payment proxy 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 proxies.\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 Next.js proxy handler\n *\n * @example\n * ```typescript\n * import { paymentProxy } from \"@x402/next\";\n *\n * const server = new x402ResourceServer(myFacilitatorClient)\n * .register(NETWORK, new ExactEvmScheme());\n *\n * export const proxy = paymentProxy(routes, server, paywallConfig);\n * ```\n */\nexport function paymentProxy(\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 return paymentProxyFromHTTPServer(httpServer, paywallConfig, paywall, syncFacilitatorOnStart);\n}\n\n/**\n * Next.js payment proxy for x402 protocol (configuration-based).\n *\n * Use this when you want to quickly set up proxy 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 Next.js proxy handler\n *\n * @example\n * ```typescript\n * import { paymentProxyFromConfig } from \"@x402/next\";\n *\n * export const proxy = paymentProxyFromConfig(\n * routes,\n * myFacilitatorClient,\n * [{ network: \"eip155:8453\", server: evmSchemeServer }],\n * paywallConfig\n * );\n * ```\n */\nexport function paymentProxyFromConfig(\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 paymentProxy with the configured server\n // Note: paymentProxy handles dynamic bazaar registration\n return paymentProxy(routes, ResourceServer, paywallConfig, paywall, syncFacilitatorOnStart);\n}\n\n/**\n * Wraps a Next.js App Router API route handler with x402 payment protection (HTTP server instance).\n *\n * Use this when you need to configure HTTP-level hooks.\n *\n * @param routeHandler - The API route handler function to wrap\n * @param httpServer - Pre-configured x402HTTPResourceServer 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 A wrapped Next.js route handler\n *\n * @example\n * ```typescript\n * import { NextRequest, NextResponse } from \"next/server\";\n * import { withX402FromHTTPServer, x402ResourceServer, x402HTTPResourceServer } from \"@x402/next\";\n *\n * const resourceServer = new x402ResourceServer(facilitatorClient)\n * .register(NETWORK, new ExactEvmScheme());\n *\n * const httpServer = new x402HTTPResourceServer(resourceServer, { \"*\": routeConfig })\n * .onProtectedRequest(requestHook);\n *\n * const handler = async (request: NextRequest) => {\n * return NextResponse.json({ data: \"protected content\" });\n * };\n *\n * export const GET = withX402FromHTTPServer(handler, httpServer);\n * ```\n */\nexport function withX402FromHTTPServer<T = unknown>(\n routeHandler: (request: NextRequest) => Promise<NextResponse<T>>,\n httpServer: x402HTTPResourceServer,\n paywallConfig?: PaywallConfig,\n paywall?: PaywallProvider,\n syncFacilitatorOnStart: boolean = true,\n): (request: NextRequest) => Promise<NextResponse<T>> {\n const { init } = prepareHttpServer(httpServer, paywall, syncFacilitatorOnStart);\n\n // Dynamically register bazaar extension if route declares it and not already registered\n // Skip if pre-registered (e.g., in serverless environments where static imports are used)\n let bazaarPromise: Promise<void> | null = null;\n if (checkIfBazaarNeeded(httpServer.routes) && !httpServer.server.hasExtension(\"bazaar\")) {\n bazaarPromise = import(/* webpackIgnore: true */ \"@x402/extensions/bazaar\")\n .then(({ bazaarResourceServerExtension }) => {\n httpServer.server.registerExtension(bazaarResourceServerExtension);\n })\n .catch(err => {\n console.error(\"Failed to load bazaar extension:\", err);\n });\n }\n\n return async (request: NextRequest): Promise<NextResponse<T>> => {\n // Only initialize when processing a protected route\n await init();\n\n // Await bazaar extension loading if needed\n if (bazaarPromise) {\n await bazaarPromise;\n bazaarPromise = null;\n }\n\n const context = createRequestContext(request);\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 routeHandler(request);\n\n case \"payment-error\":\n return handlePaymentError(result.response) as NextResponse<T>;\n\n case \"payment-verified\": {\n // Payment is valid, need to wrap response for settlement\n const { paymentPayload, paymentRequirements, declaredExtensions } = result;\n const handlerResponse = await routeHandler(request);\n return handleSettlement(\n httpServer,\n handlerResponse,\n paymentPayload,\n paymentRequirements,\n declaredExtensions,\n ) as Promise<NextResponse<T>>;\n }\n }\n };\n}\n\n/**\n * Wraps a Next.js App Router API route handler with x402 payment protection.\n *\n * Unlike `paymentProxy` which works as middleware, `withX402` wraps individual route handlers\n * and guarantees that payment settlement only occurs after the handler returns a successful\n * response (status < 400). This provides more precise control over when payments are settled.\n *\n * @param routeHandler - The API route handler function to wrap\n * @param routeConfig - Payment configuration for this specific route\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 A wrapped Next.js route handler\n *\n * @example\n * ```typescript\n * import { NextRequest, NextResponse } from \"next/server\";\n * import { withX402 } from \"@x402/next\";\n *\n * const server = new x402ResourceServer(myFacilitatorClient)\n * .register(NETWORK, new ExactEvmScheme());\n *\n * const handler = async (request: NextRequest) => {\n * return NextResponse.json({ data: \"protected content\" });\n * };\n *\n * export const GET = withX402(\n * handler,\n * {\n * accepts: {\n * scheme: \"exact\",\n * payTo: \"0x123...\",\n * price: \"$0.01\",\n * network: \"eip155:84532\",\n * },\n * description: \"Access to protected API\",\n * },\n * server,\n * );\n * ```\n */\nexport function withX402<T = unknown>(\n routeHandler: (request: NextRequest) => Promise<NextResponse<T>>,\n routeConfig: RouteConfig,\n server: x402ResourceServer,\n paywallConfig?: PaywallConfig,\n paywall?: PaywallProvider,\n syncFacilitatorOnStart: boolean = true,\n): (request: NextRequest) => Promise<NextResponse<T>> {\n const routes = { \"*\": routeConfig };\n // Create the x402 HTTP server instance with the resource server\n const httpServer = new x402HTTPResourceServer(server, routes);\n\n return withX402FromHTTPServer(\n routeHandler,\n httpServer,\n paywallConfig,\n paywall,\n syncFacilitatorOnStart,\n );\n}\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\nexport type {\n PaymentRequired,\n PaymentRequirements,\n PaymentPayload,\n Network,\n SchemeNetworkServer,\n} from \"@x402/core/types\";\n\nexport type { PaywallProvider, PaywallConfig, RouteConfig } from \"@x402/core/server\";\n\nexport {\n x402ResourceServer,\n x402HTTPResourceServer,\n RouteConfigurationError,\n} from \"@x402/core/server\";\n\nexport type { RouteValidationError } from \"@x402/core/server\";\n\nexport { NextAdapter } from \"./adapter\";\n","import { NextRequest, NextResponse } from \"next/server\";\nimport {\n HTTPRequestContext,\n HTTPResponseInstructions,\n PaywallProvider,\n x402HTTPResourceServer,\n x402ResourceServer,\n RoutesConfig,\n} from \"@x402/core/server\";\nimport { PaymentPayload, PaymentRequirements } from \"@x402/core/types\";\nimport { NextAdapter } from \"./adapter\";\n\n/**\n * Result of createHttpServer\n */\nexport interface HttpServerInstance {\n httpServer: x402HTTPResourceServer;\n init: () => Promise<void>;\n}\n\n/**\n * Prepares an existing x402HTTPResourceServer with initialization logic\n *\n * @param httpServer - Pre-configured x402HTTPResourceServer instance\n * @param paywall - Optional paywall provider for custom payment UI\n * @param syncFacilitatorOnStart - Whether to sync with the facilitator on start (defaults to true)\n * @returns The HTTP server instance with initialization function\n */\nexport function prepareHttpServer(\n httpServer: x402HTTPResourceServer,\n paywall?: PaywallProvider,\n syncFacilitatorOnStart: boolean = true,\n): HttpServerInstance {\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 return {\n httpServer,\n async init() {\n // Ensure initialization completes before processing\n if (initPromise) {\n await initPromise;\n initPromise = null; // Clear after first await\n }\n },\n };\n}\n\n/**\n * Creates and configures the x402 HTTP server with initialization logic\n *\n * @param routes - The route configuration for the server\n * @param server - The x402 resource server instance\n * @param paywall - Optional paywall provider for custom payment UI\n * @param syncFacilitatorOnStart - Whether to sync with the facilitator on start (defaults to true)\n * @returns The HTTP server instance with initialization function\n */\nexport function createHttpServer(\n routes: RoutesConfig,\n server: x402ResourceServer,\n paywall?: PaywallProvider,\n syncFacilitatorOnStart: boolean = true,\n): HttpServerInstance {\n // Create the x402 HTTP server instance with the resource server\n const httpServer = new x402HTTPResourceServer(server, routes);\n\n return prepareHttpServer(httpServer, paywall, syncFacilitatorOnStart);\n}\n\n/**\n * Creates HTTP request context from a Next.js request\n *\n * @param request - The Next.js request object\n * @returns The HTTP request context for x402 processing\n */\nexport function createRequestContext(request: NextRequest): HTTPRequestContext {\n // Create adapter and context\n const adapter = new NextAdapter(request);\n return {\n adapter,\n path: request.nextUrl.pathname,\n method: request.method,\n paymentHeader: adapter.getHeader(\"payment-signature\") || adapter.getHeader(\"x-payment\"),\n };\n}\n\n/**\n * Handles payment error result by creating a 402 response\n *\n * @param response - The HTTP response instructions from payment verification\n * @returns A Next.js response with the appropriate 402 status and headers\n */\nexport function handlePaymentError(response: HTTPResponseInstructions): NextResponse {\n // Payment required but not provided or invalid\n const headers = new Headers(response.headers);\n if (response.isHtml) {\n headers.set(\"Content-Type\", \"text/html\");\n return new NextResponse(response.body as string, {\n status: response.status,\n headers,\n });\n }\n headers.set(\"Content-Type\", \"application/json\");\n return new NextResponse(JSON.stringify(response.body || {}), {\n status: response.status,\n headers,\n });\n}\n\n/**\n * Handles settlement after a successful response\n *\n * @param httpServer - The x402 HTTP resource server instance\n * @param response - The Next.js response from the protected route\n * @param paymentPayload - The payment payload from the client\n * @param paymentRequirements - The payment requirements for the route\n * @param declaredExtensions - Optional declared extensions (for per-key enrichment)\n * @returns The response with settlement headers or an error response if settlement fails\n */\nexport async function handleSettlement(\n httpServer: x402HTTPResourceServer,\n response: NextResponse,\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n declaredExtensions?: Record<string, unknown>,\n): Promise<NextResponse> {\n // If the response from the protected route is >= 400, do not settle payment\n if (response.status >= 400) {\n return response;\n }\n\n try {\n const result = await httpServer.processSettlement(\n paymentPayload,\n paymentRequirements,\n declaredExtensions,\n );\n\n if (!result.success) {\n // Settlement failed - do not return the protected resource\n return new NextResponse(\n JSON.stringify({\n error: \"Settlement failed\",\n details: result.errorReason,\n }),\n {\n status: 402,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n\n // Settlement succeeded - add headers and return original response\n Object.entries(result.headers).forEach(([key, value]) => {\n response.headers.set(key, value);\n });\n\n return response;\n } catch (error) {\n console.error(\"Settlement failed:\", error);\n // If settlement fails, return an error response\n return new NextResponse(\n JSON.stringify({\n error: \"Settlement failed\",\n details: error instanceof Error ? error.message : \"Unknown error\",\n }),\n {\n status: 402,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n}\n","import { HTTPAdapter } from \"@x402/core/server\";\nimport { NextRequest } from \"next/server\";\n\n/**\n * Next.js adapter implementation\n */\nexport class NextAdapter implements HTTPAdapter {\n /**\n * Creates a new NextAdapter instance.\n *\n * @param req - The Next.js request object\n */\n constructor(private req: NextRequest) {}\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 return this.req.headers.get(name) || undefined;\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.nextUrl.pathname;\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.url;\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.headers.get(\"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.headers.get(\"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 const params: Record<string, string | string[]> = {};\n this.req.nextUrl.searchParams.forEach((value, key) => {\n const existing = params[key];\n if (existing) {\n if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n params[key] = [existing, value];\n }\n } else {\n params[key] = value;\n }\n });\n return params;\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 all = this.req.nextUrl.searchParams.getAll(name);\n if (all.length === 0) return undefined;\n if (all.length === 1) return all[0];\n return all;\n }\n\n /**\n * Gets the parsed request body.\n *\n * @returns Promise resolving to the parsed request body\n */\n async getBody(): Promise<unknown> {\n try {\n return await this.req.json();\n } catch {\n return undefined;\n }\n }\n}\n"],"mappings":";AAAA;AAAA,EAGE,sBAAAA;AAAA,OAIK;AAEP,SAAsB,gBAAAC,qBAAoB;;;ACT1C,SAAsB,oBAAoB;AAC1C;AAAA,EAIE;AAAA,OAGK;;;ACFA,IAAM,cAAN,MAAyC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM9C,YAAoB,KAAkB;AAAlB;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQvC,UAAU,MAAkC;AAC1C,WAAO,KAAK,IAAI,QAAQ,IAAI,IAAI,KAAK;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAoB;AAClB,WAAO,KAAK,IAAI;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAkB;AAChB,WAAO,KAAK,IAAI,QAAQ;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAiB;AACf,WAAO,KAAK,IAAI;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAA0B;AACxB,WAAO,KAAK,IAAI,QAAQ,IAAI,QAAQ,KAAK;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAuB;AACrB,WAAO,KAAK,IAAI,QAAQ,IAAI,YAAY,KAAK;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAoD;AAClD,UAAM,SAA4C,CAAC;AACnD,SAAK,IAAI,QAAQ,aAAa,QAAQ,CAAC,OAAO,QAAQ;AACpD,YAAM,WAAW,OAAO,GAAG;AAC3B,UAAI,UAAU;AACZ,YAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,mBAAS,KAAK,KAAK;AAAA,QACrB,OAAO;AACL,iBAAO,GAAG,IAAI,CAAC,UAAU,KAAK;AAAA,QAChC;AAAA,MACF,OAAO;AACL,eAAO,GAAG,IAAI;AAAA,MAChB;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAAc,MAA6C;AACzD,UAAM,MAAM,KAAK,IAAI,QAAQ,aAAa,OAAO,IAAI;AACrD,QAAI,IAAI,WAAW,EAAG,QAAO;AAC7B,QAAI,IAAI,WAAW,EAAG,QAAO,IAAI,CAAC;AAClC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAA4B;AAChC,QAAI;AACF,aAAO,MAAM,KAAK,IAAI,KAAK;AAAA,IAC7B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;ADxFO,SAAS,kBACd,YACA,SACA,yBAAkC,MACd;AAEpB,MAAI,SAAS;AACX,eAAW,wBAAwB,OAAO;AAAA,EAC5C;AAIA,MAAI,cAAoC,yBAAyB,WAAW,WAAW,IAAI;AAE3F,SAAO;AAAA,IACL;AAAA,IACA,MAAM,OAAO;AAEX,UAAI,aAAa;AACf,cAAM;AACN,sBAAc;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACF;AA6BO,SAAS,qBAAqB,SAA0C;AAE7E,QAAM,UAAU,IAAI,YAAY,OAAO;AACvC,SAAO;AAAA,IACL;AAAA,IACA,MAAM,QAAQ,QAAQ;AAAA,IACtB,QAAQ,QAAQ;AAAA,IAChB,eAAe,QAAQ,UAAU,mBAAmB,KAAK,QAAQ,UAAU,WAAW;AAAA,EACxF;AACF;AAQO,SAAS,mBAAmB,UAAkD;AAEnF,QAAM,UAAU,IAAI,QAAQ,SAAS,OAAO;AAC5C,MAAI,SAAS,QAAQ;AACnB,YAAQ,IAAI,gBAAgB,WAAW;AACvC,WAAO,IAAI,aAAa,SAAS,MAAgB;AAAA,MAC/C,QAAQ,SAAS;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AACA,UAAQ,IAAI,gBAAgB,kBAAkB;AAC9C,SAAO,IAAI,aAAa,KAAK,UAAU,SAAS,QAAQ,CAAC,CAAC,GAAG;AAAA,IAC3D,QAAQ,SAAS;AAAA,IACjB;AAAA,EACF,CAAC;AACH;AAYA,eAAsB,iBACpB,YACA,UACA,gBACA,qBACA,oBACuB;AAEvB,MAAI,SAAS,UAAU,KAAK;AAC1B,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,SAAS,MAAM,WAAW;AAAA,MAC9B;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,CAAC,OAAO,SAAS;AAEnB,aAAO,IAAI;AAAA,QACT,KAAK,UAAU;AAAA,UACb,OAAO;AAAA,UACP,SAAS,OAAO;AAAA,QAClB,CAAC;AAAA,QACD;AAAA,UACE,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAChD;AAAA,MACF;AAAA,IACF;AAGA,WAAO,QAAQ,OAAO,OAAO,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACvD,eAAS,QAAQ,IAAI,KAAK,KAAK;AAAA,IACjC,CAAC;AAED,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,MAAM,sBAAsB,KAAK;AAEzC,WAAO,IAAI;AAAA,MACT,KAAK,UAAU;AAAA,QACb,OAAO;AAAA,QACP,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MACpD,CAAC;AAAA,MACD;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AACF;;;ADlKA,SAAS,0BAAAC,+BAA8B;AAwXvC;AAAA,EACE,sBAAAC;AAAA,EACA,0BAAAD;AAAA,EACA;AAAA,OACK;AAnVA,SAAS,2BACd,YACA,eACA,SACA,yBAAkC,MAClC;AACA,QAAM,EAAE,KAAK,IAAI,kBAAkB,YAAY,SAAS,sBAAsB;AAI9E,MAAI,gBAAsC;AAC1C,MAAI,oBAAoB,WAAW,MAAM,KAAK,CAAC,WAAW,OAAO,aAAa,QAAQ,GAAG;AACvF,oBAAgB;AAAA;AAAA,MAAiC;AAAA,IAAyB,EACvE,KAAK,CAAC,EAAE,8BAA8B,MAAM;AAC3C,iBAAW,OAAO,kBAAkB,6BAA6B;AAAA,IACnE,CAAC,EACA,MAAM,SAAO;AACZ,cAAQ,MAAM,oCAAoC,GAAG;AAAA,IACvD,CAAC;AAAA,EACL;AAEA,SAAO,OAAO,QAAqB;AACjC,UAAM,UAAU,qBAAqB,GAAG;AAGxC,QAAI,CAAC,WAAW,gBAAgB,OAAO,GAAG;AACxC,aAAOE,cAAa,KAAK;AAAA,IAC3B;AAGA,UAAM,KAAK;AAGX,QAAI,eAAe;AACjB,YAAM;AACN,sBAAgB;AAAA,IAClB;AAGA,UAAM,SAAS,MAAM,WAAW,mBAAmB,SAAS,aAAa;AAGzE,YAAQ,OAAO,MAAM;AAAA,MACnB,KAAK;AAEH,eAAOA,cAAa,KAAK;AAAA,MAE3B,KAAK;AACH,eAAO,mBAAmB,OAAO,QAAQ;AAAA,MAE3C,KAAK,oBAAoB;AAEvB,cAAM,EAAE,gBAAgB,qBAAqB,mBAAmB,IAAI;AAGpE,cAAM,eAAeA,cAAa,KAAK;AACvC,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AA0BO,SAAS,aACd,QACA,QACA,eACA,SACA,yBAAkC,MAClC;AAEA,QAAM,aAAa,IAAIF,wBAAuB,QAAQ,MAAM;AAE5D,SAAO,2BAA2B,YAAY,eAAe,SAAS,sBAAsB;AAC9F;AA4BO,SAAS,uBACd,QACA,oBACA,SACA,eACA,SACA,yBAAkC,MAClC;AACA,QAAM,iBAAiB,IAAIC,oBAAmB,kBAAkB;AAEhE,MAAI,SAAS;AACX,YAAQ,QAAQ,CAAC,EAAE,SAAS,QAAQ,aAAa,MAAM;AACrD,qBAAe,SAAS,SAAS,YAAY;AAAA,IAC/C,CAAC;AAAA,EACH;AAIA,SAAO,aAAa,QAAQ,gBAAgB,eAAe,SAAS,sBAAsB;AAC5F;AAgCO,SAAS,uBACd,cACA,YACA,eACA,SACA,yBAAkC,MACkB;AACpD,QAAM,EAAE,KAAK,IAAI,kBAAkB,YAAY,SAAS,sBAAsB;AAI9E,MAAI,gBAAsC;AAC1C,MAAI,oBAAoB,WAAW,MAAM,KAAK,CAAC,WAAW,OAAO,aAAa,QAAQ,GAAG;AACvF,oBAAgB;AAAA;AAAA,MAAiC;AAAA,IAAyB,EACvE,KAAK,CAAC,EAAE,8BAA8B,MAAM;AAC3C,iBAAW,OAAO,kBAAkB,6BAA6B;AAAA,IACnE,CAAC,EACA,MAAM,SAAO;AACZ,cAAQ,MAAM,oCAAoC,GAAG;AAAA,IACvD,CAAC;AAAA,EACL;AAEA,SAAO,OAAO,YAAmD;AAE/D,UAAM,KAAK;AAGX,QAAI,eAAe;AACjB,YAAM;AACN,sBAAgB;AAAA,IAClB;AAEA,UAAM,UAAU,qBAAqB,OAAO;AAG5C,UAAM,SAAS,MAAM,WAAW,mBAAmB,SAAS,aAAa;AAGzE,YAAQ,OAAO,MAAM;AAAA,MACnB,KAAK;AAEH,eAAO,aAAa,OAAO;AAAA,MAE7B,KAAK;AACH,eAAO,mBAAmB,OAAO,QAAQ;AAAA,MAE3C,KAAK,oBAAoB;AAEvB,cAAM,EAAE,gBAAgB,qBAAqB,mBAAmB,IAAI;AACpE,cAAM,kBAAkB,MAAM,aAAa,OAAO;AAClD,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AA4CO,SAAS,SACd,cACA,aACA,QACA,eACA,SACA,yBAAkC,MACkB;AACpD,QAAM,SAAS,EAAE,KAAK,YAAY;AAElC,QAAM,aAAa,IAAID,wBAAuB,QAAQ,MAAM;AAE5D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAQA,SAAS,oBAAoB,QAA+B;AAE1D,MAAI,aAAa,QAAQ;AACvB,WAAO,CAAC,EAAE,OAAO,cAAc,YAAY,OAAO;AAAA,EACpD;AAGA,SAAO,OAAO,OAAO,MAAM,EAAE,KAAK,iBAAe;AAC/C,WAAO,CAAC,EAAE,YAAY,cAAc,YAAY,YAAY;AAAA,EAC9D,CAAC;AACH;","names":["x402ResourceServer","NextResponse","x402HTTPResourceServer","x402ResourceServer","NextResponse"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@x402/next",
3
- "version": "2.1.0",
3
+ "version": "2.3.0",
4
4
  "main": "./dist/cjs/index.js",
5
5
  "module": "./dist/esm/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -29,12 +29,12 @@
29
29
  "dependencies": {
30
30
  "@coinbase/cdp-sdk": "^1.22.0",
31
31
  "zod": "^3.24.2",
32
- "@x402/core": "^2.1.0",
33
- "@x402/extensions": "^2.1.0"
32
+ "@x402/core": "~2.3.0",
33
+ "@x402/extensions": "~2.3.0"
34
34
  },
35
35
  "peerDependencies": {
36
36
  "next": "^16.0.10",
37
- "@x402/paywall": "2.1.0"
37
+ "@x402/paywall": "2.3.0"
38
38
  },
39
39
  "peerDependenciesMeta": {
40
40
  "@x402/paywall": {