@niledatabase/server 5.0.0-alpha.28 → 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 +156 -136
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +156 -136
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.mjs
CHANGED
|
@@ -125,139 +125,6 @@ function isUUID(value) {
|
|
|
125
125
|
return regex.test(value);
|
|
126
126
|
}
|
|
127
127
|
|
|
128
|
-
// src/api/utils/request.ts
|
|
129
|
-
async function request(url, _init, config) {
|
|
130
|
-
const { debug, info, error } = config.logger("[REQUEST]");
|
|
131
|
-
const { request: request2, ...init } = _init;
|
|
132
|
-
const requestUrl = new URL(request2.url);
|
|
133
|
-
const updatedHeaders = new Headers({});
|
|
134
|
-
if (request2.headers.get("cookie")) {
|
|
135
|
-
updatedHeaders.set("cookie", String(request2.headers.get("cookie")));
|
|
136
|
-
}
|
|
137
|
-
if (request2.headers.get(TENANT_COOKIE)) {
|
|
138
|
-
updatedHeaders.set(
|
|
139
|
-
TENANT_COOKIE,
|
|
140
|
-
String(request2.headers.get(TENANT_COOKIE))
|
|
141
|
-
);
|
|
142
|
-
}
|
|
143
|
-
if (config.secureCookies != null) {
|
|
144
|
-
updatedHeaders.set(HEADER_SECURE_COOKIES, String(config.secureCookies));
|
|
145
|
-
} else {
|
|
146
|
-
updatedHeaders.set(
|
|
147
|
-
HEADER_SECURE_COOKIES,
|
|
148
|
-
process.env.NODE_ENV === "production" ? "true" : "false"
|
|
149
|
-
);
|
|
150
|
-
}
|
|
151
|
-
updatedHeaders.set("host", requestUrl.host);
|
|
152
|
-
if (config.callbackUrl) {
|
|
153
|
-
const cbUrl = new URL(config.callbackUrl);
|
|
154
|
-
debug(`Obtained origin from config.callbackUrl ${config.callbackUrl}`);
|
|
155
|
-
updatedHeaders.set(HEADER_ORIGIN, cbUrl.origin);
|
|
156
|
-
} else if (config.origin) {
|
|
157
|
-
debug(`Obtained origin from config.origin ${config.origin}`);
|
|
158
|
-
updatedHeaders.set(HEADER_ORIGIN, config.origin);
|
|
159
|
-
} else {
|
|
160
|
-
const passedOrigin = request2.headers.get(HEADER_ORIGIN);
|
|
161
|
-
if (passedOrigin) {
|
|
162
|
-
updatedHeaders.set(HEADER_ORIGIN, passedOrigin);
|
|
163
|
-
} else {
|
|
164
|
-
const reqOrigin = config.routePrefix !== DEFAULT_PREFIX ? `${requestUrl.origin}${config.routePrefix}` : requestUrl.origin;
|
|
165
|
-
updatedHeaders.set(HEADER_ORIGIN, reqOrigin);
|
|
166
|
-
debug(`Obtained origin from request ${reqOrigin}`);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
const params = { ...init };
|
|
170
|
-
if (params.method?.toLowerCase() === "post" || params.method?.toLowerCase() === "put") {
|
|
171
|
-
try {
|
|
172
|
-
updatedHeaders.set("content-type", "application/json");
|
|
173
|
-
const bodyStream = _init.body ?? _init.request?.body ?? request2.body;
|
|
174
|
-
const bodyText = await new Response(bodyStream).text();
|
|
175
|
-
try {
|
|
176
|
-
params.body = JSON.stringify(JSON.parse(bodyText));
|
|
177
|
-
} catch {
|
|
178
|
-
updatedHeaders.set("content-type", "application/x-www-form-urlencoded");
|
|
179
|
-
params.body = bodyText;
|
|
180
|
-
}
|
|
181
|
-
} catch (e) {
|
|
182
|
-
error("Failed to parse request body");
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
params.headers = updatedHeaders;
|
|
186
|
-
const fullUrl = `${url}${requestUrl.search}`;
|
|
187
|
-
if (config.debug) {
|
|
188
|
-
params.headers.set("request-id", crypto.randomUUID());
|
|
189
|
-
params.cache = "no-store";
|
|
190
|
-
}
|
|
191
|
-
await config.extensionCtx?.runExtensions(
|
|
192
|
-
"onRequest" /* onRequest */,
|
|
193
|
-
config,
|
|
194
|
-
params,
|
|
195
|
-
_init
|
|
196
|
-
);
|
|
197
|
-
try {
|
|
198
|
-
const res = await fetch(fullUrl, {
|
|
199
|
-
...params
|
|
200
|
-
}).catch((e) => {
|
|
201
|
-
error("An error has occurred in the fetch", {
|
|
202
|
-
message: e.message,
|
|
203
|
-
stack: e.stack
|
|
204
|
-
});
|
|
205
|
-
return new Response(
|
|
206
|
-
"An unexpected (most likely configuration) problem has occurred",
|
|
207
|
-
{ status: 500 }
|
|
208
|
-
);
|
|
209
|
-
});
|
|
210
|
-
const loggingRes = typeof res?.clone === "function" ? res?.clone() : null;
|
|
211
|
-
info(`[${params.method ?? "GET"}] ${fullUrl}`, {
|
|
212
|
-
status: res?.status,
|
|
213
|
-
statusText: res?.statusText,
|
|
214
|
-
text: await loggingRes?.text()
|
|
215
|
-
});
|
|
216
|
-
const updatedRes = await config.extensionCtx?.runExtensions(
|
|
217
|
-
"onResponse" /* onResponse */,
|
|
218
|
-
config,
|
|
219
|
-
{ ...params, response: res }
|
|
220
|
-
);
|
|
221
|
-
if (updatedRes) {
|
|
222
|
-
return updatedRes;
|
|
223
|
-
}
|
|
224
|
-
return res;
|
|
225
|
-
} catch (e) {
|
|
226
|
-
if (e instanceof Error) {
|
|
227
|
-
error("An error has occurred in the fetch", {
|
|
228
|
-
message: e.message,
|
|
229
|
-
stack: e.stack
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
return new Response(
|
|
233
|
-
"An unexpected (most likely configuration) problem has occurred",
|
|
234
|
-
{ status: 500 }
|
|
235
|
-
);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
// src/api/utils/auth.ts
|
|
240
|
-
async function auth(req, config) {
|
|
241
|
-
const { info, error } = config.logger("[nileauth]");
|
|
242
|
-
info("checking auth");
|
|
243
|
-
const sessionUrl = `${config.apiUrl}/auth/session`;
|
|
244
|
-
info(`using session ${sessionUrl}`);
|
|
245
|
-
req.headers.delete("content-length");
|
|
246
|
-
const res = await request(sessionUrl, { request: req }, config);
|
|
247
|
-
try {
|
|
248
|
-
const session = await new Response(res.body).json();
|
|
249
|
-
if (Object.keys(session).length === 0) {
|
|
250
|
-
info("no session found");
|
|
251
|
-
return void 0;
|
|
252
|
-
}
|
|
253
|
-
info("session active");
|
|
254
|
-
return session;
|
|
255
|
-
} catch (e) {
|
|
256
|
-
error(e);
|
|
257
|
-
return void 0;
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
|
|
261
128
|
// src/utils/Logger.ts
|
|
262
129
|
var red = "\x1B[31m";
|
|
263
130
|
var yellow = "\x1B[38;2;255;255;0m";
|
|
@@ -557,6 +424,160 @@ function serializeCookies(cookies) {
|
|
|
557
424
|
return Object.entries(cookies).map(([k, v]) => `${k}=${v}`).join("; ");
|
|
558
425
|
}
|
|
559
426
|
|
|
427
|
+
// src/api/utils/request.ts
|
|
428
|
+
async function request(url, _init, config) {
|
|
429
|
+
const { debug, info, error, warn: warn2 } = config.logger("[REQUEST]");
|
|
430
|
+
const { request: request2, ...init } = _init;
|
|
431
|
+
const requestUrl = new URL(request2.url);
|
|
432
|
+
const updatedHeaders = new Headers({});
|
|
433
|
+
if (request2.headers.get("cookie")) {
|
|
434
|
+
updatedHeaders.set("cookie", String(request2.headers.get("cookie")));
|
|
435
|
+
}
|
|
436
|
+
if (request2.headers.get(TENANT_COOKIE)) {
|
|
437
|
+
updatedHeaders.set(
|
|
438
|
+
TENANT_COOKIE,
|
|
439
|
+
String(request2.headers.get(TENANT_COOKIE))
|
|
440
|
+
);
|
|
441
|
+
}
|
|
442
|
+
if (config.secureCookies != null) {
|
|
443
|
+
updatedHeaders.set(HEADER_SECURE_COOKIES, String(config.secureCookies));
|
|
444
|
+
} else {
|
|
445
|
+
updatedHeaders.set(
|
|
446
|
+
HEADER_SECURE_COOKIES,
|
|
447
|
+
process.env.NODE_ENV === "production" ? "true" : "false"
|
|
448
|
+
);
|
|
449
|
+
}
|
|
450
|
+
updatedHeaders.set("host", requestUrl.host);
|
|
451
|
+
if (config.callbackUrl) {
|
|
452
|
+
const cbUrl = new URL(config.callbackUrl);
|
|
453
|
+
debug(`Obtained origin from config.callbackUrl ${config.callbackUrl}`);
|
|
454
|
+
updatedHeaders.set(HEADER_ORIGIN, cbUrl.origin);
|
|
455
|
+
} else if (config.origin) {
|
|
456
|
+
debug(`Obtained origin from config.origin ${config.origin}`);
|
|
457
|
+
updatedHeaders.set(HEADER_ORIGIN, config.origin);
|
|
458
|
+
} else {
|
|
459
|
+
const passedOrigin = request2.headers.get(HEADER_ORIGIN);
|
|
460
|
+
if (passedOrigin) {
|
|
461
|
+
updatedHeaders.set(HEADER_ORIGIN, passedOrigin);
|
|
462
|
+
} else {
|
|
463
|
+
const { headers } = ctx.get();
|
|
464
|
+
const host = headers.get("host");
|
|
465
|
+
if (host) {
|
|
466
|
+
const serverSideOrigin = `${getProtocolFromHeaders(headers)}://${host}`;
|
|
467
|
+
updatedHeaders.set(HEADER_ORIGIN, serverSideOrigin);
|
|
468
|
+
debug(`Obtained origin from server side headers ${serverSideOrigin}`);
|
|
469
|
+
} else {
|
|
470
|
+
const reqOrigin = config.routePrefix !== DEFAULT_PREFIX ? `${requestUrl.origin}${config.routePrefix}` : requestUrl.origin;
|
|
471
|
+
updatedHeaders.set(HEADER_ORIGIN, reqOrigin);
|
|
472
|
+
debug(`Obtained origin from request ${reqOrigin}`);
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
const params = { ...init };
|
|
477
|
+
if (params.method?.toLowerCase() === "post" || params.method?.toLowerCase() === "put") {
|
|
478
|
+
try {
|
|
479
|
+
updatedHeaders.set("content-type", "application/json");
|
|
480
|
+
const bodyStream = _init.body ?? _init.request?.body ?? request2.body;
|
|
481
|
+
const bodyText = await new Response(bodyStream).text();
|
|
482
|
+
try {
|
|
483
|
+
params.body = JSON.stringify(JSON.parse(bodyText));
|
|
484
|
+
} catch {
|
|
485
|
+
updatedHeaders.set("content-type", "application/x-www-form-urlencoded");
|
|
486
|
+
params.body = bodyText;
|
|
487
|
+
}
|
|
488
|
+
} catch (e) {
|
|
489
|
+
error("Failed to parse request body");
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
params.headers = updatedHeaders;
|
|
493
|
+
const fullUrl = `${url}${requestUrl.search}`;
|
|
494
|
+
if (config.debug) {
|
|
495
|
+
params.headers.set("request-id", crypto.randomUUID());
|
|
496
|
+
params.cache = "no-store";
|
|
497
|
+
}
|
|
498
|
+
await config.extensionCtx?.runExtensions(
|
|
499
|
+
"onRequest" /* onRequest */,
|
|
500
|
+
config,
|
|
501
|
+
params,
|
|
502
|
+
_init
|
|
503
|
+
);
|
|
504
|
+
try {
|
|
505
|
+
const res = await fetch(fullUrl, {
|
|
506
|
+
...params
|
|
507
|
+
}).catch((e) => {
|
|
508
|
+
error("An error has occurred in the fetch", {
|
|
509
|
+
message: e.message,
|
|
510
|
+
stack: e.stack
|
|
511
|
+
});
|
|
512
|
+
return new Response(
|
|
513
|
+
"An unexpected (most likely configuration) problem has occurred",
|
|
514
|
+
{ status: 500 }
|
|
515
|
+
);
|
|
516
|
+
});
|
|
517
|
+
const loggingRes = typeof res?.clone === "function" ? res?.clone() : null;
|
|
518
|
+
info(`[${params.method ?? "GET"}] ${fullUrl}`, {
|
|
519
|
+
status: res?.status,
|
|
520
|
+
statusText: res?.statusText,
|
|
521
|
+
text: await loggingRes?.text()
|
|
522
|
+
});
|
|
523
|
+
const updatedRes = await config.extensionCtx?.runExtensions(
|
|
524
|
+
"onResponse" /* onResponse */,
|
|
525
|
+
config,
|
|
526
|
+
{ ...params, response: res }
|
|
527
|
+
);
|
|
528
|
+
if (updatedRes) {
|
|
529
|
+
return updatedRes;
|
|
530
|
+
}
|
|
531
|
+
return res;
|
|
532
|
+
} catch (e) {
|
|
533
|
+
if (e instanceof Error) {
|
|
534
|
+
error("An error has occurred in the fetch", {
|
|
535
|
+
message: e.message,
|
|
536
|
+
stack: e.stack
|
|
537
|
+
});
|
|
538
|
+
}
|
|
539
|
+
return new Response(
|
|
540
|
+
"An unexpected (most likely configuration) problem has occurred",
|
|
541
|
+
{ status: 500 }
|
|
542
|
+
);
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
function getProtocolFromHeaders(headers) {
|
|
546
|
+
const get = (key17) => headers instanceof Headers ? headers.get(key17) : headers[key17.toLowerCase()];
|
|
547
|
+
const xfp = get("x-forwarded-proto");
|
|
548
|
+
if (xfp) return xfp.toLowerCase();
|
|
549
|
+
const forwarded = get("forwarded");
|
|
550
|
+
if (forwarded) {
|
|
551
|
+
const match = forwarded.match(/proto=(https?)/i);
|
|
552
|
+
if (match) return match[1].toLowerCase();
|
|
553
|
+
}
|
|
554
|
+
const ref = get("referer") || get("origin");
|
|
555
|
+
if (ref && ref.startsWith("https")) return "https";
|
|
556
|
+
return "http";
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
// src/api/utils/auth.ts
|
|
560
|
+
async function auth(req, config) {
|
|
561
|
+
const { info, error } = config.logger("[nileauth]");
|
|
562
|
+
info("checking auth");
|
|
563
|
+
const sessionUrl = `${config.apiUrl}/auth/session`;
|
|
564
|
+
info(`using session ${sessionUrl}`);
|
|
565
|
+
req.headers.delete("content-length");
|
|
566
|
+
const res = await request(sessionUrl, { request: req }, config);
|
|
567
|
+
try {
|
|
568
|
+
const session = await new Response(res.body).json();
|
|
569
|
+
if (Object.keys(session).length === 0) {
|
|
570
|
+
info("no session found");
|
|
571
|
+
return void 0;
|
|
572
|
+
}
|
|
573
|
+
info("session active");
|
|
574
|
+
return session;
|
|
575
|
+
} catch (e) {
|
|
576
|
+
error(e);
|
|
577
|
+
return void 0;
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
|
|
560
581
|
// src/api/routes/me/index.ts
|
|
561
582
|
var key = "ME";
|
|
562
583
|
async function route(request2, config) {
|
|
@@ -3208,7 +3229,6 @@ var Tenants = class {
|
|
|
3208
3229
|
return withNileContext(
|
|
3209
3230
|
this.#config,
|
|
3210
3231
|
async () => {
|
|
3211
|
-
await runExtensionContext(this.#config);
|
|
3212
3232
|
const { csrfToken } = await obtainCsrf(
|
|
3213
3233
|
this.#config
|
|
3214
3234
|
);
|
|
@@ -3258,8 +3278,8 @@ var Tenants = class {
|
|
|
3258
3278
|
throw new Error("The identifier and token are required.");
|
|
3259
3279
|
}
|
|
3260
3280
|
const { identifier, token } = req;
|
|
3261
|
-
const
|
|
3262
|
-
const callbackUrl =
|
|
3281
|
+
const { callbackUrl: cbUrl } = defaultCallbackUrl3(this.#config);
|
|
3282
|
+
const callbackUrl = fQUrl2(cbUrl, req?.callbackUrl ?? "/");
|
|
3263
3283
|
const res = await fetchInvite(
|
|
3264
3284
|
this.#config,
|
|
3265
3285
|
"PUT",
|