princejs 2.1.4 → 2.1.5
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/prince.d.ts +4 -1
- package/dist/prince.d.ts.map +1 -1
- package/dist/prince.js +144 -95
- package/package.json +1 -1
package/dist/prince.d.ts
CHANGED
|
@@ -75,6 +75,7 @@ export declare class Prince {
|
|
|
75
75
|
private router;
|
|
76
76
|
private staticRoutes;
|
|
77
77
|
private staticMiddlewares;
|
|
78
|
+
private staticComposed;
|
|
78
79
|
private routeCache;
|
|
79
80
|
private onRequestHooks;
|
|
80
81
|
private onBeforeHandleHooks;
|
|
@@ -111,8 +112,10 @@ export declare class Prince {
|
|
|
111
112
|
private add;
|
|
112
113
|
private buildRouter;
|
|
113
114
|
private insertRoute;
|
|
115
|
+
private composeMW;
|
|
114
116
|
private findRoute;
|
|
115
|
-
private
|
|
117
|
+
private composeRouterMiddlewares;
|
|
118
|
+
private composeStaticMiddlewares;
|
|
116
119
|
private matchRoute;
|
|
117
120
|
private parseBody;
|
|
118
121
|
private executeHandler;
|
package/dist/prince.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prince.d.ts","sourceRoot":"","sources":["../src/prince.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAe,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE9E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,KAAK,IAAI,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;AACpC,KAAK,UAAU,GAAG,CAAC,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC;AAC3G,KAAK,aAAa,GAAG,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,GAAG,UAAU,CAAC;AAE1E,MAAM,WAAW,aAAc,SAAQ,OAAO;IAC5C,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAGD,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AACrE,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AACxG,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AACtH,MAAM,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3G,UAAU,gBAAgB;IACxB,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,IAAI,CAAC;IACzB,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;IAClD,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,IAAI,CAAC;CAC3B;AAED,KAAK,YAAY,GAAG,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"prince.d.ts","sourceRoot":"","sources":["../src/prince.ts"],"names":[],"mappings":"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"}
|
package/dist/prince.js
CHANGED
|
@@ -177,27 +177,50 @@ function parseCookies(cookieHeader) {
|
|
|
177
177
|
const cookies = {};
|
|
178
178
|
if (!cookieHeader)
|
|
179
179
|
return cookies;
|
|
180
|
-
cookieHeader.
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
180
|
+
const len = cookieHeader.length;
|
|
181
|
+
let i = 0;
|
|
182
|
+
while (i < len) {
|
|
183
|
+
while (i < len && cookieHeader.charCodeAt(i) === 32)
|
|
184
|
+
i++;
|
|
185
|
+
const eqIdx = cookieHeader.indexOf("=", i);
|
|
186
|
+
if (eqIdx === -1)
|
|
187
|
+
break;
|
|
188
|
+
const semIdx = cookieHeader.indexOf(";", eqIdx);
|
|
189
|
+
const end = semIdx === -1 ? len : semIdx;
|
|
190
|
+
const name = cookieHeader.slice(i, eqIdx).trimEnd();
|
|
191
|
+
const val = cookieHeader.slice(eqIdx + 1, end).trim();
|
|
192
|
+
if (name) {
|
|
193
|
+
try {
|
|
194
|
+
cookies[decodeURIComponent(name)] = decodeURIComponent(val);
|
|
195
|
+
} catch {
|
|
196
|
+
cookies[name] = val;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
i = end + 1;
|
|
200
|
+
}
|
|
185
201
|
return cookies;
|
|
186
202
|
}
|
|
203
|
+
function extractPathname(url) {
|
|
204
|
+
const slashSlash = url.indexOf("//");
|
|
205
|
+
if (slashSlash === -1)
|
|
206
|
+
return "/";
|
|
207
|
+
const pathStart = url.indexOf("/", slashSlash + 2);
|
|
208
|
+
if (pathStart === -1)
|
|
209
|
+
return "/";
|
|
210
|
+
const qIdx = url.indexOf("?", pathStart);
|
|
211
|
+
return qIdx === -1 ? url.slice(pathStart) : url.slice(pathStart, qIdx);
|
|
212
|
+
}
|
|
213
|
+
function extractSearch(url) {
|
|
214
|
+
const qIdx = url.indexOf("?");
|
|
215
|
+
return qIdx === -1 ? "" : url.slice(qIdx + 1);
|
|
216
|
+
}
|
|
187
217
|
function detectIP(req) {
|
|
188
218
|
const forwarded = req.headers.get("x-forwarded-for");
|
|
189
|
-
if (forwarded)
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
const cfIp = req.headers.get("cf-connecting-ip");
|
|
195
|
-
if (cfIp)
|
|
196
|
-
return cfIp;
|
|
197
|
-
const clientIp = req.headers.get("x-client-ip");
|
|
198
|
-
if (clientIp)
|
|
199
|
-
return clientIp;
|
|
200
|
-
return "127.0.0.1";
|
|
219
|
+
if (forwarded) {
|
|
220
|
+
const comma = forwarded.indexOf(",");
|
|
221
|
+
return comma === -1 ? forwarded.trim() : forwarded.slice(0, comma).trim();
|
|
222
|
+
}
|
|
223
|
+
return req.headers.get("x-real-ip") ?? req.headers.get("cf-connecting-ip") ?? req.headers.get("x-client-ip") ?? "127.0.0.1";
|
|
201
224
|
}
|
|
202
225
|
function zodToJsonSchema(schema) {
|
|
203
226
|
const d = schema._def;
|
|
@@ -353,6 +376,7 @@ class Prince {
|
|
|
353
376
|
router = null;
|
|
354
377
|
staticRoutes = new Map;
|
|
355
378
|
staticMiddlewares = new Map;
|
|
379
|
+
staticComposed = new Map;
|
|
356
380
|
routeCache = new Map;
|
|
357
381
|
onRequestHooks = [];
|
|
358
382
|
onBeforeHandleHooks = [];
|
|
@@ -363,6 +387,9 @@ class Prince {
|
|
|
363
387
|
}
|
|
364
388
|
use(mw) {
|
|
365
389
|
this.middlewares.push(mw);
|
|
390
|
+
this.routeCache.clear();
|
|
391
|
+
this.staticComposed.clear();
|
|
392
|
+
this.router = null;
|
|
366
393
|
return this;
|
|
367
394
|
}
|
|
368
395
|
plugin(plugin, options) {
|
|
@@ -448,6 +475,8 @@ class Prince {
|
|
|
448
475
|
pattern: "",
|
|
449
476
|
handlers: {},
|
|
450
477
|
middlewares: {},
|
|
478
|
+
composedMiddlewares: {},
|
|
479
|
+
allowedMethods: new Set,
|
|
451
480
|
children: []
|
|
452
481
|
};
|
|
453
482
|
for (const route of this.rawRoutes) {
|
|
@@ -476,6 +505,8 @@ class Prince {
|
|
|
476
505
|
pattern: part,
|
|
477
506
|
handlers: {},
|
|
478
507
|
middlewares: {},
|
|
508
|
+
composedMiddlewares: {},
|
|
509
|
+
allowedMethods: new Set,
|
|
479
510
|
children: []
|
|
480
511
|
};
|
|
481
512
|
if (part.startsWith(":")) {
|
|
@@ -490,76 +521,71 @@ class Prince {
|
|
|
490
521
|
}
|
|
491
522
|
}
|
|
492
523
|
currentNode.handlers[route.method] = route.handler;
|
|
524
|
+
currentNode.allowedMethods.add(route.method);
|
|
493
525
|
if (route.middlewares.length > 0) {
|
|
494
526
|
currentNode.middlewares[route.method] = route.middlewares;
|
|
495
527
|
}
|
|
496
528
|
}
|
|
529
|
+
composeMW(routeMW) {
|
|
530
|
+
if (this.middlewares.length === 0)
|
|
531
|
+
return routeMW;
|
|
532
|
+
if (routeMW.length === 0)
|
|
533
|
+
return this.middlewares;
|
|
534
|
+
return [...this.middlewares, ...routeMW];
|
|
535
|
+
}
|
|
497
536
|
findRoute(method, pathname) {
|
|
498
537
|
const cacheKey = `${method}:${pathname}`;
|
|
499
538
|
if (this.routeCache.has(cacheKey)) {
|
|
500
539
|
return this.routeCache.get(cacheKey);
|
|
501
540
|
}
|
|
502
|
-
const
|
|
503
|
-
const staticHandler = this.staticRoutes.get(staticKey);
|
|
541
|
+
const staticHandler = this.staticRoutes.get(cacheKey);
|
|
504
542
|
if (staticHandler) {
|
|
505
|
-
const
|
|
506
|
-
|
|
507
|
-
params: {},
|
|
508
|
-
middlewares: this.staticMiddlewares.get(staticKey) || []
|
|
509
|
-
};
|
|
543
|
+
const composed = this.staticComposed.get(cacheKey) ?? this.composeMW(this.staticMiddlewares.get(cacheKey) ?? []);
|
|
544
|
+
const result2 = { handler: staticHandler, params: {}, middlewares: composed };
|
|
510
545
|
this.routeCache.set(cacheKey, result2);
|
|
511
546
|
return result2;
|
|
512
547
|
}
|
|
548
|
+
if (this.staticRoutes.size > 0) {
|
|
549
|
+
const methods = ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"];
|
|
550
|
+
const allowed = methods.filter((m) => m !== method && this.staticRoutes.has(`${m}:${pathname}`));
|
|
551
|
+
if (allowed.length > 0) {
|
|
552
|
+
const r = { handler: null, params: {}, middlewares: [], allowedMethods: allowed };
|
|
553
|
+
this.routeCache.set(cacheKey, r);
|
|
554
|
+
return r;
|
|
555
|
+
}
|
|
556
|
+
}
|
|
513
557
|
const segments = pathname === "/" ? [""] : pathname.split("/").slice(1);
|
|
514
558
|
const result = this.matchRoute(this.buildRouter(), segments, method);
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
const
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
allowedMethods.add(route.method);
|
|
523
|
-
}
|
|
559
|
+
this.routeCache.set(cacheKey, result);
|
|
560
|
+
return result;
|
|
561
|
+
}
|
|
562
|
+
composeRouterMiddlewares(node) {
|
|
563
|
+
for (const method of Object.keys(node.handlers)) {
|
|
564
|
+
const routeMW = node.middlewares[method] ?? [];
|
|
565
|
+
node.composedMiddlewares[method] = this.middlewares.length === 0 ? routeMW : routeMW.length === 0 ? this.middlewares : [...this.middlewares, ...routeMW];
|
|
524
566
|
}
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
handler: null,
|
|
528
|
-
params: {},
|
|
529
|
-
middlewares: [],
|
|
530
|
-
allowedMethods: Array.from(allowedMethods)
|
|
531
|
-
};
|
|
532
|
-
this.routeCache.set(cacheKey, methodNotAllowed);
|
|
533
|
-
return methodNotAllowed;
|
|
567
|
+
for (const child of node.children) {
|
|
568
|
+
this.composeRouterMiddlewares(child);
|
|
534
569
|
}
|
|
535
|
-
this.routeCache.set(cacheKey, null);
|
|
536
|
-
return null;
|
|
537
570
|
}
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
const
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
return true;
|
|
544
|
-
return false;
|
|
571
|
+
composeStaticMiddlewares() {
|
|
572
|
+
this.staticComposed.clear();
|
|
573
|
+
for (const [key, handler] of this.staticRoutes) {
|
|
574
|
+
const routeMW = this.staticMiddlewares.get(key) ?? [];
|
|
575
|
+
this.staticComposed.set(key, this.middlewares.length === 0 ? routeMW : routeMW.length === 0 ? this.middlewares : [...this.middlewares, ...routeMW]);
|
|
545
576
|
}
|
|
546
|
-
for (let i = 0;i < routeParts.length; i++) {
|
|
547
|
-
const routePart = routeParts[i];
|
|
548
|
-
const requestPart = requestParts[i];
|
|
549
|
-
if (routePart.startsWith(":") || routePart === "*" || routePart === "**") {
|
|
550
|
-
continue;
|
|
551
|
-
}
|
|
552
|
-
if (routePart !== requestPart) {
|
|
553
|
-
return false;
|
|
554
|
-
}
|
|
555
|
-
}
|
|
556
|
-
return true;
|
|
557
577
|
}
|
|
558
578
|
matchRoute(node, segments, method, params = {}, index = 0) {
|
|
559
579
|
if (index === segments.length) {
|
|
560
580
|
const handler = node.handlers[method];
|
|
561
|
-
|
|
562
|
-
|
|
581
|
+
if (handler) {
|
|
582
|
+
const middlewares = node.composedMiddlewares[method] ?? this.composeMW(node.middlewares[method] ?? []);
|
|
583
|
+
return { handler, params, middlewares };
|
|
584
|
+
}
|
|
585
|
+
if (node.allowedMethods.size > 0) {
|
|
586
|
+
return { handler: null, params, middlewares: [], allowedMethods: [...node.allowedMethods] };
|
|
587
|
+
}
|
|
588
|
+
return null;
|
|
563
589
|
}
|
|
564
590
|
const segment = segments[index];
|
|
565
591
|
for (const child of node.children) {
|
|
@@ -573,11 +599,15 @@ class Prince {
|
|
|
573
599
|
}
|
|
574
600
|
for (const child of node.children) {
|
|
575
601
|
if (child.paramName) {
|
|
602
|
+
const saved = params[child.paramName];
|
|
576
603
|
params[child.paramName] = segment;
|
|
577
604
|
const result = this.matchRoute(child, segments, method, params, index + 1);
|
|
578
605
|
if (result)
|
|
579
606
|
return result;
|
|
580
|
-
|
|
607
|
+
if (saved === undefined)
|
|
608
|
+
delete params[child.paramName];
|
|
609
|
+
else
|
|
610
|
+
params[child.paramName] = saved;
|
|
581
611
|
}
|
|
582
612
|
}
|
|
583
613
|
for (const child of node.children) {
|
|
@@ -590,39 +620,32 @@ class Prince {
|
|
|
590
620
|
for (const child of node.children) {
|
|
591
621
|
if (child.isCatchAll) {
|
|
592
622
|
const handler = child.handlers[method];
|
|
593
|
-
const middlewares = child.middlewares[method] || [];
|
|
594
623
|
if (handler) {
|
|
624
|
+
const middlewares = child.composedMiddlewares[method] ?? this.composeMW(child.middlewares[method] ?? []);
|
|
595
625
|
return { handler, params, middlewares };
|
|
596
626
|
}
|
|
627
|
+
if (child.allowedMethods.size > 0) {
|
|
628
|
+
return { handler: null, params, middlewares: [], allowedMethods: [...child.allowedMethods] };
|
|
629
|
+
}
|
|
597
630
|
}
|
|
598
631
|
}
|
|
599
632
|
return null;
|
|
600
633
|
}
|
|
601
634
|
async parseBody(req) {
|
|
602
635
|
const ct = req.headers.get("content-type") || "";
|
|
603
|
-
const clonedReq = req.clone();
|
|
604
636
|
try {
|
|
605
637
|
if (ct.includes("application/json")) {
|
|
606
|
-
return await
|
|
638
|
+
return await req.json();
|
|
607
639
|
}
|
|
608
640
|
if (ct.includes("application/x-www-form-urlencoded")) {
|
|
609
|
-
const text = await
|
|
641
|
+
const text = await req.text();
|
|
610
642
|
return Object.fromEntries(new URLSearchParams(text));
|
|
611
643
|
}
|
|
612
644
|
if (ct.startsWith("multipart/form-data")) {
|
|
613
|
-
|
|
614
|
-
const files = {};
|
|
615
|
-
const fields = {};
|
|
616
|
-
for (const [k, v] of fd.entries()) {
|
|
617
|
-
if (v instanceof File)
|
|
618
|
-
files[k] = v;
|
|
619
|
-
else
|
|
620
|
-
fields[k] = v;
|
|
621
|
-
}
|
|
622
|
-
return { files, fields };
|
|
645
|
+
return null;
|
|
623
646
|
}
|
|
624
647
|
if (ct.startsWith("text/")) {
|
|
625
|
-
return await
|
|
648
|
+
return await req.text();
|
|
626
649
|
}
|
|
627
650
|
} catch (error) {
|
|
628
651
|
console.error("Body parsing error:", error);
|
|
@@ -630,11 +653,31 @@ class Prince {
|
|
|
630
653
|
}
|
|
631
654
|
return null;
|
|
632
655
|
}
|
|
633
|
-
async executeHandler(req, handler, params,
|
|
656
|
+
async executeHandler(req, handler, params, search, routeMiddlewares, method, pathname) {
|
|
634
657
|
req.params = params;
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
658
|
+
let _query;
|
|
659
|
+
Object.defineProperty(req, "query", {
|
|
660
|
+
get() {
|
|
661
|
+
return _query ??= new URLSearchParams(search);
|
|
662
|
+
},
|
|
663
|
+
configurable: true
|
|
664
|
+
});
|
|
665
|
+
Object.defineProperty(req, "cookies", {
|
|
666
|
+
get() {
|
|
667
|
+
const val = parseCookies(req.headers.get("cookie") ?? "");
|
|
668
|
+
Object.defineProperty(req, "cookies", { value: val, configurable: true });
|
|
669
|
+
return val;
|
|
670
|
+
},
|
|
671
|
+
configurable: true
|
|
672
|
+
});
|
|
673
|
+
Object.defineProperty(req, "ip", {
|
|
674
|
+
get() {
|
|
675
|
+
const val = detectIP(req);
|
|
676
|
+
Object.defineProperty(req, "ip", { value: val, configurable: true });
|
|
677
|
+
return val;
|
|
678
|
+
},
|
|
679
|
+
configurable: true
|
|
680
|
+
});
|
|
638
681
|
if (["POST", "PUT", "PATCH"].includes(req.method) && !req.parsedBody) {
|
|
639
682
|
const parsed = await this.parseBody(req);
|
|
640
683
|
if (parsed) {
|
|
@@ -649,7 +692,7 @@ class Prince {
|
|
|
649
692
|
for (const hook of this.onBeforeHandleHooks) {
|
|
650
693
|
await hook(req, pathname, method);
|
|
651
694
|
}
|
|
652
|
-
const allMiddlewares = routeMiddlewares
|
|
695
|
+
const allMiddlewares = routeMiddlewares;
|
|
653
696
|
let i = 0;
|
|
654
697
|
const next = async () => {
|
|
655
698
|
while (i < allMiddlewares.length) {
|
|
@@ -669,16 +712,18 @@ class Prince {
|
|
|
669
712
|
return this.json(res);
|
|
670
713
|
};
|
|
671
714
|
const response = await next();
|
|
672
|
-
|
|
673
|
-
|
|
715
|
+
if (this.onAfterHandleHooks.length > 0) {
|
|
716
|
+
for (const hook of this.onAfterHandleHooks) {
|
|
717
|
+
await hook(req, response, pathname, method);
|
|
718
|
+
}
|
|
674
719
|
}
|
|
675
720
|
return response;
|
|
676
721
|
}
|
|
677
722
|
async handleFetch(req) {
|
|
678
|
-
const
|
|
723
|
+
const rawUrl = req.url;
|
|
724
|
+
const pathname = extractPathname(rawUrl);
|
|
679
725
|
const r = req;
|
|
680
726
|
const method = req.method;
|
|
681
|
-
const pathname = url.pathname;
|
|
682
727
|
for (const hook of this.onRequestHooks) {
|
|
683
728
|
await hook(r);
|
|
684
729
|
}
|
|
@@ -695,15 +740,16 @@ class Prince {
|
|
|
695
740
|
}
|
|
696
741
|
});
|
|
697
742
|
}
|
|
698
|
-
|
|
743
|
+
const search = extractSearch(rawUrl);
|
|
744
|
+
return this.executeHandler(r, routeMatch.handler, routeMatch.params, search, routeMatch.middlewares, method, pathname);
|
|
699
745
|
}
|
|
700
746
|
async fetch(req) {
|
|
701
|
-
const
|
|
702
|
-
const pathname = url.pathname;
|
|
747
|
+
const rawUrl = req.url;
|
|
703
748
|
const method = req.method;
|
|
704
749
|
try {
|
|
705
750
|
return await this.handleFetch(req);
|
|
706
751
|
} catch (err) {
|
|
752
|
+
const pathname = extractPathname(rawUrl);
|
|
707
753
|
for (const hook of this.onErrorHooks) {
|
|
708
754
|
await hook(err, req, pathname, method);
|
|
709
755
|
}
|
|
@@ -768,12 +814,15 @@ class Prince {
|
|
|
768
814
|
}
|
|
769
815
|
listen(port = 3000) {
|
|
770
816
|
const self = this;
|
|
817
|
+
const router = this.buildRouter();
|
|
818
|
+
this.composeRouterMiddlewares(router);
|
|
819
|
+
this.composeStaticMiddlewares();
|
|
771
820
|
Bun.serve({
|
|
772
821
|
port,
|
|
773
822
|
fetch: (req, server) => {
|
|
774
|
-
const
|
|
775
|
-
if (self.wsRoutes[
|
|
776
|
-
data: { path:
|
|
823
|
+
const pathname = extractPathname(req.url);
|
|
824
|
+
if (self.wsRoutes[pathname] && server.upgrade(req, {
|
|
825
|
+
data: { path: pathname }
|
|
777
826
|
})) {
|
|
778
827
|
return;
|
|
779
828
|
}
|
package/package.json
CHANGED