vafast 0.3.11 → 0.4.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.
- package/README.md +61 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +144 -1
- package/dist/index.js.map +1 -1
- package/dist/monitoring/index.js +18 -1
- package/dist/monitoring/index.js.map +1 -1
- package/dist/monitoring/native-monitor.js +18 -1
- package/dist/monitoring/native-monitor.js.map +1 -1
- package/dist/router/index.js +2 -1
- package/dist/router/index.js.map +1 -1
- package/dist/router.js +2 -1
- package/dist/router.js.map +1 -1
- package/dist/server/index.js +18 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/server-factory.js +18 -1
- package/dist/server/server-factory.js.map +1 -1
- package/dist/server/server.d.ts +15 -1
- package/dist/server/server.js +18 -1
- package/dist/server/server.js.map +1 -1
- package/dist/types/types.d.ts +12 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +126 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/route-registry.d.ts +134 -0
- package/dist/utils/route-registry.js +128 -0
- package/dist/utils/route-registry.js.map +1 -0
- package/package.json +1 -1
package/dist/monitoring/index.js
CHANGED
|
@@ -29,8 +29,9 @@ function flattenNestedRoutes(routes) {
|
|
|
29
29
|
...route.middleware || []
|
|
30
30
|
];
|
|
31
31
|
if ("method" in route && "handler" in route) {
|
|
32
|
+
const leafRoute = route;
|
|
32
33
|
flattened.push({
|
|
33
|
-
...
|
|
34
|
+
...leafRoute,
|
|
34
35
|
fullPath: currentPath,
|
|
35
36
|
middlewareChain: currentMiddleware
|
|
36
37
|
});
|
|
@@ -644,6 +645,22 @@ var init_server = __esm({
|
|
|
644
645
|
getRoutes() {
|
|
645
646
|
return this.router.getRoutes();
|
|
646
647
|
}
|
|
648
|
+
/**
|
|
649
|
+
* 获取完整的路由元信息(不含 handler 和 middleware)
|
|
650
|
+
*
|
|
651
|
+
* 用于 API 文档生成、Webhook 事件注册、权限检查等场景
|
|
652
|
+
*
|
|
653
|
+
* @example
|
|
654
|
+
* ```typescript
|
|
655
|
+
* const routes = server.getRoutesWithMeta()
|
|
656
|
+
* for (const route of routes) {
|
|
657
|
+
* console.log(route.fullPath, route.name, route.description)
|
|
658
|
+
* }
|
|
659
|
+
* ```
|
|
660
|
+
*/
|
|
661
|
+
getRoutesWithMeta() {
|
|
662
|
+
return this.routes;
|
|
663
|
+
}
|
|
647
664
|
};
|
|
648
665
|
}
|
|
649
666
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/router.ts","../../src/utils/response.ts","../../src/middleware.ts","../../src/server/base-server.ts","../../src/router/radix-tree.ts","../../src/server/server.ts","../../src/middleware/component-router.ts","../../src/utils/path-matcher.ts","../../src/utils/html-renderer.ts","../../src/utils/dependency-manager.ts","../../src/server/component-server.ts","../../src/server/server-factory.ts","../../src/server/index.ts","../../src/monitoring/native-monitor.ts","../../src/monitoring/index.ts"],"sourcesContent":["/**\n * 路由工具函数\n *\n * 提供路由处理的基础工具\n */\n\nimport type { Route, NestedRoute, FlattenedRoute, Middleware } from \"./types\";\n\n/**\n * 扁平化嵌套路由\n *\n * 将嵌套路由结构转换为扁平数组,计算完整路径和中间件链\n *\n * @example\n * ```typescript\n * const routes = flattenNestedRoutes([\n * {\n * path: \"/api\",\n * middleware: [authMiddleware],\n * children: [\n * { path: \"/users\", method: \"GET\", handler: getUsers },\n * { path: \"/users/:id\", method: \"GET\", handler: getUser },\n * ],\n * },\n * ]);\n * // 结果:\n * // [\n * // { fullPath: \"/api/users\", method: \"GET\", ... },\n * // { fullPath: \"/api/users/:id\", method: \"GET\", ... },\n * // ]\n * ```\n */\nexport function flattenNestedRoutes(\n routes: (Route | NestedRoute)[],\n): FlattenedRoute[] {\n const flattened: FlattenedRoute[] = [];\n\n function processRoute(\n route: Route | NestedRoute,\n parentPath = \"\",\n parentMiddleware: Middleware[] = [],\n ): void {\n // 计算当前完整路径\n const currentPath = normalizePath(parentPath + route.path);\n // 合并中间件链\n const currentMiddleware = [\n ...parentMiddleware,\n ...(route.middleware || []),\n ];\n\n if (\"method\" in route && \"handler\" in route) {\n // 叶子路由(有处理函数)\n flattened.push({\n ...route,\n fullPath: currentPath,\n middlewareChain: currentMiddleware,\n });\n } else if (\"children\" in route && route.children) {\n // 分组路由,递归处理子路由\n for (const child of route.children) {\n processRoute(child, currentPath, currentMiddleware);\n }\n }\n }\n\n for (const route of routes) {\n processRoute(route);\n }\n\n return flattened;\n}\n\n/**\n * 标准化路径\n *\n * - 解码 URL 编码字符\n * - 去除重复斜杠\n * - 处理结尾斜杠\n *\n * @example\n * ```typescript\n * normalizePath(\"//api//users/\") // \"/api/users\"\n * normalizePath(\"/api/%20test\") // \"/api/ test\"\n * ```\n */\nexport function normalizePath(path: string): string {\n // 解码 URL 编码\n let normalized = decodeURIComponent(path);\n\n // 去除重复斜杠\n normalized = normalized.replace(/\\/+/g, \"/\");\n\n // 空路径转为根路径\n if (normalized === \"\") return \"/\";\n\n // 去除结尾斜杠(根路径除外)\n if (normalized !== \"/\" && normalized.endsWith(\"/\")) {\n normalized = normalized.slice(0, -1);\n }\n\n return normalized;\n}\n","// src/response.ts\n\n/** 生成 JSON 响应 */\nexport function json(\n data: unknown,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const body = JSON.stringify(data);\n\n // 优化:只在有自定义 headers 时才创建 Headers 对象\n if (Object.keys(headers).length === 0) {\n return new Response(body, {\n status,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n // 有自定义 headers 时才创建 Headers 对象\n const h = new Headers({\n \"Content-Type\": \"application/json\",\n ...headers,\n });\n\n return new Response(body, {\n status,\n headers: h,\n });\n}\n\n// JSON 响应的预创建 headers(避免每次创建)\nconst JSON_HEADERS = { \"Content-Type\": \"application/json\" };\nconst TEXT_HEADERS = { \"Content-Type\": \"text/plain\" };\n\n/**\n * 类型特化的响应映射\n * 根据返回值类型直接生成 Response,避免不必要的检查\n */\nexport function mapResponse(response: unknown): Response {\n // 快速路径:已经是 Response\n if (response instanceof Response) return response;\n\n // 使用 constructor.name 进行类型判断(比 instanceof 更快)\n switch (response?.constructor?.name) {\n case \"String\":\n return new Response(response as string, { headers: TEXT_HEADERS });\n\n case \"Object\":\n case \"Array\":\n return new Response(JSON.stringify(response), { headers: JSON_HEADERS });\n\n case \"Number\":\n case \"Boolean\":\n return new Response(String(response), { headers: TEXT_HEADERS });\n\n case undefined:\n // null 或 undefined\n return new Response(null, { status: 204 });\n\n case \"ReadableStream\":\n return new Response(response as ReadableStream);\n\n case \"Blob\":\n return new Response(response as Blob);\n\n case \"ArrayBuffer\":\n return new Response(response as ArrayBuffer);\n\n case \"Uint8Array\":\n return new Response(response as unknown as BodyInit);\n\n default:\n // Promise 处理\n if (response instanceof Promise) {\n return response.then(mapResponse) as unknown as Response;\n }\n // 其他情况使用 JSON 序列化\n return new Response(JSON.stringify(response), { headers: JSON_HEADERS });\n }\n}\n\n/** 生成重定向响应 */\nexport function redirect(location: string, status: 301 | 302 = 302): Response {\n return new Response(null, {\n status,\n headers: {\n Location: location,\n },\n });\n}\n\n/** 生成纯文本响应 */\nexport function text(\n content: string,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const h = new Headers({\n \"Content-Type\": \"text/plain; charset=utf-8\",\n ...headers,\n });\n\n return new Response(content, {\n status,\n headers: h,\n });\n}\n\n/** 生成HTML响应 */\nexport function html(\n content: string,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const h = new Headers({\n \"Content-Type\": \"text/html; charset=utf-8\",\n ...headers,\n });\n\n return new Response(content, {\n status,\n headers: h,\n });\n}\n\n/** 生成空响应(204 No Content) */\nexport function empty(status = 204, headers: HeadersInit = {}): Response {\n return new Response(null, {\n status,\n headers,\n });\n}\n\n/** 生成流式响应 */\nexport function stream(\n stream: ReadableStream,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const h = new Headers({\n \"Content-Type\": \"application/octet-stream\",\n ...headers,\n });\n\n return new Response(stream, {\n status,\n headers: h,\n });\n}\n","// src/middleware.ts\n\nimport { json, mapResponse } from \"./utils/response\";\n\nimport type { Handler, Middleware } from \"./types\";\n/** 中间件类型:使用 next() 传递给下一个处理 */\n\n/** Vafast 自定义错误类型 */\nexport class VafastError extends Error {\n status: number;\n type: string;\n expose: boolean;\n\n constructor(\n message: string,\n options: {\n status?: number;\n type?: string;\n expose?: boolean;\n cause?: unknown;\n } = {},\n ) {\n super(message);\n this.name = \"VafastError\";\n this.status = options.status ?? 500;\n this.type = options.type ?? \"internal_error\";\n this.expose = options.expose ?? false;\n if (options.cause) (this as any).cause = options.cause;\n }\n}\n\n/**\n * 组合类型: 自动注入错误处理器进行中间件组合\n */\nexport function composeMiddleware(\n middleware: Middleware[],\n finalHandler: Handler,\n): (req: Request) => Promise<Response> {\n const all = [errorHandler, ...middleware];\n\n return function composedHandler(req: Request): Promise<Response> {\n let i = -1;\n\n const dispatch = (index: number): Promise<Response> => {\n if (index <= i)\n return Promise.reject(new Error(\"next() called multiple times\"));\n i = index;\n\n // 中间件阶段\n if (index < all.length) {\n const mw = all[index];\n return Promise.resolve(mw(req, () => dispatch(index + 1)));\n }\n\n // 最终 handler - 使用 mapResponse 转换返回值\n return Promise.resolve(finalHandler(req)).then(mapResponse);\n };\n\n return dispatch(0);\n };\n}\n\n/** 默认包含的全局错误处理器 */\nconst errorHandler: Middleware = async (req, next) => {\n try {\n return await next();\n } catch (err) {\n console.error(\"未处理的错误:\", err);\n\n if (err instanceof VafastError) {\n return json(\n {\n error: err.type,\n message: err.expose ? err.message : \"发生了一个错误\",\n },\n err.status,\n );\n }\n\n return json({ error: \"internal_error\", message: \"出现了一些问题\" }, 500);\n }\n};\n","import type { Middleware } from \"../types\";\n\n/**\n * 服务器基类\n * 包含所有服务器类型的公共逻辑\n */\nexport abstract class BaseServer {\n protected globalMiddleware: Middleware[] = [];\n\n use(mw: Middleware) {\n this.globalMiddleware.push(mw);\n }\n\n /**\n * 打印扁平化后的路由信息,用于调试\n */\n protected logFlattenedRoutes(routes: any[], type: string = \"路由\"): void {\n console.log(`🚀 扁平化后的${type}:`);\n for (const route of routes) {\n const method = route.method || \"GET\";\n const path = route.fullPath || route.path;\n console.log(` ${method} ${path}`);\n if (route.middlewareChain && route.middlewareChain.length > 0) {\n console.log(` 中间件链: ${route.middlewareChain.length} 个`);\n }\n }\n console.log(\"\");\n }\n\n /**\n * 检测路由冲突\n * 检查是否有路径相同但方法不同的路由,以及潜在的路径冲突\n */\n protected detectRouteConflicts(routes: any[]): void {\n const pathGroups = new Map<string, any[]>();\n\n // 按路径分组\n for (const route of routes) {\n const path = route.fullPath || route.path;\n const method = route.method || \"GET\";\n if (!pathGroups.has(path)) {\n pathGroups.set(path, []);\n }\n pathGroups.get(path)!.push({ ...route, method });\n }\n\n // 检查冲突\n for (const [path, routeList] of pathGroups) {\n if (routeList.length > 1) {\n const methods = routeList.map((r) => r.method);\n const uniqueMethods = [...new Set(methods)];\n\n if (uniqueMethods.length === 1) {\n // 相同路径、相同方法 - 这是冲突!\n console.warn(\n `⚠️ 路由冲突: ${uniqueMethods[0]} ${path} 定义了 ${routeList.length} 次`,\n );\n routeList.forEach((route, index) => {\n console.warn(` ${index + 1}. ${route.method} ${path}`);\n });\n } else {\n // 相同路径、不同方法 - 这是正常的\n console.log(`ℹ️ 路径 ${path} 支持方法: ${uniqueMethods.join(\", \")}`);\n }\n }\n }\n\n // 检查潜在的路径冲突(动态路由可能冲突)\n this.detectDynamicRouteConflicts(routes);\n }\n\n /**\n * 检测动态路由的潜在冲突\n */\n private detectDynamicRouteConflicts(routes: any[]): void {\n const dynamicRoutes = routes.filter((r) => {\n const path = r.fullPath || r.path;\n return path.includes(\":\") || path.includes(\"*\");\n });\n\n for (let i = 0; i < dynamicRoutes.length; i++) {\n for (let j = i + 1; j < dynamicRoutes.length; j++) {\n const route1 = dynamicRoutes[i];\n const route2 = dynamicRoutes[j];\n const method1 = route1.method || \"GET\";\n const method2 = route2.method || \"GET\";\n\n if (method1 === method2) {\n const path1 = route1.fullPath || route1.path;\n const path2 = route2.fullPath || route2.path;\n // 检查路径是否可能冲突\n if (this.pathsMayConflict(path1, path2)) {\n console.warn(\n `⚠️ 潜在路由冲突: ${method1} ${path1} 可能与 ${path2} 冲突`,\n );\n }\n }\n }\n }\n }\n\n /**\n * 判断两个路径是否可能冲突\n */\n private pathsMayConflict(path1: string, path2: string): boolean {\n const parts1 = path1.split(\"/\").filter(Boolean);\n const parts2 = path2.split(\"/\").filter(Boolean);\n\n if (parts1.length !== parts2.length) return false;\n\n for (let i = 0; i < parts1.length; i++) {\n const p1 = parts1[i];\n const p2 = parts2[i];\n\n // 如果两个部分都是静态的且不同,则不会冲突\n if (\n !p1.startsWith(\":\") &&\n !p1.startsWith(\"*\") &&\n !p2.startsWith(\":\") &&\n !p2.startsWith(\"*\") &&\n p1 !== p2\n ) {\n return false;\n }\n\n // 如果一个是通配符,另一个是动态参数,可能冲突\n if (\n (p1 === \"*\" && p2.startsWith(\":\")) ||\n (p2 === \"*\" && p1.startsWith(\":\"))\n ) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * 路径匹配\n */\n protected matchPath(pattern: string, path: string): boolean {\n const patternParts = pattern.split(\"/\").filter(Boolean);\n const pathParts = path.split(\"/\").filter(Boolean);\n\n if (patternParts.length !== pathParts.length) {\n return false;\n }\n\n for (let i = 0; i < patternParts.length; i++) {\n if (\n patternParts[i] !== pathParts[i] &&\n !patternParts[i].startsWith(\":\")\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * 提取路径参数\n */\n protected extractParams(\n pattern: string,\n path: string,\n ): Record<string, string> {\n const params: Record<string, string> = {};\n const patternParts = pattern.split(\"/\").filter(Boolean);\n const pathParts = path.split(\"/\").filter(Boolean);\n\n for (let i = 0; i < patternParts.length; i++) {\n if (patternParts[i].startsWith(\":\")) {\n const paramName = patternParts[i].slice(1);\n params[paramName] = pathParts[i];\n }\n }\n\n return params;\n }\n}\n","/**\n * Radix Tree 路由匹配器\n *\n * 高性能路由匹配实现,时间复杂度 O(k),k 为路径段数\n *\n * 支持的路由模式:\n * - 静态路径: /users, /api/v1/health\n * - 动态参数: /users/:id, /posts/:postId/comments/:commentId\n * - 通配符: /files/*, /static/*filepath\n */\n\nimport type { Handler, Middleware, Method } from \"../types\";\n\n/** 预编译的处理器类型 */\ntype CompiledHandler = (req: Request) => Promise<Response>;\n\n/** 路由处理信息 */\ninterface RouteHandler {\n handler: Handler;\n middleware: Middleware[];\n /** 预编译后的完整处理链(包含中间件) */\n compiled?: CompiledHandler;\n}\n\n/** Radix Tree 节点 */\ninterface RadixNode {\n path: string;\n children: Record<string, RadixNode>;\n paramChild?: RadixNode;\n wildcardChild?: RadixNode;\n paramName?: string;\n handlers: Record<Method, RouteHandler | undefined>;\n}\n\n/** 路由匹配结果 */\nexport interface MatchResult {\n handler: Handler;\n middleware: Middleware[];\n params: Record<string, string>;\n /** 预编译后的完整处理链 */\n compiled?: CompiledHandler;\n}\n\n/**\n * Radix Tree 路由器\n *\n * @example\n * ```typescript\n * const router = new RadixRouter();\n * router.register(\"GET\", \"/users/:id\", handler);\n * const result = router.match(\"GET\", \"/users/123\");\n * // result.params = { id: \"123\" }\n * ```\n */\nexport class RadixRouter {\n private root: RadixNode;\n\n constructor() {\n this.root = this.createNode(\"\");\n }\n\n private createNode(path: string): RadixNode {\n return {\n path,\n children: Object.create(null),\n handlers: Object.create(null),\n };\n }\n\n /** 分割路径 */\n private splitPath(path: string): string[] {\n return path.split(\"/\").filter(Boolean);\n }\n\n /** 编译器函数 - 用于预编译中间件链 */\n private compiler?: (\n middleware: Middleware[],\n handler: Handler,\n ) => CompiledHandler;\n\n /** 设置中间件编译器 */\n setCompiler(\n compiler: (middleware: Middleware[], handler: Handler) => CompiledHandler,\n ): void {\n this.compiler = compiler;\n }\n\n /** 注册路由 */\n register(\n method: Method,\n pattern: string,\n handler: Handler,\n middleware: Middleware[] = [],\n ): void {\n const segments = this.splitPath(pattern);\n let node = this.root;\n\n for (const segment of segments) {\n const firstChar = segment[0];\n\n if (firstChar === \":\") {\n // 动态参数节点\n if (!node.paramChild) {\n node.paramChild = this.createNode(segment);\n node.paramChild.paramName = segment.substring(1);\n }\n node = node.paramChild;\n } else if (firstChar === \"*\") {\n // 通配符节点\n if (!node.wildcardChild) {\n node.wildcardChild = this.createNode(segment);\n node.wildcardChild.paramName =\n segment.length > 1 ? segment.substring(1) : \"*\";\n }\n node = node.wildcardChild;\n break;\n } else {\n // 静态路径节点\n if (!node.children[segment]) {\n node.children[segment] = this.createNode(segment);\n }\n node = node.children[segment];\n }\n }\n\n const routeHandler: RouteHandler = { handler, middleware };\n\n // 如果没有全局中间件且设置了编译器,预编译处理链\n if (this.compiler && middleware.length === 0) {\n routeHandler.compiled = this.compiler([], handler);\n }\n\n node.handlers[method] = routeHandler;\n }\n\n /** 预编译所有路由(在添加全局中间件后调用) */\n precompileAll(globalMiddleware: Middleware[]): void {\n if (!this.compiler) return;\n this.precompileNode(this.root, globalMiddleware);\n }\n\n private precompileNode(\n node: RadixNode,\n globalMiddleware: Middleware[],\n ): void {\n for (const method in node.handlers) {\n const routeHandler = node.handlers[method as Method];\n if (routeHandler) {\n const allMiddleware = [...globalMiddleware, ...routeHandler.middleware];\n routeHandler.compiled = this.compiler!(\n allMiddleware,\n routeHandler.handler,\n );\n }\n }\n\n for (const key in node.children) {\n this.precompileNode(node.children[key], globalMiddleware);\n }\n\n if (node.paramChild) {\n this.precompileNode(node.paramChild, globalMiddleware);\n }\n\n if (node.wildcardChild) {\n this.precompileNode(node.wildcardChild, globalMiddleware);\n }\n }\n\n /** 匹配路由 */\n match(method: Method, path: string): MatchResult | null {\n const segments = this.splitPath(path);\n const params: Record<string, string> = Object.create(null);\n\n const node = this.matchNode(this.root, segments, 0, params);\n if (!node) return null;\n\n const routeHandler = node.handlers[method];\n if (!routeHandler) return null;\n\n return {\n handler: routeHandler.handler,\n middleware: routeHandler.middleware,\n params,\n compiled: routeHandler.compiled,\n };\n }\n\n /** 递归匹配节点 (优先级: 静态 > 动态参数 > 通配符) */\n private matchNode(\n node: RadixNode,\n segments: string[],\n index: number,\n params: Record<string, string>,\n ): RadixNode | null {\n if (index === segments.length) {\n for (const method in node.handlers) {\n if (node.handlers[method as Method]) return node;\n }\n return null;\n }\n\n const segment = segments[index];\n\n // 1. 静态路径\n const staticChild = node.children[segment];\n if (staticChild) {\n const result = this.matchNode(staticChild, segments, index + 1, params);\n if (result) return result;\n }\n\n // 2. 动态参数\n if (node.paramChild) {\n const paramName = node.paramChild.paramName!;\n const oldValue = params[paramName];\n\n params[paramName] = segment;\n const result = this.matchNode(\n node.paramChild,\n segments,\n index + 1,\n params,\n );\n\n if (result) return result;\n\n // 回溯\n if (oldValue === undefined) {\n delete params[paramName];\n } else {\n params[paramName] = oldValue;\n }\n }\n\n // 3. 通配符\n if (node.wildcardChild) {\n params[node.wildcardChild.paramName || \"*\"] = segments\n .slice(index)\n .join(\"/\");\n return node.wildcardChild;\n }\n\n return null;\n }\n\n /** 获取路径允许的 HTTP 方法 */\n getAllowedMethods(path: string): Method[] {\n const segments = this.splitPath(path);\n const node = this.findNode(segments);\n if (!node) return [];\n\n const methods: Method[] = [];\n for (const method in node.handlers) {\n if (node.handlers[method as Method]) {\n methods.push(method as Method);\n }\n }\n return methods;\n }\n\n /** 查找节点(不提取参数) */\n private findNode(segments: string[]): RadixNode | null {\n let node = this.root;\n\n for (const segment of segments) {\n if (node.children[segment]) {\n node = node.children[segment];\n } else if (node.paramChild) {\n node = node.paramChild;\n } else if (node.wildcardChild) {\n return node.wildcardChild;\n } else {\n return null;\n }\n }\n\n return node;\n }\n\n /** 获取所有已注册的路由 */\n getRoutes(): Array<{ method: Method; path: string }> {\n const routes: Array<{ method: Method; path: string }> = [];\n this.collectRoutes(this.root, \"\", routes);\n return routes;\n }\n\n private collectRoutes(\n node: RadixNode,\n prefix: string,\n routes: Array<{ method: Method; path: string }>,\n ): void {\n const currentPath = prefix + (node.path ? \"/\" + node.path : \"\");\n\n for (const method in node.handlers) {\n if (node.handlers[method as Method]) {\n routes.push({ method: method as Method, path: currentPath || \"/\" });\n }\n }\n\n for (const key in node.children) {\n this.collectRoutes(node.children[key], currentPath, routes);\n }\n\n if (node.paramChild) {\n this.collectRoutes(node.paramChild, currentPath, routes);\n }\n\n if (node.wildcardChild) {\n this.collectRoutes(node.wildcardChild, currentPath, routes);\n }\n }\n}\n","/**\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\";\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: (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\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: (Route | NestedRoute)[]): void {\n this.registerRoutes(routes);\n }\n\n getRoutes(): Array<{ method: Method; path: string }> {\n return this.router.getRoutes();\n }\n}\n","import type {\n ComponentRoute,\n NestedComponentRoute,\n FlattenedComponentRoute,\n} from \"../types/component-route\";\nimport { vueRenderer, reactRenderer } from \"./component-renderer\";\n\n/**\n * 扁平化嵌套组件路由\n */\nexport function flattenComponentRoutes(\n routes: (ComponentRoute | NestedComponentRoute)[],\n): FlattenedComponentRoute[] {\n const flattened: FlattenedComponentRoute[] = [];\n\n function processRoute(\n route: ComponentRoute | NestedComponentRoute,\n parentPath: string = \"\",\n parentMiddleware: any[] = [],\n ) {\n const currentPath = parentPath + route.path;\n const currentMiddleware = [\n ...parentMiddleware,\n ...(route.middleware || []),\n ];\n\n if (\"component\" in route) {\n // 这是一个组件路由\n flattened.push({\n ...route,\n fullPath: currentPath,\n middlewareChain: currentMiddleware,\n });\n } else if (\"children\" in route && route.children) {\n // 这是一个嵌套路由\n for (const child of route.children) {\n processRoute(child, currentPath, currentMiddleware);\n }\n }\n }\n\n for (const route of routes) {\n processRoute(route);\n }\n\n return flattened;\n}\n\n/**\n * 组件路由处理器中间件\n * 自动检测组件类型并应用相应的渲染器\n */\nexport const componentRouter = () => {\n return async (req: Request, next: () => Promise<Response>) => {\n // 这里可以添加组件路由的自动处理逻辑\n // 比如自动检测组件类型,应用相应的渲染器\n return next();\n };\n};\n","/**\n * 路径匹配工具类\n * 提供统一的路径匹配和参数提取功能\n */\nexport class PathMatcher {\n /**\n * 路径匹配\n */\n static matchPath(pattern: string, path: string): boolean {\n const patternParts = pattern.split(\"/\").filter(Boolean);\n const pathParts = path.split(\"/\").filter(Boolean);\n\n if (patternParts.length !== pathParts.length) {\n return false;\n }\n\n for (let i = 0; i < patternParts.length; i++) {\n if (\n patternParts[i] !== pathParts[i] &&\n !patternParts[i].startsWith(\":\")\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * 提取路径参数\n */\n static extractParams(pattern: string, path: string): Record<string, string> {\n const params: Record<string, string> = {};\n const patternParts = pattern.split(\"/\").filter(Boolean);\n const pathParts = path.split(\"/\").filter(Boolean);\n\n for (let i = 0; i < patternParts.length; i++) {\n if (patternParts[i].startsWith(\":\")) {\n const paramName = patternParts[i].slice(1);\n params[paramName] = pathParts[i];\n }\n }\n\n return params;\n }\n\n /**\n * 计算路径特异性分数\n * 用于路由排序:静态 > 动态(:param) > 通配符(*)\n */\n static calculatePathScore(path: string): number {\n const parts = path.split(\"/\").filter(Boolean);\n let score = 0;\n for (const p of parts) {\n if (p === \"*\")\n score += 1; // 最弱\n else if (p.startsWith(\":\"))\n score += 2; // 中等\n else score += 3; // 静态最强\n }\n // 更长的路径更具体,略微提升\n return score * 10 + parts.length;\n }\n\n /**\n * 判断两个路径是否可能冲突\n */\n static pathsMayConflict(path1: string, path2: string): boolean {\n const parts1 = path1.split(\"/\").filter(Boolean);\n const parts2 = path2.split(\"/\").filter(Boolean);\n\n if (parts1.length !== parts2.length) return false;\n\n for (let i = 0; i < parts1.length; i++) {\n const p1 = parts1[i];\n const p2 = parts2[i];\n\n // 如果两个部分都是静态的且不同,则不会冲突\n if (\n !p1.startsWith(\":\") &&\n !p1.startsWith(\"*\") &&\n !p2.startsWith(\":\") &&\n !p2.startsWith(\"*\") &&\n p1 !== p2\n ) {\n return false;\n }\n\n // 如果一个是通配符,另一个是动态参数,可能冲突\n if (\n (p1 === \"*\" && p2.startsWith(\":\")) ||\n (p2 === \"*\" && p1.startsWith(\":\"))\n ) {\n return true;\n }\n }\n\n return false;\n }\n}\n","/**\n * HTML渲染工具类\n * 提供统一的HTML模板生成功能\n */\nexport class HtmlRenderer {\n /**\n * 生成基础HTML模板\n */\n static generateBaseHtml(\n content: string,\n context: any,\n clientScriptPath: string = \"/client.js\",\n ): string {\n return `\n <!doctype html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <title>Vafast SSR App</title>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n </head>\n <body>\n <div id=\"app\">${content}</div>\n <script>\n window.__ROUTE_INFO__ = {\n params: ${JSON.stringify(context.params || {})},\n query: ${JSON.stringify(context.query || {})},\n pathname: '${context.pathname}'\n };\n </script>\n <script type=\"module\" src=\"${clientScriptPath}\"></script>\n </body>\n </html>\n `;\n }\n\n /**\n * 生成Vue组件HTML\n */\n static generateVueHtml(\n content: string,\n context: any,\n clientScriptPath: string = \"/client.js\",\n ): string {\n return this.generateBaseHtml(content, context, clientScriptPath);\n }\n\n /**\n * 生成React组件HTML\n */\n static generateReactHtml(\n content: string,\n context: any,\n clientScriptPath: string = \"/client.js\",\n ): string {\n return `\n <!doctype html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <title>Vafast SSR App</title>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n </head>\n <body>\n <div id=\"root\">${content}</div>\n <script>\n window.__ROUTE_INFO__ = {\n params: ${JSON.stringify(context.params || {})},\n query: ${JSON.stringify(context.query || {})},\n pathname: '${context.pathname}'\n };\n </script>\n <script type=\"module\" src=\"${clientScriptPath}\"></script>\n </body>\n </html>\n `;\n }\n}\n","/**\n * 依赖管理器\n * 负责按需加载和管理框架依赖\n */\nexport class DependencyManager {\n private dependencyCache = new Map<string, any>();\n\n /**\n * 按需获取框架依赖\n */\n async getFrameworkDeps(framework: \"vue\" | \"react\") {\n if (this.dependencyCache.has(framework)) {\n return this.dependencyCache.get(framework);\n }\n\n console.log(`📦 按需加载 ${framework} 依赖...`);\n\n try {\n let deps;\n switch (framework) {\n case \"vue\":\n deps = await Promise.all([\n import(\"vue\"),\n import(\"@vue/server-renderer\"),\n ]);\n break;\n case \"react\":\n deps = await Promise.all([\n import(\"react\"),\n import(\"react-dom/server\"),\n ]);\n break;\n default:\n throw new Error(`不支持的框架: ${framework}`);\n }\n\n this.dependencyCache.set(framework, deps);\n console.log(`✅ ${framework} 依赖加载完成`);\n return deps;\n } catch (error) {\n console.error(`❌ ${framework} 依赖加载失败:`, error);\n throw error;\n }\n }\n\n /**\n * 检测组件类型\n */\n detectComponentType(component: any): \"vue\" | \"react\" {\n // 简单的组件类型检测\n if (component.render && typeof component.render === \"function\") {\n return \"vue\";\n }\n if (component.$$typeof) {\n return \"react\";\n }\n // 默认使用 Vue\n return \"vue\";\n }\n\n /**\n * 清除缓存\n */\n clearCache(): void {\n this.dependencyCache.clear();\n console.log(\"🧹 依赖缓存已清除\");\n }\n\n /**\n * 获取缓存状态\n */\n getCacheStatus(): Record<string, boolean> {\n const status: Record<string, boolean> = {};\n for (const [framework] of this.dependencyCache) {\n status[framework] = true;\n }\n return status;\n }\n}\n","import type {\n ComponentRoute,\n NestedComponentRoute,\n FlattenedComponentRoute,\n} from \"../types/component-route\";\nimport { flattenComponentRoutes } from \"../middleware/component-router\";\nimport { BaseServer } from \"./base-server\";\nimport { PathMatcher } from \"../utils/path-matcher\";\nimport { HtmlRenderer } from \"../utils/html-renderer\";\nimport { DependencyManager } from \"../utils/dependency-manager\";\n\n/**\n * 组件路由服务器\n * 专门处理声明式组件路由\n */\nexport class ComponentServer extends BaseServer {\n private routes: FlattenedComponentRoute[];\n private dependencyManager: DependencyManager;\n\n constructor(routes: (ComponentRoute | NestedComponentRoute)[]) {\n super();\n this.routes = flattenComponentRoutes(routes);\n this.dependencyManager = new DependencyManager();\n\n // 检测路由冲突\n this.detectRouteConflicts(this.routes);\n this.logFlattenedRoutes(this.routes, \"组件路由\");\n console.log(\"🚀 依赖按需加载,服务器启动完成\");\n }\n\n /**\n * 处理请求\n */\n async fetch(req: Request): Promise<Response> {\n const url = new URL(req.url);\n const pathname = url.pathname;\n const method = req.method;\n\n // 只支持 GET 请求\n if (method !== \"GET\") {\n return new Response(\"Method Not Allowed\", { status: 405 });\n }\n\n // 查找匹配的路由\n let matchedRoute: FlattenedComponentRoute | null = null;\n for (const route of this.routes) {\n if (PathMatcher.matchPath(route.fullPath, pathname)) {\n matchedRoute = route;\n break;\n }\n }\n\n if (!matchedRoute) {\n return new Response(\"Not Found\", { status: 404 });\n }\n\n try {\n // 创建中间件上下文\n const context = {\n req,\n params: PathMatcher.extractParams(matchedRoute.fullPath, pathname),\n query: Object.fromEntries(url.searchParams),\n pathname,\n };\n\n // 执行中间件链,中间件会处理组件渲染\n return await this.executeMiddlewareChain(\n matchedRoute.middlewareChain,\n context,\n matchedRoute.component,\n );\n } catch (error) {\n console.error(\"组件渲染失败:\", error);\n return new Response(\"Internal Server Error\", { status: 500 });\n }\n }\n\n /**\n * 执行中间件链\n */\n private async executeMiddlewareChain(\n middlewareChain: any[],\n context: any,\n componentImport: () => Promise<any>,\n ): Promise<Response> {\n // 创建最终的渲染函数\n const renderComponent = async () => {\n const componentModule = await componentImport();\n const component = componentModule.default || componentModule;\n\n // 自动检测组件类型\n const componentType =\n this.dependencyManager.detectComponentType(component);\n\n // 按需加载依赖\n const deps = await this.dependencyManager.getFrameworkDeps(componentType);\n\n // 根据组件类型渲染\n if (componentType === \"vue\") {\n return await this.renderVueComponent(component, context, deps);\n } else if (componentType === \"react\") {\n return await this.renderReactComponent(component, context, deps);\n } else {\n throw new Error(`不支持的组件类型: ${componentType}`);\n }\n };\n\n // 执行中间件链\n let index = 0;\n const next = async (): Promise<Response> => {\n if (index >= middlewareChain.length) {\n return await renderComponent();\n }\n\n const middleware = middlewareChain[index++];\n return await middleware(context.req, next);\n };\n\n return await next();\n }\n\n /**\n * 渲染 Vue 组件\n */\n private async renderVueComponent(\n component: any,\n context: any,\n deps: any,\n ): Promise<Response> {\n try {\n const [vue, renderer] = deps;\n const app = vue.createSSRApp(component);\n\n // 提供路由信息\n app.provide(\"routeInfo\", {\n params: context.params || {},\n query: context.query || {},\n pathname: context.pathname,\n });\n\n const html = await renderer.renderToString(app);\n const fullHtml = HtmlRenderer.generateVueHtml(html, context);\n\n return new Response(fullHtml, {\n headers: { \"Content-Type\": \"text/html; charset=utf-8\" },\n });\n } catch (error) {\n console.error(\"Vue 组件渲染失败:\", error);\n return new Response(\"Vue Component Render Error\", { status: 500 });\n }\n }\n\n /**\n * 渲染 React 组件\n */\n private async renderReactComponent(\n component: any,\n context: any,\n deps: any,\n ): Promise<Response> {\n try {\n const [react, renderer] = deps;\n const content = react.createElement(component, {\n req: context.req,\n params: context.params || {},\n query: context.query || {},\n });\n\n const html = renderer.renderToString(content);\n const fullHtml = HtmlRenderer.generateReactHtml(html, context);\n\n return new Response(fullHtml, {\n headers: { \"Content-Type\": \"text/html; charset=utf-8\" },\n });\n } catch (error) {\n console.error(\"React 组件渲染失败:\", error);\n return new Response(\"React Component Render Error\", { status: 500 });\n }\n }\n\n /**\n * 获取依赖管理器(用于外部访问)\n */\n getDependencyManager(): DependencyManager {\n return this.dependencyManager;\n }\n}\n","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","/**\n * 服务器模块导出\n */\n\n// 主服务器类\nexport { Server } from \"./server\";\n\n// 组件服务器 (SSR)\nexport { ComponentServer } from \"./component-server\";\n\n// 服务器工厂\nexport { ServerFactory } from \"./server-factory\";\n\n// 基类 (仅用于扩展)\nexport { BaseServer } from \"./base-server\";\n","/**\n * 原生监控装饰器\n *\n * 通过装饰器模式为 Server 添加监控能力,完全不入侵原类\n *\n * @author Framework Team\n * @version 2.0.0\n * @license MIT\n */\n\nimport type { Server } from \"../server\";\n\n// 监控配置接口\nexport interface NativeMonitoringConfig {\n enabled?: boolean;\n console?: boolean;\n slowThreshold?: number; // 毫秒\n errorThreshold?: number;\n tags?: Record<string, string>;\n}\n\n// 监控指标接口\nexport interface NativeMonitoringMetrics {\n requestId: string;\n method: string;\n path: string;\n statusCode: number;\n totalTime: number;\n timestamp: number;\n memoryUsage: {\n heapUsed: number;\n heapTotal: number;\n };\n}\n\n// 带监控的 Server 接口\nexport interface MonitoredServer extends Server {\n // 监控相关方法\n getMonitoringStatus(): any;\n getMonitoringMetrics(): NativeMonitoringMetrics[];\n resetMonitoring(): void;\n\n // 原始方法保持不变\n fetch: (req: Request) => Promise<Response>;\n use: (mw: any) => void;\n}\n\n// 原生监控器\nclass NativeMonitor {\n private config: NativeMonitoringConfig;\n private metrics: NativeMonitoringMetrics[] = [];\n private isEnabled = false;\n\n constructor(config: NativeMonitoringConfig = {}) {\n this.config = {\n enabled: true,\n console: true,\n slowThreshold: 1000,\n errorThreshold: 0.05,\n tags: { framework: \"vafast\" },\n ...config,\n };\n\n this.isEnabled = this.config.enabled ?? true;\n\n if (this.isEnabled && this.config.console) {\n console.log(\"✅ 原生监控已启用\");\n console.log(`📊 监控配置:`, {\n 慢请求阈值: `${this.config.slowThreshold}ms`,\n 错误率阈值: `${(this.config.errorThreshold! * 100).toFixed(1)}%`,\n 标签: this.config.tags,\n });\n }\n }\n\n // 记录监控指标\n recordMetrics(metrics: NativeMonitoringMetrics): void {\n if (!this.isEnabled) return;\n\n this.metrics.push(metrics);\n\n // 保持最近1000条记录\n if (this.metrics.length > 1000) {\n this.metrics = this.metrics.slice(-1000);\n }\n\n // 控制台输出\n if (this.config.console) {\n const status = metrics.statusCode < 400 ? \"✅\" : \"❌\";\n const timeColor =\n metrics.totalTime > this.config.slowThreshold! ? \"🐌\" : \"⚡\";\n\n console.log(\n `${status} ${metrics.method} ${metrics.path} - ${\n metrics.statusCode\n } (${timeColor} ${metrics.totalTime.toFixed(2)}ms)`,\n );\n\n // 慢请求警告\n if (metrics.totalTime > this.config.slowThreshold!) {\n console.warn(\n `🐌 慢请求警告: ${metrics.path} 耗时 ${metrics.totalTime.toFixed(\n 2,\n )}ms`,\n );\n }\n }\n }\n\n // 获取监控状态\n getStatus() {\n if (!this.isEnabled) {\n return { enabled: false, message: \"监控未启用\" };\n }\n\n const totalRequests = this.metrics.length;\n const successfulRequests = this.metrics.filter(\n (m) => m.statusCode < 400,\n ).length;\n const failedRequests = totalRequests - successfulRequests;\n const avgResponseTime =\n totalRequests > 0\n ? this.metrics.reduce((sum, m) => sum + m.totalTime, 0) / totalRequests\n : 0;\n\n return {\n enabled: true,\n totalRequests,\n successfulRequests,\n failedRequests,\n errorRate: totalRequests > 0 ? failedRequests / totalRequests : 0,\n avgResponseTime: avgResponseTime.toFixed(2) + \"ms\",\n memoryUsage: this.getMemoryUsage(),\n recentRequests: this.metrics.slice(-5),\n };\n }\n\n // 获取监控指标\n getMetrics() {\n return this.metrics;\n }\n\n // 重置监控数据\n reset() {\n this.metrics = [];\n console.log(\"🔄 监控数据已重置\");\n }\n\n // 获取内存使用情况\n private getMemoryUsage() {\n if (typeof process !== \"undefined\" && process.memoryUsage) {\n const mem = process.memoryUsage();\n return {\n heapUsed: (mem.heapUsed / 1024 / 1024).toFixed(2) + \"MB\",\n heapTotal: (mem.heapTotal / 1024 / 1024).toFixed(2) + \"MB\",\n external: (mem.external / 1024 / 1024).toFixed(2) + \"MB\",\n };\n }\n return { message: \"内存信息不可用\" };\n }\n}\n\n// 纯函数:为 Server 添加监控能力\nexport function withMonitoring(\n server: Server,\n config: NativeMonitoringConfig = {},\n): MonitoredServer {\n const monitor = new NativeMonitor(config);\n\n // 保存原始的 fetch 方法\n const originalFetch = server.fetch.bind(server);\n\n // 创建带监控的 fetch 方法\n const monitoredFetch = async (req: Request): Promise<Response> => {\n const startTime = performance.now();\n const requestId = `req_${Date.now()}_${Math.random()\n .toString(36)\n .substr(2, 9)}`;\n const { pathname } = new URL(req.url);\n const method = req.method;\n\n try {\n // 调用原始 fetch\n const response = await originalFetch(req);\n\n // 记录监控指标\n const totalTime = performance.now() - startTime;\n monitor.recordMetrics({\n requestId,\n method,\n path: pathname,\n statusCode: response.status,\n totalTime,\n timestamp: Date.now(),\n memoryUsage: (() => {\n if (typeof process !== \"undefined\" && process.memoryUsage) {\n const mem = process.memoryUsage();\n return {\n heapUsed: mem.heapUsed,\n heapTotal: mem.heapTotal,\n };\n }\n return { heapUsed: 0, heapTotal: 0 };\n })(),\n });\n\n return response;\n } catch (error) {\n // 记录错误监控指标\n const totalTime = performance.now() - startTime;\n monitor.recordMetrics({\n requestId,\n method,\n path: pathname,\n statusCode: 500,\n totalTime,\n timestamp: Date.now(),\n memoryUsage: (() => {\n if (typeof process !== \"undefined\" && process.memoryUsage) {\n const mem = process.memoryUsage();\n return {\n heapUsed: mem.heapUsed,\n heapTotal: mem.heapTotal,\n };\n }\n return { heapUsed: 0, heapTotal: 0 };\n })(),\n });\n\n throw error;\n }\n };\n\n // 创建带监控的 Server 对象\n const monitoredServer = {\n ...server,\n fetch: monitoredFetch,\n\n // 监控方法\n getMonitoringStatus: () => monitor.getStatus(),\n getMonitoringMetrics: () => monitor.getMetrics(),\n resetMonitoring: () => monitor.reset(),\n } as MonitoredServer;\n\n return monitoredServer;\n}\n\n// 便捷函数:创建带监控的 Server\nexport function createMonitoredServer(\n routes: any[],\n config?: NativeMonitoringConfig,\n): MonitoredServer {\n const { Server } = require(\"../server\");\n const server = new Server(routes);\n return withMonitoring(server, config);\n}\n","/**\n * 原生监控系统入口\n *\n * @author Framework Team\n * @version 2.0.0\n * @license MIT\n */\n\nexport * from \"./types\";\nexport * from \"./native-monitor\";\n\n// 默认监控配置\nexport const defaultMonitoringConfig = {\n enabled: true,\n console: true,\n slowThreshold: 1000, // 1秒\n errorThreshold: 0.05, // 5%\n tags: {\n framework: \"vafast\",\n version: \"2.0.0\",\n },\n};\n\n// 创建监控配置\nexport function createMonitoringConfig(\n config: Partial<typeof defaultMonitoringConfig> = {},\n) {\n return { ...defaultMonitoringConfig, ...config };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAgCO,SAAS,oBACd,QACkB;AAClB,QAAM,YAA8B,CAAC;AAErC,WAAS,aACP,OACA,aAAa,IACb,mBAAiC,CAAC,GAC5B;AAEN,UAAM,cAAc,cAAc,aAAa,MAAM,IAAI;AAEzD,UAAM,oBAAoB;AAAA,MACxB,GAAG;AAAA,MACH,GAAI,MAAM,cAAc,CAAC;AAAA,IAC3B;AAEA,QAAI,YAAY,SAAS,aAAa,OAAO;AAE3C,gBAAU,KAAK;AAAA,QACb,GAAG;AAAA,QACH,UAAU;AAAA,QACV,iBAAiB;AAAA,MACnB,CAAC;AAAA,IACH,WAAW,cAAc,SAAS,MAAM,UAAU;AAEhD,iBAAW,SAAS,MAAM,UAAU;AAClC,qBAAa,OAAO,aAAa,iBAAiB;AAAA,MACpD;AAAA,IACF;AAAA,EACF;AAEA,aAAW,SAAS,QAAQ;AAC1B,iBAAa,KAAK;AAAA,EACpB;AAEA,SAAO;AACT;AAeO,SAAS,cAAc,MAAsB;AAElD,MAAI,aAAa,mBAAmB,IAAI;AAGxC,eAAa,WAAW,QAAQ,QAAQ,GAAG;AAG3C,MAAI,eAAe,GAAI,QAAO;AAG9B,MAAI,eAAe,OAAO,WAAW,SAAS,GAAG,GAAG;AAClD,iBAAa,WAAW,MAAM,GAAG,EAAE;AAAA,EACrC;AAEA,SAAO;AACT;AArGA;AAAA;AAAA;AAAA;AAAA;;;ACGO,SAAS,KACd,MACA,SAAS,KACT,UAAuB,CAAC,GACd;AACV,QAAM,OAAO,KAAK,UAAU,IAAI;AAGhC,MAAI,OAAO,KAAK,OAAO,EAAE,WAAW,GAAG;AACrC,WAAO,IAAI,SAAS,MAAM;AAAA,MACxB;AAAA,MACA,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAChD,CAAC;AAAA,EACH;AAGA,QAAM,IAAI,IAAI,QAAQ;AAAA,IACpB,gBAAgB;AAAA,IAChB,GAAG;AAAA,EACL,CAAC;AAED,SAAO,IAAI,SAAS,MAAM;AAAA,IACxB;AAAA,IACA,SAAS;AAAA,EACX,CAAC;AACH;AAUO,SAAS,YAAY,UAA6B;AAEvD,MAAI,oBAAoB,SAAU,QAAO;AAGzC,UAAQ,UAAU,aAAa,MAAM;AAAA,IACnC,KAAK;AACH,aAAO,IAAI,SAAS,UAAoB,EAAE,SAAS,aAAa,CAAC;AAAA,IAEnE,KAAK;AAAA,IACL,KAAK;AACH,aAAO,IAAI,SAAS,KAAK,UAAU,QAAQ,GAAG,EAAE,SAAS,aAAa,CAAC;AAAA,IAEzE,KAAK;AAAA,IACL,KAAK;AACH,aAAO,IAAI,SAAS,OAAO,QAAQ,GAAG,EAAE,SAAS,aAAa,CAAC;AAAA,IAEjE,KAAK;AAEH,aAAO,IAAI,SAAS,MAAM,EAAE,QAAQ,IAAI,CAAC;AAAA,IAE3C,KAAK;AACH,aAAO,IAAI,SAAS,QAA0B;AAAA,IAEhD,KAAK;AACH,aAAO,IAAI,SAAS,QAAgB;AAAA,IAEtC,KAAK;AACH,aAAO,IAAI,SAAS,QAAuB;AAAA,IAE7C,KAAK;AACH,aAAO,IAAI,SAAS,QAA+B;AAAA,IAErD;AAEE,UAAI,oBAAoB,SAAS;AAC/B,eAAO,SAAS,KAAK,WAAW;AAAA,MAClC;AAEA,aAAO,IAAI,SAAS,KAAK,UAAU,QAAQ,GAAG,EAAE,SAAS,aAAa,CAAC;AAAA,EAC3E;AACF;AA/EA,IA+BM,cACA;AAhCN;AAAA;AAAA;AA+BA,IAAM,eAAe,EAAE,gBAAgB,mBAAmB;AAC1D,IAAM,eAAe,EAAE,gBAAgB,aAAa;AAAA;AAAA;;;ACE7C,SAAS,kBACd,YACA,cACqC;AACrC,QAAM,MAAM,CAAC,cAAc,GAAG,UAAU;AAExC,SAAO,SAAS,gBAAgB,KAAiC;AAC/D,QAAI,IAAI;AAER,UAAM,WAAW,CAAC,UAAqC;AACrD,UAAI,SAAS;AACX,eAAO,QAAQ,OAAO,IAAI,MAAM,8BAA8B,CAAC;AACjE,UAAI;AAGJ,UAAI,QAAQ,IAAI,QAAQ;AACtB,cAAM,KAAK,IAAI,KAAK;AACpB,eAAO,QAAQ,QAAQ,GAAG,KAAK,MAAM,SAAS,QAAQ,CAAC,CAAC,CAAC;AAAA,MAC3D;AAGA,aAAO,QAAQ,QAAQ,aAAa,GAAG,CAAC,EAAE,KAAK,WAAW;AAAA,IAC5D;AAEA,WAAO,SAAS,CAAC;AAAA,EACnB;AACF;AA5DA,IAQa,aAuDP;AA/DN;AAAA;AAAA;AAEA;AAMO,IAAM,cAAN,cAA0B,MAAM;AAAA,MACrC;AAAA,MACA;AAAA,MACA;AAAA,MAEA,YACE,SACA,UAKI,CAAC,GACL;AACA,cAAM,OAAO;AACb,aAAK,OAAO;AACZ,aAAK,SAAS,QAAQ,UAAU;AAChC,aAAK,OAAO,QAAQ,QAAQ;AAC5B,aAAK,SAAS,QAAQ,UAAU;AAChC,YAAI,QAAQ,MAAO,CAAC,KAAa,QAAQ,QAAQ;AAAA,MACnD;AAAA,IACF;AAkCA,IAAM,eAA2B,OAAO,KAAK,SAAS;AACpD,UAAI;AACF,eAAO,MAAM,KAAK;AAAA,MACpB,SAAS,KAAK;AACZ,gBAAQ,MAAM,yCAAW,GAAG;AAE5B,YAAI,eAAe,aAAa;AAC9B,iBAAO;AAAA,YACL;AAAA,cACE,OAAO,IAAI;AAAA,cACX,SAAS,IAAI,SAAS,IAAI,UAAU;AAAA,YACtC;AAAA,YACA,IAAI;AAAA,UACN;AAAA,QACF;AAEA,eAAO,KAAK,EAAE,OAAO,kBAAkB,SAAS,6CAAU,GAAG,GAAG;AAAA,MAClE;AAAA,IACF;AAAA;AAAA;;;ACjFA,IAMsB;AANtB;AAAA;AAAA;AAMO,IAAe,aAAf,MAA0B;AAAA,MACrB,mBAAiC,CAAC;AAAA,MAE5C,IAAI,IAAgB;AAClB,aAAK,iBAAiB,KAAK,EAAE;AAAA,MAC/B;AAAA;AAAA;AAAA;AAAA,MAKU,mBAAmB,QAAe,OAAe,gBAAY;AACrE,gBAAQ,IAAI,2CAAW,IAAI,GAAG;AAC9B,mBAAW,SAAS,QAAQ;AAC1B,gBAAM,SAAS,MAAM,UAAU;AAC/B,gBAAM,OAAO,MAAM,YAAY,MAAM;AACrC,kBAAQ,IAAI,KAAK,MAAM,IAAI,IAAI,EAAE;AACjC,cAAI,MAAM,mBAAmB,MAAM,gBAAgB,SAAS,GAAG;AAC7D,oBAAQ,IAAI,iCAAa,MAAM,gBAAgB,MAAM,SAAI;AAAA,UAC3D;AAAA,QACF;AACA,gBAAQ,IAAI,EAAE;AAAA,MAChB;AAAA;AAAA;AAAA;AAAA;AAAA,MAMU,qBAAqB,QAAqB;AAClD,cAAM,aAAa,oBAAI,IAAmB;AAG1C,mBAAW,SAAS,QAAQ;AAC1B,gBAAM,OAAO,MAAM,YAAY,MAAM;AACrC,gBAAM,SAAS,MAAM,UAAU;AAC/B,cAAI,CAAC,WAAW,IAAI,IAAI,GAAG;AACzB,uBAAW,IAAI,MAAM,CAAC,CAAC;AAAA,UACzB;AACA,qBAAW,IAAI,IAAI,EAAG,KAAK,EAAE,GAAG,OAAO,OAAO,CAAC;AAAA,QACjD;AAGA,mBAAW,CAAC,MAAM,SAAS,KAAK,YAAY;AAC1C,cAAI,UAAU,SAAS,GAAG;AACxB,kBAAM,UAAU,UAAU,IAAI,CAAC,MAAM,EAAE,MAAM;AAC7C,kBAAM,gBAAgB,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC;AAE1C,gBAAI,cAAc,WAAW,GAAG;AAE9B,sBAAQ;AAAA,gBACN,2CAAa,cAAc,CAAC,CAAC,IAAI,IAAI,uBAAQ,UAAU,MAAM;AAAA,cAC/D;AACA,wBAAU,QAAQ,CAAC,OAAO,UAAU;AAClC,wBAAQ,KAAK,MAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,IAAI,IAAI,EAAE;AAAA,cACzD,CAAC;AAAA,YACH,OAAO;AAEL,sBAAQ,IAAI,8BAAU,IAAI,8BAAU,cAAc,KAAK,IAAI,CAAC,EAAE;AAAA,YAChE;AAAA,UACF;AAAA,QACF;AAGA,aAAK,4BAA4B,MAAM;AAAA,MACzC;AAAA;AAAA;AAAA;AAAA,MAKQ,4BAA4B,QAAqB;AACvD,cAAM,gBAAgB,OAAO,OAAO,CAAC,MAAM;AACzC,gBAAM,OAAO,EAAE,YAAY,EAAE;AAC7B,iBAAO,KAAK,SAAS,GAAG,KAAK,KAAK,SAAS,GAAG;AAAA,QAChD,CAAC;AAED,iBAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC7C,mBAAS,IAAI,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AACjD,kBAAM,SAAS,cAAc,CAAC;AAC9B,kBAAM,SAAS,cAAc,CAAC;AAC9B,kBAAM,UAAU,OAAO,UAAU;AACjC,kBAAM,UAAU,OAAO,UAAU;AAEjC,gBAAI,YAAY,SAAS;AACvB,oBAAM,QAAQ,OAAO,YAAY,OAAO;AACxC,oBAAM,QAAQ,OAAO,YAAY,OAAO;AAExC,kBAAI,KAAK,iBAAiB,OAAO,KAAK,GAAG;AACvC,wBAAQ;AAAA,kBACN,uDAAe,OAAO,IAAI,KAAK,uBAAQ,KAAK;AAAA,gBAC9C;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,iBAAiB,OAAe,OAAwB;AAC9D,cAAM,SAAS,MAAM,MAAM,GAAG,EAAE,OAAO,OAAO;AAC9C,cAAM,SAAS,MAAM,MAAM,GAAG,EAAE,OAAO,OAAO;AAE9C,YAAI,OAAO,WAAW,OAAO,OAAQ,QAAO;AAE5C,iBAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,gBAAM,KAAK,OAAO,CAAC;AACnB,gBAAM,KAAK,OAAO,CAAC;AAGnB,cACE,CAAC,GAAG,WAAW,GAAG,KAClB,CAAC,GAAG,WAAW,GAAG,KAClB,CAAC,GAAG,WAAW,GAAG,KAClB,CAAC,GAAG,WAAW,GAAG,KAClB,OAAO,IACP;AACA,mBAAO;AAAA,UACT;AAGA,cACG,OAAO,OAAO,GAAG,WAAW,GAAG,KAC/B,OAAO,OAAO,GAAG,WAAW,GAAG,GAChC;AACA,mBAAO;AAAA,UACT;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKU,UAAU,SAAiB,MAAuB;AAC1D,cAAM,eAAe,QAAQ,MAAM,GAAG,EAAE,OAAO,OAAO;AACtD,cAAM,YAAY,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAEhD,YAAI,aAAa,WAAW,UAAU,QAAQ;AAC5C,iBAAO;AAAA,QACT;AAEA,iBAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC5C,cACE,aAAa,CAAC,MAAM,UAAU,CAAC,KAC/B,CAAC,aAAa,CAAC,EAAE,WAAW,GAAG,GAC/B;AACA,mBAAO;AAAA,UACT;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKU,cACR,SACA,MACwB;AACxB,cAAM,SAAiC,CAAC;AACxC,cAAM,eAAe,QAAQ,MAAM,GAAG,EAAE,OAAO,OAAO;AACtD,cAAM,YAAY,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAEhD,iBAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC5C,cAAI,aAAa,CAAC,EAAE,WAAW,GAAG,GAAG;AACnC,kBAAM,YAAY,aAAa,CAAC,EAAE,MAAM,CAAC;AACzC,mBAAO,SAAS,IAAI,UAAU,CAAC;AAAA,UACjC;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;ACpLA,IAsDa;AAtDb;AAAA;AAAA;AAsDO,IAAM,cAAN,MAAkB;AAAA,MACf;AAAA,MAER,cAAc;AACZ,aAAK,OAAO,KAAK,WAAW,EAAE;AAAA,MAChC;AAAA,MAEQ,WAAW,MAAyB;AAC1C,eAAO;AAAA,UACL;AAAA,UACA,UAAU,uBAAO,OAAO,IAAI;AAAA,UAC5B,UAAU,uBAAO,OAAO,IAAI;AAAA,QAC9B;AAAA,MACF;AAAA;AAAA,MAGQ,UAAU,MAAwB;AACxC,eAAO,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA,MACvC;AAAA;AAAA,MAGQ;AAAA;AAAA,MAMR,YACE,UACM;AACN,aAAK,WAAW;AAAA,MAClB;AAAA;AAAA,MAGA,SACE,QACA,SACA,SACA,aAA2B,CAAC,GACtB;AACN,cAAM,WAAW,KAAK,UAAU,OAAO;AACvC,YAAI,OAAO,KAAK;AAEhB,mBAAW,WAAW,UAAU;AAC9B,gBAAM,YAAY,QAAQ,CAAC;AAE3B,cAAI,cAAc,KAAK;AAErB,gBAAI,CAAC,KAAK,YAAY;AACpB,mBAAK,aAAa,KAAK,WAAW,OAAO;AACzC,mBAAK,WAAW,YAAY,QAAQ,UAAU,CAAC;AAAA,YACjD;AACA,mBAAO,KAAK;AAAA,UACd,WAAW,cAAc,KAAK;AAE5B,gBAAI,CAAC,KAAK,eAAe;AACvB,mBAAK,gBAAgB,KAAK,WAAW,OAAO;AAC5C,mBAAK,cAAc,YACjB,QAAQ,SAAS,IAAI,QAAQ,UAAU,CAAC,IAAI;AAAA,YAChD;AACA,mBAAO,KAAK;AACZ;AAAA,UACF,OAAO;AAEL,gBAAI,CAAC,KAAK,SAAS,OAAO,GAAG;AAC3B,mBAAK,SAAS,OAAO,IAAI,KAAK,WAAW,OAAO;AAAA,YAClD;AACA,mBAAO,KAAK,SAAS,OAAO;AAAA,UAC9B;AAAA,QACF;AAEA,cAAM,eAA6B,EAAE,SAAS,WAAW;AAGzD,YAAI,KAAK,YAAY,WAAW,WAAW,GAAG;AAC5C,uBAAa,WAAW,KAAK,SAAS,CAAC,GAAG,OAAO;AAAA,QACnD;AAEA,aAAK,SAAS,MAAM,IAAI;AAAA,MAC1B;AAAA;AAAA,MAGA,cAAc,kBAAsC;AAClD,YAAI,CAAC,KAAK,SAAU;AACpB,aAAK,eAAe,KAAK,MAAM,gBAAgB;AAAA,MACjD;AAAA,MAEQ,eACN,MACA,kBACM;AACN,mBAAW,UAAU,KAAK,UAAU;AAClC,gBAAM,eAAe,KAAK,SAAS,MAAgB;AACnD,cAAI,cAAc;AAChB,kBAAM,gBAAgB,CAAC,GAAG,kBAAkB,GAAG,aAAa,UAAU;AACtE,yBAAa,WAAW,KAAK;AAAA,cAC3B;AAAA,cACA,aAAa;AAAA,YACf;AAAA,UACF;AAAA,QACF;AAEA,mBAAW,OAAO,KAAK,UAAU;AAC/B,eAAK,eAAe,KAAK,SAAS,GAAG,GAAG,gBAAgB;AAAA,QAC1D;AAEA,YAAI,KAAK,YAAY;AACnB,eAAK,eAAe,KAAK,YAAY,gBAAgB;AAAA,QACvD;AAEA,YAAI,KAAK,eAAe;AACtB,eAAK,eAAe,KAAK,eAAe,gBAAgB;AAAA,QAC1D;AAAA,MACF;AAAA;AAAA,MAGA,MAAM,QAAgB,MAAkC;AACtD,cAAM,WAAW,KAAK,UAAU,IAAI;AACpC,cAAM,SAAiC,uBAAO,OAAO,IAAI;AAEzD,cAAM,OAAO,KAAK,UAAU,KAAK,MAAM,UAAU,GAAG,MAAM;AAC1D,YAAI,CAAC,KAAM,QAAO;AAElB,cAAM,eAAe,KAAK,SAAS,MAAM;AACzC,YAAI,CAAC,aAAc,QAAO;AAE1B,eAAO;AAAA,UACL,SAAS,aAAa;AAAA,UACtB,YAAY,aAAa;AAAA,UACzB;AAAA,UACA,UAAU,aAAa;AAAA,QACzB;AAAA,MACF;AAAA;AAAA,MAGQ,UACN,MACA,UACA,OACA,QACkB;AAClB,YAAI,UAAU,SAAS,QAAQ;AAC7B,qBAAW,UAAU,KAAK,UAAU;AAClC,gBAAI,KAAK,SAAS,MAAgB,EAAG,QAAO;AAAA,UAC9C;AACA,iBAAO;AAAA,QACT;AAEA,cAAM,UAAU,SAAS,KAAK;AAG9B,cAAM,cAAc,KAAK,SAAS,OAAO;AACzC,YAAI,aAAa;AACf,gBAAM,SAAS,KAAK,UAAU,aAAa,UAAU,QAAQ,GAAG,MAAM;AACtE,cAAI,OAAQ,QAAO;AAAA,QACrB;AAGA,YAAI,KAAK,YAAY;AACnB,gBAAM,YAAY,KAAK,WAAW;AAClC,gBAAM,WAAW,OAAO,SAAS;AAEjC,iBAAO,SAAS,IAAI;AACpB,gBAAM,SAAS,KAAK;AAAA,YAClB,KAAK;AAAA,YACL;AAAA,YACA,QAAQ;AAAA,YACR;AAAA,UACF;AAEA,cAAI,OAAQ,QAAO;AAGnB,cAAI,aAAa,QAAW;AAC1B,mBAAO,OAAO,SAAS;AAAA,UACzB,OAAO;AACL,mBAAO,SAAS,IAAI;AAAA,UACtB;AAAA,QACF;AAGA,YAAI,KAAK,eAAe;AACtB,iBAAO,KAAK,cAAc,aAAa,GAAG,IAAI,SAC3C,MAAM,KAAK,EACX,KAAK,GAAG;AACX,iBAAO,KAAK;AAAA,QACd;AAEA,eAAO;AAAA,MACT;AAAA;AAAA,MAGA,kBAAkB,MAAwB;AACxC,cAAM,WAAW,KAAK,UAAU,IAAI;AACpC,cAAM,OAAO,KAAK,SAAS,QAAQ;AACnC,YAAI,CAAC,KAAM,QAAO,CAAC;AAEnB,cAAM,UAAoB,CAAC;AAC3B,mBAAW,UAAU,KAAK,UAAU;AAClC,cAAI,KAAK,SAAS,MAAgB,GAAG;AACnC,oBAAQ,KAAK,MAAgB;AAAA,UAC/B;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA;AAAA,MAGQ,SAAS,UAAsC;AACrD,YAAI,OAAO,KAAK;AAEhB,mBAAW,WAAW,UAAU;AAC9B,cAAI,KAAK,SAAS,OAAO,GAAG;AAC1B,mBAAO,KAAK,SAAS,OAAO;AAAA,UAC9B,WAAW,KAAK,YAAY;AAC1B,mBAAO,KAAK;AAAA,UACd,WAAW,KAAK,eAAe;AAC7B,mBAAO,KAAK;AAAA,UACd,OAAO;AACL,mBAAO;AAAA,UACT;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA;AAAA,MAGA,YAAqD;AACnD,cAAM,SAAkD,CAAC;AACzD,aAAK,cAAc,KAAK,MAAM,IAAI,MAAM;AACxC,eAAO;AAAA,MACT;AAAA,MAEQ,cACN,MACA,QACA,QACM;AACN,cAAM,cAAc,UAAU,KAAK,OAAO,MAAM,KAAK,OAAO;AAE5D,mBAAW,UAAU,KAAK,UAAU;AAClC,cAAI,KAAK,SAAS,MAAgB,GAAG;AACnC,mBAAO,KAAK,EAAE,QAA0B,MAAM,eAAe,IAAI,CAAC;AAAA,UACpE;AAAA,QACF;AAEA,mBAAW,OAAO,KAAK,UAAU;AAC/B,eAAK,cAAc,KAAK,SAAS,GAAG,GAAG,aAAa,MAAM;AAAA,QAC5D;AAEA,YAAI,KAAK,YAAY;AACnB,eAAK,cAAc,KAAK,YAAY,aAAa,MAAM;AAAA,QACzD;AAEA,YAAI,KAAK,eAAe;AACtB,eAAK,cAAc,KAAK,eAAe,aAAa,MAAM;AAAA,QAC5D;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACvTA,IAyBa;AAzBb;AAAA;AAAA;AAQA;AACA;AACA;AACA;AACA;AAaO,IAAM,SAAN,cAAqB,WAAW;AAAA,MAC7B;AAAA,MACA;AAAA;AAAA,MAEA,aAAa;AAAA;AAAA,MAEb,8BAA8B;AAAA,MAEtC,YAAY,SAAkC,CAAC,GAAG;AAChD,cAAM;AACN,aAAK,SAAS,IAAI,YAAY;AAC9B,aAAK,SAAS,CAAC;AAGf,aAAK,OAAO;AAAA,UAAY,CAAC,YAAY,YACnC,kBAAkB,YAAY,OAAO;AAAA,QACvC;AAEA,YAAI,OAAO,SAAS,GAAG;AACrB,eAAK,eAAe,MAAM;AAAA,QAC5B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,UAAgB;AACd,aAAK,OAAO,cAAc,KAAK,gBAAgB;AAC/C,aAAK,aAAa;AAClB,aAAK,8BAA8B,KAAK,iBAAiB;AACzD,eAAO;AAAA,MACT;AAAA,MAEQ,eAAe,QAAuC;AAC5D,cAAM,YAAY,oBAAoB,MAAM;AAC5C,aAAK,OAAO,KAAK,GAAG,SAAS;AAE7B,mBAAW,SAAS,WAAW;AAC7B,eAAK,OAAO;AAAA,YACV,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM,mBAAmB,CAAC;AAAA,UAC5B;AAAA,QACF;AAEA,aAAK,qBAAqB,SAAS;AACnC,aAAK,mBAAmB,SAAS;AAGjC,YAAI,KAAK,iBAAiB,WAAW,KAAK,CAAC,KAAK,YAAY;AAC1D,eAAK,QAAQ;AAAA,QACf;AAAA,MACF;AAAA;AAAA,MAGQ,gBAAgB,KAAqB;AAC3C,YAAI,QAAQ,IAAI,QAAQ,KAAK;AAC7B,gBAAQ,UAAU,KAAK,IAAI,QAAQ;AAEnC,cAAM,YAAY,IAAI,QAAQ,KAAK,KAAK;AACxC,YAAI,cAAc,GAAI,QAAO;AAE7B,YAAI,MAAM,IAAI,QAAQ,KAAK,SAAS;AACpC,YAAI,QAAQ,GAAI,OAAM,IAAI,QAAQ,KAAK,SAAS;AAChD,YAAI,QAAQ,GAAI,OAAM,IAAI;AAE1B,eAAO,IAAI,UAAU,WAAW,GAAG,KAAK;AAAA,MAC1C;AAAA;AAAA,MAGQ,oBAAoB,QAAgB,UAA4B;AACtE,cAAM,iBAAiB,KAAK,OAAO,kBAAkB,QAAQ;AAC7D,YAAI,eAAe,SAAS,GAAG;AAC7B,iBAAO;AAAA,YACL;AAAA,cACE,SAAS;AAAA,cACT,OAAO;AAAA,cACP,SAAS,UAAU,MAAM;AAAA,cACzB;AAAA,YACF;AAAA,YACA;AAAA,YACA,EAAE,OAAO,eAAe,KAAK,IAAI,EAAE;AAAA,UACrC;AAAA,QACF;AACA,eAAO,KAAK,EAAE,SAAS,OAAO,OAAO,YAAY,GAAG,GAAG;AAAA,MACzD;AAAA;AAAA,MAGA,QAAQ,OAAO,QAAoC;AACjD,cAAM,WAAW,KAAK,gBAAgB,IAAI,GAAG;AAC7C,cAAM,SAAS,IAAI;AAEnB,cAAM,QAAQ,KAAK,OAAO,MAAM,QAAQ,QAAQ;AAEhD,YAAI,OAAO;AACT,UAAC,IAA2C,SAAS,MAAM;AAG3D,cACE,MAAM,YACN,KAAK,iBAAiB,WAAW,KAAK,6BACtC;AACA,mBAAO,MAAM,SAAS,GAAG;AAAA,UAC3B;AAGA,gBAAM,gBAAgB,CAAC,GAAG,KAAK,kBAAkB,GAAG,MAAM,UAAU;AACpE,gBAAM,UAAU,kBAAkB,eAAe,MAAM,OAAO;AAE9D,iBAAO,QAAQ,GAAG;AAAA,QACpB;AAIA,YAAI,WAAW,WAAW;AACxB,gBAAM,iBAAiB,KAAK,OAAO,kBAAkB,QAAQ;AAC7D,cAAI,eAAe,SAAS,GAAG;AAE7B,kBAAM,WAAW,KAAK,OAAO;AAAA,cAC3B,eAAe,CAAC;AAAA,cAChB;AAAA,YACF;AACA,kBAAM,kBAAkB,UAAU,cAAc,CAAC;AACjD,kBAAM,gBAAgB,CAAC,GAAG,KAAK,kBAAkB,GAAG,eAAe;AAGnE,kBAAM,iBAAiB,MACrB,IAAI,SAAS,MAAM;AAAA,cACjB,QAAQ;AAAA,cACR,SAAS,EAAE,OAAO,eAAe,KAAK,IAAI,EAAE;AAAA,YAC9C,CAAC;AAEH,kBAAM,UAAU,kBAAkB,eAAe,cAAc;AAC/D,mBAAO,QAAQ,GAAG;AAAA,UACpB;AAAA,QACF;AAGA,YAAI,KAAK,iBAAiB,SAAS,GAAG;AACpC,gBAAM,UAAU;AAAA,YAAkB,KAAK;AAAA,YAAkB,MACvD,KAAK,oBAAoB,QAAQ,QAAQ;AAAA,UAC3C;AACA,iBAAO,QAAQ,GAAG;AAAA,QACpB;AAEA,eAAO,KAAK,oBAAoB,QAAQ,QAAQ;AAAA,MAClD;AAAA,MAEA,SAAS,OAAoB;AAC3B,cAAM,iBAAiC;AAAA,UACrC,GAAG;AAAA,UACH,UAAU,MAAM;AAAA,UAChB,iBAAiB,MAAM,cAAc,CAAC;AAAA,QACxC;AAEA,aAAK,OAAO,KAAK,cAAc;AAC/B,aAAK,OAAO;AAAA,UACV,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM,cAAc,CAAC;AAAA,QACvB;AAAA,MACF;AAAA,MAEA,UAAU,QAAuC;AAC/C,aAAK,eAAe,MAAM;AAAA,MAC5B;AAAA,MAEA,YAAqD;AACnD,eAAO,KAAK,OAAO,UAAU;AAAA,MAC/B;AAAA,IACF;AAAA;AAAA;;;AC5LO,SAAS,uBACd,QAC2B;AAC3B,QAAM,YAAuC,CAAC;AAE9C,WAAS,aACP,OACA,aAAqB,IACrB,mBAA0B,CAAC,GAC3B;AACA,UAAM,cAAc,aAAa,MAAM;AACvC,UAAM,oBAAoB;AAAA,MACxB,GAAG;AAAA,MACH,GAAI,MAAM,cAAc,CAAC;AAAA,IAC3B;AAEA,QAAI,eAAe,OAAO;AAExB,gBAAU,KAAK;AAAA,QACb,GAAG;AAAA,QACH,UAAU;AAAA,QACV,iBAAiB;AAAA,MACnB,CAAC;AAAA,IACH,WAAW,cAAc,SAAS,MAAM,UAAU;AAEhD,iBAAW,SAAS,MAAM,UAAU;AAClC,qBAAa,OAAO,aAAa,iBAAiB;AAAA,MACpD;AAAA,IACF;AAAA,EACF;AAEA,aAAW,SAAS,QAAQ;AAC1B,iBAAa,KAAK;AAAA,EACpB;AAEA,SAAO;AACT;AA9CA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAIa;AAJb;AAAA;AAAA;AAIO,IAAM,cAAN,MAAkB;AAAA;AAAA;AAAA;AAAA,MAIvB,OAAO,UAAU,SAAiB,MAAuB;AACvD,cAAM,eAAe,QAAQ,MAAM,GAAG,EAAE,OAAO,OAAO;AACtD,cAAM,YAAY,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAEhD,YAAI,aAAa,WAAW,UAAU,QAAQ;AAC5C,iBAAO;AAAA,QACT;AAEA,iBAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC5C,cACE,aAAa,CAAC,MAAM,UAAU,CAAC,KAC/B,CAAC,aAAa,CAAC,EAAE,WAAW,GAAG,GAC/B;AACA,mBAAO;AAAA,UACT;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,cAAc,SAAiB,MAAsC;AAC1E,cAAM,SAAiC,CAAC;AACxC,cAAM,eAAe,QAAQ,MAAM,GAAG,EAAE,OAAO,OAAO;AACtD,cAAM,YAAY,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAEhD,iBAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC5C,cAAI,aAAa,CAAC,EAAE,WAAW,GAAG,GAAG;AACnC,kBAAM,YAAY,aAAa,CAAC,EAAE,MAAM,CAAC;AACzC,mBAAO,SAAS,IAAI,UAAU,CAAC;AAAA,UACjC;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,OAAO,mBAAmB,MAAsB;AAC9C,cAAM,QAAQ,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAC5C,YAAI,QAAQ;AACZ,mBAAW,KAAK,OAAO;AACrB,cAAI,MAAM;AACR,qBAAS;AAAA,mBACF,EAAE,WAAW,GAAG;AACvB,qBAAS;AAAA,cACN,UAAS;AAAA,QAChB;AAEA,eAAO,QAAQ,KAAK,MAAM;AAAA,MAC5B;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,iBAAiB,OAAe,OAAwB;AAC7D,cAAM,SAAS,MAAM,MAAM,GAAG,EAAE,OAAO,OAAO;AAC9C,cAAM,SAAS,MAAM,MAAM,GAAG,EAAE,OAAO,OAAO;AAE9C,YAAI,OAAO,WAAW,OAAO,OAAQ,QAAO;AAE5C,iBAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,gBAAM,KAAK,OAAO,CAAC;AACnB,gBAAM,KAAK,OAAO,CAAC;AAGnB,cACE,CAAC,GAAG,WAAW,GAAG,KAClB,CAAC,GAAG,WAAW,GAAG,KAClB,CAAC,GAAG,WAAW,GAAG,KAClB,CAAC,GAAG,WAAW,GAAG,KAClB,OAAO,IACP;AACA,mBAAO;AAAA,UACT;AAGA,cACG,OAAO,OAAO,GAAG,WAAW,GAAG,KAC/B,OAAO,OAAO,GAAG,WAAW,GAAG,GAChC;AACA,mBAAO;AAAA,UACT;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;ACnGA,IAIa;AAJb;AAAA;AAAA;AAIO,IAAM,eAAN,MAAmB;AAAA;AAAA;AAAA;AAAA,MAIxB,OAAO,iBACL,SACA,SACA,mBAA2B,cACnB;AACR,eAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BASe,OAAO;AAAA;AAAA;AAAA,wBAGT,KAAK,UAAU,QAAQ,UAAU,CAAC,CAAC,CAAC;AAAA,uBACrC,KAAK,UAAU,QAAQ,SAAS,CAAC,CAAC,CAAC;AAAA,2BAC/B,QAAQ,QAAQ;AAAA;AAAA;AAAA,uCAGJ,gBAAgB;AAAA;AAAA;AAAA;AAAA,MAIrD;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,gBACL,SACA,SACA,mBAA2B,cACnB;AACR,eAAO,KAAK,iBAAiB,SAAS,SAAS,gBAAgB;AAAA,MACjE;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,kBACL,SACA,SACA,mBAA2B,cACnB;AACR,eAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BASgB,OAAO;AAAA;AAAA;AAAA,wBAGV,KAAK,UAAU,QAAQ,UAAU,CAAC,CAAC,CAAC;AAAA,uBACrC,KAAK,UAAU,QAAQ,SAAS,CAAC,CAAC,CAAC;AAAA,2BAC/B,QAAQ,QAAQ;AAAA;AAAA;AAAA,uCAGJ,gBAAgB;AAAA;AAAA;AAAA;AAAA,MAIrD;AAAA,IACF;AAAA;AAAA;;;AC7EA,IAIa;AAJb;AAAA;AAAA;AAIO,IAAM,oBAAN,MAAwB;AAAA,MACrB,kBAAkB,oBAAI,IAAiB;AAAA;AAAA;AAAA;AAAA,MAK/C,MAAM,iBAAiB,WAA4B;AACjD,YAAI,KAAK,gBAAgB,IAAI,SAAS,GAAG;AACvC,iBAAO,KAAK,gBAAgB,IAAI,SAAS;AAAA,QAC3C;AAEA,gBAAQ,IAAI,sCAAW,SAAS,kBAAQ;AAExC,YAAI;AACF,cAAI;AACJ,kBAAQ,WAAW;AAAA,YACjB,KAAK;AACH,qBAAO,MAAM,QAAQ,IAAI;AAAA,gBACvB,OAAO,KAAK;AAAA,gBACZ,OAAO,sBAAsB;AAAA,cAC/B,CAAC;AACD;AAAA,YACF,KAAK;AACH,qBAAO,MAAM,QAAQ,IAAI;AAAA,gBACvB,OAAO,OAAO;AAAA,gBACd,OAAO,kBAAkB;AAAA,cAC3B,CAAC;AACD;AAAA,YACF;AACE,oBAAM,IAAI,MAAM,yCAAW,SAAS,EAAE;AAAA,UAC1C;AAEA,eAAK,gBAAgB,IAAI,WAAW,IAAI;AACxC,kBAAQ,IAAI,UAAK,SAAS,uCAAS;AACnC,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,kBAAQ,MAAM,UAAK,SAAS,0CAAY,KAAK;AAC7C,gBAAM;AAAA,QACR;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,oBAAoB,WAAiC;AAEnD,YAAI,UAAU,UAAU,OAAO,UAAU,WAAW,YAAY;AAC9D,iBAAO;AAAA,QACT;AACA,YAAI,UAAU,UAAU;AACtB,iBAAO;AAAA,QACT;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,aAAmB;AACjB,aAAK,gBAAgB,MAAM;AAC3B,gBAAQ,IAAI,sDAAY;AAAA,MAC1B;AAAA;AAAA;AAAA;AAAA,MAKA,iBAA0C;AACxC,cAAM,SAAkC,CAAC;AACzC,mBAAW,CAAC,SAAS,KAAK,KAAK,iBAAiB;AAC9C,iBAAO,SAAS,IAAI;AAAA,QACtB;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;AC9EA,IAea;AAfb;AAAA;AAAA;AAKA;AACA;AACA;AACA;AACA;AAMO,IAAM,kBAAN,cAA8B,WAAW;AAAA,MACtC;AAAA,MACA;AAAA,MAER,YAAY,QAAmD;AAC7D,cAAM;AACN,aAAK,SAAS,uBAAuB,MAAM;AAC3C,aAAK,oBAAoB,IAAI,kBAAkB;AAG/C,aAAK,qBAAqB,KAAK,MAAM;AACrC,aAAK,mBAAmB,KAAK,QAAQ,0BAAM;AAC3C,gBAAQ,IAAI,gGAAmB;AAAA,MACjC;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,MAAM,KAAiC;AAC3C,cAAM,MAAM,IAAI,IAAI,IAAI,GAAG;AAC3B,cAAM,WAAW,IAAI;AACrB,cAAM,SAAS,IAAI;AAGnB,YAAI,WAAW,OAAO;AACpB,iBAAO,IAAI,SAAS,sBAAsB,EAAE,QAAQ,IAAI,CAAC;AAAA,QAC3D;AAGA,YAAI,eAA+C;AACnD,mBAAW,SAAS,KAAK,QAAQ;AAC/B,cAAI,YAAY,UAAU,MAAM,UAAU,QAAQ,GAAG;AACnD,2BAAe;AACf;AAAA,UACF;AAAA,QACF;AAEA,YAAI,CAAC,cAAc;AACjB,iBAAO,IAAI,SAAS,aAAa,EAAE,QAAQ,IAAI,CAAC;AAAA,QAClD;AAEA,YAAI;AAEF,gBAAM,UAAU;AAAA,YACd;AAAA,YACA,QAAQ,YAAY,cAAc,aAAa,UAAU,QAAQ;AAAA,YACjE,OAAO,OAAO,YAAY,IAAI,YAAY;AAAA,YAC1C;AAAA,UACF;AAGA,iBAAO,MAAM,KAAK;AAAA,YAChB,aAAa;AAAA,YACb;AAAA,YACA,aAAa;AAAA,UACf;AAAA,QACF,SAAS,OAAO;AACd,kBAAQ,MAAM,yCAAW,KAAK;AAC9B,iBAAO,IAAI,SAAS,yBAAyB,EAAE,QAAQ,IAAI,CAAC;AAAA,QAC9D;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,uBACZ,iBACA,SACA,iBACmB;AAEnB,cAAM,kBAAkB,YAAY;AAClC,gBAAM,kBAAkB,MAAM,gBAAgB;AAC9C,gBAAM,YAAY,gBAAgB,WAAW;AAG7C,gBAAM,gBACJ,KAAK,kBAAkB,oBAAoB,SAAS;AAGtD,gBAAM,OAAO,MAAM,KAAK,kBAAkB,iBAAiB,aAAa;AAGxE,cAAI,kBAAkB,OAAO;AAC3B,mBAAO,MAAM,KAAK,mBAAmB,WAAW,SAAS,IAAI;AAAA,UAC/D,WAAW,kBAAkB,SAAS;AACpC,mBAAO,MAAM,KAAK,qBAAqB,WAAW,SAAS,IAAI;AAAA,UACjE,OAAO;AACL,kBAAM,IAAI,MAAM,qDAAa,aAAa,EAAE;AAAA,UAC9C;AAAA,QACF;AAGA,YAAI,QAAQ;AACZ,cAAM,OAAO,YAA+B;AAC1C,cAAI,SAAS,gBAAgB,QAAQ;AACnC,mBAAO,MAAM,gBAAgB;AAAA,UAC/B;AAEA,gBAAM,aAAa,gBAAgB,OAAO;AAC1C,iBAAO,MAAM,WAAW,QAAQ,KAAK,IAAI;AAAA,QAC3C;AAEA,eAAO,MAAM,KAAK;AAAA,MACpB;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,mBACZ,WACA,SACA,MACmB;AACnB,YAAI;AACF,gBAAM,CAAC,KAAK,QAAQ,IAAI;AACxB,gBAAM,MAAM,IAAI,aAAa,SAAS;AAGtC,cAAI,QAAQ,aAAa;AAAA,YACvB,QAAQ,QAAQ,UAAU,CAAC;AAAA,YAC3B,OAAO,QAAQ,SAAS,CAAC;AAAA,YACzB,UAAU,QAAQ;AAAA,UACpB,CAAC;AAED,gBAAM,OAAO,MAAM,SAAS,eAAe,GAAG;AAC9C,gBAAM,WAAW,aAAa,gBAAgB,MAAM,OAAO;AAE3D,iBAAO,IAAI,SAAS,UAAU;AAAA,YAC5B,SAAS,EAAE,gBAAgB,2BAA2B;AAAA,UACxD,CAAC;AAAA,QACH,SAAS,OAAO;AACd,kBAAQ,MAAM,6CAAe,KAAK;AAClC,iBAAO,IAAI,SAAS,8BAA8B,EAAE,QAAQ,IAAI,CAAC;AAAA,QACnE;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,qBACZ,WACA,SACA,MACmB;AACnB,YAAI;AACF,gBAAM,CAAC,OAAO,QAAQ,IAAI;AAC1B,gBAAM,UAAU,MAAM,cAAc,WAAW;AAAA,YAC7C,KAAK,QAAQ;AAAA,YACb,QAAQ,QAAQ,UAAU,CAAC;AAAA,YAC3B,OAAO,QAAQ,SAAS,CAAC;AAAA,UAC3B,CAAC;AAED,gBAAM,OAAO,SAAS,eAAe,OAAO;AAC5C,gBAAM,WAAW,aAAa,kBAAkB,MAAM,OAAO;AAE7D,iBAAO,IAAI,SAAS,UAAU;AAAA,YAC5B,SAAS,EAAE,gBAAgB,2BAA2B;AAAA,UACxD,CAAC;AAAA,QACH,SAAS,OAAO;AACd,kBAAQ,MAAM,+CAAiB,KAAK;AACpC,iBAAO,IAAI,SAAS,gCAAgC,EAAE,QAAQ,IAAI,CAAC;AAAA,QACrE;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,uBAA0C;AACxC,eAAO,KAAK;AAAA,MACd;AAAA,IACF;AAAA;AAAA;;;AC1LA,IAYa;AAZb;AAAA;AAAA;AAKA,IAAAA;AACA;AAMO,IAAM,gBAAN,MAAoB;AAAA,MACjB,UAAiD,oBAAI,IAAI;AAAA;AAAA;AAAA;AAAA,MAKjE,iBAAiB,QAAyC;AACxD,cAAM,SAAS,IAAI,OAAO,MAAM;AAChC,aAAK,QAAQ,IAAI,QAAQ,MAAM;AAC/B,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,sBACE,QACiB;AACjB,cAAM,SAAS,IAAI,gBAAgB,MAAM;AACzC,aAAK,QAAQ,IAAI,aAAa,MAAM;AACpC,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,UAAU,MAAkE;AAC1E,eAAO,KAAK,QAAQ,IAAI,IAAI;AAAA,MAC9B;AAAA;AAAA;AAAA;AAAA,MAKA,gBAAuD;AACrD,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,aAAa,MAAuB;AAClC,eAAO,KAAK,QAAQ,OAAO,IAAI;AAAA,MACjC;AAAA;AAAA;AAAA;AAAA,MAKA,eAAqB;AACnB,aAAK,QAAQ,MAAM;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA,MAKA,kBAAoE;AAClE,cAAM,SAA2D,CAAC;AAElE,mBAAW,CAAC,MAAM,MAAM,KAAK,KAAK,SAAS;AACzC,cAAI,kBAAkB,QAAQ;AAC5B,mBAAO,IAAI,IAAI;AAAA,cACb,MAAM;AAAA,cACN,QAAS,OAAe,QAAQ,UAAU;AAAA,YAC5C;AAAA,UACF,WAAW,kBAAkB,iBAAiB;AAC5C,mBAAO,IAAI,IAAI;AAAA,cACb,MAAM;AAAA,cACN,QAAS,OAAe,QAAQ,UAAU;AAAA,YAC5C;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;ACrFA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAC,eAAA;AAAA;AAAA;AAKA;AAGA;AAGA;AAGA;AAAA;AAAA;;;ACkCA,IAAM,gBAAN,MAAoB;AAAA,EACV;AAAA,EACA,UAAqC,CAAC;AAAA,EACtC,YAAY;AAAA,EAEpB,YAAY,SAAiC,CAAC,GAAG;AAC/C,SAAK,SAAS;AAAA,MACZ,SAAS;AAAA,MACT,SAAS;AAAA,MACT,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,MAAM,EAAE,WAAW,SAAS;AAAA,MAC5B,GAAG;AAAA,IACL;AAEA,SAAK,YAAY,KAAK,OAAO,WAAW;AAExC,QAAI,KAAK,aAAa,KAAK,OAAO,SAAS;AACzC,cAAQ,IAAI,mDAAW;AACvB,cAAQ,IAAI,uCAAY;AAAA,QACtB,gCAAO,GAAG,KAAK,OAAO,aAAa;AAAA,QACnC,gCAAO,IAAI,KAAK,OAAO,iBAAkB,KAAK,QAAQ,CAAC,CAAC;AAAA,QACxD,cAAI,KAAK,OAAO;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,cAAc,SAAwC;AACpD,QAAI,CAAC,KAAK,UAAW;AAErB,SAAK,QAAQ,KAAK,OAAO;AAGzB,QAAI,KAAK,QAAQ,SAAS,KAAM;AAC9B,WAAK,UAAU,KAAK,QAAQ,MAAM,IAAK;AAAA,IACzC;AAGA,QAAI,KAAK,OAAO,SAAS;AACvB,YAAM,SAAS,QAAQ,aAAa,MAAM,WAAM;AAChD,YAAM,YACJ,QAAQ,YAAY,KAAK,OAAO,gBAAiB,cAAO;AAE1D,cAAQ;AAAA,QACN,GAAG,MAAM,IAAI,QAAQ,MAAM,IAAI,QAAQ,IAAI,MACzC,QAAQ,UACV,KAAK,SAAS,IAAI,QAAQ,UAAU,QAAQ,CAAC,CAAC;AAAA,MAChD;AAGA,UAAI,QAAQ,YAAY,KAAK,OAAO,eAAgB;AAClD,gBAAQ;AAAA,UACN,6CAAa,QAAQ,IAAI,iBAAO,QAAQ,UAAU;AAAA,YAChD;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,YAAY;AACV,QAAI,CAAC,KAAK,WAAW;AACnB,aAAO,EAAE,SAAS,OAAO,SAAS,iCAAQ;AAAA,IAC5C;AAEA,UAAM,gBAAgB,KAAK,QAAQ;AACnC,UAAM,qBAAqB,KAAK,QAAQ;AAAA,MACtC,CAAC,MAAM,EAAE,aAAa;AAAA,IACxB,EAAE;AACF,UAAM,iBAAiB,gBAAgB;AACvC,UAAM,kBACJ,gBAAgB,IACZ,KAAK,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,WAAW,CAAC,IAAI,gBACxD;AAEN,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,gBAAgB,IAAI,iBAAiB,gBAAgB;AAAA,MAChE,iBAAiB,gBAAgB,QAAQ,CAAC,IAAI;AAAA,MAC9C,aAAa,KAAK,eAAe;AAAA,MACjC,gBAAgB,KAAK,QAAQ,MAAM,EAAE;AAAA,IACvC;AAAA,EACF;AAAA;AAAA,EAGA,aAAa;AACX,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,QAAQ;AACN,SAAK,UAAU,CAAC;AAChB,YAAQ,IAAI,sDAAY;AAAA,EAC1B;AAAA;AAAA,EAGQ,iBAAiB;AACvB,QAAI,OAAO,YAAY,eAAe,QAAQ,aAAa;AACzD,YAAM,MAAM,QAAQ,YAAY;AAChC,aAAO;AAAA,QACL,WAAW,IAAI,WAAW,OAAO,MAAM,QAAQ,CAAC,IAAI;AAAA,QACpD,YAAY,IAAI,YAAY,OAAO,MAAM,QAAQ,CAAC,IAAI;AAAA,QACtD,WAAW,IAAI,WAAW,OAAO,MAAM,QAAQ,CAAC,IAAI;AAAA,MACtD;AAAA,IACF;AACA,WAAO,EAAE,SAAS,6CAAU;AAAA,EAC9B;AACF;AAGO,SAAS,eACd,QACA,SAAiC,CAAC,GACjB;AACjB,QAAM,UAAU,IAAI,cAAc,MAAM;AAGxC,QAAM,gBAAgB,OAAO,MAAM,KAAK,MAAM;AAG9C,QAAM,iBAAiB,OAAO,QAAoC;AAChE,UAAM,YAAY,YAAY,IAAI;AAClC,UAAM,YAAY,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAChD,SAAS,EAAE,EACX,OAAO,GAAG,CAAC,CAAC;AACf,UAAM,EAAE,SAAS,IAAI,IAAI,IAAI,IAAI,GAAG;AACpC,UAAM,SAAS,IAAI;AAEnB,QAAI;AAEF,YAAM,WAAW,MAAM,cAAc,GAAG;AAGxC,YAAM,YAAY,YAAY,IAAI,IAAI;AACtC,cAAQ,cAAc;AAAA,QACpB;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,YAAY,SAAS;AAAA,QACrB;AAAA,QACA,WAAW,KAAK,IAAI;AAAA,QACpB,cAAc,MAAM;AAClB,cAAI,OAAO,YAAY,eAAe,QAAQ,aAAa;AACzD,kBAAM,MAAM,QAAQ,YAAY;AAChC,mBAAO;AAAA,cACL,UAAU,IAAI;AAAA,cACd,WAAW,IAAI;AAAA,YACjB;AAAA,UACF;AACA,iBAAO,EAAE,UAAU,GAAG,WAAW,EAAE;AAAA,QACrC,GAAG;AAAA,MACL,CAAC;AAED,aAAO;AAAA,IACT,SAAS,OAAO;AAEd,YAAM,YAAY,YAAY,IAAI,IAAI;AACtC,cAAQ,cAAc;AAAA,QACpB;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,YAAY;AAAA,QACZ;AAAA,QACA,WAAW,KAAK,IAAI;AAAA,QACpB,cAAc,MAAM;AAClB,cAAI,OAAO,YAAY,eAAe,QAAQ,aAAa;AACzD,kBAAM,MAAM,QAAQ,YAAY;AAChC,mBAAO;AAAA,cACL,UAAU,IAAI;AAAA,cACd,WAAW,IAAI;AAAA,YACjB;AAAA,UACF;AACA,iBAAO,EAAE,UAAU,GAAG,WAAW,EAAE;AAAA,QACrC,GAAG;AAAA,MACL,CAAC;AAED,YAAM;AAAA,IACR;AAAA,EACF;AAGA,QAAM,kBAAkB;AAAA,IACtB,GAAG;AAAA,IACH,OAAO;AAAA;AAAA,IAGP,qBAAqB,MAAM,QAAQ,UAAU;AAAA,IAC7C,sBAAsB,MAAM,QAAQ,WAAW;AAAA,IAC/C,iBAAiB,MAAM,QAAQ,MAAM;AAAA,EACvC;AAEA,SAAO;AACT;AAGO,SAAS,sBACd,QACA,QACiB;AACjB,QAAM,EAAE,QAAAC,QAAO,IAAI;AACnB,QAAM,SAAS,IAAIA,QAAO,MAAM;AAChC,SAAO,eAAe,QAAQ,MAAM;AACtC;;;ACnPO,IAAM,0BAA0B;AAAA,EACrC,SAAS;AAAA,EACT,SAAS;AAAA,EACT,eAAe;AAAA;AAAA,EACf,gBAAgB;AAAA;AAAA,EAChB,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AACF;AAGO,SAAS,uBACd,SAAkD,CAAC,GACnD;AACA,SAAO,EAAE,GAAG,yBAAyB,GAAG,OAAO;AACjD;","names":["init_server","init_server","Server"]}
|
|
1
|
+
{"version":3,"sources":["../../src/router.ts","../../src/utils/response.ts","../../src/middleware.ts","../../src/server/base-server.ts","../../src/router/radix-tree.ts","../../src/server/server.ts","../../src/middleware/component-router.ts","../../src/utils/path-matcher.ts","../../src/utils/html-renderer.ts","../../src/utils/dependency-manager.ts","../../src/server/component-server.ts","../../src/server/server-factory.ts","../../src/server/index.ts","../../src/monitoring/native-monitor.ts","../../src/monitoring/index.ts"],"sourcesContent":["/**\n * 路由工具函数\n *\n * 提供路由处理的基础工具\n */\n\nimport type { Route, NestedRoute, FlattenedRoute, Middleware } from \"./types\";\n\n/**\n * 扁平化嵌套路由\n *\n * 将嵌套路由结构转换为扁平数组,计算完整路径和中间件链\n *\n * @example\n * ```typescript\n * const routes = flattenNestedRoutes([\n * {\n * path: \"/api\",\n * middleware: [authMiddleware],\n * children: [\n * { path: \"/users\", method: \"GET\", handler: getUsers },\n * { path: \"/users/:id\", method: \"GET\", handler: getUser },\n * ],\n * },\n * ]);\n * // 结果:\n * // [\n * // { fullPath: \"/api/users\", method: \"GET\", ... },\n * // { fullPath: \"/api/users/:id\", method: \"GET\", ... },\n * // ]\n * ```\n */\nexport function flattenNestedRoutes(\n routes: (Route | NestedRoute)[],\n): FlattenedRoute[] {\n const flattened: FlattenedRoute[] = [];\n\n function processRoute(\n route: Route | NestedRoute,\n parentPath = \"\",\n parentMiddleware: Middleware[] = [],\n ): void {\n // 计算当前完整路径\n const currentPath = normalizePath(parentPath + route.path);\n // 合并中间件链\n const currentMiddleware = [\n ...parentMiddleware,\n ...(route.middleware || []),\n ];\n\n if (\"method\" in route && \"handler\" in route) {\n // 叶子路由(有处理函数)\n const leafRoute = route as Route;\n flattened.push({\n ...leafRoute,\n fullPath: currentPath,\n middlewareChain: currentMiddleware,\n });\n } else if (\"children\" in route && route.children) {\n // 分组路由,递归处理子路由\n for (const child of route.children) {\n processRoute(child, currentPath, currentMiddleware);\n }\n }\n }\n\n for (const route of routes) {\n processRoute(route);\n }\n\n return flattened;\n}\n\n/**\n * 标准化路径\n *\n * - 解码 URL 编码字符\n * - 去除重复斜杠\n * - 处理结尾斜杠\n *\n * @example\n * ```typescript\n * normalizePath(\"//api//users/\") // \"/api/users\"\n * normalizePath(\"/api/%20test\") // \"/api/ test\"\n * ```\n */\nexport function normalizePath(path: string): string {\n // 解码 URL 编码\n let normalized = decodeURIComponent(path);\n\n // 去除重复斜杠\n normalized = normalized.replace(/\\/+/g, \"/\");\n\n // 空路径转为根路径\n if (normalized === \"\") return \"/\";\n\n // 去除结尾斜杠(根路径除外)\n if (normalized !== \"/\" && normalized.endsWith(\"/\")) {\n normalized = normalized.slice(0, -1);\n }\n\n return normalized;\n}\n","// src/response.ts\n\n/** 生成 JSON 响应 */\nexport function json(\n data: unknown,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const body = JSON.stringify(data);\n\n // 优化:只在有自定义 headers 时才创建 Headers 对象\n if (Object.keys(headers).length === 0) {\n return new Response(body, {\n status,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n // 有自定义 headers 时才创建 Headers 对象\n const h = new Headers({\n \"Content-Type\": \"application/json\",\n ...headers,\n });\n\n return new Response(body, {\n status,\n headers: h,\n });\n}\n\n// JSON 响应的预创建 headers(避免每次创建)\nconst JSON_HEADERS = { \"Content-Type\": \"application/json\" };\nconst TEXT_HEADERS = { \"Content-Type\": \"text/plain\" };\n\n/**\n * 类型特化的响应映射\n * 根据返回值类型直接生成 Response,避免不必要的检查\n */\nexport function mapResponse(response: unknown): Response {\n // 快速路径:已经是 Response\n if (response instanceof Response) return response;\n\n // 使用 constructor.name 进行类型判断(比 instanceof 更快)\n switch (response?.constructor?.name) {\n case \"String\":\n return new Response(response as string, { headers: TEXT_HEADERS });\n\n case \"Object\":\n case \"Array\":\n return new Response(JSON.stringify(response), { headers: JSON_HEADERS });\n\n case \"Number\":\n case \"Boolean\":\n return new Response(String(response), { headers: TEXT_HEADERS });\n\n case undefined:\n // null 或 undefined\n return new Response(null, { status: 204 });\n\n case \"ReadableStream\":\n return new Response(response as ReadableStream);\n\n case \"Blob\":\n return new Response(response as Blob);\n\n case \"ArrayBuffer\":\n return new Response(response as ArrayBuffer);\n\n case \"Uint8Array\":\n return new Response(response as unknown as BodyInit);\n\n default:\n // Promise 处理\n if (response instanceof Promise) {\n return response.then(mapResponse) as unknown as Response;\n }\n // 其他情况使用 JSON 序列化\n return new Response(JSON.stringify(response), { headers: JSON_HEADERS });\n }\n}\n\n/** 生成重定向响应 */\nexport function redirect(location: string, status: 301 | 302 = 302): Response {\n return new Response(null, {\n status,\n headers: {\n Location: location,\n },\n });\n}\n\n/** 生成纯文本响应 */\nexport function text(\n content: string,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const h = new Headers({\n \"Content-Type\": \"text/plain; charset=utf-8\",\n ...headers,\n });\n\n return new Response(content, {\n status,\n headers: h,\n });\n}\n\n/** 生成HTML响应 */\nexport function html(\n content: string,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const h = new Headers({\n \"Content-Type\": \"text/html; charset=utf-8\",\n ...headers,\n });\n\n return new Response(content, {\n status,\n headers: h,\n });\n}\n\n/** 生成空响应(204 No Content) */\nexport function empty(status = 204, headers: HeadersInit = {}): Response {\n return new Response(null, {\n status,\n headers,\n });\n}\n\n/** 生成流式响应 */\nexport function stream(\n stream: ReadableStream,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const h = new Headers({\n \"Content-Type\": \"application/octet-stream\",\n ...headers,\n });\n\n return new Response(stream, {\n status,\n headers: h,\n });\n}\n","// src/middleware.ts\n\nimport { json, mapResponse } from \"./utils/response\";\n\nimport type { Handler, Middleware } from \"./types\";\n/** 中间件类型:使用 next() 传递给下一个处理 */\n\n/** Vafast 自定义错误类型 */\nexport class VafastError extends Error {\n status: number;\n type: string;\n expose: boolean;\n\n constructor(\n message: string,\n options: {\n status?: number;\n type?: string;\n expose?: boolean;\n cause?: unknown;\n } = {},\n ) {\n super(message);\n this.name = \"VafastError\";\n this.status = options.status ?? 500;\n this.type = options.type ?? \"internal_error\";\n this.expose = options.expose ?? false;\n if (options.cause) (this as any).cause = options.cause;\n }\n}\n\n/**\n * 组合类型: 自动注入错误处理器进行中间件组合\n */\nexport function composeMiddleware(\n middleware: Middleware[],\n finalHandler: Handler,\n): (req: Request) => Promise<Response> {\n const all = [errorHandler, ...middleware];\n\n return function composedHandler(req: Request): Promise<Response> {\n let i = -1;\n\n const dispatch = (index: number): Promise<Response> => {\n if (index <= i)\n return Promise.reject(new Error(\"next() called multiple times\"));\n i = index;\n\n // 中间件阶段\n if (index < all.length) {\n const mw = all[index];\n return Promise.resolve(mw(req, () => dispatch(index + 1)));\n }\n\n // 最终 handler - 使用 mapResponse 转换返回值\n return Promise.resolve(finalHandler(req)).then(mapResponse);\n };\n\n return dispatch(0);\n };\n}\n\n/** 默认包含的全局错误处理器 */\nconst errorHandler: Middleware = async (req, next) => {\n try {\n return await next();\n } catch (err) {\n console.error(\"未处理的错误:\", err);\n\n if (err instanceof VafastError) {\n return json(\n {\n error: err.type,\n message: err.expose ? err.message : \"发生了一个错误\",\n },\n err.status,\n );\n }\n\n return json({ error: \"internal_error\", message: \"出现了一些问题\" }, 500);\n }\n};\n","import type { Middleware } from \"../types\";\n\n/**\n * 服务器基类\n * 包含所有服务器类型的公共逻辑\n */\nexport abstract class BaseServer {\n protected globalMiddleware: Middleware[] = [];\n\n use(mw: Middleware) {\n this.globalMiddleware.push(mw);\n }\n\n /**\n * 打印扁平化后的路由信息,用于调试\n */\n protected logFlattenedRoutes(routes: any[], type: string = \"路由\"): void {\n console.log(`🚀 扁平化后的${type}:`);\n for (const route of routes) {\n const method = route.method || \"GET\";\n const path = route.fullPath || route.path;\n console.log(` ${method} ${path}`);\n if (route.middlewareChain && route.middlewareChain.length > 0) {\n console.log(` 中间件链: ${route.middlewareChain.length} 个`);\n }\n }\n console.log(\"\");\n }\n\n /**\n * 检测路由冲突\n * 检查是否有路径相同但方法不同的路由,以及潜在的路径冲突\n */\n protected detectRouteConflicts(routes: any[]): void {\n const pathGroups = new Map<string, any[]>();\n\n // 按路径分组\n for (const route of routes) {\n const path = route.fullPath || route.path;\n const method = route.method || \"GET\";\n if (!pathGroups.has(path)) {\n pathGroups.set(path, []);\n }\n pathGroups.get(path)!.push({ ...route, method });\n }\n\n // 检查冲突\n for (const [path, routeList] of pathGroups) {\n if (routeList.length > 1) {\n const methods = routeList.map((r) => r.method);\n const uniqueMethods = [...new Set(methods)];\n\n if (uniqueMethods.length === 1) {\n // 相同路径、相同方法 - 这是冲突!\n console.warn(\n `⚠️ 路由冲突: ${uniqueMethods[0]} ${path} 定义了 ${routeList.length} 次`,\n );\n routeList.forEach((route, index) => {\n console.warn(` ${index + 1}. ${route.method} ${path}`);\n });\n } else {\n // 相同路径、不同方法 - 这是正常的\n console.log(`ℹ️ 路径 ${path} 支持方法: ${uniqueMethods.join(\", \")}`);\n }\n }\n }\n\n // 检查潜在的路径冲突(动态路由可能冲突)\n this.detectDynamicRouteConflicts(routes);\n }\n\n /**\n * 检测动态路由的潜在冲突\n */\n private detectDynamicRouteConflicts(routes: any[]): void {\n const dynamicRoutes = routes.filter((r) => {\n const path = r.fullPath || r.path;\n return path.includes(\":\") || path.includes(\"*\");\n });\n\n for (let i = 0; i < dynamicRoutes.length; i++) {\n for (let j = i + 1; j < dynamicRoutes.length; j++) {\n const route1 = dynamicRoutes[i];\n const route2 = dynamicRoutes[j];\n const method1 = route1.method || \"GET\";\n const method2 = route2.method || \"GET\";\n\n if (method1 === method2) {\n const path1 = route1.fullPath || route1.path;\n const path2 = route2.fullPath || route2.path;\n // 检查路径是否可能冲突\n if (this.pathsMayConflict(path1, path2)) {\n console.warn(\n `⚠️ 潜在路由冲突: ${method1} ${path1} 可能与 ${path2} 冲突`,\n );\n }\n }\n }\n }\n }\n\n /**\n * 判断两个路径是否可能冲突\n */\n private pathsMayConflict(path1: string, path2: string): boolean {\n const parts1 = path1.split(\"/\").filter(Boolean);\n const parts2 = path2.split(\"/\").filter(Boolean);\n\n if (parts1.length !== parts2.length) return false;\n\n for (let i = 0; i < parts1.length; i++) {\n const p1 = parts1[i];\n const p2 = parts2[i];\n\n // 如果两个部分都是静态的且不同,则不会冲突\n if (\n !p1.startsWith(\":\") &&\n !p1.startsWith(\"*\") &&\n !p2.startsWith(\":\") &&\n !p2.startsWith(\"*\") &&\n p1 !== p2\n ) {\n return false;\n }\n\n // 如果一个是通配符,另一个是动态参数,可能冲突\n if (\n (p1 === \"*\" && p2.startsWith(\":\")) ||\n (p2 === \"*\" && p1.startsWith(\":\"))\n ) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * 路径匹配\n */\n protected matchPath(pattern: string, path: string): boolean {\n const patternParts = pattern.split(\"/\").filter(Boolean);\n const pathParts = path.split(\"/\").filter(Boolean);\n\n if (patternParts.length !== pathParts.length) {\n return false;\n }\n\n for (let i = 0; i < patternParts.length; i++) {\n if (\n patternParts[i] !== pathParts[i] &&\n !patternParts[i].startsWith(\":\")\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * 提取路径参数\n */\n protected extractParams(\n pattern: string,\n path: string,\n ): Record<string, string> {\n const params: Record<string, string> = {};\n const patternParts = pattern.split(\"/\").filter(Boolean);\n const pathParts = path.split(\"/\").filter(Boolean);\n\n for (let i = 0; i < patternParts.length; i++) {\n if (patternParts[i].startsWith(\":\")) {\n const paramName = patternParts[i].slice(1);\n params[paramName] = pathParts[i];\n }\n }\n\n return params;\n }\n}\n","/**\n * Radix Tree 路由匹配器\n *\n * 高性能路由匹配实现,时间复杂度 O(k),k 为路径段数\n *\n * 支持的路由模式:\n * - 静态路径: /users, /api/v1/health\n * - 动态参数: /users/:id, /posts/:postId/comments/:commentId\n * - 通配符: /files/*, /static/*filepath\n */\n\nimport type { Handler, Middleware, Method } from \"../types\";\n\n/** 预编译的处理器类型 */\ntype CompiledHandler = (req: Request) => Promise<Response>;\n\n/** 路由处理信息 */\ninterface RouteHandler {\n handler: Handler;\n middleware: Middleware[];\n /** 预编译后的完整处理链(包含中间件) */\n compiled?: CompiledHandler;\n}\n\n/** Radix Tree 节点 */\ninterface RadixNode {\n path: string;\n children: Record<string, RadixNode>;\n paramChild?: RadixNode;\n wildcardChild?: RadixNode;\n paramName?: string;\n handlers: Record<Method, RouteHandler | undefined>;\n}\n\n/** 路由匹配结果 */\nexport interface MatchResult {\n handler: Handler;\n middleware: Middleware[];\n params: Record<string, string>;\n /** 预编译后的完整处理链 */\n compiled?: CompiledHandler;\n}\n\n/**\n * Radix Tree 路由器\n *\n * @example\n * ```typescript\n * const router = new RadixRouter();\n * router.register(\"GET\", \"/users/:id\", handler);\n * const result = router.match(\"GET\", \"/users/123\");\n * // result.params = { id: \"123\" }\n * ```\n */\nexport class RadixRouter {\n private root: RadixNode;\n\n constructor() {\n this.root = this.createNode(\"\");\n }\n\n private createNode(path: string): RadixNode {\n return {\n path,\n children: Object.create(null),\n handlers: Object.create(null),\n };\n }\n\n /** 分割路径 */\n private splitPath(path: string): string[] {\n return path.split(\"/\").filter(Boolean);\n }\n\n /** 编译器函数 - 用于预编译中间件链 */\n private compiler?: (\n middleware: Middleware[],\n handler: Handler,\n ) => CompiledHandler;\n\n /** 设置中间件编译器 */\n setCompiler(\n compiler: (middleware: Middleware[], handler: Handler) => CompiledHandler,\n ): void {\n this.compiler = compiler;\n }\n\n /** 注册路由 */\n register(\n method: Method,\n pattern: string,\n handler: Handler,\n middleware: Middleware[] = [],\n ): void {\n const segments = this.splitPath(pattern);\n let node = this.root;\n\n for (const segment of segments) {\n const firstChar = segment[0];\n\n if (firstChar === \":\") {\n // 动态参数节点\n if (!node.paramChild) {\n node.paramChild = this.createNode(segment);\n node.paramChild.paramName = segment.substring(1);\n }\n node = node.paramChild;\n } else if (firstChar === \"*\") {\n // 通配符节点\n if (!node.wildcardChild) {\n node.wildcardChild = this.createNode(segment);\n node.wildcardChild.paramName =\n segment.length > 1 ? segment.substring(1) : \"*\";\n }\n node = node.wildcardChild;\n break;\n } else {\n // 静态路径节点\n if (!node.children[segment]) {\n node.children[segment] = this.createNode(segment);\n }\n node = node.children[segment];\n }\n }\n\n const routeHandler: RouteHandler = { handler, middleware };\n\n // 如果没有全局中间件且设置了编译器,预编译处理链\n if (this.compiler && middleware.length === 0) {\n routeHandler.compiled = this.compiler([], handler);\n }\n\n node.handlers[method] = routeHandler;\n }\n\n /** 预编译所有路由(在添加全局中间件后调用) */\n precompileAll(globalMiddleware: Middleware[]): void {\n if (!this.compiler) return;\n this.precompileNode(this.root, globalMiddleware);\n }\n\n private precompileNode(\n node: RadixNode,\n globalMiddleware: Middleware[],\n ): void {\n for (const method in node.handlers) {\n const routeHandler = node.handlers[method as Method];\n if (routeHandler) {\n const allMiddleware = [...globalMiddleware, ...routeHandler.middleware];\n routeHandler.compiled = this.compiler!(\n allMiddleware,\n routeHandler.handler,\n );\n }\n }\n\n for (const key in node.children) {\n this.precompileNode(node.children[key], globalMiddleware);\n }\n\n if (node.paramChild) {\n this.precompileNode(node.paramChild, globalMiddleware);\n }\n\n if (node.wildcardChild) {\n this.precompileNode(node.wildcardChild, globalMiddleware);\n }\n }\n\n /** 匹配路由 */\n match(method: Method, path: string): MatchResult | null {\n const segments = this.splitPath(path);\n const params: Record<string, string> = Object.create(null);\n\n const node = this.matchNode(this.root, segments, 0, params);\n if (!node) return null;\n\n const routeHandler = node.handlers[method];\n if (!routeHandler) return null;\n\n return {\n handler: routeHandler.handler,\n middleware: routeHandler.middleware,\n params,\n compiled: routeHandler.compiled,\n };\n }\n\n /** 递归匹配节点 (优先级: 静态 > 动态参数 > 通配符) */\n private matchNode(\n node: RadixNode,\n segments: string[],\n index: number,\n params: Record<string, string>,\n ): RadixNode | null {\n if (index === segments.length) {\n for (const method in node.handlers) {\n if (node.handlers[method as Method]) return node;\n }\n return null;\n }\n\n const segment = segments[index];\n\n // 1. 静态路径\n const staticChild = node.children[segment];\n if (staticChild) {\n const result = this.matchNode(staticChild, segments, index + 1, params);\n if (result) return result;\n }\n\n // 2. 动态参数\n if (node.paramChild) {\n const paramName = node.paramChild.paramName!;\n const oldValue = params[paramName];\n\n params[paramName] = segment;\n const result = this.matchNode(\n node.paramChild,\n segments,\n index + 1,\n params,\n );\n\n if (result) return result;\n\n // 回溯\n if (oldValue === undefined) {\n delete params[paramName];\n } else {\n params[paramName] = oldValue;\n }\n }\n\n // 3. 通配符\n if (node.wildcardChild) {\n params[node.wildcardChild.paramName || \"*\"] = segments\n .slice(index)\n .join(\"/\");\n return node.wildcardChild;\n }\n\n return null;\n }\n\n /** 获取路径允许的 HTTP 方法 */\n getAllowedMethods(path: string): Method[] {\n const segments = this.splitPath(path);\n const node = this.findNode(segments);\n if (!node) return [];\n\n const methods: Method[] = [];\n for (const method in node.handlers) {\n if (node.handlers[method as Method]) {\n methods.push(method as Method);\n }\n }\n return methods;\n }\n\n /** 查找节点(不提取参数) */\n private findNode(segments: string[]): RadixNode | null {\n let node = this.root;\n\n for (const segment of segments) {\n if (node.children[segment]) {\n node = node.children[segment];\n } else if (node.paramChild) {\n node = node.paramChild;\n } else if (node.wildcardChild) {\n return node.wildcardChild;\n } else {\n return null;\n }\n }\n\n return node;\n }\n\n /** 获取所有已注册的路由 */\n getRoutes(): Array<{ method: Method; path: string }> {\n const routes: Array<{ method: Method; path: string }> = [];\n this.collectRoutes(this.root, \"\", routes);\n return routes;\n }\n\n private collectRoutes(\n node: RadixNode,\n prefix: string,\n routes: Array<{ method: Method; path: string }>,\n ): void {\n const currentPath = prefix + (node.path ? \"/\" + node.path : \"\");\n\n for (const method in node.handlers) {\n if (node.handlers[method as Method]) {\n routes.push({ method: method as Method, path: currentPath || \"/\" });\n }\n }\n\n for (const key in node.children) {\n this.collectRoutes(node.children[key], currentPath, routes);\n }\n\n if (node.paramChild) {\n this.collectRoutes(node.paramChild, currentPath, routes);\n }\n\n if (node.wildcardChild) {\n this.collectRoutes(node.wildcardChild, currentPath, routes);\n }\n }\n}\n","/**\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\";\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: (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\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: (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","import type {\n ComponentRoute,\n NestedComponentRoute,\n FlattenedComponentRoute,\n} from \"../types/component-route\";\nimport { vueRenderer, reactRenderer } from \"./component-renderer\";\n\n/**\n * 扁平化嵌套组件路由\n */\nexport function flattenComponentRoutes(\n routes: (ComponentRoute | NestedComponentRoute)[],\n): FlattenedComponentRoute[] {\n const flattened: FlattenedComponentRoute[] = [];\n\n function processRoute(\n route: ComponentRoute | NestedComponentRoute,\n parentPath: string = \"\",\n parentMiddleware: any[] = [],\n ) {\n const currentPath = parentPath + route.path;\n const currentMiddleware = [\n ...parentMiddleware,\n ...(route.middleware || []),\n ];\n\n if (\"component\" in route) {\n // 这是一个组件路由\n flattened.push({\n ...route,\n fullPath: currentPath,\n middlewareChain: currentMiddleware,\n });\n } else if (\"children\" in route && route.children) {\n // 这是一个嵌套路由\n for (const child of route.children) {\n processRoute(child, currentPath, currentMiddleware);\n }\n }\n }\n\n for (const route of routes) {\n processRoute(route);\n }\n\n return flattened;\n}\n\n/**\n * 组件路由处理器中间件\n * 自动检测组件类型并应用相应的渲染器\n */\nexport const componentRouter = () => {\n return async (req: Request, next: () => Promise<Response>) => {\n // 这里可以添加组件路由的自动处理逻辑\n // 比如自动检测组件类型,应用相应的渲染器\n return next();\n };\n};\n","/**\n * 路径匹配工具类\n * 提供统一的路径匹配和参数提取功能\n */\nexport class PathMatcher {\n /**\n * 路径匹配\n */\n static matchPath(pattern: string, path: string): boolean {\n const patternParts = pattern.split(\"/\").filter(Boolean);\n const pathParts = path.split(\"/\").filter(Boolean);\n\n if (patternParts.length !== pathParts.length) {\n return false;\n }\n\n for (let i = 0; i < patternParts.length; i++) {\n if (\n patternParts[i] !== pathParts[i] &&\n !patternParts[i].startsWith(\":\")\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * 提取路径参数\n */\n static extractParams(pattern: string, path: string): Record<string, string> {\n const params: Record<string, string> = {};\n const patternParts = pattern.split(\"/\").filter(Boolean);\n const pathParts = path.split(\"/\").filter(Boolean);\n\n for (let i = 0; i < patternParts.length; i++) {\n if (patternParts[i].startsWith(\":\")) {\n const paramName = patternParts[i].slice(1);\n params[paramName] = pathParts[i];\n }\n }\n\n return params;\n }\n\n /**\n * 计算路径特异性分数\n * 用于路由排序:静态 > 动态(:param) > 通配符(*)\n */\n static calculatePathScore(path: string): number {\n const parts = path.split(\"/\").filter(Boolean);\n let score = 0;\n for (const p of parts) {\n if (p === \"*\")\n score += 1; // 最弱\n else if (p.startsWith(\":\"))\n score += 2; // 中等\n else score += 3; // 静态最强\n }\n // 更长的路径更具体,略微提升\n return score * 10 + parts.length;\n }\n\n /**\n * 判断两个路径是否可能冲突\n */\n static pathsMayConflict(path1: string, path2: string): boolean {\n const parts1 = path1.split(\"/\").filter(Boolean);\n const parts2 = path2.split(\"/\").filter(Boolean);\n\n if (parts1.length !== parts2.length) return false;\n\n for (let i = 0; i < parts1.length; i++) {\n const p1 = parts1[i];\n const p2 = parts2[i];\n\n // 如果两个部分都是静态的且不同,则不会冲突\n if (\n !p1.startsWith(\":\") &&\n !p1.startsWith(\"*\") &&\n !p2.startsWith(\":\") &&\n !p2.startsWith(\"*\") &&\n p1 !== p2\n ) {\n return false;\n }\n\n // 如果一个是通配符,另一个是动态参数,可能冲突\n if (\n (p1 === \"*\" && p2.startsWith(\":\")) ||\n (p2 === \"*\" && p1.startsWith(\":\"))\n ) {\n return true;\n }\n }\n\n return false;\n }\n}\n","/**\n * HTML渲染工具类\n * 提供统一的HTML模板生成功能\n */\nexport class HtmlRenderer {\n /**\n * 生成基础HTML模板\n */\n static generateBaseHtml(\n content: string,\n context: any,\n clientScriptPath: string = \"/client.js\",\n ): string {\n return `\n <!doctype html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <title>Vafast SSR App</title>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n </head>\n <body>\n <div id=\"app\">${content}</div>\n <script>\n window.__ROUTE_INFO__ = {\n params: ${JSON.stringify(context.params || {})},\n query: ${JSON.stringify(context.query || {})},\n pathname: '${context.pathname}'\n };\n </script>\n <script type=\"module\" src=\"${clientScriptPath}\"></script>\n </body>\n </html>\n `;\n }\n\n /**\n * 生成Vue组件HTML\n */\n static generateVueHtml(\n content: string,\n context: any,\n clientScriptPath: string = \"/client.js\",\n ): string {\n return this.generateBaseHtml(content, context, clientScriptPath);\n }\n\n /**\n * 生成React组件HTML\n */\n static generateReactHtml(\n content: string,\n context: any,\n clientScriptPath: string = \"/client.js\",\n ): string {\n return `\n <!doctype html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <title>Vafast SSR App</title>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n </head>\n <body>\n <div id=\"root\">${content}</div>\n <script>\n window.__ROUTE_INFO__ = {\n params: ${JSON.stringify(context.params || {})},\n query: ${JSON.stringify(context.query || {})},\n pathname: '${context.pathname}'\n };\n </script>\n <script type=\"module\" src=\"${clientScriptPath}\"></script>\n </body>\n </html>\n `;\n }\n}\n","/**\n * 依赖管理器\n * 负责按需加载和管理框架依赖\n */\nexport class DependencyManager {\n private dependencyCache = new Map<string, any>();\n\n /**\n * 按需获取框架依赖\n */\n async getFrameworkDeps(framework: \"vue\" | \"react\") {\n if (this.dependencyCache.has(framework)) {\n return this.dependencyCache.get(framework);\n }\n\n console.log(`📦 按需加载 ${framework} 依赖...`);\n\n try {\n let deps;\n switch (framework) {\n case \"vue\":\n deps = await Promise.all([\n import(\"vue\"),\n import(\"@vue/server-renderer\"),\n ]);\n break;\n case \"react\":\n deps = await Promise.all([\n import(\"react\"),\n import(\"react-dom/server\"),\n ]);\n break;\n default:\n throw new Error(`不支持的框架: ${framework}`);\n }\n\n this.dependencyCache.set(framework, deps);\n console.log(`✅ ${framework} 依赖加载完成`);\n return deps;\n } catch (error) {\n console.error(`❌ ${framework} 依赖加载失败:`, error);\n throw error;\n }\n }\n\n /**\n * 检测组件类型\n */\n detectComponentType(component: any): \"vue\" | \"react\" {\n // 简单的组件类型检测\n if (component.render && typeof component.render === \"function\") {\n return \"vue\";\n }\n if (component.$$typeof) {\n return \"react\";\n }\n // 默认使用 Vue\n return \"vue\";\n }\n\n /**\n * 清除缓存\n */\n clearCache(): void {\n this.dependencyCache.clear();\n console.log(\"🧹 依赖缓存已清除\");\n }\n\n /**\n * 获取缓存状态\n */\n getCacheStatus(): Record<string, boolean> {\n const status: Record<string, boolean> = {};\n for (const [framework] of this.dependencyCache) {\n status[framework] = true;\n }\n return status;\n }\n}\n","import type {\n ComponentRoute,\n NestedComponentRoute,\n FlattenedComponentRoute,\n} from \"../types/component-route\";\nimport { flattenComponentRoutes } from \"../middleware/component-router\";\nimport { BaseServer } from \"./base-server\";\nimport { PathMatcher } from \"../utils/path-matcher\";\nimport { HtmlRenderer } from \"../utils/html-renderer\";\nimport { DependencyManager } from \"../utils/dependency-manager\";\n\n/**\n * 组件路由服务器\n * 专门处理声明式组件路由\n */\nexport class ComponentServer extends BaseServer {\n private routes: FlattenedComponentRoute[];\n private dependencyManager: DependencyManager;\n\n constructor(routes: (ComponentRoute | NestedComponentRoute)[]) {\n super();\n this.routes = flattenComponentRoutes(routes);\n this.dependencyManager = new DependencyManager();\n\n // 检测路由冲突\n this.detectRouteConflicts(this.routes);\n this.logFlattenedRoutes(this.routes, \"组件路由\");\n console.log(\"🚀 依赖按需加载,服务器启动完成\");\n }\n\n /**\n * 处理请求\n */\n async fetch(req: Request): Promise<Response> {\n const url = new URL(req.url);\n const pathname = url.pathname;\n const method = req.method;\n\n // 只支持 GET 请求\n if (method !== \"GET\") {\n return new Response(\"Method Not Allowed\", { status: 405 });\n }\n\n // 查找匹配的路由\n let matchedRoute: FlattenedComponentRoute | null = null;\n for (const route of this.routes) {\n if (PathMatcher.matchPath(route.fullPath, pathname)) {\n matchedRoute = route;\n break;\n }\n }\n\n if (!matchedRoute) {\n return new Response(\"Not Found\", { status: 404 });\n }\n\n try {\n // 创建中间件上下文\n const context = {\n req,\n params: PathMatcher.extractParams(matchedRoute.fullPath, pathname),\n query: Object.fromEntries(url.searchParams),\n pathname,\n };\n\n // 执行中间件链,中间件会处理组件渲染\n return await this.executeMiddlewareChain(\n matchedRoute.middlewareChain,\n context,\n matchedRoute.component,\n );\n } catch (error) {\n console.error(\"组件渲染失败:\", error);\n return new Response(\"Internal Server Error\", { status: 500 });\n }\n }\n\n /**\n * 执行中间件链\n */\n private async executeMiddlewareChain(\n middlewareChain: any[],\n context: any,\n componentImport: () => Promise<any>,\n ): Promise<Response> {\n // 创建最终的渲染函数\n const renderComponent = async () => {\n const componentModule = await componentImport();\n const component = componentModule.default || componentModule;\n\n // 自动检测组件类型\n const componentType =\n this.dependencyManager.detectComponentType(component);\n\n // 按需加载依赖\n const deps = await this.dependencyManager.getFrameworkDeps(componentType);\n\n // 根据组件类型渲染\n if (componentType === \"vue\") {\n return await this.renderVueComponent(component, context, deps);\n } else if (componentType === \"react\") {\n return await this.renderReactComponent(component, context, deps);\n } else {\n throw new Error(`不支持的组件类型: ${componentType}`);\n }\n };\n\n // 执行中间件链\n let index = 0;\n const next = async (): Promise<Response> => {\n if (index >= middlewareChain.length) {\n return await renderComponent();\n }\n\n const middleware = middlewareChain[index++];\n return await middleware(context.req, next);\n };\n\n return await next();\n }\n\n /**\n * 渲染 Vue 组件\n */\n private async renderVueComponent(\n component: any,\n context: any,\n deps: any,\n ): Promise<Response> {\n try {\n const [vue, renderer] = deps;\n const app = vue.createSSRApp(component);\n\n // 提供路由信息\n app.provide(\"routeInfo\", {\n params: context.params || {},\n query: context.query || {},\n pathname: context.pathname,\n });\n\n const html = await renderer.renderToString(app);\n const fullHtml = HtmlRenderer.generateVueHtml(html, context);\n\n return new Response(fullHtml, {\n headers: { \"Content-Type\": \"text/html; charset=utf-8\" },\n });\n } catch (error) {\n console.error(\"Vue 组件渲染失败:\", error);\n return new Response(\"Vue Component Render Error\", { status: 500 });\n }\n }\n\n /**\n * 渲染 React 组件\n */\n private async renderReactComponent(\n component: any,\n context: any,\n deps: any,\n ): Promise<Response> {\n try {\n const [react, renderer] = deps;\n const content = react.createElement(component, {\n req: context.req,\n params: context.params || {},\n query: context.query || {},\n });\n\n const html = renderer.renderToString(content);\n const fullHtml = HtmlRenderer.generateReactHtml(html, context);\n\n return new Response(fullHtml, {\n headers: { \"Content-Type\": \"text/html; charset=utf-8\" },\n });\n } catch (error) {\n console.error(\"React 组件渲染失败:\", error);\n return new Response(\"React Component Render Error\", { status: 500 });\n }\n }\n\n /**\n * 获取依赖管理器(用于外部访问)\n */\n getDependencyManager(): DependencyManager {\n return this.dependencyManager;\n }\n}\n","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","/**\n * 服务器模块导出\n */\n\n// 主服务器类\nexport { Server } from \"./server\";\n\n// 组件服务器 (SSR)\nexport { ComponentServer } from \"./component-server\";\n\n// 服务器工厂\nexport { ServerFactory } from \"./server-factory\";\n\n// 基类 (仅用于扩展)\nexport { BaseServer } from \"./base-server\";\n","/**\n * 原生监控装饰器\n *\n * 通过装饰器模式为 Server 添加监控能力,完全不入侵原类\n *\n * @author Framework Team\n * @version 2.0.0\n * @license MIT\n */\n\nimport type { Server } from \"../server\";\n\n// 监控配置接口\nexport interface NativeMonitoringConfig {\n enabled?: boolean;\n console?: boolean;\n slowThreshold?: number; // 毫秒\n errorThreshold?: number;\n tags?: Record<string, string>;\n}\n\n// 监控指标接口\nexport interface NativeMonitoringMetrics {\n requestId: string;\n method: string;\n path: string;\n statusCode: number;\n totalTime: number;\n timestamp: number;\n memoryUsage: {\n heapUsed: number;\n heapTotal: number;\n };\n}\n\n// 带监控的 Server 接口\nexport interface MonitoredServer extends Server {\n // 监控相关方法\n getMonitoringStatus(): any;\n getMonitoringMetrics(): NativeMonitoringMetrics[];\n resetMonitoring(): void;\n\n // 原始方法保持不变\n fetch: (req: Request) => Promise<Response>;\n use: (mw: any) => void;\n}\n\n// 原生监控器\nclass NativeMonitor {\n private config: NativeMonitoringConfig;\n private metrics: NativeMonitoringMetrics[] = [];\n private isEnabled = false;\n\n constructor(config: NativeMonitoringConfig = {}) {\n this.config = {\n enabled: true,\n console: true,\n slowThreshold: 1000,\n errorThreshold: 0.05,\n tags: { framework: \"vafast\" },\n ...config,\n };\n\n this.isEnabled = this.config.enabled ?? true;\n\n if (this.isEnabled && this.config.console) {\n console.log(\"✅ 原生监控已启用\");\n console.log(`📊 监控配置:`, {\n 慢请求阈值: `${this.config.slowThreshold}ms`,\n 错误率阈值: `${(this.config.errorThreshold! * 100).toFixed(1)}%`,\n 标签: this.config.tags,\n });\n }\n }\n\n // 记录监控指标\n recordMetrics(metrics: NativeMonitoringMetrics): void {\n if (!this.isEnabled) return;\n\n this.metrics.push(metrics);\n\n // 保持最近1000条记录\n if (this.metrics.length > 1000) {\n this.metrics = this.metrics.slice(-1000);\n }\n\n // 控制台输出\n if (this.config.console) {\n const status = metrics.statusCode < 400 ? \"✅\" : \"❌\";\n const timeColor =\n metrics.totalTime > this.config.slowThreshold! ? \"🐌\" : \"⚡\";\n\n console.log(\n `${status} ${metrics.method} ${metrics.path} - ${\n metrics.statusCode\n } (${timeColor} ${metrics.totalTime.toFixed(2)}ms)`,\n );\n\n // 慢请求警告\n if (metrics.totalTime > this.config.slowThreshold!) {\n console.warn(\n `🐌 慢请求警告: ${metrics.path} 耗时 ${metrics.totalTime.toFixed(\n 2,\n )}ms`,\n );\n }\n }\n }\n\n // 获取监控状态\n getStatus() {\n if (!this.isEnabled) {\n return { enabled: false, message: \"监控未启用\" };\n }\n\n const totalRequests = this.metrics.length;\n const successfulRequests = this.metrics.filter(\n (m) => m.statusCode < 400,\n ).length;\n const failedRequests = totalRequests - successfulRequests;\n const avgResponseTime =\n totalRequests > 0\n ? this.metrics.reduce((sum, m) => sum + m.totalTime, 0) / totalRequests\n : 0;\n\n return {\n enabled: true,\n totalRequests,\n successfulRequests,\n failedRequests,\n errorRate: totalRequests > 0 ? failedRequests / totalRequests : 0,\n avgResponseTime: avgResponseTime.toFixed(2) + \"ms\",\n memoryUsage: this.getMemoryUsage(),\n recentRequests: this.metrics.slice(-5),\n };\n }\n\n // 获取监控指标\n getMetrics() {\n return this.metrics;\n }\n\n // 重置监控数据\n reset() {\n this.metrics = [];\n console.log(\"🔄 监控数据已重置\");\n }\n\n // 获取内存使用情况\n private getMemoryUsage() {\n if (typeof process !== \"undefined\" && process.memoryUsage) {\n const mem = process.memoryUsage();\n return {\n heapUsed: (mem.heapUsed / 1024 / 1024).toFixed(2) + \"MB\",\n heapTotal: (mem.heapTotal / 1024 / 1024).toFixed(2) + \"MB\",\n external: (mem.external / 1024 / 1024).toFixed(2) + \"MB\",\n };\n }\n return { message: \"内存信息不可用\" };\n }\n}\n\n// 纯函数:为 Server 添加监控能力\nexport function withMonitoring(\n server: Server,\n config: NativeMonitoringConfig = {},\n): MonitoredServer {\n const monitor = new NativeMonitor(config);\n\n // 保存原始的 fetch 方法\n const originalFetch = server.fetch.bind(server);\n\n // 创建带监控的 fetch 方法\n const monitoredFetch = async (req: Request): Promise<Response> => {\n const startTime = performance.now();\n const requestId = `req_${Date.now()}_${Math.random()\n .toString(36)\n .substr(2, 9)}`;\n const { pathname } = new URL(req.url);\n const method = req.method;\n\n try {\n // 调用原始 fetch\n const response = await originalFetch(req);\n\n // 记录监控指标\n const totalTime = performance.now() - startTime;\n monitor.recordMetrics({\n requestId,\n method,\n path: pathname,\n statusCode: response.status,\n totalTime,\n timestamp: Date.now(),\n memoryUsage: (() => {\n if (typeof process !== \"undefined\" && process.memoryUsage) {\n const mem = process.memoryUsage();\n return {\n heapUsed: mem.heapUsed,\n heapTotal: mem.heapTotal,\n };\n }\n return { heapUsed: 0, heapTotal: 0 };\n })(),\n });\n\n return response;\n } catch (error) {\n // 记录错误监控指标\n const totalTime = performance.now() - startTime;\n monitor.recordMetrics({\n requestId,\n method,\n path: pathname,\n statusCode: 500,\n totalTime,\n timestamp: Date.now(),\n memoryUsage: (() => {\n if (typeof process !== \"undefined\" && process.memoryUsage) {\n const mem = process.memoryUsage();\n return {\n heapUsed: mem.heapUsed,\n heapTotal: mem.heapTotal,\n };\n }\n return { heapUsed: 0, heapTotal: 0 };\n })(),\n });\n\n throw error;\n }\n };\n\n // 创建带监控的 Server 对象\n const monitoredServer = {\n ...server,\n fetch: monitoredFetch,\n\n // 监控方法\n getMonitoringStatus: () => monitor.getStatus(),\n getMonitoringMetrics: () => monitor.getMetrics(),\n resetMonitoring: () => monitor.reset(),\n } as MonitoredServer;\n\n return monitoredServer;\n}\n\n// 便捷函数:创建带监控的 Server\nexport function createMonitoredServer(\n routes: any[],\n config?: NativeMonitoringConfig,\n): MonitoredServer {\n const { Server } = require(\"../server\");\n const server = new Server(routes);\n return withMonitoring(server, config);\n}\n","/**\n * 原生监控系统入口\n *\n * @author Framework Team\n * @version 2.0.0\n * @license MIT\n */\n\nexport * from \"./types\";\nexport * from \"./native-monitor\";\n\n// 默认监控配置\nexport const defaultMonitoringConfig = {\n enabled: true,\n console: true,\n slowThreshold: 1000, // 1秒\n errorThreshold: 0.05, // 5%\n tags: {\n framework: \"vafast\",\n version: \"2.0.0\",\n },\n};\n\n// 创建监控配置\nexport function createMonitoringConfig(\n config: Partial<typeof defaultMonitoringConfig> = {},\n) {\n return { ...defaultMonitoringConfig, ...config };\n}\n"],"mappings":"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","names":["init_server","init_server","Server"]}
|
|
@@ -29,8 +29,9 @@ function flattenNestedRoutes(routes) {
|
|
|
29
29
|
...route.middleware || []
|
|
30
30
|
];
|
|
31
31
|
if ("method" in route && "handler" in route) {
|
|
32
|
+
const leafRoute = route;
|
|
32
33
|
flattened.push({
|
|
33
|
-
...
|
|
34
|
+
...leafRoute,
|
|
34
35
|
fullPath: currentPath,
|
|
35
36
|
middlewareChain: currentMiddleware
|
|
36
37
|
});
|
|
@@ -644,6 +645,22 @@ var init_server = __esm({
|
|
|
644
645
|
getRoutes() {
|
|
645
646
|
return this.router.getRoutes();
|
|
646
647
|
}
|
|
648
|
+
/**
|
|
649
|
+
* 获取完整的路由元信息(不含 handler 和 middleware)
|
|
650
|
+
*
|
|
651
|
+
* 用于 API 文档生成、Webhook 事件注册、权限检查等场景
|
|
652
|
+
*
|
|
653
|
+
* @example
|
|
654
|
+
* ```typescript
|
|
655
|
+
* const routes = server.getRoutesWithMeta()
|
|
656
|
+
* for (const route of routes) {
|
|
657
|
+
* console.log(route.fullPath, route.name, route.description)
|
|
658
|
+
* }
|
|
659
|
+
* ```
|
|
660
|
+
*/
|
|
661
|
+
getRoutesWithMeta() {
|
|
662
|
+
return this.routes;
|
|
663
|
+
}
|
|
647
664
|
};
|
|
648
665
|
}
|
|
649
666
|
});
|