vafast 0.4.22 → 0.4.23
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-CEfOqqvd.d.mts → index-Bj3SWrMU.d.mts} +2 -2
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +2 -2
- package/dist/monitoring/index.d.mts +2 -2
- package/dist/monitoring/native-monitor.d.mts +2 -2
- package/dist/server/index.d.mts +2 -2
- package/dist/server/index.mjs +2 -2
- package/dist/server/server-factory.d.mts +2 -2
- package/dist/server/server-factory.mjs +2 -2
- package/dist/server/server.d.mts +1 -1
- package/dist/server/server.mjs +1 -1
- package/dist/{server-DGA3dd5s.d.mts → server-C2RPKSvC.d.mts} +1 -10
- package/dist/{server-C75o1b-a.mjs → server-CezB-92R.mjs} +2 -2
- package/dist/{server-C75o1b-a.mjs.map → server-CezB-92R.mjs.map} +1 -1
- package/dist/{server-L_FNwdap.mjs → server-DdIIf4co.mjs} +1 -18
- package/dist/server-DdIIf4co.mjs.map +1 -0
- package/package.json +1 -1
- package/dist/server-L_FNwdap.mjs.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { l as Route, s as NestedRoute } from "./types-D1PUFkda.mjs";
|
|
2
2
|
import { r as NestedComponentRoute, t as ComponentRoute } from "./component-route-nrrO0iSI.mjs";
|
|
3
|
-
import { t as Server } from "./server-
|
|
3
|
+
import { t as Server } from "./server-C2RPKSvC.mjs";
|
|
4
4
|
import { t as ComponentServer } from "./component-server-JqpDC7wy.mjs";
|
|
5
5
|
|
|
6
6
|
//#region src/server/server-factory.d.ts
|
|
@@ -45,4 +45,4 @@ declare class ServerFactory {
|
|
|
45
45
|
}
|
|
46
46
|
//#endregion
|
|
47
47
|
export { ServerFactory as t };
|
|
48
|
-
//# sourceMappingURL=index-
|
|
48
|
+
//# sourceMappingURL=index-Bj3SWrMU.d.mts.map
|
package/dist/index.d.mts
CHANGED
|
@@ -6,10 +6,10 @@ import "./index-CREkvfw9.mjs";
|
|
|
6
6
|
import { i as simpleHandler, n as createHandler, r as createHandlerWithExtra, t as InferableHandler } from "./create-handler-DKw-sQOV.mjs";
|
|
7
7
|
import { InferableRoute, defineRoutes } from "./defineRoute.mjs";
|
|
8
8
|
import { t as BaseServer } from "./base-server-DLxtulAO.mjs";
|
|
9
|
-
import { t as Server } from "./server-
|
|
9
|
+
import { t as Server } from "./server-C2RPKSvC.mjs";
|
|
10
10
|
import { t as DependencyManager } from "./dependency-manager-C3_7ic4h.mjs";
|
|
11
11
|
import { t as ComponentServer } from "./component-server-JqpDC7wy.mjs";
|
|
12
|
-
import { t as ServerFactory } from "./index-
|
|
12
|
+
import { t as ServerFactory } from "./index-Bj3SWrMU.mjs";
|
|
13
13
|
import { n as composeMiddleware, t as VafastError } from "./middleware-KXEoefLX.mjs";
|
|
14
14
|
import { a as parseBody, c as parseCookiesFast, d as parseHeaders, f as parseQuery, i as getHeader, p as parseQueryFast, r as getCookie, s as parseCookies } from "./parsers-BerGr2_q.mjs";
|
|
15
15
|
import { c as text, i as json, n as err, o as redirect, r as html, s as stream, t as empty } from "./response-BMfdEcTm.mjs";
|
package/dist/index.mjs
CHANGED
|
@@ -3,11 +3,11 @@ import { n as normalizePath, t as flattenNestedRoutes } from "./router-xWzwz_1a.
|
|
|
3
3
|
import { a as html, c as redirect, i as err, l as stream, n as composeMiddleware, o as json, r as empty, t as VafastError, u as text } from "./middleware-CewKbtb4.mjs";
|
|
4
4
|
import { t as BaseServer } from "./base-server-B7MYJNsl.mjs";
|
|
5
5
|
import { a as getRoute, i as getAllRoutes, n as createRouteRegistry, o as getRouteRegistry, r as filterRoutes, t as RouteRegistry } from "./route-registry-emTmRrWQ.mjs";
|
|
6
|
-
import { t as Server } from "./server-
|
|
6
|
+
import { t as Server } from "./server-DdIIf4co.mjs";
|
|
7
7
|
import { t as HtmlRenderer } from "./html-renderer-DTtJ_Yic.mjs";
|
|
8
8
|
import { t as DependencyManager } from "./dependency-manager-DCmh7xFc.mjs";
|
|
9
9
|
import { t as ComponentServer } from "./component-server-DomPJ_7S.mjs";
|
|
10
|
-
import { t as ServerFactory } from "./server-
|
|
10
|
+
import { t as ServerFactory } from "./server-CezB-92R.mjs";
|
|
11
11
|
import { a as parseCookies, d as parseQueryFast, l as parseHeaders, n as getHeader, o as parseCookiesFast, r as parseBody, t as getCookie, u as parseQuery } from "./parsers-DpH_mD0H.mjs";
|
|
12
12
|
import { t as goAwait } from "./go-await-C4ZdEUwY.mjs";
|
|
13
13
|
import { a as validateAllSchemas, c as validateSchemaOrThrow, i as precompileSchemas, n as createValidator, o as validateFast, r as getValidatorCacheStats, s as validateSchema } from "./validators-DBkyw6BG.mjs";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import "../schema-B6DFN5c2.mjs";
|
|
2
2
|
import "../index-CREkvfw9.mjs";
|
|
3
3
|
import "../base-server-DLxtulAO.mjs";
|
|
4
|
-
import "../server-
|
|
4
|
+
import "../server-C2RPKSvC.mjs";
|
|
5
5
|
import "../component-server-JqpDC7wy.mjs";
|
|
6
|
-
import "../index-
|
|
6
|
+
import "../index-Bj3SWrMU.mjs";
|
|
7
7
|
import { MemoryInfo, MonitoredServer, MonitoringConfig, MonitoringMetrics, MonitoringStatus, PathStats, StatusCodeDistribution, TimeWindowStats, createMonitoredServer, withMonitoring } from "./native-monitor.mjs";
|
|
8
8
|
export { type MemoryInfo, type MonitoredServer, type MonitoringConfig, type MonitoringMetrics, type MonitoringStatus, type PathStats, type StatusCodeDistribution, type TimeWindowStats, createMonitoredServer, withMonitoring };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import "../schema-B6DFN5c2.mjs";
|
|
2
2
|
import "../index-CREkvfw9.mjs";
|
|
3
3
|
import "../base-server-DLxtulAO.mjs";
|
|
4
|
-
import { t as Server } from "../server-
|
|
4
|
+
import { t as Server } from "../server-C2RPKSvC.mjs";
|
|
5
5
|
import "../component-server-JqpDC7wy.mjs";
|
|
6
|
-
import "../index-
|
|
6
|
+
import "../index-Bj3SWrMU.mjs";
|
|
7
7
|
|
|
8
8
|
//#region src/monitoring/native-monitor.d.ts
|
|
9
9
|
|
package/dist/server/index.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "../schema-B6DFN5c2.mjs";
|
|
2
2
|
import "../index-CREkvfw9.mjs";
|
|
3
3
|
import { t as BaseServer } from "../base-server-DLxtulAO.mjs";
|
|
4
|
-
import { t as Server } from "../server-
|
|
4
|
+
import { t as Server } from "../server-C2RPKSvC.mjs";
|
|
5
5
|
import { t as ComponentServer } from "../component-server-JqpDC7wy.mjs";
|
|
6
|
-
import { t as ServerFactory } from "../index-
|
|
6
|
+
import { t as ServerFactory } from "../index-Bj3SWrMU.mjs";
|
|
7
7
|
export { BaseServer, ComponentServer, Server, ServerFactory };
|
package/dist/server/index.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import "../middleware-CewKbtb4.mjs";
|
|
2
2
|
import { t as BaseServer } from "../base-server-B7MYJNsl.mjs";
|
|
3
|
-
import { t as Server } from "../server-
|
|
3
|
+
import { t as Server } from "../server-DdIIf4co.mjs";
|
|
4
4
|
import "../dependency-manager-DCmh7xFc.mjs";
|
|
5
5
|
import { t as ComponentServer } from "../component-server-DomPJ_7S.mjs";
|
|
6
|
-
import { t as ServerFactory } from "../server-
|
|
6
|
+
import { t as ServerFactory } from "../server-CezB-92R.mjs";
|
|
7
7
|
|
|
8
8
|
export { BaseServer, ComponentServer, Server, ServerFactory };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "../schema-B6DFN5c2.mjs";
|
|
2
2
|
import "../index-CREkvfw9.mjs";
|
|
3
3
|
import "../base-server-DLxtulAO.mjs";
|
|
4
|
-
import "../server-
|
|
4
|
+
import "../server-C2RPKSvC.mjs";
|
|
5
5
|
import "../component-server-JqpDC7wy.mjs";
|
|
6
|
-
import { t as ServerFactory } from "../index-
|
|
6
|
+
import { t as ServerFactory } from "../index-Bj3SWrMU.mjs";
|
|
7
7
|
export { ServerFactory };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "../middleware-CewKbtb4.mjs";
|
|
2
|
-
import "../server-
|
|
2
|
+
import "../server-DdIIf4co.mjs";
|
|
3
3
|
import "../dependency-manager-DCmh7xFc.mjs";
|
|
4
4
|
import "../component-server-DomPJ_7S.mjs";
|
|
5
|
-
import { t as ServerFactory } from "../server-
|
|
5
|
+
import { t as ServerFactory } from "../server-CezB-92R.mjs";
|
|
6
6
|
|
|
7
7
|
export { ServerFactory };
|
package/dist/server/server.d.mts
CHANGED
package/dist/server/server.mjs
CHANGED
|
@@ -17,16 +17,7 @@ import { t as BaseServer } from "./base-server-DLxtulAO.mjs";
|
|
|
17
17
|
declare class Server extends BaseServer {
|
|
18
18
|
private router;
|
|
19
19
|
private routes;
|
|
20
|
-
/** 是否已预编译 */
|
|
21
|
-
private isCompiled;
|
|
22
|
-
/** 预编译时的全局中间件数量 */
|
|
23
|
-
private compiledWithMiddlewareCount;
|
|
24
20
|
constructor(routes?: readonly (Route | NestedRoute)[]);
|
|
25
|
-
/**
|
|
26
|
-
* 预编译所有路由处理链
|
|
27
|
-
* 在添加所有路由和全局中间件后调用,可提升运行时性能
|
|
28
|
-
*/
|
|
29
|
-
compile(): this;
|
|
30
21
|
private registerRoutes;
|
|
31
22
|
/** 快速提取 pathname */
|
|
32
23
|
private extractPathname;
|
|
@@ -57,4 +48,4 @@ declare class Server extends BaseServer {
|
|
|
57
48
|
}
|
|
58
49
|
//#endregion
|
|
59
50
|
export { Server as t };
|
|
60
|
-
//# sourceMappingURL=server-
|
|
51
|
+
//# sourceMappingURL=server-C2RPKSvC.d.mts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as Server } from "./server-
|
|
1
|
+
import { t as Server } from "./server-DdIIf4co.mjs";
|
|
2
2
|
import { t as ComponentServer } from "./component-server-DomPJ_7S.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/server/server-factory.ts
|
|
@@ -67,4 +67,4 @@ var ServerFactory = class {
|
|
|
67
67
|
|
|
68
68
|
//#endregion
|
|
69
69
|
export { ServerFactory as t };
|
|
70
|
-
//# sourceMappingURL=server-
|
|
70
|
+
//# sourceMappingURL=server-CezB-92R.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-
|
|
1
|
+
{"version":3,"file":"server-CezB-92R.mjs","names":[],"sources":["../src/server/server-factory.ts"],"sourcesContent":["import type { Route, NestedRoute } from \"../types\";\nimport type {\n ComponentRoute,\n NestedComponentRoute,\n} from \"../types/component-route\";\nimport { Server } from \"../server\";\nimport { ComponentServer } from \"./component-server\";\n\n/**\n * 服务器工厂类\n * 用于创建和管理不同类型的服务器\n */\nexport class ServerFactory {\n private servers: Map<string, Server | ComponentServer> = new Map();\n\n /**\n * 创建标准REST API服务器\n */\n createRestServer(routes: (Route | NestedRoute)[]): Server {\n const server = new Server(routes);\n this.servers.set(\"rest\", server);\n return server;\n }\n\n /**\n * 创建组件服务器\n */\n createComponentServer(\n routes: (ComponentRoute | NestedComponentRoute)[],\n ): ComponentServer {\n const server = new ComponentServer(routes);\n this.servers.set(\"component\", server);\n return server;\n }\n\n /**\n * 获取指定类型的服务器\n */\n getServer(type: \"rest\" | \"component\"): Server | ComponentServer | undefined {\n return this.servers.get(type);\n }\n\n /**\n * 获取所有服务器\n */\n getAllServers(): Map<string, Server | ComponentServer> {\n return this.servers;\n }\n\n /**\n * 移除指定类型的服务器\n */\n removeServer(type: string): boolean {\n return this.servers.delete(type);\n }\n\n /**\n * 清除所有服务器\n */\n clearServers(): void {\n this.servers.clear();\n }\n\n /**\n * 获取服务器状态信息\n */\n getServerStatus(): Record<string, { type: string; routes: number }> {\n const status: Record<string, { type: string; routes: number }> = {};\n\n for (const [name, server] of this.servers) {\n if (server instanceof Server) {\n status[name] = {\n type: \"REST API\",\n routes: (server as any).routes?.length || 0,\n };\n } else if (server instanceof ComponentServer) {\n status[name] = {\n type: \"Component\",\n routes: (server as any).routes?.length || 0,\n };\n }\n }\n\n return status;\n }\n}\n"],"mappings":";;;;;;;;AAYA,IAAa,gBAAb,MAA2B;CACzB,AAAQ,0BAAiD,IAAI,KAAK;;;;CAKlE,iBAAiB,QAAyC;EACxD,MAAM,SAAS,IAAI,OAAO,OAAO;AACjC,OAAK,QAAQ,IAAI,QAAQ,OAAO;AAChC,SAAO;;;;;CAMT,sBACE,QACiB;EACjB,MAAM,SAAS,IAAI,gBAAgB,OAAO;AAC1C,OAAK,QAAQ,IAAI,aAAa,OAAO;AACrC,SAAO;;;;;CAMT,UAAU,MAAkE;AAC1E,SAAO,KAAK,QAAQ,IAAI,KAAK;;;;;CAM/B,gBAAuD;AACrD,SAAO,KAAK;;;;;CAMd,aAAa,MAAuB;AAClC,SAAO,KAAK,QAAQ,OAAO,KAAK;;;;;CAMlC,eAAqB;AACnB,OAAK,QAAQ,OAAO;;;;;CAMtB,kBAAoE;EAClE,MAAM,SAA2D,EAAE;AAEnE,OAAK,MAAM,CAAC,MAAM,WAAW,KAAK,QAChC,KAAI,kBAAkB,OACpB,QAAO,QAAQ;GACb,MAAM;GACN,QAAS,OAAe,QAAQ,UAAU;GAC3C;WACQ,kBAAkB,gBAC3B,QAAO,QAAQ;GACb,MAAM;GACN,QAAS,OAAe,QAAQ,UAAU;GAC3C;AAIL,SAAO"}
|
|
@@ -19,34 +19,18 @@ import { s as setGlobalRegistry, t as RouteRegistry } from "./route-registry-emT
|
|
|
19
19
|
var Server = class extends BaseServer {
|
|
20
20
|
router;
|
|
21
21
|
routes;
|
|
22
|
-
/** 是否已预编译 */
|
|
23
|
-
isCompiled = false;
|
|
24
|
-
/** 预编译时的全局中间件数量 */
|
|
25
|
-
compiledWithMiddlewareCount = 0;
|
|
26
22
|
constructor(routes = []) {
|
|
27
23
|
super();
|
|
28
24
|
this.router = new RadixRouter();
|
|
29
25
|
this.routes = [];
|
|
30
|
-
this.router.setCompiler((middleware, handler) => composeMiddleware(middleware, handler));
|
|
31
26
|
if (routes.length > 0) this.registerRoutes([...routes]);
|
|
32
27
|
}
|
|
33
|
-
/**
|
|
34
|
-
* 预编译所有路由处理链
|
|
35
|
-
* 在添加所有路由和全局中间件后调用,可提升运行时性能
|
|
36
|
-
*/
|
|
37
|
-
compile() {
|
|
38
|
-
this.router.precompileAll(this.globalMiddleware);
|
|
39
|
-
this.isCompiled = true;
|
|
40
|
-
this.compiledWithMiddlewareCount = this.globalMiddleware.length;
|
|
41
|
-
return this;
|
|
42
|
-
}
|
|
43
28
|
registerRoutes(routes) {
|
|
44
29
|
const flattened = flattenNestedRoutes(routes);
|
|
45
30
|
this.routes.push(...flattened);
|
|
46
31
|
for (const route of flattened) this.router.register(route.method, route.fullPath, route.handler, route.middlewareChain || []);
|
|
47
32
|
this.detectRouteConflicts(flattened);
|
|
48
33
|
this.logFlattenedRoutes(flattened);
|
|
49
|
-
if (this.globalMiddleware.length === 0 && !this.isCompiled) this.compile();
|
|
50
34
|
setGlobalRegistry(new RouteRegistry(this.routes));
|
|
51
35
|
}
|
|
52
36
|
/** 快速提取 pathname */
|
|
@@ -81,7 +65,6 @@ var Server = class extends BaseServer {
|
|
|
81
65
|
const match = this.router.match(method, pathname);
|
|
82
66
|
if (match) {
|
|
83
67
|
req.params = match.params;
|
|
84
|
-
if (match.compiled && this.globalMiddleware.length === this.compiledWithMiddlewareCount) return match.compiled(req);
|
|
85
68
|
return composeMiddleware([...this.globalMiddleware, ...match.middleware], match.handler)(req);
|
|
86
69
|
}
|
|
87
70
|
if (method === "OPTIONS") {
|
|
@@ -134,4 +117,4 @@ var Server = class extends BaseServer {
|
|
|
134
117
|
|
|
135
118
|
//#endregion
|
|
136
119
|
export { Server as t };
|
|
137
|
-
//# sourceMappingURL=server-
|
|
120
|
+
//# sourceMappingURL=server-DdIIf4co.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-DdIIf4co.mjs","names":[],"sources":["../src/server/server.ts"],"sourcesContent":["/**\n * Vafast 核心服务器\n *\n * 基于 Radix Tree 的高性能路由匹配\n * 时间复杂度: O(k),k 为路径段数\n */\n\nimport type { Route, NestedRoute, FlattenedRoute, Method } from \"../types\";\nimport { flattenNestedRoutes } from \"../router\";\nimport { composeMiddleware } from \"../middleware\";\nimport { json } from \"../utils/response\";\nimport { BaseServer } from \"./base-server\";\nimport { RadixRouter } from \"../router/radix-tree\";\nimport { RouteRegistry, setGlobalRegistry } from \"../utils/route-registry\";\n\n/**\n * Vafast 服务器\n *\n * @example\n * ```typescript\n * const server = new Server([\n * { method: \"GET\", path: \"/\", handler: () => new Response(\"Hello\") },\n * ]);\n * export default { fetch: server.fetch };\n * ```\n */\nexport class Server extends BaseServer {\n private router: RadixRouter;\n private routes: FlattenedRoute[];\n\n constructor(routes: readonly (Route | NestedRoute)[] = []) {\n super();\n this.router = new RadixRouter();\n this.routes = [];\n\n if (routes.length > 0) {\n this.registerRoutes([...routes]);\n }\n }\n\n private registerRoutes(routes: (Route | NestedRoute)[]): void {\n const flattened = flattenNestedRoutes(routes);\n this.routes.push(...flattened);\n\n for (const route of flattened) {\n this.router.register(\n route.method as Method,\n route.fullPath,\n route.handler,\n route.middlewareChain || [],\n );\n }\n\n this.detectRouteConflicts(flattened);\n this.logFlattenedRoutes(flattened);\n\n // 自动设置全局 RouteRegistry(支持在任意位置通过 getRouteRegistry() 访问)\n setGlobalRegistry(new RouteRegistry(this.routes));\n }\n\n /** 快速提取 pathname */\n private extractPathname(url: string): string {\n let start = url.indexOf(\"://\");\n start = start === -1 ? 0 : start + 3;\n\n const pathStart = url.indexOf(\"/\", start);\n if (pathStart === -1) return \"/\";\n\n let end = url.indexOf(\"?\", pathStart);\n if (end === -1) end = url.indexOf(\"#\", pathStart);\n if (end === -1) end = url.length;\n\n return url.substring(pathStart, end) || \"/\";\n }\n\n /** 生成 404/405 响应 */\n private createErrorResponse(method: string, pathname: string): Response {\n const allowedMethods = this.router.getAllowedMethods(pathname);\n if (allowedMethods.length > 0) {\n return json(\n {\n success: false,\n error: \"Method Not Allowed\",\n message: `Method ${method} not allowed for this endpoint`,\n allowedMethods,\n },\n 405,\n { Allow: allowedMethods.join(\", \") },\n );\n }\n return json({ success: false, error: \"Not Found\" }, 404);\n }\n\n /** 处理请求 */\n fetch = async (req: Request): Promise<Response> => {\n const pathname = this.extractPathname(req.url);\n const method = req.method as Method;\n\n const match = this.router.match(method, pathname);\n\n if (match) {\n (req as unknown as Record<string, unknown>).params = match.params;\n\n // 运行时组合中间件\n const allMiddleware = [...this.globalMiddleware, ...match.middleware];\n const handler = composeMiddleware(allMiddleware, match.handler);\n\n return handler(req);\n }\n\n // OPTIONS 预检请求特殊处理:查找同路径其他方法的路由,使用其中间件\n // 这允许路由级 CORS 中间件正常工作\n if (method === \"OPTIONS\") {\n const allowedMethods = this.router.getAllowedMethods(pathname);\n if (allowedMethods.length > 0) {\n // 尝试获取该路径任意方法的路由中间件\n const anyMatch = this.router.match(\n allowedMethods[0] as Method,\n pathname,\n );\n const routeMiddleware = anyMatch?.middleware || [];\n const allMiddleware = [...this.globalMiddleware, ...routeMiddleware];\n\n // OPTIONS 请求默认返回 204(中间件如 CORS 可能会提前响应)\n const optionsHandler = () =>\n new Response(null, {\n status: 204,\n headers: { Allow: allowedMethods.join(\", \") },\n });\n\n const handler = composeMiddleware(allMiddleware, optionsHandler);\n return handler(req);\n }\n }\n\n // 未匹配路由时,仍执行全局中间件(如 CORS 处理 OPTIONS 预检)\n if (this.globalMiddleware.length > 0) {\n const handler = composeMiddleware(this.globalMiddleware, () =>\n this.createErrorResponse(method, pathname),\n );\n return handler(req);\n }\n\n return this.createErrorResponse(method, pathname);\n };\n\n addRoute(route: Route): void {\n const flattenedRoute: FlattenedRoute = {\n ...route,\n fullPath: route.path,\n middlewareChain: route.middleware || [],\n };\n\n this.routes.push(flattenedRoute);\n this.router.register(\n route.method as Method,\n route.path,\n route.handler,\n route.middleware || [],\n );\n }\n\n addRoutes(routes: readonly (Route | NestedRoute)[]): void {\n this.registerRoutes([...routes]);\n }\n\n getRoutes(): Array<{ method: Method; path: string }> {\n return this.router.getRoutes();\n }\n\n /**\n * 获取完整的路由元信息(不含 handler 和 middleware)\n *\n * 用于 API 文档生成、Webhook 事件注册、权限检查等场景\n *\n * @example\n * ```typescript\n * const routes = server.getRoutesWithMeta()\n * for (const route of routes) {\n * console.log(route.fullPath, route.name, route.description)\n * }\n * ```\n */\n getRoutesWithMeta(): FlattenedRoute[] {\n return this.routes;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AA0BA,IAAa,SAAb,cAA4B,WAAW;CACrC,AAAQ;CACR,AAAQ;CAER,YAAY,SAA2C,EAAE,EAAE;AACzD,SAAO;AACP,OAAK,SAAS,IAAI,aAAa;AAC/B,OAAK,SAAS,EAAE;AAEhB,MAAI,OAAO,SAAS,EAClB,MAAK,eAAe,CAAC,GAAG,OAAO,CAAC;;CAIpC,AAAQ,eAAe,QAAuC;EAC5D,MAAM,YAAY,oBAAoB,OAAO;AAC7C,OAAK,OAAO,KAAK,GAAG,UAAU;AAE9B,OAAK,MAAM,SAAS,UAClB,MAAK,OAAO,SACV,MAAM,QACN,MAAM,UACN,MAAM,SACN,MAAM,mBAAmB,EAAE,CAC5B;AAGH,OAAK,qBAAqB,UAAU;AACpC,OAAK,mBAAmB,UAAU;AAGlC,oBAAkB,IAAI,cAAc,KAAK,OAAO,CAAC;;;CAInD,AAAQ,gBAAgB,KAAqB;EAC3C,IAAI,QAAQ,IAAI,QAAQ,MAAM;AAC9B,UAAQ,UAAU,KAAK,IAAI,QAAQ;EAEnC,MAAM,YAAY,IAAI,QAAQ,KAAK,MAAM;AACzC,MAAI,cAAc,GAAI,QAAO;EAE7B,IAAI,MAAM,IAAI,QAAQ,KAAK,UAAU;AACrC,MAAI,QAAQ,GAAI,OAAM,IAAI,QAAQ,KAAK,UAAU;AACjD,MAAI,QAAQ,GAAI,OAAM,IAAI;AAE1B,SAAO,IAAI,UAAU,WAAW,IAAI,IAAI;;;CAI1C,AAAQ,oBAAoB,QAAgB,UAA4B;EACtE,MAAM,iBAAiB,KAAK,OAAO,kBAAkB,SAAS;AAC9D,MAAI,eAAe,SAAS,EAC1B,QAAO,KACL;GACE,SAAS;GACT,OAAO;GACP,SAAS,UAAU,OAAO;GAC1B;GACD,EACD,KACA,EAAE,OAAO,eAAe,KAAK,KAAK,EAAE,CACrC;AAEH,SAAO,KAAK;GAAE,SAAS;GAAO,OAAO;GAAa,EAAE,IAAI;;;CAI1D,QAAQ,OAAO,QAAoC;EACjD,MAAM,WAAW,KAAK,gBAAgB,IAAI,IAAI;EAC9C,MAAM,SAAS,IAAI;EAEnB,MAAM,QAAQ,KAAK,OAAO,MAAM,QAAQ,SAAS;AAEjD,MAAI,OAAO;AACT,GAAC,IAA2C,SAAS,MAAM;AAM3D,UAFgB,kBADM,CAAC,GAAG,KAAK,kBAAkB,GAAG,MAAM,WAAW,EACpB,MAAM,QAAQ,CAEhD,IAAI;;AAKrB,MAAI,WAAW,WAAW;GACxB,MAAM,iBAAiB,KAAK,OAAO,kBAAkB,SAAS;AAC9D,OAAI,eAAe,SAAS,GAAG;IAM7B,MAAM,kBAJW,KAAK,OAAO,MAC3B,eAAe,IACf,SACD,EACiC,cAAc,EAAE;IAClD,MAAM,gBAAgB,CAAC,GAAG,KAAK,kBAAkB,GAAG,gBAAgB;IAGpE,MAAM,uBACJ,IAAI,SAAS,MAAM;KACjB,QAAQ;KACR,SAAS,EAAE,OAAO,eAAe,KAAK,KAAK,EAAE;KAC9C,CAAC;AAGJ,WADgB,kBAAkB,eAAe,eAAe,CACjD,IAAI;;;AAKvB,MAAI,KAAK,iBAAiB,SAAS,EAIjC,QAHgB,kBAAkB,KAAK,wBACrC,KAAK,oBAAoB,QAAQ,SAAS,CAC3C,CACc,IAAI;AAGrB,SAAO,KAAK,oBAAoB,QAAQ,SAAS;;CAGnD,SAAS,OAAoB;EAC3B,MAAM,iBAAiC;GACrC,GAAG;GACH,UAAU,MAAM;GAChB,iBAAiB,MAAM,cAAc,EAAE;GACxC;AAED,OAAK,OAAO,KAAK,eAAe;AAChC,OAAK,OAAO,SACV,MAAM,QACN,MAAM,MACN,MAAM,SACN,MAAM,cAAc,EAAE,CACvB;;CAGH,UAAU,QAAgD;AACxD,OAAK,eAAe,CAAC,GAAG,OAAO,CAAC;;CAGlC,YAAqD;AACnD,SAAO,KAAK,OAAO,WAAW;;;;;;;;;;;;;;;CAgBhC,oBAAsC;AACpC,SAAO,KAAK"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server-L_FNwdap.mjs","names":[],"sources":["../src/server/server.ts"],"sourcesContent":["/**\n * Vafast 核心服务器\n *\n * 基于 Radix Tree 的高性能路由匹配\n * 时间复杂度: O(k),k 为路径段数\n */\n\nimport type { Route, NestedRoute, FlattenedRoute, Method } from \"../types\";\nimport { flattenNestedRoutes } from \"../router\";\nimport { composeMiddleware } from \"../middleware\";\nimport { json } from \"../utils/response\";\nimport { BaseServer } from \"./base-server\";\nimport { RadixRouter } from \"../router/radix-tree\";\nimport { RouteRegistry, setGlobalRegistry } from \"../utils/route-registry\";\n\n/**\n * Vafast 服务器\n *\n * @example\n * ```typescript\n * const server = new Server([\n * { method: \"GET\", path: \"/\", handler: () => new Response(\"Hello\") },\n * ]);\n * export default { fetch: server.fetch };\n * ```\n */\nexport class Server extends BaseServer {\n private router: RadixRouter;\n private routes: FlattenedRoute[];\n /** 是否已预编译 */\n private isCompiled = false;\n /** 预编译时的全局中间件数量 */\n private compiledWithMiddlewareCount = 0;\n\n constructor(routes: readonly (Route | NestedRoute)[] = []) {\n super();\n this.router = new RadixRouter();\n this.routes = [];\n\n // 设置中间件编译器\n this.router.setCompiler((middleware, handler) =>\n composeMiddleware(middleware, handler),\n );\n\n if (routes.length > 0) {\n this.registerRoutes([...routes]);\n }\n }\n\n /**\n * 预编译所有路由处理链\n * 在添加所有路由和全局中间件后调用,可提升运行时性能\n */\n compile(): this {\n this.router.precompileAll(this.globalMiddleware);\n this.isCompiled = true;\n this.compiledWithMiddlewareCount = this.globalMiddleware.length;\n return this;\n }\n\n private registerRoutes(routes: (Route | NestedRoute)[]): void {\n const flattened = flattenNestedRoutes(routes);\n this.routes.push(...flattened);\n\n for (const route of flattened) {\n this.router.register(\n route.method as Method,\n route.fullPath,\n route.handler,\n route.middlewareChain || [],\n );\n }\n\n this.detectRouteConflicts(flattened);\n this.logFlattenedRoutes(flattened);\n\n // 自动预编译(如果没有全局中间件)\n if (this.globalMiddleware.length === 0 && !this.isCompiled) {\n this.compile();\n }\n\n // 自动设置全局 RouteRegistry(支持在任意位置通过 getRouteRegistry() 访问)\n setGlobalRegistry(new RouteRegistry(this.routes));\n }\n\n /** 快速提取 pathname */\n private extractPathname(url: string): string {\n let start = url.indexOf(\"://\");\n start = start === -1 ? 0 : start + 3;\n\n const pathStart = url.indexOf(\"/\", start);\n if (pathStart === -1) return \"/\";\n\n let end = url.indexOf(\"?\", pathStart);\n if (end === -1) end = url.indexOf(\"#\", pathStart);\n if (end === -1) end = url.length;\n\n return url.substring(pathStart, end) || \"/\";\n }\n\n /** 生成 404/405 响应 */\n private createErrorResponse(method: string, pathname: string): Response {\n const allowedMethods = this.router.getAllowedMethods(pathname);\n if (allowedMethods.length > 0) {\n return json(\n {\n success: false,\n error: \"Method Not Allowed\",\n message: `Method ${method} not allowed for this endpoint`,\n allowedMethods,\n },\n 405,\n { Allow: allowedMethods.join(\", \") },\n );\n }\n return json({ success: false, error: \"Not Found\" }, 404);\n }\n\n /** 处理请求 */\n fetch = async (req: Request): Promise<Response> => {\n const pathname = this.extractPathname(req.url);\n const method = req.method as Method;\n\n const match = this.router.match(method, pathname);\n\n if (match) {\n (req as unknown as Record<string, unknown>).params = match.params;\n\n // 优先使用预编译的处理链(仅当全局中间件未变化时)\n if (\n match.compiled &&\n this.globalMiddleware.length === this.compiledWithMiddlewareCount\n ) {\n return match.compiled(req);\n }\n\n // 回退:运行时组合中间件\n const allMiddleware = [...this.globalMiddleware, ...match.middleware];\n const handler = composeMiddleware(allMiddleware, match.handler);\n\n return handler(req);\n }\n\n // OPTIONS 预检请求特殊处理:查找同路径其他方法的路由,使用其中间件\n // 这允许路由级 CORS 中间件正常工作\n if (method === \"OPTIONS\") {\n const allowedMethods = this.router.getAllowedMethods(pathname);\n if (allowedMethods.length > 0) {\n // 尝试获取该路径任意方法的路由中间件\n const anyMatch = this.router.match(\n allowedMethods[0] as Method,\n pathname,\n );\n const routeMiddleware = anyMatch?.middleware || [];\n const allMiddleware = [...this.globalMiddleware, ...routeMiddleware];\n\n // OPTIONS 请求默认返回 204(中间件如 CORS 可能会提前响应)\n const optionsHandler = () =>\n new Response(null, {\n status: 204,\n headers: { Allow: allowedMethods.join(\", \") },\n });\n\n const handler = composeMiddleware(allMiddleware, optionsHandler);\n return handler(req);\n }\n }\n\n // 未匹配路由时,仍执行全局中间件(如 CORS 处理 OPTIONS 预检)\n if (this.globalMiddleware.length > 0) {\n const handler = composeMiddleware(this.globalMiddleware, () =>\n this.createErrorResponse(method, pathname),\n );\n return handler(req);\n }\n\n return this.createErrorResponse(method, pathname);\n };\n\n addRoute(route: Route): void {\n const flattenedRoute: FlattenedRoute = {\n ...route,\n fullPath: route.path,\n middlewareChain: route.middleware || [],\n };\n\n this.routes.push(flattenedRoute);\n this.router.register(\n route.method as Method,\n route.path,\n route.handler,\n route.middleware || [],\n );\n }\n\n addRoutes(routes: readonly (Route | NestedRoute)[]): void {\n this.registerRoutes([...routes]);\n }\n\n getRoutes(): Array<{ method: Method; path: string }> {\n return this.router.getRoutes();\n }\n\n /**\n * 获取完整的路由元信息(不含 handler 和 middleware)\n *\n * 用于 API 文档生成、Webhook 事件注册、权限检查等场景\n *\n * @example\n * ```typescript\n * const routes = server.getRoutesWithMeta()\n * for (const route of routes) {\n * console.log(route.fullPath, route.name, route.description)\n * }\n * ```\n */\n getRoutesWithMeta(): FlattenedRoute[] {\n return this.routes;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AA0BA,IAAa,SAAb,cAA4B,WAAW;CACrC,AAAQ;CACR,AAAQ;;CAER,AAAQ,aAAa;;CAErB,AAAQ,8BAA8B;CAEtC,YAAY,SAA2C,EAAE,EAAE;AACzD,SAAO;AACP,OAAK,SAAS,IAAI,aAAa;AAC/B,OAAK,SAAS,EAAE;AAGhB,OAAK,OAAO,aAAa,YAAY,YACnC,kBAAkB,YAAY,QAAQ,CACvC;AAED,MAAI,OAAO,SAAS,EAClB,MAAK,eAAe,CAAC,GAAG,OAAO,CAAC;;;;;;CAQpC,UAAgB;AACd,OAAK,OAAO,cAAc,KAAK,iBAAiB;AAChD,OAAK,aAAa;AAClB,OAAK,8BAA8B,KAAK,iBAAiB;AACzD,SAAO;;CAGT,AAAQ,eAAe,QAAuC;EAC5D,MAAM,YAAY,oBAAoB,OAAO;AAC7C,OAAK,OAAO,KAAK,GAAG,UAAU;AAE9B,OAAK,MAAM,SAAS,UAClB,MAAK,OAAO,SACV,MAAM,QACN,MAAM,UACN,MAAM,SACN,MAAM,mBAAmB,EAAE,CAC5B;AAGH,OAAK,qBAAqB,UAAU;AACpC,OAAK,mBAAmB,UAAU;AAGlC,MAAI,KAAK,iBAAiB,WAAW,KAAK,CAAC,KAAK,WAC9C,MAAK,SAAS;AAIhB,oBAAkB,IAAI,cAAc,KAAK,OAAO,CAAC;;;CAInD,AAAQ,gBAAgB,KAAqB;EAC3C,IAAI,QAAQ,IAAI,QAAQ,MAAM;AAC9B,UAAQ,UAAU,KAAK,IAAI,QAAQ;EAEnC,MAAM,YAAY,IAAI,QAAQ,KAAK,MAAM;AACzC,MAAI,cAAc,GAAI,QAAO;EAE7B,IAAI,MAAM,IAAI,QAAQ,KAAK,UAAU;AACrC,MAAI,QAAQ,GAAI,OAAM,IAAI,QAAQ,KAAK,UAAU;AACjD,MAAI,QAAQ,GAAI,OAAM,IAAI;AAE1B,SAAO,IAAI,UAAU,WAAW,IAAI,IAAI;;;CAI1C,AAAQ,oBAAoB,QAAgB,UAA4B;EACtE,MAAM,iBAAiB,KAAK,OAAO,kBAAkB,SAAS;AAC9D,MAAI,eAAe,SAAS,EAC1B,QAAO,KACL;GACE,SAAS;GACT,OAAO;GACP,SAAS,UAAU,OAAO;GAC1B;GACD,EACD,KACA,EAAE,OAAO,eAAe,KAAK,KAAK,EAAE,CACrC;AAEH,SAAO,KAAK;GAAE,SAAS;GAAO,OAAO;GAAa,EAAE,IAAI;;;CAI1D,QAAQ,OAAO,QAAoC;EACjD,MAAM,WAAW,KAAK,gBAAgB,IAAI,IAAI;EAC9C,MAAM,SAAS,IAAI;EAEnB,MAAM,QAAQ,KAAK,OAAO,MAAM,QAAQ,SAAS;AAEjD,MAAI,OAAO;AACT,GAAC,IAA2C,SAAS,MAAM;AAG3D,OACE,MAAM,YACN,KAAK,iBAAiB,WAAW,KAAK,4BAEtC,QAAO,MAAM,SAAS,IAAI;AAO5B,UAFgB,kBADM,CAAC,GAAG,KAAK,kBAAkB,GAAG,MAAM,WAAW,EACpB,MAAM,QAAQ,CAEhD,IAAI;;AAKrB,MAAI,WAAW,WAAW;GACxB,MAAM,iBAAiB,KAAK,OAAO,kBAAkB,SAAS;AAC9D,OAAI,eAAe,SAAS,GAAG;IAM7B,MAAM,kBAJW,KAAK,OAAO,MAC3B,eAAe,IACf,SACD,EACiC,cAAc,EAAE;IAClD,MAAM,gBAAgB,CAAC,GAAG,KAAK,kBAAkB,GAAG,gBAAgB;IAGpE,MAAM,uBACJ,IAAI,SAAS,MAAM;KACjB,QAAQ;KACR,SAAS,EAAE,OAAO,eAAe,KAAK,KAAK,EAAE;KAC9C,CAAC;AAGJ,WADgB,kBAAkB,eAAe,eAAe,CACjD,IAAI;;;AAKvB,MAAI,KAAK,iBAAiB,SAAS,EAIjC,QAHgB,kBAAkB,KAAK,wBACrC,KAAK,oBAAoB,QAAQ,SAAS,CAC3C,CACc,IAAI;AAGrB,SAAO,KAAK,oBAAoB,QAAQ,SAAS;;CAGnD,SAAS,OAAoB;EAC3B,MAAM,iBAAiC;GACrC,GAAG;GACH,UAAU,MAAM;GAChB,iBAAiB,MAAM,cAAc,EAAE;GACxC;AAED,OAAK,OAAO,KAAK,eAAe;AAChC,OAAK,OAAO,SACV,MAAM,QACN,MAAM,MACN,MAAM,SACN,MAAM,cAAc,EAAE,CACvB;;CAGH,UAAU,QAAgD;AACxD,OAAK,eAAe,CAAC,GAAG,OAAO,CAAC;;CAGlC,YAAqD;AACnD,SAAO,KAAK,OAAO,WAAW;;;;;;;;;;;;;;;CAgBhC,oBAAsC;AACpC,SAAO,KAAK"}
|