@x402/next 0.0.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1 +1,278 @@
1
1
  # @x402/next
2
+
3
+ Next.js integration for the x402 Payment Protocol. This package allows you to easily add paywall functionality to your Next.js applications using the x402 protocol.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ pnpm install @x402/next
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ### Protecting Page Routes
14
+
15
+ Page routes are protected using the `paymentProxy`. Create a proxy (middleware) file in your Next.js project (`proxy.ts`):
16
+
17
+ ```typescript
18
+ import { paymentProxy, x402ResourceServer } from "@x402/next";
19
+ import { HTTPFacilitatorClient } from "@x402/core/server";
20
+ import { ExactEvmScheme } from "@x402/evm/exact/server";
21
+
22
+ const facilitatorClient = new HTTPFacilitatorClient({ url: "https://facilitator.x402.org" });
23
+ const resourceServer = new x402ResourceServer(facilitatorClient)
24
+ .register("eip155:84532", new ExactEvmScheme());
25
+
26
+ export const proxy = paymentProxy(
27
+ {
28
+ "/protected": {
29
+ accepts: {
30
+ scheme: "exact",
31
+ price: "$0.01",
32
+ network: "eip155:84532",
33
+ payTo: "0xYourAddress",
34
+ },
35
+ description: "Access to protected content",
36
+ },
37
+ },
38
+ resourceServer,
39
+ );
40
+
41
+ // Configure which paths the middleware should run on
42
+ export const config = {
43
+ matcher: ["/protected/:path*"],
44
+ };
45
+ ```
46
+
47
+ ### Protecting API Routes
48
+
49
+ API routes are protected using the `withX402` route wrapper. This is the recommended approach to protect API routes as it guarantees payment settlement only AFTER successful API responses (status < 400). API routes can also be protected by `paymentProxy`, however this will charge clients for failed API responses:
50
+
51
+ ```typescript
52
+ // app/api/your-endpoint/route.ts
53
+ import { NextRequest, NextResponse } from "next/server";
54
+ import { withX402 } from "@x402/next";
55
+
56
+ const handler = async (_: NextRequest) => {
57
+ return NextResponse.json({ data: "your response" });
58
+ };
59
+
60
+ export const GET = withX402(
61
+ handler,
62
+ {
63
+ accepts: {
64
+ scheme: "exact",
65
+ price: "$0.01",
66
+ network: "eip155:84532",
67
+ payTo: "0xYourAddress",
68
+ },
69
+ description: "Access to API endpoint",
70
+ },
71
+ server, // your configured x402ResourceServer
72
+ );
73
+ ```
74
+
75
+ ## Configuration
76
+
77
+ ### paymentProxy
78
+
79
+ The `paymentProxy` function is used to protect page routes. It can also protect API routes, however this will charge clients for failed API responses.
80
+
81
+ ```typescript
82
+ paymentProxy(
83
+ routes: RoutesConfig,
84
+ server: x402ResourceServer,
85
+ paywallConfig?: PaywallConfig,
86
+ paywall?: PaywallProvider,
87
+ syncFacilitatorOnStart?: boolean
88
+ )
89
+ ```
90
+
91
+ #### Parameters
92
+
93
+ 1. **`routes`** (required): Route configurations for protected endpoints
94
+ 2. **`server`** (required): Pre-configured x402ResourceServer instance
95
+ 3. **`paywallConfig`** (optional): Configuration for the built-in paywall UI
96
+ 4. **`paywall`** (optional): Custom paywall provider
97
+ 5. **`syncFacilitatorOnStart`** (optional): Whether to sync with facilitator on startup (defaults to true)
98
+
99
+ ### withX402
100
+
101
+ The `withX402` function wraps API route handlers. This is the recommended approach to protect API routes as it guarantees payment settlement only AFTER successful API responses (status < 400).
102
+
103
+ ```typescript
104
+ withX402(
105
+ routeHandler: (request: NextRequest) => Promise<NextResponse>,
106
+ routeConfig: RouteConfig,
107
+ server: x402ResourceServer,
108
+ paywallConfig?: PaywallConfig,
109
+ paywall?: PaywallProvider,
110
+ syncFacilitatorOnStart?: boolean
111
+ )
112
+ ```
113
+
114
+ #### Parameters
115
+
116
+ 1. **`routeHandler`** (required): Your API route handler function
117
+ 2. **`routeConfig`** (required): Payment configuration for this specific route
118
+ 3. **`server`** (required): Pre-configured x402ResourceServer instance
119
+ 4. **`paywallConfig`** (optional): Configuration for the built-in paywall UI
120
+ 5. **`paywall`** (optional): Custom paywall provider
121
+ 6. **`syncFacilitatorOnStart`** (optional): Whether to sync with facilitator on startup (defaults to true)
122
+
123
+ ## API Reference
124
+
125
+ ### NextAdapter
126
+
127
+ The `NextAdapter` class implements the `HTTPAdapter` interface from `@x402/core`, providing Next.js-specific request handling:
128
+
129
+ ```typescript
130
+ class NextAdapter implements HTTPAdapter {
131
+ getHeader(name: string): string | undefined;
132
+ getMethod(): string;
133
+ getPath(): string;
134
+ getUrl(): string;
135
+ getAcceptHeader(): string;
136
+ getUserAgent(): string;
137
+ }
138
+ ```
139
+
140
+ ### Route Configuration
141
+
142
+ ```typescript
143
+ const routes: RoutesConfig = {
144
+ "/api/protected": {
145
+ accepts: {
146
+ scheme: "exact",
147
+ price: "$0.10",
148
+ network: "eip155:84532",
149
+ payTo: "0xYourAddress",
150
+ maxTimeoutSeconds: 60,
151
+ },
152
+ description: "Premium API access",
153
+ },
154
+ };
155
+ ```
156
+
157
+ ## Advanced Usage
158
+
159
+ ### Multiple Payment Networks
160
+
161
+ ```typescript
162
+ import { paymentProxy, x402ResourceServer } from "@x402/next";
163
+ import { HTTPFacilitatorClient } from "@x402/core/server";
164
+ import { registerExactEvmScheme } from "@x402/evm/exact/server";
165
+ import { registerExactSvmScheme } from "@x402/svm/exact/server";
166
+
167
+ const facilitatorClient = new HTTPFacilitatorClient({ url: facilitatorUrl });
168
+ const server = new x402ResourceServer(facilitatorClient);
169
+
170
+ registerExactEvmScheme(server);
171
+ registerExactSvmScheme(server);
172
+
173
+ export const middleware = paymentProxy(
174
+ {
175
+ "/protected": {
176
+ accepts: [
177
+ {
178
+ scheme: "exact",
179
+ price: "$0.001",
180
+ network: "eip155:84532",
181
+ payTo: evmAddress,
182
+ },
183
+ {
184
+ scheme: "exact",
185
+ price: "$0.001",
186
+ network: "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",
187
+ payTo: svmAddress,
188
+ },
189
+ ],
190
+ description: "Premium content",
191
+ mimeType: "text/html",
192
+ },
193
+ },
194
+ server,
195
+ );
196
+ ```
197
+
198
+ ### Custom Paywall
199
+
200
+ ```typescript
201
+ import { createPaywall } from "@x402/paywall";
202
+ import { evmPaywall } from "@x402/paywall/evm";
203
+ import { svmPaywall } from "@x402/paywall/svm";
204
+
205
+ const paywall = createPaywall()
206
+ .withNetwork(evmPaywall)
207
+ .withNetwork(svmPaywall)
208
+ .withConfig({
209
+ appName: "My App",
210
+ appLogo: "/logo.png",
211
+ testnet: true,
212
+ })
213
+ .build();
214
+
215
+ export const middleware = paymentProxy(
216
+ routes,
217
+ server,
218
+ undefined, // paywallConfig (using custom paywall instead)
219
+ paywall,
220
+ );
221
+ ```
222
+ ## Migration from x402-next
223
+
224
+ If you're migrating from the legacy `x402-next` package:
225
+
226
+ 1. **Update imports**: Change from `x402-next` to `@x402/next`
227
+ 2. **New API**: Create an x402ResourceServer and register payment schemes
228
+ 3. **Function rename**: `paymentMiddleware` is now `paymentProxy`
229
+ 4. **Parameter order**: Routes first, then resource server
230
+
231
+ ### Before (x402-next):
232
+
233
+ ```typescript
234
+ import { paymentMiddleware } from "x402-next";
235
+
236
+ export const middleware = paymentMiddleware(
237
+ "0xYourAddress",
238
+ {
239
+ "/protected": {
240
+ price: "$0.01",
241
+ network: "base-sepolia",
242
+ config: { description: "Access to protected content" },
243
+ },
244
+ },
245
+ facilitator,
246
+ paywall,
247
+ );
248
+ ```
249
+
250
+ ### After (@x402/next):
251
+
252
+ ```typescript
253
+ import { paymentProxy, x402ResourceServer } from "@x402/next";
254
+ import { HTTPFacilitatorClient } from "@x402/core/server";
255
+ import { ExactEvmScheme } from "@x402/evm/exact/server";
256
+
257
+ const facilitator = new HTTPFacilitatorClient({ url: facilitatorUrl });
258
+ const resourceServer = new x402ResourceServer(facilitator)
259
+ .register("eip155:84532", new ExactEvmScheme());
260
+
261
+ export const middleware = paymentProxy(
262
+ {
263
+ "/protected": {
264
+ accepts: {
265
+ scheme: "exact",
266
+ price: "$0.01",
267
+ network: "eip155:84532",
268
+ payTo: "0xYourAddress",
269
+ },
270
+ description: "Access to protected content",
271
+ },
272
+ },
273
+ resourceServer,
274
+ );
275
+ ```
276
+
277
+ Note: The `payTo` address is now specified within each route configuration rather than as a separate parameter.
278
+
@@ -0,0 +1,335 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var src_exports = {};
32
+ __export(src_exports, {
33
+ NextAdapter: () => NextAdapter,
34
+ RouteConfigurationError: () => import_server5.RouteConfigurationError,
35
+ paymentProxy: () => paymentProxy,
36
+ paymentProxyFromConfig: () => paymentProxyFromConfig,
37
+ withX402: () => withX402
38
+ });
39
+ module.exports = __toCommonJS(src_exports);
40
+ var import_server3 = require("@x402/core/server");
41
+ var import_server4 = require("next/server");
42
+
43
+ // src/utils.ts
44
+ var import_server = require("next/server");
45
+ var import_server2 = require("@x402/core/server");
46
+
47
+ // src/adapter.ts
48
+ var NextAdapter = class {
49
+ /**
50
+ * Creates a new NextAdapter instance.
51
+ *
52
+ * @param req - The Next.js request object
53
+ */
54
+ constructor(req) {
55
+ this.req = req;
56
+ }
57
+ /**
58
+ * Gets a header value from the request.
59
+ *
60
+ * @param name - The header name
61
+ * @returns The header value or undefined
62
+ */
63
+ getHeader(name) {
64
+ return this.req.headers.get(name) || void 0;
65
+ }
66
+ /**
67
+ * Gets the HTTP method of the request.
68
+ *
69
+ * @returns The HTTP method
70
+ */
71
+ getMethod() {
72
+ return this.req.method;
73
+ }
74
+ /**
75
+ * Gets the path of the request.
76
+ *
77
+ * @returns The request path
78
+ */
79
+ getPath() {
80
+ return this.req.nextUrl.pathname;
81
+ }
82
+ /**
83
+ * Gets the full URL of the request.
84
+ *
85
+ * @returns The full request URL
86
+ */
87
+ getUrl() {
88
+ return this.req.url;
89
+ }
90
+ /**
91
+ * Gets the Accept header from the request.
92
+ *
93
+ * @returns The Accept header value or empty string
94
+ */
95
+ getAcceptHeader() {
96
+ return this.req.headers.get("Accept") || "";
97
+ }
98
+ /**
99
+ * Gets the User-Agent header from the request.
100
+ *
101
+ * @returns The User-Agent header value or empty string
102
+ */
103
+ getUserAgent() {
104
+ return this.req.headers.get("User-Agent") || "";
105
+ }
106
+ /**
107
+ * Gets all query parameters from the request URL.
108
+ *
109
+ * @returns Record of query parameter key-value pairs
110
+ */
111
+ getQueryParams() {
112
+ const params = {};
113
+ this.req.nextUrl.searchParams.forEach((value, key) => {
114
+ const existing = params[key];
115
+ if (existing) {
116
+ if (Array.isArray(existing)) {
117
+ existing.push(value);
118
+ } else {
119
+ params[key] = [existing, value];
120
+ }
121
+ } else {
122
+ params[key] = value;
123
+ }
124
+ });
125
+ return params;
126
+ }
127
+ /**
128
+ * Gets a specific query parameter by name.
129
+ *
130
+ * @param name - The query parameter name
131
+ * @returns The query parameter value(s) or undefined
132
+ */
133
+ getQueryParam(name) {
134
+ const all = this.req.nextUrl.searchParams.getAll(name);
135
+ if (all.length === 0) return void 0;
136
+ if (all.length === 1) return all[0];
137
+ return all;
138
+ }
139
+ /**
140
+ * Gets the parsed request body.
141
+ *
142
+ * @returns Promise resolving to the parsed request body
143
+ */
144
+ async getBody() {
145
+ try {
146
+ return await this.req.json();
147
+ } catch {
148
+ return void 0;
149
+ }
150
+ }
151
+ };
152
+
153
+ // src/utils.ts
154
+ function createHttpServer(routes, server, paywall, syncFacilitatorOnStart = true) {
155
+ const httpServer = new import_server2.x402HTTPResourceServer(server, routes);
156
+ if (paywall) {
157
+ httpServer.registerPaywallProvider(paywall);
158
+ }
159
+ let initPromise = syncFacilitatorOnStart ? httpServer.initialize() : null;
160
+ return {
161
+ httpServer,
162
+ async init() {
163
+ if (initPromise) {
164
+ await initPromise;
165
+ initPromise = null;
166
+ }
167
+ }
168
+ };
169
+ }
170
+ function createRequestContext(request) {
171
+ const adapter = new NextAdapter(request);
172
+ return {
173
+ adapter,
174
+ path: request.nextUrl.pathname,
175
+ method: request.method,
176
+ paymentHeader: adapter.getHeader("payment-signature") || adapter.getHeader("x-payment")
177
+ };
178
+ }
179
+ function handlePaymentError(response) {
180
+ const headers = new Headers(response.headers);
181
+ if (response.isHtml) {
182
+ headers.set("Content-Type", "text/html");
183
+ return new import_server.NextResponse(response.body, {
184
+ status: response.status,
185
+ headers
186
+ });
187
+ }
188
+ headers.set("Content-Type", "application/json");
189
+ return new import_server.NextResponse(JSON.stringify(response.body || {}), {
190
+ status: response.status,
191
+ headers
192
+ });
193
+ }
194
+ async function handleSettlement(httpServer, response, paymentPayload, paymentRequirements) {
195
+ if (response.status >= 400) {
196
+ return response;
197
+ }
198
+ try {
199
+ const result = await httpServer.processSettlement(paymentPayload, paymentRequirements);
200
+ if (!result.success) {
201
+ return new import_server.NextResponse(
202
+ JSON.stringify({
203
+ error: "Settlement failed",
204
+ details: result.errorReason
205
+ }),
206
+ {
207
+ status: 402,
208
+ headers: { "Content-Type": "application/json" }
209
+ }
210
+ );
211
+ }
212
+ Object.entries(result.headers).forEach(([key, value]) => {
213
+ response.headers.set(key, value);
214
+ });
215
+ return response;
216
+ } catch (error) {
217
+ console.error("Settlement failed:", error);
218
+ return new import_server.NextResponse(
219
+ JSON.stringify({
220
+ error: "Settlement failed",
221
+ details: error instanceof Error ? error.message : "Unknown error"
222
+ }),
223
+ {
224
+ status: 402,
225
+ headers: { "Content-Type": "application/json" }
226
+ }
227
+ );
228
+ }
229
+ }
230
+
231
+ // src/index.ts
232
+ 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);
235
+ let bazaarPromise = null;
236
+ if (checkIfBazaarNeeded(routes)) {
237
+ bazaarPromise = import(
238
+ /* webpackIgnore: true */
239
+ "@x402/extensions/bazaar"
240
+ ).then(({ bazaarResourceServerExtension }) => {
241
+ server.registerExtension(bazaarResourceServerExtension);
242
+ }).catch((err) => {
243
+ console.error("Failed to load bazaar extension:", err);
244
+ });
245
+ }
246
+ return async (req) => {
247
+ const context = createRequestContext(req);
248
+ if (!httpServer.requiresPayment(context)) {
249
+ return import_server4.NextResponse.next();
250
+ }
251
+ await init();
252
+ if (bazaarPromise) {
253
+ await bazaarPromise;
254
+ bazaarPromise = null;
255
+ }
256
+ const result = await httpServer.processHTTPRequest(context, paywallConfig);
257
+ switch (result.type) {
258
+ case "no-payment-required":
259
+ return import_server4.NextResponse.next();
260
+ case "payment-error":
261
+ return handlePaymentError(result.response);
262
+ case "payment-verified": {
263
+ const { paymentPayload, paymentRequirements } = result;
264
+ const nextResponse = import_server4.NextResponse.next();
265
+ return handleSettlement(httpServer, nextResponse, paymentPayload, paymentRequirements);
266
+ }
267
+ }
268
+ };
269
+ }
270
+ function paymentProxyFromConfig(routes, facilitatorClients, schemes, paywallConfig, paywall, syncFacilitatorOnStart = true) {
271
+ const ResourceServer = new import_server3.x402ResourceServer(facilitatorClients);
272
+ if (schemes) {
273
+ schemes.forEach(({ network, server: schemeServer }) => {
274
+ ResourceServer.register(network, schemeServer);
275
+ });
276
+ }
277
+ return paymentProxy(routes, ResourceServer, paywallConfig, paywall, syncFacilitatorOnStart);
278
+ }
279
+ function withX402(routeHandler, routeConfig, server, paywallConfig, paywall, syncFacilitatorOnStart = true) {
280
+ const routes = { "*": routeConfig };
281
+ const { httpServer, init } = createHttpServer(routes, server, paywall, syncFacilitatorOnStart);
282
+ let bazaarPromise = null;
283
+ if (checkIfBazaarNeeded(routes)) {
284
+ bazaarPromise = import(
285
+ /* webpackIgnore: true */
286
+ "@x402/extensions/bazaar"
287
+ ).then(({ bazaarResourceServerExtension }) => {
288
+ server.registerExtension(bazaarResourceServerExtension);
289
+ }).catch((err) => {
290
+ console.error("Failed to load bazaar extension:", err);
291
+ });
292
+ }
293
+ return async (request) => {
294
+ await init();
295
+ if (bazaarPromise) {
296
+ await bazaarPromise;
297
+ bazaarPromise = null;
298
+ }
299
+ const context = createRequestContext(request);
300
+ const result = await httpServer.processHTTPRequest(context, paywallConfig);
301
+ switch (result.type) {
302
+ case "no-payment-required":
303
+ return routeHandler(request);
304
+ case "payment-error":
305
+ return handlePaymentError(result.response);
306
+ case "payment-verified": {
307
+ const { paymentPayload, paymentRequirements } = result;
308
+ const handlerResponse = await routeHandler(request);
309
+ return handleSettlement(
310
+ httpServer,
311
+ handlerResponse,
312
+ paymentPayload,
313
+ paymentRequirements
314
+ );
315
+ }
316
+ }
317
+ };
318
+ }
319
+ function checkIfBazaarNeeded(routes) {
320
+ if ("accepts" in routes) {
321
+ return !!(routes.extensions && "bazaar" in routes.extensions);
322
+ }
323
+ return Object.values(routes).some((routeConfig) => {
324
+ return !!(routeConfig.extensions && "bazaar" in routeConfig.extensions);
325
+ });
326
+ }
327
+ // Annotate the CommonJS export names for ESM import in node:
328
+ 0 && (module.exports = {
329
+ NextAdapter,
330
+ RouteConfigurationError,
331
+ paymentProxy,
332
+ paymentProxyFromConfig,
333
+ withX402
334
+ });
335
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +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"]}