@klnap/next-proxy-chain 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,65 @@
1
+ import { NextRequest, NextFetchEvent, NextResponse } from 'next/server';
2
+ import { ProxyContext, MergeStrategy, ChainLogger, RequestHeaderPolicy, NextResult, ProxyPathFilter, BaseProxyRule } from './core.cjs';
3
+ export { CompiledScope, DEFAULT_BLOCKED_REQUEST_HEADERS, EntryWrite, HostMatcher, LogLevel, NEXT, NextOptions, PathMatcher, PathOptions, PipelineOutcome, ProxyResult, RouteScopeInput, RouteScopeList, RuleTimeoutError, applyMergedToResponse, assertIncludeExcludeNoOverlap, compileScopes, cookieItemsFromHeaders, createConsoleLogger, createProxyContext, decodeOverriddenRequestHeaders, formatPipelineLine, headersDiffer, host, isNextResult, isRequestHeaderAllowed, listSetCookie, mergeRequestHeaderOverrides, mergeWrites, next, normalizeHost, parseCookieName, path, pathMatches, responseHeaderItems, ruleLabel, ruleMatches, toPathRegex, toRule, toStatelessRegExp, withPaths, withRuleTimeout } from './core.cjs';
4
+
5
+ /**
6
+ * A single proxy step.
7
+ *
8
+ * Contract:
9
+ * - `return` / `undefined` — continue with no mutations
10
+ * - `return next({ request?, headers? })` — continue with mutations
11
+ * - `return Response | NextResponse` — if NextResponse.next() or NextResponse.rewrite(), chain continues with mutations; otherwise terminates after merge
12
+ *
13
+ * Third-party middleware (e.g. next-intl) should run **last** and return its
14
+ * Response directly; any terminal Response terminates the chain after merge.
15
+ */
16
+ type ProxyFn<TContext = ProxyContext> = (req: NextRequest, ctx: TContext, event: NextFetchEvent) => NextResponse | Response | NextResult | undefined | void | Promise<NextResponse | Response | NextResult | undefined | void>;
17
+ type ProxyRule<TContext = ProxyContext> = BaseProxyRule<ProxyFn<TContext>>;
18
+ type Entry<TContext> = ProxyFn<TContext> | ProxyRule<TContext>;
19
+ type DefinedProxy<TContext = ProxyContext> = ProxyFn<TContext> & ((filter: ProxyPathFilter) => ProxyRule<TContext>);
20
+ /**
21
+ * Define a reusable proxy. Call with a path filter to scope it.
22
+ *
23
+ * @example
24
+ * defineProxy("auth", (req, ctx) => next())
25
+ * demoAuthProxy({ include: path("/admin/*") })
26
+ */
27
+ declare function defineProxy<TContext = ProxyContext>(run: ProxyFn<TContext>): DefinedProxy<TContext>;
28
+ declare function defineProxy<TContext = ProxyContext>(name: string, run: ProxyFn<TContext>): DefinedProxy<TContext>;
29
+ interface ChainConfig<TContext = ProxyContext> {
30
+ createContext: (req: NextRequest, event: NextFetchEvent) => TContext;
31
+ cookieMergeStrategy: MergeStrategy;
32
+ headerMergeStrategy: MergeStrategy;
33
+ onError?: (err: unknown, ruleIndex: number, req: NextRequest, ctx: TContext) => NextResponse | Response | undefined | void | Promise<NextResponse | Response | undefined | void>;
34
+ debug: boolean;
35
+ logger: ChainLogger;
36
+ /** Per-rule wall-clock limit in ms. `0` disables. */
37
+ ruleTimeoutMs: number;
38
+ requestHeaderPolicy: RequestHeaderPolicy;
39
+ /** Throw an error if platform does not support request header overrides. Defaults to false (logs warning). */
40
+ strictOverrideCheck?: boolean;
41
+ }
42
+ type ProxyChainOptions<TContext = ProxyContext> = Partial<ChainConfig<TContext>>;
43
+ declare function safeInternalError(): NextResponse;
44
+ /** Assert once per process at construction time that NextResponse.next() supports request header overrides. */
45
+ declare function assertOverrideMechanismSupported(strict?: boolean): boolean;
46
+ /**
47
+ * Compose proxy rules into a single Edge entry (`proxy.ts` / middleware).
48
+ *
49
+ * @example
50
+ * export default proxyChain({ debug: true }, [
51
+ * hostProxy,
52
+ * demoAuthProxy({
53
+ * include: [
54
+ * path("/admin/*"),
55
+ * { host: "shop.localhost", path: "/checkout/*" },
56
+ * ],
57
+ * exclude: { host: "museum.localhost" },
58
+ * }),
59
+ * i18nProxy,
60
+ * ])
61
+ */
62
+ declare function proxyChain<TContext = ProxyContext>(entries: Entry<TContext>[]): (req: NextRequest, event: NextFetchEvent) => Promise<NextResponse | Response>;
63
+ declare function proxyChain<TContext = ProxyContext>(options: ProxyChainOptions<TContext>, entries: Entry<TContext>[]): (req: NextRequest, event: NextFetchEvent) => Promise<NextResponse | Response>;
64
+
65
+ export { BaseProxyRule, type ChainConfig, ChainLogger, type DefinedProxy, MergeStrategy, NextResult, type ProxyChainOptions, ProxyContext, type ProxyFn, ProxyPathFilter, type ProxyRule, RequestHeaderPolicy, assertOverrideMechanismSupported, defineProxy, proxyChain, safeInternalError };
@@ -0,0 +1,65 @@
1
+ import { NextRequest, NextFetchEvent, NextResponse } from 'next/server';
2
+ import { ProxyContext, MergeStrategy, ChainLogger, RequestHeaderPolicy, NextResult, ProxyPathFilter, BaseProxyRule } from './core.js';
3
+ export { CompiledScope, DEFAULT_BLOCKED_REQUEST_HEADERS, EntryWrite, HostMatcher, LogLevel, NEXT, NextOptions, PathMatcher, PathOptions, PipelineOutcome, ProxyResult, RouteScopeInput, RouteScopeList, RuleTimeoutError, applyMergedToResponse, assertIncludeExcludeNoOverlap, compileScopes, cookieItemsFromHeaders, createConsoleLogger, createProxyContext, decodeOverriddenRequestHeaders, formatPipelineLine, headersDiffer, host, isNextResult, isRequestHeaderAllowed, listSetCookie, mergeRequestHeaderOverrides, mergeWrites, next, normalizeHost, parseCookieName, path, pathMatches, responseHeaderItems, ruleLabel, ruleMatches, toPathRegex, toRule, toStatelessRegExp, withPaths, withRuleTimeout } from './core.js';
4
+
5
+ /**
6
+ * A single proxy step.
7
+ *
8
+ * Contract:
9
+ * - `return` / `undefined` — continue with no mutations
10
+ * - `return next({ request?, headers? })` — continue with mutations
11
+ * - `return Response | NextResponse` — if NextResponse.next() or NextResponse.rewrite(), chain continues with mutations; otherwise terminates after merge
12
+ *
13
+ * Third-party middleware (e.g. next-intl) should run **last** and return its
14
+ * Response directly; any terminal Response terminates the chain after merge.
15
+ */
16
+ type ProxyFn<TContext = ProxyContext> = (req: NextRequest, ctx: TContext, event: NextFetchEvent) => NextResponse | Response | NextResult | undefined | void | Promise<NextResponse | Response | NextResult | undefined | void>;
17
+ type ProxyRule<TContext = ProxyContext> = BaseProxyRule<ProxyFn<TContext>>;
18
+ type Entry<TContext> = ProxyFn<TContext> | ProxyRule<TContext>;
19
+ type DefinedProxy<TContext = ProxyContext> = ProxyFn<TContext> & ((filter: ProxyPathFilter) => ProxyRule<TContext>);
20
+ /**
21
+ * Define a reusable proxy. Call with a path filter to scope it.
22
+ *
23
+ * @example
24
+ * defineProxy("auth", (req, ctx) => next())
25
+ * demoAuthProxy({ include: path("/admin/*") })
26
+ */
27
+ declare function defineProxy<TContext = ProxyContext>(run: ProxyFn<TContext>): DefinedProxy<TContext>;
28
+ declare function defineProxy<TContext = ProxyContext>(name: string, run: ProxyFn<TContext>): DefinedProxy<TContext>;
29
+ interface ChainConfig<TContext = ProxyContext> {
30
+ createContext: (req: NextRequest, event: NextFetchEvent) => TContext;
31
+ cookieMergeStrategy: MergeStrategy;
32
+ headerMergeStrategy: MergeStrategy;
33
+ onError?: (err: unknown, ruleIndex: number, req: NextRequest, ctx: TContext) => NextResponse | Response | undefined | void | Promise<NextResponse | Response | undefined | void>;
34
+ debug: boolean;
35
+ logger: ChainLogger;
36
+ /** Per-rule wall-clock limit in ms. `0` disables. */
37
+ ruleTimeoutMs: number;
38
+ requestHeaderPolicy: RequestHeaderPolicy;
39
+ /** Throw an error if platform does not support request header overrides. Defaults to false (logs warning). */
40
+ strictOverrideCheck?: boolean;
41
+ }
42
+ type ProxyChainOptions<TContext = ProxyContext> = Partial<ChainConfig<TContext>>;
43
+ declare function safeInternalError(): NextResponse;
44
+ /** Assert once per process at construction time that NextResponse.next() supports request header overrides. */
45
+ declare function assertOverrideMechanismSupported(strict?: boolean): boolean;
46
+ /**
47
+ * Compose proxy rules into a single Edge entry (`proxy.ts` / middleware).
48
+ *
49
+ * @example
50
+ * export default proxyChain({ debug: true }, [
51
+ * hostProxy,
52
+ * demoAuthProxy({
53
+ * include: [
54
+ * path("/admin/*"),
55
+ * { host: "shop.localhost", path: "/checkout/*" },
56
+ * ],
57
+ * exclude: { host: "museum.localhost" },
58
+ * }),
59
+ * i18nProxy,
60
+ * ])
61
+ */
62
+ declare function proxyChain<TContext = ProxyContext>(entries: Entry<TContext>[]): (req: NextRequest, event: NextFetchEvent) => Promise<NextResponse | Response>;
63
+ declare function proxyChain<TContext = ProxyContext>(options: ProxyChainOptions<TContext>, entries: Entry<TContext>[]): (req: NextRequest, event: NextFetchEvent) => Promise<NextResponse | Response>;
64
+
65
+ export { BaseProxyRule, type ChainConfig, ChainLogger, type DefinedProxy, MergeStrategy, NextResult, type ProxyChainOptions, ProxyContext, type ProxyFn, ProxyPathFilter, type ProxyRule, RequestHeaderPolicy, assertOverrideMechanismSupported, defineProxy, proxyChain, safeInternalError };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,478 @@
1
+ import {
2
+ DEFAULT_BLOCKED_REQUEST_HEADERS,
3
+ NEXT,
4
+ RuleTimeoutError,
5
+ applyMergedToResponse,
6
+ assertIncludeExcludeNoOverlap,
7
+ compileScopes,
8
+ cookieItemsFromHeaders,
9
+ createConsoleLogger,
10
+ createProxyContext,
11
+ decodeOverriddenRequestHeaders,
12
+ formatPipelineLine,
13
+ headersDiffer,
14
+ headersInitToHeaders,
15
+ host,
16
+ isNextResult,
17
+ isRequestHeaderAllowed,
18
+ listSetCookie,
19
+ mergeRequestHeaderOverrides,
20
+ mergeWrites,
21
+ next,
22
+ normalizeHost,
23
+ parseCookieName,
24
+ path,
25
+ pathMatches,
26
+ responseHeaderItems,
27
+ ruleLabel,
28
+ ruleMatches,
29
+ toPathRegex,
30
+ toRule,
31
+ toStatelessRegExp,
32
+ withPaths,
33
+ withRuleTimeout
34
+ } from "./chunk-PTAOIFNB.js";
35
+
36
+ // src/index.ts
37
+ import { NextRequest, NextResponse } from "next/server";
38
+ function isPathFilter(value) {
39
+ if (value === null || typeof value !== "object") return false;
40
+ if ("nextUrl" in value) return false;
41
+ return "include" in value || "exclude" in value || "name" in value || "pathOptions" in value;
42
+ }
43
+ function defineProxy(nameOrRun, maybeRun) {
44
+ const defaultName = typeof nameOrRun === "string" ? nameOrRun : void 0;
45
+ const run = typeof nameOrRun === "function" ? nameOrRun : maybeRun;
46
+ const proxy = ((reqOrFilter, eventOrCtx, maybeEvent) => {
47
+ if (isPathFilter(reqOrFilter)) {
48
+ return withPaths(run, {
49
+ ...reqOrFilter,
50
+ name: reqOrFilter.name ?? defaultName
51
+ });
52
+ }
53
+ return run(reqOrFilter, eventOrCtx, maybeEvent);
54
+ });
55
+ Object.defineProperty(proxy, "name", {
56
+ value: defaultName ?? "",
57
+ configurable: true
58
+ });
59
+ return proxy;
60
+ }
61
+ function resolveConfig(overrides = {}) {
62
+ const { logger, debug, ...rest } = overrides;
63
+ return {
64
+ createContext: () => createProxyContext(),
65
+ cookieMergeStrategy: "last-write-wins",
66
+ headerMergeStrategy: "last-write-wins",
67
+ debug: false,
68
+ ruleTimeoutMs: 0,
69
+ requestHeaderPolicy: {},
70
+ strictOverrideCheck: false,
71
+ ...rest,
72
+ ...debug !== void 0 ? { debug } : {},
73
+ logger: logger ?? createConsoleLogger(debug ? "debug" : "info")
74
+ };
75
+ }
76
+ function safeInternalError() {
77
+ return new NextResponse("Internal Server Error", {
78
+ status: 500,
79
+ headers: { "content-type": "text/plain; charset=utf-8" }
80
+ });
81
+ }
82
+ var cachedOverrideSupported = null;
83
+ function assertOverrideMechanismSupported(strict = false) {
84
+ if (cachedOverrideSupported !== null) return cachedOverrideSupported;
85
+ try {
86
+ const testRes = NextResponse.next({
87
+ request: { headers: new Headers({ "x-proxy-chain-probe": "1" }) }
88
+ });
89
+ const isSupported = testRes.headers.get("x-middleware-next") === "1";
90
+ cachedOverrideSupported = isSupported;
91
+ if (!isSupported) {
92
+ const msg = "[proxy-chain] Warning: platform NextResponse.next() does not support x-middleware-next header overrides.";
93
+ if (strict) throw new Error(msg);
94
+ console.warn(msg);
95
+ }
96
+ return isSupported;
97
+ } catch (err) {
98
+ cachedOverrideSupported = false;
99
+ const msg = "[proxy-chain] Warning: unable to verify NextResponse request override mechanism.";
100
+ if (strict) throw err instanceof Error ? err : new Error(msg);
101
+ console.warn(msg, err);
102
+ return false;
103
+ }
104
+ }
105
+ function resolveRuleResult(res, requestHeaderPolicy, logger, debug) {
106
+ if (res == null) {
107
+ return { kind: "continue", responseHeaders: /* @__PURE__ */ new Map(), cookies: /* @__PURE__ */ new Map() };
108
+ }
109
+ if (isNextResult(res)) {
110
+ let request;
111
+ if (res.request) {
112
+ const filtered = new Headers();
113
+ const { dropped } = mergeRequestHeaderOverrides(
114
+ filtered,
115
+ headersInitToHeaders(res.request),
116
+ requestHeaderPolicy
117
+ );
118
+ if (debug && dropped.length) {
119
+ logger.warn({ dropped }, "blocked request header mutation");
120
+ }
121
+ if ([...filtered.keys()].length) request = filtered;
122
+ }
123
+ return {
124
+ kind: "continue",
125
+ request,
126
+ responseHeaders: res.headers ? responseHeaderItems(headersInitToHeaders(res.headers)) : /* @__PURE__ */ new Map(),
127
+ cookies: /* @__PURE__ */ new Map()
128
+ };
129
+ }
130
+ if (res.headers.get("x-middleware-next") === "1") {
131
+ let request;
132
+ const decoded = decodeOverriddenRequestHeaders(res.headers);
133
+ if ([...decoded.keys()].length > 0) {
134
+ const target = new Headers();
135
+ mergeRequestHeaderOverrides(target, decoded, requestHeaderPolicy);
136
+ if ([...target.keys()].length) request = target;
137
+ }
138
+ return {
139
+ kind: "continue",
140
+ request,
141
+ responseHeaders: responseHeaderItems(res.headers),
142
+ cookies: cookieItemsFromHeaders(res.headers)
143
+ };
144
+ }
145
+ const rewriteHeader = res.headers.get("x-middleware-rewrite");
146
+ if (rewriteHeader && (res.status === 200 || !res.status)) {
147
+ let request;
148
+ const decoded = decodeOverriddenRequestHeaders(res.headers);
149
+ if ([...decoded.keys()].length > 0) {
150
+ const target = new Headers();
151
+ mergeRequestHeaderOverrides(target, decoded, requestHeaderPolicy);
152
+ if ([...target.keys()].length) request = target;
153
+ }
154
+ return {
155
+ kind: "continue",
156
+ request,
157
+ responseHeaders: responseHeaderItems(res.headers),
158
+ cookies: cookieItemsFromHeaders(res.headers),
159
+ rewriteUrl: rewriteHeader
160
+ };
161
+ }
162
+ return { kind: "stop", response: res };
163
+ }
164
+ function proxyChain(optionsOrEntries, maybeEntries) {
165
+ const options = Array.isArray(optionsOrEntries) ? {} : optionsOrEntries;
166
+ const entries = Array.isArray(optionsOrEntries) ? optionsOrEntries : maybeEntries;
167
+ const config = resolveConfig(options);
168
+ const rules = entries.map(toRule);
169
+ const {
170
+ logger,
171
+ debug,
172
+ cookieMergeStrategy,
173
+ headerMergeStrategy,
174
+ ruleTimeoutMs,
175
+ requestHeaderPolicy,
176
+ strictOverrideCheck
177
+ } = config;
178
+ assertOverrideMechanismSupported(strictOverrideCheck);
179
+ for (let i = 0; i < rules.length; i++) {
180
+ assertIncludeExcludeNoOverlap(rules[i].include, rules[i].exclude, ruleLabel(rules[i], i));
181
+ }
182
+ return async function proxy(req, event) {
183
+ let ctx;
184
+ try {
185
+ ctx = config.createContext(req, event);
186
+ } catch (err) {
187
+ logger.error({ err }, "createContext threw");
188
+ return safeInternalError();
189
+ }
190
+ const method = req.method;
191
+ const pathname = req.nextUrl.pathname;
192
+ const traceId = req.headers.get("x-request-id") ?? req.headers.get("traceparent") ?? req.headers.get("x-b3-traceid") ?? void 0;
193
+ let currentReq = req;
194
+ let pendingRequestOverrides = null;
195
+ let pendingRewriteUrl = null;
196
+ const headerWrites = [];
197
+ const cookieWrites = [];
198
+ const materializeRequest = () => {
199
+ if (!pendingRequestOverrides) return currentReq;
200
+ if (!headersDiffer(currentReq.headers, pendingRequestOverrides)) {
201
+ pendingRequestOverrides = null;
202
+ return currentReq;
203
+ }
204
+ const merged = new Headers(currentReq.headers);
205
+ pendingRequestOverrides.forEach((v, k) => {
206
+ merged.set(k, v);
207
+ });
208
+ pendingRequestOverrides = null;
209
+ currentReq = new NextRequest(currentReq, { headers: merged });
210
+ return currentReq;
211
+ };
212
+ const appliedRequestOverrides = new Headers();
213
+ const queueRequestOverrides = (overrides) => {
214
+ if (!pendingRequestOverrides) pendingRequestOverrides = new Headers();
215
+ mergeRequestHeaderOverrides(pendingRequestOverrides, overrides, requestHeaderPolicy);
216
+ overrides.forEach((v, k) => {
217
+ appliedRequestOverrides.set(k, v);
218
+ });
219
+ };
220
+ try {
221
+ for (let i = 0; i < rules.length; i++) {
222
+ const rule = rules[i];
223
+ const label = ruleLabel(rule, i);
224
+ const activeReq = materializeRequest();
225
+ const reqHost = normalizeHost(
226
+ activeReq.headers.get("host") ?? activeReq.headers.get("x-forwarded-host")
227
+ );
228
+ if (!ruleMatches(activeReq.nextUrl.pathname, reqHost, rule)) continue;
229
+ const startedAt = debug ? performance.now() : 0;
230
+ let raw;
231
+ try {
232
+ raw = await withRuleTimeout(
233
+ Promise.resolve(rule.run(activeReq, ctx, event)),
234
+ ruleTimeoutMs,
235
+ label
236
+ );
237
+ } catch (err) {
238
+ if (config.onError) {
239
+ try {
240
+ const recovered = await config.onError(err, i, activeReq, ctx);
241
+ if (recovered == null) continue;
242
+ if (isNextResult(recovered)) {
243
+ raw = recovered;
244
+ } else if (recovered instanceof Response) {
245
+ headerWrites.push({
246
+ ruleIndex: i,
247
+ ruleName: label,
248
+ items: responseHeaderItems(recovered.headers)
249
+ });
250
+ cookieWrites.push({
251
+ ruleIndex: i,
252
+ ruleName: label,
253
+ items: cookieItemsFromHeaders(recovered.headers)
254
+ });
255
+ if (debug) {
256
+ logger.debug(
257
+ formatPipelineLine({
258
+ method,
259
+ path: pathname,
260
+ name: label,
261
+ traceId,
262
+ outcome: {
263
+ kind: "stop",
264
+ duration: performance.now() - startedAt,
265
+ status: recovered.status
266
+ }
267
+ })
268
+ );
269
+ }
270
+ return finalize(
271
+ recovered,
272
+ headerWrites,
273
+ cookieWrites,
274
+ headerMergeStrategy,
275
+ cookieMergeStrategy,
276
+ logger,
277
+ debug
278
+ );
279
+ } else {
280
+ continue;
281
+ }
282
+ } catch (onErrorErr) {
283
+ logger.error({ rule: label, err: onErrorErr }, "onError handler threw");
284
+ return safeInternalError();
285
+ }
286
+ } else {
287
+ logger.error({ rule: label, err }, "rule threw");
288
+ return safeInternalError();
289
+ }
290
+ }
291
+ const outcome = resolveRuleResult(raw, requestHeaderPolicy, logger, debug);
292
+ const duration = debug ? performance.now() - startedAt : 0;
293
+ if (outcome.kind === "continue") {
294
+ if (outcome.rewriteUrl) {
295
+ pendingRewriteUrl = outcome.rewriteUrl;
296
+ try {
297
+ const parsed = new URL(outcome.rewriteUrl);
298
+ currentReq.nextUrl.pathname = parsed.pathname;
299
+ currentReq.nextUrl.search = parsed.search;
300
+ } catch {
301
+ currentReq.nextUrl.pathname = outcome.rewriteUrl;
302
+ }
303
+ }
304
+ if (outcome.request) queueRequestOverrides(outcome.request);
305
+ if (outcome.responseHeaders.size || outcome.cookies.size) {
306
+ headerWrites.push({ ruleIndex: i, ruleName: label, items: outcome.responseHeaders });
307
+ cookieWrites.push({ ruleIndex: i, ruleName: label, items: outcome.cookies });
308
+ }
309
+ if (debug) {
310
+ const mutated = outcome.responseHeaders.size + outcome.cookies.size + (outcome.request ? 1 : 0) + (outcome.rewriteUrl ? 1 : 0);
311
+ logger.debug(
312
+ formatPipelineLine({
313
+ method,
314
+ path: pathname,
315
+ name: label,
316
+ traceId,
317
+ outcome: mutated === 0 ? { kind: "passed", duration } : { kind: "next", duration, headers: outcome.responseHeaders.size }
318
+ })
319
+ );
320
+ }
321
+ continue;
322
+ }
323
+ headerWrites.push({
324
+ ruleIndex: i,
325
+ ruleName: label,
326
+ items: responseHeaderItems(outcome.response.headers)
327
+ });
328
+ cookieWrites.push({
329
+ ruleIndex: i,
330
+ ruleName: label,
331
+ items: cookieItemsFromHeaders(outcome.response.headers)
332
+ });
333
+ if (debug) {
334
+ logger.debug(
335
+ formatPipelineLine({
336
+ method,
337
+ path: pathname,
338
+ name: label,
339
+ traceId,
340
+ outcome: {
341
+ kind: "stop",
342
+ duration,
343
+ status: outcome.response.status
344
+ }
345
+ })
346
+ );
347
+ }
348
+ const internalFolder = appliedRequestOverrides.get("x-internal-host-folder");
349
+ if (internalFolder && outcome.response.headers.has("x-middleware-rewrite")) {
350
+ const rawRewrite = outcome.response.headers.get("x-middleware-rewrite");
351
+ const cleanFolder = "/" + internalFolder.replace(/^\/+|\/+$/g, "").split("/").filter((seg) => !/^\(.*\)$/.test(seg)).join("/");
352
+ try {
353
+ const parsed = new URL(rawRewrite, currentReq.url);
354
+ if (!parsed.pathname.startsWith(cleanFolder)) {
355
+ parsed.pathname = cleanFolder + (parsed.pathname === "/" ? "" : parsed.pathname);
356
+ outcome.response.headers.set("x-middleware-rewrite", parsed.toString());
357
+ }
358
+ } catch {
359
+ if (!rawRewrite.startsWith(cleanFolder)) {
360
+ outcome.response.headers.set(
361
+ "x-middleware-rewrite",
362
+ cleanFolder + (rawRewrite === "/" ? "" : rawRewrite)
363
+ );
364
+ }
365
+ }
366
+ }
367
+ return finalize(
368
+ outcome.response,
369
+ headerWrites,
370
+ cookieWrites,
371
+ headerMergeStrategy,
372
+ cookieMergeStrategy,
373
+ logger,
374
+ debug
375
+ );
376
+ }
377
+ const finalReq = materializeRequest();
378
+ const internalHostFolder = appliedRequestOverrides.get("x-internal-host-folder");
379
+ let finalRewriteUrl = pendingRewriteUrl;
380
+ if (internalHostFolder) {
381
+ const cleanFolder = "/" + internalHostFolder.replace(/^\/+|\/+$/g, "").split("/").filter((seg) => !/^\(.*\)$/.test(seg)).join("/");
382
+ if (finalRewriteUrl) {
383
+ try {
384
+ const parsed = new URL(finalRewriteUrl, finalReq.url);
385
+ if (!parsed.pathname.startsWith(cleanFolder)) {
386
+ parsed.pathname = cleanFolder + (parsed.pathname === "/" ? "" : parsed.pathname);
387
+ finalRewriteUrl = parsed.toString();
388
+ }
389
+ } catch {
390
+ if (!finalRewriteUrl.startsWith(cleanFolder)) {
391
+ finalRewriteUrl = cleanFolder + (finalRewriteUrl === "/" ? "" : finalRewriteUrl);
392
+ }
393
+ }
394
+ } else {
395
+ const currentPath = finalReq.nextUrl.pathname;
396
+ if (!currentPath.startsWith(cleanFolder)) {
397
+ const targetUrl = finalReq.nextUrl.clone();
398
+ targetUrl.pathname = cleanFolder + (currentPath === "/" ? "" : currentPath);
399
+ finalRewriteUrl = targetUrl.toString();
400
+ }
401
+ }
402
+ }
403
+ let final;
404
+ if (finalRewriteUrl) {
405
+ const rewriteTarget = new URL(finalRewriteUrl, finalReq.url);
406
+ final = NextResponse.rewrite(rewriteTarget, { request: { headers: finalReq.headers } });
407
+ } else {
408
+ final = NextResponse.next({ request: { headers: finalReq.headers } });
409
+ }
410
+ return finalize(
411
+ final,
412
+ headerWrites,
413
+ cookieWrites,
414
+ headerMergeStrategy,
415
+ cookieMergeStrategy,
416
+ logger,
417
+ debug
418
+ );
419
+ } catch (err) {
420
+ logger.error({ err }, "proxy chain failed");
421
+ if (config.onError) {
422
+ try {
423
+ const recovered = await config.onError(err, -1, materializeRequest(), ctx);
424
+ if (recovered instanceof Response) return recovered;
425
+ } catch {
426
+ }
427
+ }
428
+ return safeInternalError();
429
+ }
430
+ };
431
+ }
432
+ function finalize(res, headerWrites, cookieWrites, headerStrategy, cookieStrategy, logger, debug) {
433
+ const headers = mergeWrites(headerWrites, headerStrategy, (key, winner, loser) => {
434
+ if (debug) logger.debug({ header: key, winner, loser }, "header conflict resolved");
435
+ });
436
+ const cookies = mergeWrites(cookieWrites, cookieStrategy, (key, winner, loser) => {
437
+ if (debug) logger.debug({ cookie: key, winner, loser }, "cookie conflict resolved");
438
+ });
439
+ applyMergedToResponse(res, headers, cookies);
440
+ return res;
441
+ }
442
+ export {
443
+ DEFAULT_BLOCKED_REQUEST_HEADERS,
444
+ NEXT,
445
+ RuleTimeoutError,
446
+ applyMergedToResponse,
447
+ assertIncludeExcludeNoOverlap,
448
+ assertOverrideMechanismSupported,
449
+ compileScopes,
450
+ cookieItemsFromHeaders,
451
+ createConsoleLogger,
452
+ createProxyContext,
453
+ decodeOverriddenRequestHeaders,
454
+ defineProxy,
455
+ formatPipelineLine,
456
+ headersDiffer,
457
+ host,
458
+ isNextResult,
459
+ isRequestHeaderAllowed,
460
+ listSetCookie,
461
+ mergeRequestHeaderOverrides,
462
+ mergeWrites,
463
+ next,
464
+ normalizeHost,
465
+ parseCookieName,
466
+ path,
467
+ pathMatches,
468
+ proxyChain,
469
+ responseHeaderItems,
470
+ ruleLabel,
471
+ ruleMatches,
472
+ safeInternalError,
473
+ toPathRegex,
474
+ toRule,
475
+ toStatelessRegExp,
476
+ withPaths,
477
+ withRuleTimeout
478
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}