@niledatabase/server 5.0.0-alpha.27 → 5.0.0-alpha.29
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/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +202 -157
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +202 -157
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.d.mts
CHANGED
|
@@ -318,7 +318,7 @@ declare class Tenants {
|
|
|
318
318
|
acceptInvite<T = Response>(req?: {
|
|
319
319
|
identifier: string;
|
|
320
320
|
token: string;
|
|
321
|
-
|
|
321
|
+
callbackUrl?: string;
|
|
322
322
|
}, rawResponse?: boolean): Promise<T>;
|
|
323
323
|
/**
|
|
324
324
|
* Delete a pending invite using `DELETE /api/tenants/{tenantId}/invite/{inviteId}`.
|
package/dist/index.d.ts
CHANGED
|
@@ -318,7 +318,7 @@ declare class Tenants {
|
|
|
318
318
|
acceptInvite<T = Response>(req?: {
|
|
319
319
|
identifier: string;
|
|
320
320
|
token: string;
|
|
321
|
-
|
|
321
|
+
callbackUrl?: string;
|
|
322
322
|
}, rawResponse?: boolean): Promise<T>;
|
|
323
323
|
/**
|
|
324
324
|
* Delete a pending invite using `DELETE /api/tenants/{tenantId}/invite/{inviteId}`.
|
package/dist/index.js
CHANGED
|
@@ -131,139 +131,6 @@ function isUUID(value) {
|
|
|
131
131
|
return regex.test(value);
|
|
132
132
|
}
|
|
133
133
|
|
|
134
|
-
// src/api/utils/request.ts
|
|
135
|
-
async function request(url, _init, config) {
|
|
136
|
-
const { debug, info, error } = config.logger("[REQUEST]");
|
|
137
|
-
const { request: request2, ...init } = _init;
|
|
138
|
-
const requestUrl = new URL(request2.url);
|
|
139
|
-
const updatedHeaders = new Headers({});
|
|
140
|
-
if (request2.headers.get("cookie")) {
|
|
141
|
-
updatedHeaders.set("cookie", String(request2.headers.get("cookie")));
|
|
142
|
-
}
|
|
143
|
-
if (request2.headers.get(TENANT_COOKIE)) {
|
|
144
|
-
updatedHeaders.set(
|
|
145
|
-
TENANT_COOKIE,
|
|
146
|
-
String(request2.headers.get(TENANT_COOKIE))
|
|
147
|
-
);
|
|
148
|
-
}
|
|
149
|
-
if (config.secureCookies != null) {
|
|
150
|
-
updatedHeaders.set(HEADER_SECURE_COOKIES, String(config.secureCookies));
|
|
151
|
-
} else {
|
|
152
|
-
updatedHeaders.set(
|
|
153
|
-
HEADER_SECURE_COOKIES,
|
|
154
|
-
process.env.NODE_ENV === "production" ? "true" : "false"
|
|
155
|
-
);
|
|
156
|
-
}
|
|
157
|
-
updatedHeaders.set("host", requestUrl.host);
|
|
158
|
-
if (config.callbackUrl) {
|
|
159
|
-
const cbUrl = new URL(config.callbackUrl);
|
|
160
|
-
debug(`Obtained origin from config.callbackUrl ${config.callbackUrl}`);
|
|
161
|
-
updatedHeaders.set(HEADER_ORIGIN, cbUrl.origin);
|
|
162
|
-
} else if (config.origin) {
|
|
163
|
-
debug(`Obtained origin from config.origin ${config.origin}`);
|
|
164
|
-
updatedHeaders.set(HEADER_ORIGIN, config.origin);
|
|
165
|
-
} else {
|
|
166
|
-
const passedOrigin = request2.headers.get(HEADER_ORIGIN);
|
|
167
|
-
if (passedOrigin) {
|
|
168
|
-
updatedHeaders.set(HEADER_ORIGIN, passedOrigin);
|
|
169
|
-
} else {
|
|
170
|
-
const reqOrigin = config.routePrefix !== DEFAULT_PREFIX ? `${requestUrl.origin}${config.routePrefix}` : requestUrl.origin;
|
|
171
|
-
updatedHeaders.set(HEADER_ORIGIN, reqOrigin);
|
|
172
|
-
debug(`Obtained origin from request ${reqOrigin}`);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
const params = { ...init };
|
|
176
|
-
if (params.method?.toLowerCase() === "post" || params.method?.toLowerCase() === "put") {
|
|
177
|
-
try {
|
|
178
|
-
updatedHeaders.set("content-type", "application/json");
|
|
179
|
-
const bodyStream = _init.body ?? _init.request?.body ?? request2.body;
|
|
180
|
-
const bodyText = await new Response(bodyStream).text();
|
|
181
|
-
try {
|
|
182
|
-
params.body = JSON.stringify(JSON.parse(bodyText));
|
|
183
|
-
} catch {
|
|
184
|
-
updatedHeaders.set("content-type", "application/x-www-form-urlencoded");
|
|
185
|
-
params.body = bodyText;
|
|
186
|
-
}
|
|
187
|
-
} catch (e) {
|
|
188
|
-
error("Failed to parse request body");
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
params.headers = updatedHeaders;
|
|
192
|
-
const fullUrl = `${url}${requestUrl.search}`;
|
|
193
|
-
if (config.debug) {
|
|
194
|
-
params.headers.set("request-id", crypto.randomUUID());
|
|
195
|
-
params.cache = "no-store";
|
|
196
|
-
}
|
|
197
|
-
await config.extensionCtx?.runExtensions(
|
|
198
|
-
"onRequest" /* onRequest */,
|
|
199
|
-
config,
|
|
200
|
-
params,
|
|
201
|
-
_init
|
|
202
|
-
);
|
|
203
|
-
try {
|
|
204
|
-
const res = await fetch(fullUrl, {
|
|
205
|
-
...params
|
|
206
|
-
}).catch((e) => {
|
|
207
|
-
error("An error has occurred in the fetch", {
|
|
208
|
-
message: e.message,
|
|
209
|
-
stack: e.stack
|
|
210
|
-
});
|
|
211
|
-
return new Response(
|
|
212
|
-
"An unexpected (most likely configuration) problem has occurred",
|
|
213
|
-
{ status: 500 }
|
|
214
|
-
);
|
|
215
|
-
});
|
|
216
|
-
const loggingRes = typeof res?.clone === "function" ? res?.clone() : null;
|
|
217
|
-
info(`[${params.method ?? "GET"}] ${fullUrl}`, {
|
|
218
|
-
status: res?.status,
|
|
219
|
-
statusText: res?.statusText,
|
|
220
|
-
text: await loggingRes?.text()
|
|
221
|
-
});
|
|
222
|
-
const updatedRes = await config.extensionCtx?.runExtensions(
|
|
223
|
-
"onResponse" /* onResponse */,
|
|
224
|
-
config,
|
|
225
|
-
{ ...params, response: res }
|
|
226
|
-
);
|
|
227
|
-
if (updatedRes) {
|
|
228
|
-
return updatedRes;
|
|
229
|
-
}
|
|
230
|
-
return res;
|
|
231
|
-
} catch (e) {
|
|
232
|
-
if (e instanceof Error) {
|
|
233
|
-
error("An error has occurred in the fetch", {
|
|
234
|
-
message: e.message,
|
|
235
|
-
stack: e.stack
|
|
236
|
-
});
|
|
237
|
-
}
|
|
238
|
-
return new Response(
|
|
239
|
-
"An unexpected (most likely configuration) problem has occurred",
|
|
240
|
-
{ status: 500 }
|
|
241
|
-
);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
// src/api/utils/auth.ts
|
|
246
|
-
async function auth(req, config) {
|
|
247
|
-
const { info, error } = config.logger("[nileauth]");
|
|
248
|
-
info("checking auth");
|
|
249
|
-
const sessionUrl = `${config.apiUrl}/auth/session`;
|
|
250
|
-
info(`using session ${sessionUrl}`);
|
|
251
|
-
req.headers.delete("content-length");
|
|
252
|
-
const res = await request(sessionUrl, { request: req }, config);
|
|
253
|
-
try {
|
|
254
|
-
const session = await new Response(res.body).json();
|
|
255
|
-
if (Object.keys(session).length === 0) {
|
|
256
|
-
info("no session found");
|
|
257
|
-
return void 0;
|
|
258
|
-
}
|
|
259
|
-
info("session active");
|
|
260
|
-
return session;
|
|
261
|
-
} catch (e) {
|
|
262
|
-
error(e);
|
|
263
|
-
return void 0;
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
|
|
267
134
|
// src/utils/Logger.ts
|
|
268
135
|
var red = "\x1B[31m";
|
|
269
136
|
var yellow = "\x1B[38;2;255;255;0m";
|
|
@@ -477,8 +344,17 @@ var ctx = {
|
|
|
477
344
|
if (partial.headers === null) {
|
|
478
345
|
store.headers = new Headers();
|
|
479
346
|
} else if (partial.headers && store.headers instanceof Headers) {
|
|
480
|
-
for (const [
|
|
481
|
-
|
|
347
|
+
for (const [key17, value] of new Headers(partial.headers).entries()) {
|
|
348
|
+
if (key17.toLowerCase() === "cookie") {
|
|
349
|
+
const existingCookies = parseCookieHeader(
|
|
350
|
+
store.headers.get("cookie") || ""
|
|
351
|
+
);
|
|
352
|
+
const newCookies = parseCookieHeader(value);
|
|
353
|
+
const mergedCookies = { ...existingCookies, ...newCookies };
|
|
354
|
+
store.headers.set("cookie", serializeCookies(mergedCookies));
|
|
355
|
+
} else {
|
|
356
|
+
store.headers.set(key17, value);
|
|
357
|
+
}
|
|
482
358
|
}
|
|
483
359
|
}
|
|
484
360
|
if ("tenantId" in partial)
|
|
@@ -543,6 +419,170 @@ function serializeContext(context) {
|
|
|
543
419
|
preserveHeaders: context.preserveHeaders
|
|
544
420
|
});
|
|
545
421
|
}
|
|
422
|
+
function parseCookieHeader(header) {
|
|
423
|
+
return header.split(";").map((c) => c.trim()).filter(Boolean).reduce((acc, curr) => {
|
|
424
|
+
const [key17, ...val] = curr.split("=");
|
|
425
|
+
if (key17) acc[key17] = val.join("=");
|
|
426
|
+
return acc;
|
|
427
|
+
}, {});
|
|
428
|
+
}
|
|
429
|
+
function serializeCookies(cookies) {
|
|
430
|
+
return Object.entries(cookies).map(([k, v]) => `${k}=${v}`).join("; ");
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
// src/api/utils/request.ts
|
|
434
|
+
async function request(url, _init, config) {
|
|
435
|
+
const { debug, info, error, warn: warn2 } = config.logger("[REQUEST]");
|
|
436
|
+
const { request: request2, ...init } = _init;
|
|
437
|
+
const requestUrl = new URL(request2.url);
|
|
438
|
+
const updatedHeaders = new Headers({});
|
|
439
|
+
if (request2.headers.get("cookie")) {
|
|
440
|
+
updatedHeaders.set("cookie", String(request2.headers.get("cookie")));
|
|
441
|
+
}
|
|
442
|
+
if (request2.headers.get(TENANT_COOKIE)) {
|
|
443
|
+
updatedHeaders.set(
|
|
444
|
+
TENANT_COOKIE,
|
|
445
|
+
String(request2.headers.get(TENANT_COOKIE))
|
|
446
|
+
);
|
|
447
|
+
}
|
|
448
|
+
if (config.secureCookies != null) {
|
|
449
|
+
updatedHeaders.set(HEADER_SECURE_COOKIES, String(config.secureCookies));
|
|
450
|
+
} else {
|
|
451
|
+
updatedHeaders.set(
|
|
452
|
+
HEADER_SECURE_COOKIES,
|
|
453
|
+
process.env.NODE_ENV === "production" ? "true" : "false"
|
|
454
|
+
);
|
|
455
|
+
}
|
|
456
|
+
updatedHeaders.set("host", requestUrl.host);
|
|
457
|
+
if (config.callbackUrl) {
|
|
458
|
+
const cbUrl = new URL(config.callbackUrl);
|
|
459
|
+
debug(`Obtained origin from config.callbackUrl ${config.callbackUrl}`);
|
|
460
|
+
updatedHeaders.set(HEADER_ORIGIN, cbUrl.origin);
|
|
461
|
+
} else if (config.origin) {
|
|
462
|
+
debug(`Obtained origin from config.origin ${config.origin}`);
|
|
463
|
+
updatedHeaders.set(HEADER_ORIGIN, config.origin);
|
|
464
|
+
} else {
|
|
465
|
+
const passedOrigin = request2.headers.get(HEADER_ORIGIN);
|
|
466
|
+
if (passedOrigin) {
|
|
467
|
+
updatedHeaders.set(HEADER_ORIGIN, passedOrigin);
|
|
468
|
+
} else {
|
|
469
|
+
const { headers } = ctx.get();
|
|
470
|
+
const host = headers.get("host");
|
|
471
|
+
if (host) {
|
|
472
|
+
const serverSideOrigin = `${getProtocolFromHeaders(headers)}://${host}`;
|
|
473
|
+
updatedHeaders.set(HEADER_ORIGIN, serverSideOrigin);
|
|
474
|
+
debug(`Obtained origin from server side headers ${serverSideOrigin}`);
|
|
475
|
+
} else {
|
|
476
|
+
const reqOrigin = config.routePrefix !== DEFAULT_PREFIX ? `${requestUrl.origin}${config.routePrefix}` : requestUrl.origin;
|
|
477
|
+
updatedHeaders.set(HEADER_ORIGIN, reqOrigin);
|
|
478
|
+
debug(`Obtained origin from request ${reqOrigin}`);
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
const params = { ...init };
|
|
483
|
+
if (params.method?.toLowerCase() === "post" || params.method?.toLowerCase() === "put") {
|
|
484
|
+
try {
|
|
485
|
+
updatedHeaders.set("content-type", "application/json");
|
|
486
|
+
const bodyStream = _init.body ?? _init.request?.body ?? request2.body;
|
|
487
|
+
const bodyText = await new Response(bodyStream).text();
|
|
488
|
+
try {
|
|
489
|
+
params.body = JSON.stringify(JSON.parse(bodyText));
|
|
490
|
+
} catch {
|
|
491
|
+
updatedHeaders.set("content-type", "application/x-www-form-urlencoded");
|
|
492
|
+
params.body = bodyText;
|
|
493
|
+
}
|
|
494
|
+
} catch (e) {
|
|
495
|
+
error("Failed to parse request body");
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
params.headers = updatedHeaders;
|
|
499
|
+
const fullUrl = `${url}${requestUrl.search}`;
|
|
500
|
+
if (config.debug) {
|
|
501
|
+
params.headers.set("request-id", crypto.randomUUID());
|
|
502
|
+
params.cache = "no-store";
|
|
503
|
+
}
|
|
504
|
+
await config.extensionCtx?.runExtensions(
|
|
505
|
+
"onRequest" /* onRequest */,
|
|
506
|
+
config,
|
|
507
|
+
params,
|
|
508
|
+
_init
|
|
509
|
+
);
|
|
510
|
+
try {
|
|
511
|
+
const res = await fetch(fullUrl, {
|
|
512
|
+
...params
|
|
513
|
+
}).catch((e) => {
|
|
514
|
+
error("An error has occurred in the fetch", {
|
|
515
|
+
message: e.message,
|
|
516
|
+
stack: e.stack
|
|
517
|
+
});
|
|
518
|
+
return new Response(
|
|
519
|
+
"An unexpected (most likely configuration) problem has occurred",
|
|
520
|
+
{ status: 500 }
|
|
521
|
+
);
|
|
522
|
+
});
|
|
523
|
+
const loggingRes = typeof res?.clone === "function" ? res?.clone() : null;
|
|
524
|
+
info(`[${params.method ?? "GET"}] ${fullUrl}`, {
|
|
525
|
+
status: res?.status,
|
|
526
|
+
statusText: res?.statusText,
|
|
527
|
+
text: await loggingRes?.text()
|
|
528
|
+
});
|
|
529
|
+
const updatedRes = await config.extensionCtx?.runExtensions(
|
|
530
|
+
"onResponse" /* onResponse */,
|
|
531
|
+
config,
|
|
532
|
+
{ ...params, response: res }
|
|
533
|
+
);
|
|
534
|
+
if (updatedRes) {
|
|
535
|
+
return updatedRes;
|
|
536
|
+
}
|
|
537
|
+
return res;
|
|
538
|
+
} catch (e) {
|
|
539
|
+
if (e instanceof Error) {
|
|
540
|
+
error("An error has occurred in the fetch", {
|
|
541
|
+
message: e.message,
|
|
542
|
+
stack: e.stack
|
|
543
|
+
});
|
|
544
|
+
}
|
|
545
|
+
return new Response(
|
|
546
|
+
"An unexpected (most likely configuration) problem has occurred",
|
|
547
|
+
{ status: 500 }
|
|
548
|
+
);
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
function getProtocolFromHeaders(headers) {
|
|
552
|
+
const get = (key17) => headers instanceof Headers ? headers.get(key17) : headers[key17.toLowerCase()];
|
|
553
|
+
const xfp = get("x-forwarded-proto");
|
|
554
|
+
if (xfp) return xfp.toLowerCase();
|
|
555
|
+
const forwarded = get("forwarded");
|
|
556
|
+
if (forwarded) {
|
|
557
|
+
const match = forwarded.match(/proto=(https?)/i);
|
|
558
|
+
if (match) return match[1].toLowerCase();
|
|
559
|
+
}
|
|
560
|
+
const ref = get("referer") || get("origin");
|
|
561
|
+
if (ref && ref.startsWith("https")) return "https";
|
|
562
|
+
return "http";
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
// src/api/utils/auth.ts
|
|
566
|
+
async function auth(req, config) {
|
|
567
|
+
const { info, error } = config.logger("[nileauth]");
|
|
568
|
+
info("checking auth");
|
|
569
|
+
const sessionUrl = `${config.apiUrl}/auth/session`;
|
|
570
|
+
info(`using session ${sessionUrl}`);
|
|
571
|
+
req.headers.delete("content-length");
|
|
572
|
+
const res = await request(sessionUrl, { request: req }, config);
|
|
573
|
+
try {
|
|
574
|
+
const session = await new Response(res.body).json();
|
|
575
|
+
if (Object.keys(session).length === 0) {
|
|
576
|
+
info("no session found");
|
|
577
|
+
return void 0;
|
|
578
|
+
}
|
|
579
|
+
info("session active");
|
|
580
|
+
return session;
|
|
581
|
+
} catch (e) {
|
|
582
|
+
error(e);
|
|
583
|
+
return void 0;
|
|
584
|
+
}
|
|
585
|
+
}
|
|
546
586
|
|
|
547
587
|
// src/api/routes/me/index.ts
|
|
548
588
|
var key = "ME";
|
|
@@ -2694,7 +2734,7 @@ var Auth = class {
|
|
|
2694
2734
|
].filter(Boolean).join("; ");
|
|
2695
2735
|
const uHeaders = new Headers({ cookie });
|
|
2696
2736
|
updateHeaders(uHeaders);
|
|
2697
|
-
ctx.set({ headers: uHeaders });
|
|
2737
|
+
ctx.set({ headers: uHeaders, preserveHeaders: true });
|
|
2698
2738
|
} else {
|
|
2699
2739
|
error("Unable to set context after sign in", {
|
|
2700
2740
|
headers: signInRes.headers
|
|
@@ -2848,6 +2888,22 @@ async function obtainCsrf(config, rawResponse = false) {
|
|
|
2848
2888
|
}
|
|
2849
2889
|
}
|
|
2850
2890
|
|
|
2891
|
+
// src/utils/qualifyDomain.ts
|
|
2892
|
+
function fQUrl2(callbackUrl, path) {
|
|
2893
|
+
if (path.startsWith("/")) {
|
|
2894
|
+
if (callbackUrl) {
|
|
2895
|
+
const { origin } = new URL(callbackUrl);
|
|
2896
|
+
return `${origin}${path}`;
|
|
2897
|
+
}
|
|
2898
|
+
}
|
|
2899
|
+
try {
|
|
2900
|
+
new URL(path);
|
|
2901
|
+
} catch {
|
|
2902
|
+
throw new Error("An invalid URL has been passed.");
|
|
2903
|
+
}
|
|
2904
|
+
return path;
|
|
2905
|
+
}
|
|
2906
|
+
|
|
2851
2907
|
// src/users/index.ts
|
|
2852
2908
|
var Users = class {
|
|
2853
2909
|
#config;
|
|
@@ -2917,7 +2973,10 @@ var Users = class {
|
|
|
2917
2973
|
async verifySelf(options, rawResponse = false) {
|
|
2918
2974
|
return withNileContext(this.#config, async () => {
|
|
2919
2975
|
const bypassEmail = typeof options === "object" && options?.bypassEmail === true;
|
|
2920
|
-
const callbackUrl =
|
|
2976
|
+
const callbackUrl = fQUrl2(
|
|
2977
|
+
defaultCallbackUrl2().callbackUrl,
|
|
2978
|
+
typeof options === "object" ? String(options.callbackUrl) : "/"
|
|
2979
|
+
);
|
|
2921
2980
|
let res;
|
|
2922
2981
|
try {
|
|
2923
2982
|
const me = await this.getSelf();
|
|
@@ -3176,7 +3235,6 @@ var Tenants = class {
|
|
|
3176
3235
|
return withNileContext(
|
|
3177
3236
|
this.#config,
|
|
3178
3237
|
async () => {
|
|
3179
|
-
await runExtensionContext(this.#config);
|
|
3180
3238
|
const { csrfToken } = await obtainCsrf(
|
|
3181
3239
|
this.#config
|
|
3182
3240
|
);
|
|
@@ -3188,11 +3246,12 @@ var Tenants = class {
|
|
|
3188
3246
|
if ("email" in req) {
|
|
3189
3247
|
identifier = req.email;
|
|
3190
3248
|
}
|
|
3249
|
+
const { callbackUrl: cbUrl } = defaultCallbackUrl3(this.#config);
|
|
3191
3250
|
if ("callbackUrl" in req) {
|
|
3192
|
-
callbackUrl = fQUrl2(req.callbackUrl ?? ""
|
|
3251
|
+
callbackUrl = fQUrl2(cbUrl, req.callbackUrl ?? "/");
|
|
3193
3252
|
}
|
|
3194
3253
|
if ("redirectUrl" in req) {
|
|
3195
|
-
redirectUrl = fQUrl2(req.redirectUrl ?? ""
|
|
3254
|
+
redirectUrl = fQUrl2(cbUrl, req.redirectUrl ?? "/");
|
|
3196
3255
|
}
|
|
3197
3256
|
}
|
|
3198
3257
|
const { headers } = ctx.get();
|
|
@@ -3225,8 +3284,8 @@ var Tenants = class {
|
|
|
3225
3284
|
throw new Error("The identifier and token are required.");
|
|
3226
3285
|
}
|
|
3227
3286
|
const { identifier, token } = req;
|
|
3228
|
-
const
|
|
3229
|
-
const callbackUrl =
|
|
3287
|
+
const { callbackUrl: cbUrl } = defaultCallbackUrl3(this.#config);
|
|
3288
|
+
const callbackUrl = fQUrl2(cbUrl, req?.callbackUrl ?? "/");
|
|
3230
3289
|
const res = await fetchInvite(
|
|
3231
3290
|
this.#config,
|
|
3232
3291
|
"PUT",
|
|
@@ -3294,21 +3353,6 @@ function defaultCallbackUrl3(config) {
|
|
|
3294
3353
|
}
|
|
3295
3354
|
return { callbackUrl: cb, redirectUrl: redirect };
|
|
3296
3355
|
}
|
|
3297
|
-
function fQUrl2(path, config) {
|
|
3298
|
-
if (path.startsWith("/")) {
|
|
3299
|
-
const { callbackUrl } = defaultCallbackUrl3(config);
|
|
3300
|
-
if (callbackUrl) {
|
|
3301
|
-
const { origin } = new URL(callbackUrl);
|
|
3302
|
-
return `${origin}${path}`;
|
|
3303
|
-
}
|
|
3304
|
-
}
|
|
3305
|
-
try {
|
|
3306
|
-
new URL(path);
|
|
3307
|
-
} catch {
|
|
3308
|
-
throw new Error("An invalid URL has been passed.");
|
|
3309
|
-
}
|
|
3310
|
-
return path;
|
|
3311
|
-
}
|
|
3312
3356
|
|
|
3313
3357
|
// src/api/handlers/withContext/index.ts
|
|
3314
3358
|
function handlersWithContext(config) {
|
|
@@ -3401,6 +3445,7 @@ var Server = class {
|
|
|
3401
3445
|
watchHeaders((headers) => {
|
|
3402
3446
|
if (headers) {
|
|
3403
3447
|
this.#config.context.headers = new Headers(headers);
|
|
3448
|
+
this.#config.context.preserveHeaders = true;
|
|
3404
3449
|
this.#reset();
|
|
3405
3450
|
}
|
|
3406
3451
|
});
|