koatty_router 2.1.9 → 2.2.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/.opencode/.evolution_mode_active +0 -0
- package/.opencode/.knowledge-context.md +0 -0
- package/.opencode/feature_list.json +59 -0
- package/.opencode/progress.txt +45 -0
- package/.turbo/turbo-build.log +202 -46
- package/.turbo/turbo-clean.log +4 -0
- package/.turbo/turbo-test.log +77 -0
- package/CHANGELOG.md +46 -2
- package/dist/index.d.ts +8 -12
- package/dist/index.js +207 -476
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +210 -479
- package/dist/index.mjs.map +1 -1
- package/dist/package.json +9 -9
- package/package.json +1 -1
- package/tsconfig.tsbuildinfo +1 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/params/mapping.ts","../src/middleware/manager.ts","../src/payload/parser/text.ts","../src/payload/parser/json.ts","../src/payload/parser/form.ts","../src/utils/path.ts","../src/payload/parser/multipart.ts","../src/payload/parser/xml.ts","../src/payload/parser/grpc.ts","../src/payload/parser/graphql.ts","../src/payload/parser/websocket.ts","../src/payload/payload_cache.ts","../src/payload/payload.ts","../src/utils/inject.ts","../src/utils/strategy-extractor.ts","../src/utils/handler.ts","../src/router/types.ts","../src/router/graphql.ts","../src/router/grpc.ts","../src/router/http.ts","../src/router/ws.ts","../src/router/factory.ts","../src/router/router.ts","../src/params/params.ts","../src/RouterComponent.ts"],"names":["MAPPING_KEY","RequestMethod","RequestMapping","path","reqMethod","routerOptions","routerName","target","key","descriptor","targetType","IOC","getType","Error","middlewareConfigs","middleware","map","item","prototype","priority","enabled","conditions","metadata","attachPropertyData","requestMethod","method","PostMapping","GetMapping","DeleteMapping","PutMapping","PatchMapping","OptionsMapping","HeadMapping","withMiddleware","options","RouterMiddlewareManager","app","instance","isCreating","_instanceId","middlewares","Map","middlewaresByName","pathPatterns","exact","LRUCache","max","prefixes","suffixes","patterns","methodCache","headerCache","cacheCleanupTimer","CACHE_CLEANUP_INTERVAL","Math","random","toString","substr","Logger","Debug","startCacheCleanup","getInstance","resetInstance","destroy","setInterval","performCacheCleanup","beforeSize","getCacheSize","afterSize","size","clearInterval","undefined","clearCaches","clear","register","config","name","actualMiddleware","isMiddlewareClass","processMiddlewareClass","instanceIdConfig","middlewareConfig","instanceId","generateInstanceId","set","has","Set","get","add","preprocessConditions","route","replace","timestamp","Date","now","run","MiddlewareClass","middlewareInstance","appConfig","middlewareBusinessConfig","decoratorConfig","finalConfig","koaMiddleware","error","length","condition","type","preprocessPathCondition","preprocessMethodCondition","preprocessHeaderCondition","value","operator","startsWith","includes","RegExp","Warn","toUpperCase","headerName","expectedValue","split","toLowerCase","unregister","nameOrInstanceId","delete","instanceIds","deletedCount","getMiddleware","firstInstanceId","values","next","getMiddlewareByRoute","middlewareName","cleanRoute","targetMethod","expectedInstanceId","getMiddlewareInstances","Array","from","filter","listMiddlewares","keys","setEnabled","updatedCount","compose","context","validConfigs","sort","a","b","ctx","middlewareFunctions","createConditionalMiddleware","wrapMiddleware","shouldExecute","evaluateConditions","every","evaluatePathCondition","evaluateMethodCondition","evaluateHeaderCondition","evaluateCustomCondition","exactMatch","isMatch","prefixMatch","isPrefixMatch","regex","test","currentMethod","methodSet","normalizedHeaderName","actualValue","headers","actualValueStr","isArray","headerMap","cachedResult","_context","createGroup","groupName","middlewareNames","groupMiddleware","members","MiddlewareBuilder","push","build","manager","RegisterMiddleware","propertyKey","parseText","opts","getRawBody","inflate","req","catch","err","parseJson","str","body","JSON","parse","parseForm","request","trim","result","parsePath","opath","endsWith","slice","deleteFiles","files","deletePromises","Object","filePath","fsPromise","access","unlink","logger","Promise","all","parseMultipart","resolve","file","form","IncomingForm","encoding","multiples","keepExtensions","maxFileSize","limit","parseInt","cleanup","uploadFiles","e","onFinished","res","fields","xmlParser","XMLParser","ignoreAttributes","parseXml","parseGrpc","buffer","parseGraphQL","payload","query","variables","operationName","parseWebSocket","DEFAULT_ENCODING","DEFAULT_LIMIT","contentTypeRegex","IDENTITY_ENCODING","defaultParsers","commonMimeTypes","defaultOptions","extTypes","json","text","multipart","xml","grpc","graphql","websocket","PayloadCacheManager","lock","typeMapCache","contentTypeCache","optionsCache","clearAll","getTypeMap","cacheKey","stringify","cached","typeMap","mime","parser","mimes","entries","getContentType","contentType","normalizedType","match","getMergedOptions","mergedOptions","assign","cacheManager","supportedMethods","getParserForType","isSupportedMethod","getContentLength","len","hasOwnProperty","call","Helper","define","queryParams","pathParams","params","queryParser","bodyParser","_options","getMetaData","isEmpty","parseBody","setMetaData","ParamSourceType","inferSourceTypeFromFnName","fnName","DTO_METADATA_CACHE","WeakMap","injectRouter","protocol","ctlName","getIdentifier","getPropertyData","CONTROLLER_ROUTER","rmetaData","recursiveGetMetadata","router","methods","middlewareManager","appDebug","ctlPath","getControllerPath","getPublicMethods","metaKey","val","controllerMiddlewareConfigs","methodMiddlewareConfigs","middlewareItem","source","controllerMiddlewareMap","forEach","methodDisabledMiddlewares","methodAddedMiddlewares","methodConfig","filteredControllerMiddlewares","middlewareMap","allMiddlewareConfigs","middlewareInstanceIds","currentRoute","existingInstance","description","join","composedMiddleware","tmp","injectParamMetaData","metaDatas","TAGGED_PARAM","validMetaDatas","PARAM_RULE_KEY","validatedMetaDatas","PARAM_CHECK_KEY","argsMetaObj","meta","data","index","validData","v","sourceType","fn","extractorType","validEntry","find","it","validRule","rule","validOpt","isDto","compiledValidator","compileValidator","errorMsg","message","dtoCheck","clazz","getClass","cachedDtoRule","dtoRule","getOriginMetadata","PARAM_TYPE_KEY","Reflect","defineProperty","enumerable","configurable","writable","precompiledOptions","precompiledExtractor","generatePrecompiledExtractor","compiledTypeConverter","compileTypeConverter","fastPathScenario","detectFastPathScenario","fastPathHandler","createFastPathHandler","hasAsyncParams","some","p","injectParam","paramName","defaultValue","paramTypes","getMetadata","paramterTypes","classFilePath","className","project","Project","sourceFile","addSourceFileAtPath","classDeclaration","publicMethods","getMethods","modifiers","getModifiers","mod","getText","getName","process","env","APP_PATH","param","allQueryNoValidation","scenario","paramType","converted","convertParamsType","validatedValue","ClassValidator","valid","plainToClass","paramConfigs","results","num","Number","isNaN","lower","Boolean","parsed","isFunction","errorPrefix","Exception","funcs","isString","validators","func","FunctionValidator","validator","extractValueSync","QUERY","HEADER","PATH","extractValueFromSource","BODY","FILE","CUSTOM","extractParamSources","needsBody","bodyData","parsedBody","createParamOptions","validateParam","opt","needsConversion","needsValidation","convertedValue","errorMessage","detectExtractionStrategy","paramCount","hasDtoParams","hasValidation","isSimpleDto","StrategyCacheManager","cache","strategyMap","getOrCreate","strategy","handler","StrategyHandlerFactory","createHandler","getStrategy","strategyCache","extractParameters","createSyncSingleNoValidationHandler","createSyncMultiNoValidationHandler","createSyncSingleSimpleValidationHandler","createSyncMultiSimpleValidationHandler","createSyncDtoHandler","createAsyncMixedHandler","createAsyncDtoHandler","createGenericAsyncHandler","rawValue","handlers","extractor","converter","i","_app","actualClazz","transformed","asyncParams","syncParams","syncHandlers","asyncResults","paramOptions","syncResults","h","asyncIndex","syncIndex","sources","paramPromises","k","Handler","ctl","ctlParams","ctlParamsValue","throw","middlewareFns","args","isError","getProtocolConfig","ext","validateProtocolConfig","NODE_ENV","errors","warnings","proto","protoFile","poolSize","batchSize","streamConfig","sc","maxConcurrentStreams","streamTimeout","schemaFile","playground","debug","depthLimit","complexityLimit","heartbeatInterval","heartbeatTimeout","maxConnections","maxFrameSize","maxBufferSize","GraphQLRouter","routerMap","prefix","extConfig","validation","warning","schemaFilePath","isAbsolute","rootPath","KoaRouter","sensitive","strict","SetRouter","impl","routeHandler","implementation","validationRules","require","ignore","createComplexityLimitRule","scalarCost","objectCost","listFactor","schema","rootValue","formatError","koattyContext","renderGraphiQL","url","URL","host","requestBody","koaRequest","fetchRequest","Request","response","status","endpoint","ListRouter","LoadRouter","list","schemaContent","fs","promises","readFile","buildSchema","n","ctlClass","ctlRouters","getInsByClass","routerMiddleware","routes","allowedMethodsMiddleware","allowedMethods","use","GrpcConnectionPool","pool","maxSize","serviceName","connections","conn","pop","create","release","connection","close","createdAt","totalConnections","_serviceName","Info","getStats","stats","GrpcBatchProcessor","batchQueue","batchTimers","addRequest","reject","queue","processBatch","setTimeout","timer","clearTimeout","success","batchIndex","flush","totalProcessed","queueSize","StreamManager","streams","backpressureThreshold","bufferSize","registerStream","id","state","startTime","messageCount","isActive","cleanupExpiredStreams","updateStream","updates","removeStream","isBackpressureTriggered","getActiveStreamCount","s","closeAllStreams","activeCount","GrpcRouter","connectionPool","batchProcessor","streamManager","protoFilePath","service","detectStreamType","isActuallyReadableStream","readable","isActuallyWritableStream","handleUnaryCall","callback","ctlItem","createContext","handleServerStreaming","streamId","streamState","timeout","end","on","writeStream","write","endStream","handleClientStreaming","messages","pause","resume","streamMessages","handleBidirectionalStreaming","streamMessage","responseData","handleStreamCall","streamType","pdef","LoadProto","services","ListServices","ctls","si","server","grpcServer","RegisterService","getAllServers","allServers","rpc","methodPath","hasResult","HttpRouter","httpProtocols","WebsocketRouter","connectionCount","totalBufferSize","cleanupTimer","frameTimeout","cleanupInterval","startCleanupTimer","cleanupStaleConnections","staleThreshold","cleanedCount","freedMemory","socketId","lastActivity","cleanupConnection","enforceMemoryLimits","cleanupOldestConnections","count","sortedConnections","websocketHandler","wsProtocols","requestId","buffers","resetFrameTimeout","isAlive","onPong","checkAlive","terminate","ping","chunkSize","bufferData","Buffer","newBufferSize","chunk","min","fullMessage","concat","RouterFactory","routerRegistry","activeRouters","isShuttingDown","hasShutdown","initializeDefaultRouters","normalizedProtocol","RouterClass","supportedProtocols","routerClass","getSupportedProtocols","isSupported","getRouterClass","reset","shutdownAll","routerCount","shutdownPromises","routerAny","getActiveRouterCount","getActiveRouters","RouterFactoryBuilder","customRouters","excludeDefaults","addRouter","excludeDefault","factory","RegisterRouter","NewRouter","Header","PathVariable","Get","Post","File","RequestBody","Body","RequestParam","Param","RouterComponent","events","initRouter","routerOpts","serveOpts","protocols","Log","routers","successfulProtocols","protoRouterOpts","singleProto","loadRoutes","controllers","isObject","loadRouter","appStop","scope","version"],"mappings":"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","file":"index.js","sourcesContent":["/*\n * @Description: \n * @Usage: \n * @Author: richen\n * @Date: 2024-10-31 14:16:50\n * @LastEditTime: 2025-01-26 12:04:42\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\n// tslint:disable-next-line: no-import-side-effect\nimport \"reflect-metadata\";\nimport { IOC } from 'koatty_container';\nimport { MiddlewareCondition } from \"../middleware/manager\";\n\n// used for request mapping metadata\nexport const MAPPING_KEY = 'MAPPING_KEY';\n\n/**\n * Enhanced middleware configuration for decorators\n */\nexport interface MiddlewareDecoratorConfig {\n middleware: Function;\n priority?: number;\n enabled?: boolean;\n conditions?: MiddlewareCondition[];\n metadata?: Record<string, any>;\n}\n\n/**\n * Koatty router options with enhanced middleware support\n *\n * @export\n * @interface RouterOption\n */\nexport interface RouterOption {\n path?: string;\n requestMethod: string;\n routerName?: string;\n method: string;\n middleware?: Function[] | MiddlewareDecoratorConfig[];\n}\n\n/**\n * http request methods\n *\n * @export\n * @var RequestMethod\n */\nexport enum RequestMethod {\n \"GET\" = \"get\",\n \"POST\" = \"post\",\n \"PUT\" = \"put\",\n \"DELETE\" = \"delete\",\n \"PATCH\" = \"patch\",\n \"ALL\" = \"all\",\n \"OPTIONS\" = \"options\",\n \"HEAD\" = \"head\"\n}\n\n/**\n * Routes HTTP requests to the specified path with enhanced middleware support.\n *\n * @param {string} [path=\"/\"]\n * @param {RequestMethod} [reqMethod=RequestMethod.GET]\n * @param {{\n * routerName?: string;\n * middleware?: Function[] | MiddlewareDecoratorConfig[];\n * }} [routerOptions={}]\n * @returns {*} {MethodDecorator}\n */\nexport const RequestMapping = (\n path = \"/\",\n reqMethod: RequestMethod = RequestMethod.GET,\n routerOptions: {\n routerName?: string;\n middleware?: Function[] | MiddlewareDecoratorConfig[];\n } = {}\n): MethodDecorator => {\n const routerName = routerOptions.routerName ?? \"\";\n return (target: any, key: string, descriptor: PropertyDescriptor) => {\n const targetType = IOC.getType(target);\n if (targetType !== \"CONTROLLER\") {\n throw Error(\"RequestMapping decorator is only used in controllers class.\");\n }\n\n // 处理中间件配置\n let middlewareConfigs: MiddlewareDecoratorConfig[] = [];\n \n if (routerOptions.middleware) {\n middlewareConfigs = routerOptions.middleware.map(item => {\n if (typeof item === 'function') {\n // 兼容旧的简单中间件配置\n if (!('run' in item.prototype)) {\n throw new Error(`Middleware must be a class implementing IMiddleware`);\n }\n return {\n middleware: item,\n priority: 50, // 默认优先级\n enabled: true,\n conditions: [],\n metadata: {}\n } as MiddlewareDecoratorConfig;\n } else {\n // 新的高级中间件配置\n if (typeof item.middleware !== 'function' || !('run' in item.middleware.prototype)) {\n throw new Error(`Middleware must be a class implementing IMiddleware`);\n }\n return {\n priority: 50,\n enabled: true,\n conditions: [],\n metadata: {},\n ...item\n } as MiddlewareDecoratorConfig;\n }\n });\n }\n\n // tslint:disable-next-line: no-object-literal-type-assertion\n IOC.attachPropertyData(MAPPING_KEY, {\n path,\n requestMethod: reqMethod,\n routerName,\n method: key,\n middlewareConfigs // 存储完整的中间件配置\n }, target, key);\n\n return descriptor;\n };\n};\n\n/**\n * Routes HTTP POST requests to the specified path.\n */\nexport const PostMapping = (path = \"/\", routerOptions?: RouterOption) => {\n return RequestMapping(path, RequestMethod.POST, routerOptions);\n};\n\n/**\n * Routes HTTP GET requests to the specified path.\n */\nexport const GetMapping = (path = \"/\", routerOptions?: RouterOption) => {\n return RequestMapping(path, RequestMethod.GET, routerOptions);\n};\n\n/**\n * Routes HTTP DELETE requests to the specified path.\n */\nexport const DeleteMapping = (path = \"/\", routerOptions?: RouterOption) => {\n return RequestMapping(path, RequestMethod.DELETE, routerOptions);\n};\n/**\n * Routes HTTP PUT requests to the specified path.\n */\nexport const PutMapping = (path = \"/\", routerOptions?: RouterOption) => {\n return RequestMapping(path, RequestMethod.PUT, routerOptions);\n};\n\n/**\n * Routes HTTP PATCH requests to the specified path.\n */\nexport const PatchMapping = (path = \"/\", routerOptions?: RouterOption) => {\n return RequestMapping(path, RequestMethod.PATCH, routerOptions);\n};\n\n/**\n * Routes HTTP OPTIONS requests to the specified path.\n */\nexport const OptionsMapping = (path = \"/\", routerOptions?: RouterOption) => {\n return RequestMapping(path, RequestMethod.OPTIONS, routerOptions);\n};\n\n/**\n * Routes HTTP HEAD requests to the specified path.\n */\nexport const HeadMapping = (path = \"/\", routerOptions?: RouterOption) => {\n return RequestMapping(path, RequestMethod.HEAD, routerOptions);\n};\n\n/**\n * Helper function to create middleware configuration with advanced features\n * \n * @param middleware - The middleware class\n * @param options - Advanced configuration options\n * @returns MiddlewareDecoratorConfig\n * \n * @example\n * ```typescript\n * @GetMapping('/api/users', {\n * middleware: [\n * withMiddleware(AuthMiddleware, { \n * priority: 100,\n * conditions: [{ type: 'header', value: 'authorization', operator: 'contains' }]\n * }),\n * withMiddleware(RateLimitMiddleware, { \n * priority: 90,\n * metadata: { limit: 100, window: 60000 }\n * })\n * ]\n * })\n * ```\n */\nexport function withMiddleware(\n middleware: Function,\n options: {\n priority?: number;\n enabled?: boolean;\n conditions?: MiddlewareCondition[];\n metadata?: Record<string, any>;\n } = {}\n): MiddlewareDecoratorConfig {\n if (typeof middleware !== 'function' || !('run' in middleware.prototype)) {\n throw new Error(`Middleware must be a class implementing IMiddleware`);\n }\n\n return {\n middleware,\n priority: options.priority ?? 50,\n enabled: options.enabled ?? true,\n conditions: options.conditions ?? [],\n metadata: options.metadata ?? {}\n };\n}\n","/*\n * @Description: Middleware Manager Implementation\n * @Usage: Centralized middleware management and composition\n * @Author: richen\n * @Date: 2025-01-20 10:00:00\n * @LastEditTime: 2025-01-20 10:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { KoattyContext, KoattyNext } from \"koatty_core\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport compose, { Middleware } from \"koa-compose\";\nimport { LRUCache } from \"lru-cache\";\nimport { Application } from \"koatty_container\";\n\n/**\n * Middleware function type\n */\nexport type MiddlewareFunction = <T = unknown>(ctx: KoattyContext, next: KoattyNext) => Promise<T> | T;\n\n/**\n * Middleware configuration\n */\nexport interface MiddlewareConfig {\n name: string;\n instanceId?: string; // 中间件实例的唯一标识符\n middleware: MiddlewareFunction | Function; // 支持中间件函数或中间件类\n priority?: number;\n enabled?: boolean;\n conditions?: MiddlewareCondition[];\n metadata?: Record<string, unknown>;\n // 用于中间件类的配置参数\n middlewareConfig?: {\n [key: string]: unknown;\n };\n}\n\n/**\n * Middleware condition\n */\nexport interface MiddlewareCondition {\n type: 'path' | 'method' | 'header' | 'custom';\n value: string | RegExp | ((ctx: KoattyContext) => boolean);\n operator?: 'equals' | 'contains' | 'matches' | 'custom';\n}\n\n/**\n * Instance ID configuration\n */\ninterface InstanceIdConfig {\n route: string;\n method?: string;\n}\n\n/**\n * Middleware execution context\n */\nexport interface MiddlewareExecutionContext {\n route?: string;\n method?: string;\n protocol?: string;\n metadata?: Record<string, any>;\n}\n\n/**\n * Path pattern cache for optimized matching with memory management\n */\ninterface PathPattern {\n exact: LRUCache<string, boolean>; // 精确匹配的路径\n prefixes: LRUCache<string, boolean>; // 前缀匹配的路径\n suffixes: LRUCache<string, boolean>; // 后缀匹配的路径\n patterns: LRUCache<string, RegExp>; // 复杂模式的正则表达式\n}\n\n/**\n * Router middleware manager interface\n * Defines the contract for managing router-level middleware\n */\nexport interface IRouterMiddlewareManager {\n register(config: MiddlewareConfig): Promise<string>;\n unregister(nameOrInstanceId: string): boolean;\n getMiddleware(nameOrInstanceId: string): MiddlewareConfig | null;\n getMiddlewareByRoute(middlewareName: string, route: string, method?: string): MiddlewareConfig | null;\n listMiddlewares(): string[];\n compose(instanceIds: string[], context?: MiddlewareExecutionContext): MiddlewareFunction;\n}\n\n/**\n * Router middleware manager implementation\n * Manages router-level middleware registration, composition, and conditional execution\n */\nexport class RouterMiddlewareManager implements IRouterMiddlewareManager {\n private app: Application;\n private static instance: RouterMiddlewareManager | null = null;\n private static isCreating = false;\n private readonly _instanceId: string;\n private middlewares = new Map<string, MiddlewareConfig>(); // 按实例ID存储\n private middlewaresByName = new Map<string, Set<string>>(); // 按名称索引实例ID\n\n // 优化的路径匹配缓存 - 使用LRU缓存防止内存泄漏\n private pathPatterns: PathPattern = {\n exact: new LRUCache<string, boolean>({ max: 200 }),\n prefixes: new LRUCache<string, boolean>({ max: 100 }),\n suffixes: new LRUCache<string, boolean>({ max: 100 }),\n patterns: new LRUCache<string, RegExp>({ max: 50 })\n };\n\n // 方法匹配缓存 - 限制大小\n private methodCache = new LRUCache<string, Set<string>>({ max: 100 });\n\n // 头部匹配缓存 - 限制大小\n private headerCache = new LRUCache<string, Map<string, string>>({ max: 100 });\n\n // 缓存清理定时器\n private cacheCleanupTimer?: NodeJS.Timeout;\n private readonly CACHE_CLEANUP_INTERVAL = 5 * 60 * 1000; // 5分钟\n\n /**\n * Private constructor to enforce singleton pattern\n */\n private constructor(app: Application) {\n this.app = app;\n if (RouterMiddlewareManager.instance) {\n throw new Error('RouterMiddlewareManager is a singleton. Use getInstance() instead.');\n }\n this._instanceId = Math.random().toString(36).substr(2, 9);\n Logger.Debug(`RouterMiddlewareManager instance created with ID: ${this._instanceId}`);\n this.startCacheCleanup();\n }\n\n /**\n * Get singleton instance\n * @returns RouterMiddlewareManager instance\n */\n public static getInstance(app: Application): RouterMiddlewareManager {\n if (RouterMiddlewareManager.instance) {\n return RouterMiddlewareManager.instance;\n }\n\n if (RouterMiddlewareManager.isCreating) {\n throw new Error('RouterMiddlewareManager is already being created');\n }\n\n RouterMiddlewareManager.isCreating = true;\n try {\n RouterMiddlewareManager.instance = new RouterMiddlewareManager(app);\n Logger.Debug('RouterMiddlewareManager singleton instance initialized');\n } finally {\n RouterMiddlewareManager.isCreating = false;\n }\n\n return RouterMiddlewareManager.instance;\n }\n\n /**\n * Reset singleton instance (for testing)\n */\n public static resetInstance(): void {\n if (RouterMiddlewareManager.instance) {\n RouterMiddlewareManager.instance.destroy();\n }\n RouterMiddlewareManager.instance = null;\n RouterMiddlewareManager.isCreating = false;\n Logger.Debug('RouterMiddlewareManager singleton instance reset');\n }\n\n /**\n * Start cache cleanup timer\n */\n private startCacheCleanup(): void {\n this.cacheCleanupTimer = setInterval(() => {\n this.performCacheCleanup();\n }, this.CACHE_CLEANUP_INTERVAL);\n }\n\n /**\n * Perform periodic cache cleanup\n */\n private performCacheCleanup(): void {\n const beforeSize = this.getCacheSize();\n\n const afterSize = this.getCacheSize();\n Logger.Debug(`Cache cleanup completed. Size: ${beforeSize} -> ${afterSize}`);\n }\n\n\n\n /**\n * Get total cache size\n */\n private getCacheSize(): number {\n return this.pathPatterns.exact.size +\n this.pathPatterns.prefixes.size +\n this.pathPatterns.suffixes.size +\n this.pathPatterns.patterns.size +\n this.methodCache.size +\n this.headerCache.size;\n }\n\n /**\n * Destroy manager and cleanup resources\n */\n public destroy(): void {\n if (this.cacheCleanupTimer) {\n clearInterval(this.cacheCleanupTimer);\n this.cacheCleanupTimer = undefined;\n }\n\n this.clearCaches();\n this.middlewares.clear();\n\n Logger.Debug(`RouterMiddlewareManager instance ${this._instanceId} destroyed`);\n }\n\n /**\n * Register middleware\n */\n public async register(config: MiddlewareConfig): Promise<string> {\n if (!config.name || typeof config.name !== 'string') {\n throw new Error('Middleware name must be a non-empty string');\n }\n\n if (!config.middleware || typeof config.middleware !== 'function') {\n throw new Error('Middleware must be a function');\n }\n\n // 处理中间件类或中间件函数\n let actualMiddleware: MiddlewareFunction;\n\n // 检查是否为中间件类(有run方法)\n if (this.isMiddlewareClass(config.middleware)) {\n Logger.Debug(`Processing middleware class: ${config.name}`);\n actualMiddleware = await this.processMiddlewareClass(config);\n } else {\n // 直接使用中间件函数\n actualMiddleware = config.middleware as MiddlewareFunction;\n }\n\n // 生成唯一的实例ID\n const instanceIdConfig: InstanceIdConfig | undefined = config.middlewareConfig && \n typeof config.middlewareConfig === 'object' && \n 'route' in config.middlewareConfig\n ? config.middlewareConfig as unknown as InstanceIdConfig\n : undefined;\n const instanceId = config.instanceId || this.generateInstanceId(config.name, instanceIdConfig);\n\n // Set defaults\n const middlewareConfig: MiddlewareConfig = {\n priority: 500,\n enabled: true,\n conditions: [],\n metadata: {},\n ...config,\n instanceId,\n middleware: actualMiddleware // 使用处理后的中间件函数\n };\n\n // 按实例ID存储\n this.middlewares.set(instanceId, middlewareConfig);\n\n // 按名称索引实例ID\n if (!this.middlewaresByName.has(config.name)) {\n this.middlewaresByName.set(config.name, new Set());\n }\n this.middlewaresByName.get(config.name)!.add(instanceId);\n\n // 预处理条件以优化匹配性能\n this.preprocessConditions(middlewareConfig);\n\n Logger.Debug(`Registered middleware: ${config.name} with instanceId: ${instanceId}`);\n return instanceId;\n }\n\n /**\n * Generate unique instance ID using middleware name and route\n */\n private generateInstanceId(name: string, config?: InstanceIdConfig): string {\n if (config && config.route) {\n // 使用中间件名和路由组合作为唯一标识\n const route = config.route.replace(/[^a-zA-Z0-9\\/\\-_]/g, '_'); // 清理路由中的特殊字符\n const method = config.method || 'ALL';\n return `${name}@${route}#${method}`;\n }\n\n // 如果没有路由信息,使用时间戳作为后备方案\n const timestamp = Date.now();\n return `${name}_${timestamp}`;\n }\n\n /**\n * Check if the provided function is a middleware class\n */\n private isMiddlewareClass(middleware: Function): boolean {\n // 检查是否为构造函数(类)\n if (middleware.prototype && middleware.prototype.constructor === middleware) {\n // 检查原型上是否有run方法\n return typeof middleware.prototype.run === 'function';\n }\n return false;\n }\n\n /**\n * Process middleware class to get actual middleware function\n */\n private async processMiddlewareClass(config?: MiddlewareConfig): Promise<MiddlewareFunction> {\n const MiddlewareClass = config?.middleware as any;\n try {\n // 实例化中间件类\n const middlewareInstance = new MiddlewareClass();\n\n // 检查实例是否有run方法\n if (!middlewareInstance.run || typeof middlewareInstance.run !== 'function') {\n throw new Error(`Middleware class ${MiddlewareClass.name} does not have a run method`);\n }\n\n // 调用run方法获取真正的Koa中间件函数\n const appConfig = this.app.config(\"config\", \"middleware\") || {};\n const middlewareBusinessConfig = appConfig[MiddlewareClass?.name] || {};\n \n // 合并装饰器配置和应用配置\n const decoratorConfig = config?.middlewareConfig?.decoratorConfig;\n const finalConfig = {\n ...middlewareBusinessConfig,\n ...(decoratorConfig && typeof decoratorConfig === 'object' ? decoratorConfig : {}) // 装饰器配置优先级更高\n };\n \n Logger.Debug(`Processing middleware ${MiddlewareClass.name} with config:`, finalConfig);\n \n // 调用run方法,传递合并后的配置和app实例\n const koaMiddleware = await middlewareInstance.run(finalConfig, this.app);\n\n // 验证返回的是否为函数\n if (typeof koaMiddleware !== 'function') {\n throw new Error(`Middleware ${MiddlewareClass.name}.run() must return a function, got ${typeof koaMiddleware}`);\n }\n\n Logger.Debug(`Successfully processed middleware class: ${MiddlewareClass.name}`);\n return koaMiddleware;\n\n } catch (error) {\n Logger.Error(`Error processing middleware class ${MiddlewareClass.name}:`, error);\n throw error;\n }\n }\n\n /**\n * Preprocess conditions for optimized matching\n */\n private preprocessConditions(config: MiddlewareConfig): void {\n if (!config.conditions || config.conditions.length === 0) {\n return;\n }\n\n for (const condition of config.conditions) {\n switch (condition.type) {\n case 'path':\n this.preprocessPathCondition(condition);\n break;\n case 'method':\n this.preprocessMethodCondition(condition);\n break;\n case 'header':\n this.preprocessHeaderCondition(condition);\n break;\n }\n }\n }\n\n /**\n * Preprocess path conditions\n */\n private preprocessPathCondition(condition: MiddlewareCondition): void {\n if (typeof condition.value !== 'string') {\n return;\n }\n\n const path = condition.value;\n const operator = condition.operator || 'equals';\n\n switch (operator) {\n case 'equals':\n this.pathPatterns.exact.set(path, true);\n break;\n case 'contains':\n // 对于包含匹配,我们可以优化为前缀或后缀匹配\n if (path.startsWith('/') && !path.includes('*')) {\n this.pathPatterns.prefixes.set(path, true);\n }\n break;\n case 'matches':\n // 只有在必要时才使用正则表达式\n try {\n this.pathPatterns.patterns.set(path, new RegExp(path));\n } catch {\n Logger.Warn(`Invalid regex pattern: ${path}`);\n }\n break;\n }\n }\n\n /**\n * Preprocess method conditions\n */\n private preprocessMethodCondition(condition: MiddlewareCondition): void {\n if (typeof condition.value === 'string') {\n const method = condition.value.toUpperCase();\n if (!this.methodCache.has(method)) {\n this.methodCache.set(method, new Set());\n }\n }\n }\n\n /**\n * Preprocess header conditions\n */\n private preprocessHeaderCondition(condition: MiddlewareCondition): void {\n if (typeof condition.value === 'string') {\n const [headerName, expectedValue] = condition.value.split(':');\n if (headerName) {\n if (!this.headerCache.has(headerName.toLowerCase())) {\n this.headerCache.set(headerName.toLowerCase(), new Map());\n }\n if (expectedValue) {\n this.headerCache.get(headerName.toLowerCase())!.set(expectedValue, expectedValue);\n }\n }\n }\n }\n\n /**\n * Unregister middleware by name or instance ID\n */\n public unregister(nameOrInstanceId: string): boolean {\n // 首先尝试按实例ID删除\n if (this.middlewares.has(nameOrInstanceId)) {\n const config = this.middlewares.get(nameOrInstanceId)!;\n this.middlewares.delete(nameOrInstanceId);\n \n // 从名称索引中移除\n const instanceIds = this.middlewaresByName.get(config.name);\n if (instanceIds) {\n instanceIds.delete(nameOrInstanceId);\n if (instanceIds.size === 0) {\n this.middlewaresByName.delete(config.name);\n }\n }\n \n Logger.Debug(`Unregistered middleware: ${config.name} (instanceId: ${nameOrInstanceId})`);\n return true;\n }\n\n // 然后尝试按名称删除所有实例\n const instanceIds = this.middlewaresByName.get(nameOrInstanceId);\n if (instanceIds && instanceIds.size > 0) {\n let deletedCount = 0;\n for (const instanceId of instanceIds) {\n if (this.middlewares.delete(instanceId)) {\n deletedCount++;\n }\n }\n this.middlewaresByName.delete(nameOrInstanceId);\n Logger.Debug(`Unregistered ${deletedCount} instances of middleware: ${nameOrInstanceId}`);\n return deletedCount > 0;\n }\n\n Logger.Warn(`Middleware not found: ${nameOrInstanceId}`);\n return false;\n }\n\n /**\n * Get middleware configuration by name or instance ID\n */\n public getMiddleware(nameOrInstanceId: string): MiddlewareConfig | null {\n // 首先尝试按实例ID查找\n if (this.middlewares.has(nameOrInstanceId)) {\n return this.middlewares.get(nameOrInstanceId)!;\n }\n\n // 然后尝试按名称查找第一个实例\n const instanceIds = this.middlewaresByName.get(nameOrInstanceId);\n if (instanceIds && instanceIds.size > 0) {\n const firstInstanceId = instanceIds.values().next().value;\n return this.middlewares.get(firstInstanceId) || null;\n }\n\n return null;\n }\n\n /**\n * Get middleware by route and middleware name\n */\n public getMiddlewareByRoute(middlewareName: string, route: string, method?: string): MiddlewareConfig | null {\n // 生成预期的实例ID\n const cleanRoute = route.replace(/[^a-zA-Z0-9\\/\\-_]/g, '_');\n const targetMethod = method || 'ALL';\n const expectedInstanceId = `${middlewareName}@${cleanRoute}#${targetMethod}`;\n \n // 直接通过实例ID查找\n const config = this.middlewares.get(expectedInstanceId);\n if (config) {\n Logger.Debug(`Found middleware by route: ${middlewareName}@${route}#${targetMethod}`);\n return config;\n }\n\n // 如果没找到,尝试查找该中间件的所有实例,匹配路由\n const instanceIds = this.middlewaresByName.get(middlewareName);\n if (instanceIds && instanceIds.size > 0) {\n for (const instanceId of instanceIds) {\n const middlewareConfig = this.middlewares.get(instanceId);\n if (middlewareConfig && \n middlewareConfig.middlewareConfig?.route === route &&\n (middlewareConfig.middlewareConfig?.method === method || \n middlewareConfig.middlewareConfig?.method === 'ALL' || \n !method)) {\n Logger.Debug(`Found middleware by route match: ${middlewareName}@${route}`);\n return middlewareConfig;\n }\n }\n }\n\n Logger.Debug(`Middleware not found by route: ${middlewareName}@${route}#${targetMethod}`);\n return null;\n }\n\n /**\n * Get all middleware instances by name\n */\n public getMiddlewareInstances(name: string): MiddlewareConfig[] {\n const instanceIds = this.middlewaresByName.get(name);\n if (!instanceIds || instanceIds.size === 0) {\n return [];\n }\n\n return Array.from(instanceIds)\n .map(instanceId => this.middlewares.get(instanceId))\n .filter((config): config is MiddlewareConfig => config !== undefined);\n }\n\n /**\n * List all middlewares\n */\n public listMiddlewares(): string[] {\n return Array.from(this.middlewares.keys());\n }\n\n /**\n * Enable/disable middleware by name or instance ID\n */\n public setEnabled(nameOrInstanceId: string, enabled: boolean): void {\n // 首先尝试按实例ID查找\n const middleware = this.middlewares.get(nameOrInstanceId);\n if (middleware) {\n middleware.enabled = enabled;\n Logger.Debug(`${enabled ? 'Enabled' : 'Disabled'} middleware: ${nameOrInstanceId}`);\n return;\n }\n\n // 然后尝试按名称查找所有实例\n const instanceIds = this.middlewaresByName.get(nameOrInstanceId);\n if (instanceIds && instanceIds.size > 0) {\n let updatedCount = 0;\n for (const instanceId of instanceIds) {\n const config = this.middlewares.get(instanceId);\n if (config) {\n config.enabled = enabled;\n updatedCount++;\n }\n }\n Logger.Debug(`${enabled ? 'Enabled' : 'Disabled'} ${updatedCount} instances of middleware: ${nameOrInstanceId}`);\n return;\n }\n\n Logger.Warn(`Middleware not found: ${nameOrInstanceId}`);\n }\n\n /**\n * Compose middlewares by instance IDs\n */\n public compose(instanceIds: string[], context?: MiddlewareExecutionContext): MiddlewareFunction {\n // 获取有效的中间件配置并按优先级排序\n const validConfigs = instanceIds\n .map(instanceId => this.middlewares.get(instanceId))\n .filter((config): config is MiddlewareConfig =>\n config !== undefined && config.enabled !== false\n )\n .sort((a, b) => (b.priority || 0) - (a.priority || 0));\n\n if (validConfigs.length === 0) {\n return async <T = unknown>(ctx: KoattyContext, next: KoattyNext): Promise<T> => {\n await next();\n return undefined as T;\n };\n }\n\n // 创建中间件函数数组\n const middlewareFunctions = validConfigs.map(config => {\n // 如果有条件,创建条件中间件\n if (config.conditions && config.conditions.length > 0) {\n return this.createConditionalMiddleware(config, context);\n } else {\n return this.wrapMiddleware(config);\n }\n });\n\n return compose(middlewareFunctions) as MiddlewareFunction;\n }\n\n /**\n * Create conditional middleware\n */\n private createConditionalMiddleware(\n config: MiddlewareConfig,\n context?: MiddlewareExecutionContext\n ): Middleware<KoattyContext> {\n return async (ctx: KoattyContext, next: KoattyNext) => {\n const shouldExecute = this.evaluateConditions(config.conditions!, ctx, context);\n\n if (shouldExecute) {\n await this.wrapMiddleware(config)(ctx, next);\n } else {\n await next();\n }\n };\n }\n\n /**\n * Evaluate middleware conditions\n */\n private evaluateConditions(\n conditions: MiddlewareCondition[],\n ctx: KoattyContext,\n context?: MiddlewareExecutionContext\n ): boolean {\n return conditions.every(condition => {\n switch (condition.type) {\n case 'path':\n return this.evaluatePathCondition(condition, ctx.path);\n case 'method':\n return this.evaluateMethodCondition(condition, ctx.method);\n case 'header':\n return this.evaluateHeaderCondition(condition, ctx);\n case 'custom':\n return this.evaluateCustomCondition(condition, ctx, context);\n default:\n Logger.Warn(`Unknown condition type: ${condition.type}`);\n return true;\n }\n });\n }\n\n /**\n * Evaluate path condition with optimized matching\n */\n private evaluatePathCondition(condition: MiddlewareCondition, path: string): boolean {\n const { value, operator = 'equals' } = condition;\n\n if (typeof value === 'string') {\n switch (operator) {\n case 'equals':\n // 使用LRU缓存进行O(1)查找\n const exactMatch = this.pathPatterns.exact.get(value);\n if (exactMatch !== undefined) {\n return path === value;\n }\n // 如果缓存中没有,检查并缓存结果\n const isMatch = path === value;\n this.pathPatterns.exact.set(value, isMatch);\n return isMatch;\n\n case 'contains':\n // 优先使用前缀匹配缓存\n const prefixMatch = this.pathPatterns.prefixes.get(value);\n if (prefixMatch !== undefined) {\n return path.startsWith(value);\n }\n // 检查并缓存前缀匹配结果\n const isPrefixMatch = path.startsWith(value) || path.includes(value);\n this.pathPatterns.prefixes.set(value, isPrefixMatch);\n return isPrefixMatch;\n\n case 'matches':\n // 使用预编译的正则表达式缓存\n let regex = this.pathPatterns.patterns.get(value);\n if (!regex) {\n try {\n regex = new RegExp(value);\n this.pathPatterns.patterns.set(value, regex);\n } catch {\n return false;\n }\n }\n return regex.test(path);\n\n default:\n return false;\n }\n } else if (value instanceof RegExp) {\n return value.test(path);\n }\n\n return false;\n }\n\n /**\n * Evaluate method condition with caching\n */\n private evaluateMethodCondition(condition: MiddlewareCondition, method: string): boolean {\n const { value, operator = 'equals' } = condition;\n\n if (typeof value === 'string') {\n const targetMethod = value.toUpperCase();\n const currentMethod = method.toUpperCase();\n\n // 使用缓存检查方法匹配\n let methodSet = this.methodCache.get(targetMethod);\n if (!methodSet) {\n methodSet = new Set<string>();\n this.methodCache.set(targetMethod, methodSet);\n }\n\n if (methodSet.has(currentMethod)) {\n return true;\n }\n\n const isMatch = operator === 'equals' ?\n currentMethod === targetMethod :\n currentMethod.includes(targetMethod);\n\n if (isMatch) {\n methodSet.add(currentMethod);\n }\n\n return isMatch;\n }\n\n return false;\n }\n\n /**\n * Evaluate header condition with caching\n */\n private evaluateHeaderCondition(condition: MiddlewareCondition, ctx: KoattyContext): boolean {\n const { value, operator = 'equals' } = condition;\n\n if (typeof value === 'string') {\n const [headerName, expectedValue] = value.split(':');\n if (!headerName) return false;\n\n const normalizedHeaderName = headerName.toLowerCase();\n const actualValue = ctx.headers[normalizedHeaderName];\n\n if (!actualValue) return false;\n\n // 处理头部值可能是数组的情况\n const actualValueStr = Array.isArray(actualValue) ? actualValue[0] : actualValue;\n if (!actualValueStr) return false;\n\n // 使用缓存检查头部匹配\n let headerMap = this.headerCache.get(normalizedHeaderName);\n if (!headerMap) {\n headerMap = new Map<string, string>();\n this.headerCache.set(normalizedHeaderName, headerMap);\n }\n\n if (expectedValue) {\n const cachedResult = headerMap.get(expectedValue);\n if (cachedResult !== undefined) {\n return actualValueStr === expectedValue;\n }\n\n const isMatch = operator === 'equals' ?\n actualValueStr === expectedValue :\n operator === 'contains' ?\n actualValueStr.includes(expectedValue) :\n false;\n\n if (isMatch) {\n headerMap.set(expectedValue, actualValueStr);\n }\n\n return isMatch;\n } else {\n // 只检查头部是否存在\n return true;\n }\n } else if (typeof value === 'function') {\n return value(ctx);\n }\n\n return false;\n }\n\n /**\n * Evaluate custom condition\n */\n private evaluateCustomCondition(\n condition: MiddlewareCondition,\n ctx: KoattyContext,\n _context?: MiddlewareExecutionContext\n ): boolean {\n const { value } = condition;\n\n if (typeof value === 'function') {\n try {\n return value(ctx);\n } catch (error) {\n Logger.Error('Error evaluating custom condition:', error);\n return false;\n }\n }\n\n return false;\n }\n\n /**\n * Wrap middleware\n */\n private wrapMiddleware(config: MiddlewareConfig): Middleware<KoattyContext> {\n return async (ctx: KoattyContext, next: KoattyNext) => {\n await config.middleware(ctx, next);\n };\n }\n\n\n\n /**\n * Clear all caches with proper cleanup\n */\n public clearCaches(): void {\n this.pathPatterns.exact.clear();\n this.pathPatterns.prefixes.clear();\n this.pathPatterns.suffixes.clear();\n this.pathPatterns.patterns.clear();\n this.methodCache.clear();\n this.headerCache.clear();\n\n Logger.Debug('All caches cleared');\n }\n\n\n\n /**\n * Create middleware group\n */\n public createGroup(groupName: string, middlewareNames: string[]): void {\n const groupMiddleware = this.compose(middlewareNames);\n\n this.register({\n name: groupName,\n middleware: groupMiddleware,\n metadata: {\n type: 'group',\n members: middlewareNames\n }\n });\n }\n}\n\n/**\n * Middleware builder for fluent API\n */\nexport class MiddlewareBuilder {\n private config: Partial<MiddlewareConfig> = {};\n\n public name(name: string): this {\n this.config.name = name;\n return this;\n }\n\n public priority(priority: number): this {\n this.config.priority = priority;\n return this;\n }\n\n public enabled(enabled: boolean): this {\n this.config.enabled = enabled;\n return this;\n }\n\n public middleware(middleware: MiddlewareFunction): this {\n this.config.middleware = middleware;\n return this;\n }\n\n public condition(condition: MiddlewareCondition): this {\n if (!this.config.conditions) {\n this.config.conditions = [];\n }\n this.config.conditions.push(condition);\n return this;\n }\n\n public metadata(key: string, value: unknown): this {\n if (!this.config.metadata) {\n this.config.metadata = {};\n }\n this.config.metadata[key] = value;\n return this;\n }\n\n public build(): MiddlewareConfig {\n if (!this.config.name || !this.config.middleware) {\n throw new Error('Middleware name and function are required');\n }\n\n return this.config as MiddlewareConfig;\n }\n\n public register(app: Application): void {\n const manager = RouterMiddlewareManager.getInstance(app);\n manager.register(this.build());\n }\n}\n\n/**\n * Decorator for auto-registering middlewares\n */\nexport function RegisterMiddleware(app: Application, config: Omit<MiddlewareConfig, 'middleware'>) {\n return function (target: object, propertyKey: string, descriptor: PropertyDescriptor) {\n const middleware = descriptor.value;\n\n if (typeof middleware !== 'function') {\n throw new Error('Decorated method must be a function');\n }\n\n const manager = RouterMiddlewareManager.getInstance(app);\n manager.register({\n ...config,\n middleware\n });\n\n return descriptor;\n };\n} ","/*\n * @Description: Payload parsing utilities with performance optimizations\n * @Usage: Parse request body based on content-type with caching\n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2025-01-20 10:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { KoattyContext } from \"koatty_core\";\nimport { PayloadOptions } from \"../interface\";\nimport getRawBody from \"raw-body\";\nimport inflate from \"inflation\";\n\n/**\n * Parse raw request body as text.\n * \n * @param {KoattyContext} ctx - Koatty context object\n * @param {PayloadOptions} opts - Payload parsing options\n * @returns {Promise<string>} Parsed text content, empty string if parsing fails\n */\nexport function parseText(ctx: KoattyContext, opts: PayloadOptions): Promise<string> {\n return getRawBody(inflate(ctx.req), opts)\n .catch(err => {\n Logger.Error(err);\n\n return \"\";\n });\n}","/*\n * @Description: Payload parsing utilities with performance optimizations\n * @Usage: Parse request body based on content-type with caching\n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2025-01-20 10:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { KoattyContext } from \"koatty_core\";\nimport { PayloadOptions } from \"../interface\";\nimport { parseText } from \"./text\";\n\n\n/**\n * Parse request body as JSON\n * @param {KoattyContext} ctx - Koatty context object\n * @param {PayloadOptions} opts - Payload parsing options\n * @returns {Promise<{body?: any}>} Parsed JSON object with body property, or empty object if parsing fails\n */\nexport async function parseJson(ctx: KoattyContext, opts: PayloadOptions) {\n const str = await parseText(ctx, opts);\n if (!str) return {};\n\n try {\n return { body: JSON.parse(str) };\n } catch (error) {\n Logger.Error(error);\n\n return {};\n }\n}\n","/*\n * @Description: Payload parsing utilities with performance optimizations\n * @Usage: Parse request body based on content-type with caching\n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2025-01-20 10:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { KoattyContext } from \"koatty_core\";\nimport { PayloadOptions } from \"../interface\";\nimport { parseText } from \"./text\";\nimport { parse } from \"fast-querystring\";\n\n/**\n * Parse form-urlencoded request body.\n * \n * @param {KoattyContext} ctx - The Koatty context object\n * @param {PayloadOptions} opts - The payload parsing options\n * @returns {Promise<{body?: any}>} Parsed form data object with body property, or empty object if parsing fails\n * @private\n */\nexport async function parseForm(ctx: KoattyContext, opts: PayloadOptions) {\n // Early return for empty or invalid content\n if (!ctx.request.headers['content-length'] ||\n !ctx.request.headers['content-type']?.includes('application/x-www-form-urlencoded')) {\n return {};\n }\n\n const str = await parseText(ctx, opts);\n if (!str || str.trim().length === 0) {\n return {};\n }\n\n try {\n const result = parse(str);\n return {\n body: result\n };\n } catch (error) {\n Logger.Error('[FormParseError]', error);\n\n return {};\n }\n}\n","/*\n * @Description: \n * @Usage: \n * @Author: richen\n * @Date: 2024-01-07 22:33:25\n * @LastEditTime: 2024-11-07 11:00:23\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\nimport { promises as fsPromise } from \"fs\";\nimport { DefaultLogger as logger } from \"koatty_logger\";\n\n/**\n * @description: \n * @param {string} path\n * @return {*}\n */\nexport function parsePath(opath: string): string {\n let path = opath || \"/\";\n \n // Replace multiple consecutive slashes with single slash\n path = path.replace(/\\/+/g, '/');\n \n // Remove trailing slash (except for root path)\n if (path.length > 1 && path.endsWith(\"/\")) {\n path = path.slice(0, path.length - 1);\n }\n \n return path;\n}\n\n/**\n * @description: Asynchronously delete multiple files based on the given file paths\n * @param {Record} files\n * @param {*} param2\n * @return {*}\n */\nexport async function deleteFiles(files: Record<string, { path: string }>) {\n const deletePromises = Object.keys(files).map(async (key) => {\n try {\n const filePath = files[key].path;\n await fsPromise.access(filePath);\n await fsPromise.unlink(filePath);\n } catch (error) {\n logger.Error(error);\n }\n });\n\n return Promise.all(deletePromises);\n};","/*\n * @Description: Payload parsing utilities with performance optimizations\n * @Usage: Parse request body based on content-type with caching\n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2025-01-20 10:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { KoattyContext } from \"koatty_core\";\nimport { PayloadOptions } from \"../interface\";\nimport { BufferEncoding, IncomingForm } from \"formidable\";\nimport onFinished from \"on-finished\";\nimport { deleteFiles } from \"../../utils/path\";\n\n/**\n * Parse multipart/form-data request payload\n * \n * @param ctx KoattyContext - The Koatty context object\n * @param opts PayloadOptions - Configuration options for parsing\n * @returns Promise<{body: any, file: any}> - Resolves with parsed fields and files\n * \n * @description\n * Handles multipart form data parsing using IncomingForm.\n * Supports file uploads with automatic cleanup on response finish.\n * Returns empty objects if content-type is not multipart or if parsing fails.\n * \n * @example\n * const { body, file } = await parseMultipart(ctx, {\n * encoding: 'utf-8',\n * multiples: true,\n * keepExtensions: true,\n * limit: 20 // Max file size in MB\n * });\n */\nexport function parseMultipart(ctx: KoattyContext, opts: PayloadOptions) {\n // Early validation\n if (!ctx.request.headers['content-type']?.includes('multipart/form-data')) {\n return Promise.resolve({ body: {}, file: {} });\n }\n\n const form = new IncomingForm({\n encoding: <BufferEncoding>opts.encoding,\n multiples: opts.multiples,\n keepExtensions: opts.keepExtensions,\n maxFileSize: opts.limit ? parseInt(opts.limit) * 1024 * 1024 : 20 * 1024 * 1024,\n });\n\n const cleanup = () => {\n if (uploadFiles) {\n try {\n deleteFiles(uploadFiles);\n } catch (e) {\n Logger.Error('[FileCleanupError]', e);\n\n }\n }\n };\n\n let uploadFiles: any = null;\n onFinished(ctx.res, cleanup);\n\n return new Promise((resolve) => {\n form.parse(ctx.req, (err, fields, files) => {\n if (err) {\n cleanup();\n Logger.Error('[MultipartParseError]', err);\n\n return resolve({ body: {}, file: {} });\n }\n\n uploadFiles = files;\n resolve({\n body: fields,\n file: files\n });\n });\n });\n}\n","/*\n * @Description: Payload parsing utilities with performance optimizations\n * @Usage: Parse request body based on content-type with caching\n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2025-01-20 10:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { KoattyContext } from \"koatty_core\";\nimport { PayloadOptions } from \"../interface\";\nimport { XMLParser } from \"fast-xml-parser\";\nimport { parseText } from \"./text\";\n\ninterface XMLParserOptions {\n ignoreAttributes: boolean;\n isArray: (name: string) => boolean;\n}\n\n\n// 单例 XML 解析器,避免重复创建\nconst xmlParser = new XMLParser({\n ignoreAttributes: false,\n isArray: () => false,\n} as XMLParserOptions);\n\n/**\n * Parse XML payload from request body\n * @param ctx KoattyContext instance\n * @param opts Payload parsing options\n * @returns {Promise<{body?: any}>} Parsed XML object in body property or empty object if parsing fails\n */\nexport async function parseXml(ctx: KoattyContext, opts: PayloadOptions) {\n const str = await parseText(ctx, opts);\n if (!str) return {};\n\n try {\n return { body: xmlParser.parse(str) };\n } catch (error) {\n Logger.Error(error);\n\n return {};\n }\n}\n\n","/*\n * @Description: Payload parsing utilities with performance optimizations\n * @Usage: Parse request body based on content-type with caching\n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2025-01-20 10:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { KoattyContext } from \"koatty_core\";\nimport { PayloadOptions } from \"../interface\";\nimport getRawBody from \"raw-body\";\nimport inflate from \"inflation\";\n\n/**\n * Parse gRPC request payload from the context\n * \n * @param {KoattyContext} ctx - Koatty context object\n * @param {PayloadOptions} opts - Payload parsing options\n * @returns {Promise<{body: Buffer} | {}>} Raw buffer for protobuf data or empty object if parsing fails\n * @description \n * gRPC uses Protocol Buffers binary format. This parser returns the raw buffer\n * for manual decoding in controllers using proto definitions.\n * The buffer should NOT be converted to string as it will corrupt the binary data.\n */\nexport async function parseGrpc(ctx: KoattyContext, opts: PayloadOptions) {\n try {\n // gRPC 使用 protobuf 二进制格式,直接返回 Buffer\n // 不能使用 toString(),否则会破坏二进制数据\n const buffer = await getRawBody(inflate(ctx.req), opts);\n \n // 返回原始 Buffer,让控制器使用 proto 定义进行解码\n return { body: buffer };\n } catch (error) {\n Logger.Error('[GrpcParseError]', error);\n return {};\n }\n}\n","/*\n * @Description: Payload parsing utilities with performance optimizations\n * @Usage: Parse request body based on content-type with caching\n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2025-01-20 10:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { KoattyContext } from \"koatty_core\";\nimport { PayloadOptions } from \"../interface\";\nimport { parseText } from \"./text\";\n\n/**\n * Parse GraphQL request payload from context\n * @param ctx KoattyContext instance\n * @param opts PayloadOptions for parsing\n * @returns {Promise<{query?: string, variables?: object, operationName?: string|null}>} Parsed GraphQL payload object\n * @description Parses the GraphQL request body and returns an object containing query, variables, and operationName.\n * If parsing fails, returns an empty object and logs the error.\n */\nexport async function parseGraphQL(ctx: KoattyContext, opts: PayloadOptions) {\n try {\n const str = await parseText(ctx, opts);\n if (!str) return {};\n\n const payload = JSON.parse(str);\n return {\n query: payload.query,\n variables: payload.variables || {},\n operationName: payload.operationName || null\n };\n } catch (error) {\n Logger.Error('[GraphQLParseError]', error);\n\n return {};\n }\n}\n","/*\n * @Description: Payload parsing utilities with performance optimizations\n * @Usage: Parse request body based on content-type with caching\n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2025-01-20 10:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { KoattyContext } from \"koatty_core\";\nimport { PayloadOptions } from \"../interface\";\nimport { parseText } from \"./text\";\n\n\n/**\n * Parse WebSocket message data from context\n * @param ctx KoattyContext instance\n * @param opts PayloadOptions for parsing configuration\n * @returns {Promise<object|string>} Parsed message data as object for JSON or string for plain text\n * @description Attempts to parse WebSocket message as JSON first, falls back to raw text if JSON parsing fails\n * @throws {Error} Logs error if parsing fails and returns empty object\n */\nexport async function parseWebSocket(ctx: KoattyContext, opts: PayloadOptions) {\n try {\n const str = await parseText(ctx, opts);\n if (!str) return {};\n\n // WebSocket消息可能是JSON或纯文本\n try {\n return { body: JSON.parse(str) };\n } catch {\n return str;\n }\n } catch (error) {\n Logger.Error('[WebSocketParseError]', error);\n\n return {};\n }\n}\n","/*\n * @Description: Payload parsing utilities with performance optimizations\n * @Usage: Parse request body based on content-type with caching\n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2025-01-20 10:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\nimport { KoattyContext } from \"koatty_core\";\nimport { LRUCache } from \"lru-cache\";\nimport { PayloadOptions } from \"./interface\";\nimport { parseText } from \"./parser/text\";\nimport { parseJson } from \"./parser/json\";\nimport { parseForm } from \"./parser/form\";\nimport { parseMultipart } from \"./parser/multipart\";\nimport { parseXml } from \"./parser/xml\";\nimport { parseGrpc } from \"./parser/grpc\";\nimport { parseGraphQL } from \"./parser/graphql\";\nimport { parseWebSocket } from \"./parser/websocket\";\n\n\n\n\n// 预定义常量避免重复创建\nexport const DEFAULT_ENCODING = 'utf-8' as BufferEncoding;\nexport const DEFAULT_LIMIT = '20mb';\nexport const contentTypeRegex = /^(application\\/json|application\\/x-www-form-urlencoded|text\\/plain|multipart\\/form-data|text\\/xml|application\\/grpc|application\\/graphql\\+json|application\\/websocket)/i;\nexport const IDENTITY_ENCODING = 'identity';\n\n// 使用 Map 替代对象提升查找性能\nexport type ParserFunction = (ctx: KoattyContext, opts: PayloadOptions) => Promise<any>;\nexport type ParserMap = Map<string, ParserFunction>;\n\n// 默认解析器映射\nexport const defaultParsers = new Map<string, ParserFunction>([\n ['json', parseJson],\n ['form', parseForm],\n ['text', parseText],\n ['multipart', parseMultipart],\n ['xml', parseXml],\n ['grpc', parseGrpc],\n ['graphql', parseGraphQL],\n ['websocket', parseWebSocket]\n]);\n\n// 常见 MIME 类型映射,提高查找速度\nexport const commonMimeTypes = new Map<string, ParserFunction>([\n ['application/json', parseJson],\n ['application/x-www-form-urlencoded', parseForm],\n ['text/plain', parseText],\n ['multipart/form-data', parseMultipart],\n ['text/xml', parseXml],\n ['application/grpc', parseGrpc],\n ['application/graphql+json', parseGraphQL],\n ['application/websocket', parseWebSocket]\n]);\n\nconst defaultOptions: PayloadOptions = {\n extTypes: {\n json: ['application/json'],\n form: ['application/x-www-form-urlencoded'],\n text: ['text/plain'],\n multipart: ['multipart/form-data'],\n xml: ['text/xml'],\n grpc: ['application/grpc'],\n graphql: ['application/graphql+json'],\n websocket: ['application/websocket']\n } as Record<string, string[]>,\n limit: DEFAULT_LIMIT,\n encoding: DEFAULT_ENCODING,\n multiples: true,\n keepExtensions: true,\n};\n\n/**\n * 模块级别的单例缓存管理器\n * 确保并发安全和全局唯一性\n */\nexport class PayloadCacheManager {\n private static instance: PayloadCacheManager | null = null;\n private static readonly lock = Symbol('PayloadCacheManager.lock');\n\n private readonly typeMapCache: LRUCache<string, ParserMap>;\n private readonly contentTypeCache: LRUCache<string, string>;\n private readonly optionsCache: LRUCache<string, PayloadOptions>;\n\n // 私有构造函数确保单例\n private constructor() {\n this.typeMapCache = new LRUCache<string, ParserMap>({ max: 100 });\n this.contentTypeCache = new LRUCache<string, string>({ max: 200 });\n this.optionsCache = new LRUCache<string, PayloadOptions>({ max: 50 });\n }\n\n /**\n * 获取单例实例(线程安全)\n */\n public static getInstance(): PayloadCacheManager {\n if (!PayloadCacheManager.instance) {\n // 使用 Symbol 作为锁,确保并发安全\n if (!PayloadCacheManager.instance) {\n PayloadCacheManager.instance = new PayloadCacheManager();\n }\n }\n return PayloadCacheManager.instance;\n }\n\n /**\n * 重置单例实例(主要用于测试)\n */\n public static resetInstance(): void {\n if (PayloadCacheManager.instance) {\n PayloadCacheManager.instance.clearAll();\n PayloadCacheManager.instance = null;\n }\n }\n\n /**\n * 获取或创建 typeMap\n */\n public getTypeMap(extTypes: Record<string, string[]>): ParserMap {\n const cacheKey = JSON.stringify(extTypes);\n\n const cached = this.typeMapCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n // 创建新的 typeMap\n const typeMap = new Map<string, ParserFunction>();\n\n // 首先添加常用类型以提高查找速度\n for (const [mime, parser] of commonMimeTypes) {\n typeMap.set(mime, parser);\n }\n\n // 使用 extTypes 配置覆盖或添加自定义类型\n for (const [type, mimes] of Object.entries(extTypes)) {\n const parser = defaultParsers.get(type) || parseText;\n for (const mime of mimes) {\n typeMap.set(mime, parser);\n }\n }\n\n this.typeMapCache.set(cacheKey, typeMap);\n return typeMap;\n }\n\n /**\n * 获取内容类型解析结果\n */\n public getContentType(contentType: string): string | null {\n let normalizedType = this.contentTypeCache.get(contentType);\n\n if (!normalizedType) {\n const match = contentType.match(contentTypeRegex);\n if (!match) {\n return null;\n }\n\n // 返回标准化的小写形式\n normalizedType = match[1].toLowerCase();\n this.contentTypeCache.set(contentType, normalizedType);\n }\n\n return normalizedType;\n }\n\n /**\n * 获取合并后的选项\n */\n public getMergedOptions(options?: PayloadOptions): PayloadOptions {\n if (!options) {\n return defaultOptions;\n }\n\n const cacheKey = JSON.stringify(options);\n\n const cached = this.optionsCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const mergedOptions = Object.assign({}, defaultOptions, options);\n this.optionsCache.set(cacheKey, mergedOptions);\n return mergedOptions;\n }\n\n /**\n * 清理所有缓存\n */\n public clearAll(): void {\n this.typeMapCache.clear();\n this.contentTypeCache.clear();\n this.optionsCache.clear();\n }\n\n\n}\n\n\n// 模块级别的单例实例\nexport const cacheManager = PayloadCacheManager.getInstance();\n/**\n * 清理所有缓存\n */\nexport function clearTypeMapCache(): void {\n cacheManager.clearAll();\n}\n\n\n","/*\n * @Description: Payload parsing utilities with performance optimizations\n * @Usage: Parse request body based on content-type with caching\n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2025-01-20 10:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\nimport { KoattyContext, KoattyNext } from \"koatty_core\";\nimport { Helper } from \"koatty_lib\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport {\n cacheManager,\n DEFAULT_ENCODING, DEFAULT_LIMIT, IDENTITY_ENCODING, ParserFunction,\n ParserMap\n} from \"./payload_cache\";\nimport { PayloadOptions } from \"./interface\";\n\n// 使用 Set 和预编译正则表达式\nconst supportedMethods = new Set(['POST', 'PUT', 'DELETE', 'PATCH', 'LINK', 'UNLINK']);\n\n/**\n * 根据内容类型获取对应的解析器(使用单例缓存管理器)\n * @param contentType 内容类型\n * @param typeMap 解析器映射表\n * @returns 解析器函数或 null\n */\nfunction getParserForType(contentType: string, typeMap: ParserMap): ParserFunction | null {\n const normalizedType = cacheManager.getContentType(contentType);\n if (!normalizedType) {\n return null;\n }\n\n return typeMap.get(normalizedType) || null;\n}\n\n/**\n * 快速检查是否为支持的方法\n * @param method HTTP 方法\n * @returns 是否支持\n */\nfunction isSupportedMethod(method: string): boolean {\n return supportedMethods.has(method);\n}\n\n/**\n * 快速检查内容长度\n * @param headers 请求头\n * @returns 内容长度或 0\n */\nfunction getContentLength(headers: Record<string, string | string[] | undefined>): number {\n const len = headers['content-length'];\n if (typeof len === 'string') {\n return parseInt(len, 10) || 0;\n }\n return 0;\n}\n\n/**\n * Middleware for parsing request payload (query parameters and request body).\n * \n * @param {PayloadOptions} [options] - Configuration options for payload parsing\n * @returns {Function} Koa middleware function that adds requestParam and requestBody to context\n * \n * @example\n * ```ts\n * app.use(payload({\n * // payload options\n * }));\n * ```\n */\nexport function payload(options?: PayloadOptions) {\n // 性能优化:预处理选项\n const opts = cacheManager.getMergedOptions(options);\n\n return (ctx: KoattyContext, next: KoattyNext) => {\n // 防止重复定义:在多协议场景下,多个router会注册payload中间件\n // 每个请求的ctx虽然是独立实例,但会经过所有中间件\n // 只在属性未定义时才定义,避免 \"Cannot redefine property\" 错误\n if (!Object.prototype.hasOwnProperty.call(ctx, 'requestHeader')) {\n Helper.define(ctx, \"requestHeader\", (name?: string) => {\n return name ? ctx.get(name) : ctx.headers;\n });\n }\n if (!Object.prototype.hasOwnProperty.call(ctx, 'requestQuery')) {\n Helper.define(ctx, \"requestQuery\", (name?: string) => {\n const queryParams = ctx.query ?? {};\n return name ? queryParams[name] : queryParams;\n });\n }\n if (!Object.prototype.hasOwnProperty.call(ctx, 'requestPathVariable')) {\n Helper.define(ctx, \"requestPathVariable\", (name?: string) => {\n const pathParams = ctx.params ?? {};\n return name ? pathParams[name] : pathParams;\n });\n }\n if (!Object.prototype.hasOwnProperty.call(ctx, 'requestParam')) {\n Helper.define(ctx, \"requestParam\", () => queryParser(ctx, opts));\n }\n if (!Object.prototype.hasOwnProperty.call(ctx, 'requestBody')) {\n Helper.define(ctx, \"requestBody\", () => bodyParser(ctx, opts));\n }\n if (!Object.prototype.hasOwnProperty.call(ctx, 'requestFile')) {\n Helper.define(ctx, \"requestFile\", async (name?: string) => {\n const body = await bodyParser(ctx, opts);\n const files = body.file ?? {};\n return name ? files[name] : files;\n });\n }\n return next();\n }\n}\n\n/**\n * Parse and merge query parameters and route parameters from context\n * @param {KoattyContext} ctx Koatty context object\n * @param {PayloadOptions} [_options] Optional payload configuration\n * @returns {Record<string, unknown>} Merged object containing query and route parameters\n */\nexport function queryParser(ctx: KoattyContext, _options?: PayloadOptions): Record<string, unknown> {\n // 性能优化:避免不必要的对象创建\n const query = ctx.query;\n const params = ctx.params;\n\n if (!params || Object.keys(params).length === 0) {\n return query;\n }\n\n if (!query || Object.keys(query).length === 0) {\n return params;\n }\n\n return Object.assign({}, query, params);\n}\n\n/**\n * Parse request body and store it in context metadata.\n * \n * @param {KoattyContext} ctx - Koatty context object\n * @param {PayloadOptions} [options] - Optional payload parsing options\n * @returns {Promise<any>} Parsed request body\n * @throws {Error} When body parsing fails\n */\nexport async function bodyParser(ctx: KoattyContext, options?: PayloadOptions): Promise<any> {\n try {\n // 性能优化:快速检查缓存\n let body = ctx.getMetaData(\"_body\")[0];\n if (!Helper.isEmpty(body)) {\n return body;\n }\n\n // 性能优化:使用缓存的合并选项\n const opts = cacheManager.getMergedOptions(options);\n body = await parseBody(ctx, opts);\n ctx.setMetaData(\"_body\", body);\n return body;\n } catch (err) {\n Logger.Error(err);\n return {};\n }\n}\n\n/**\n * Parse request body based on content-type with performance optimizations.\n * \n * @param {KoattyContext} ctx - Koatty context object\n * @param {PayloadOptions} options - Parser options including encoding, limit, etc.\n * @returns {Promise<unknown>} Parsed body data or empty object\n * \n * @description\n * Optimized version with typeMap caching and Map-based lookups.\n * Handles different content types:\n * - application/json\n * - application/x-www-form-urlencoded\n * - text/plain\n * - multipart/form-data\n * - text/xml\n * - application/grpc\n * - application/graphql+json\n * - application/websocket\n */\nfunction parseBody(ctx: KoattyContext, options: PayloadOptions): Promise<unknown> {\n // 性能优化:使用 Set 进行 O(1) 方法检查\n if (!isSupportedMethod(ctx.method)) {\n return Promise.resolve({});\n }\n\n // 性能优化:快速获取内容长度\n const len = getContentLength(ctx.req.headers || {});\n const encoding = ctx.req.headers?.['content-encoding'] || IDENTITY_ENCODING;\n\n if (len && encoding === IDENTITY_ENCODING) {\n options.length = len;\n }\n\n // 性能优化:避免重复赋值\n if (!options.encoding) options.encoding = DEFAULT_ENCODING;\n if (!options.limit) options.limit = DEFAULT_LIMIT;\n\n const contentType = ctx.request.headers['content-type'] || '';\n\n // 性能优化:使用缓存的 typeMap\n const typeMap = cacheManager.getTypeMap(options.extTypes);\n const parser = getParserForType(contentType, typeMap);\n\n return parser ? parser(ctx, options) : Promise.resolve({});\n}\n","/*\n * @Description: \n * @Usage: \n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2025-03-15 22:21:29\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\nimport \"reflect-metadata\";\nimport {\n getOriginMetadata, IOC, recursiveGetMetadata,\n TAGGED_PARAM\n} from \"koatty_container\";\nimport { CONTROLLER_ROUTER, Koatty } from \"koatty_core\";\nimport { Helper } from \"koatty_lib\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { Project } from \"ts-morph\";\nimport { MAPPING_KEY, MiddlewareDecoratorConfig } from \"../params/mapping\";\nimport {\n FunctionValidator,\n PARAM_CHECK_KEY, PARAM_RULE_KEY, PARAM_TYPE_KEY,\n paramterTypes, ValidOtpions, ValidRules,\n} from \"koatty_validation\";\nimport { RouterMiddlewareManager } from \"../middleware/manager\";\nimport { PayloadOptions } from \"../payload/interface\";\nimport { convertParamsType, ClassValidator, plainToClass } from \"koatty_validation\";\nimport { bodyParser } from \"../payload/payload\";\nimport { Exception } from \"koatty_exception\";\n/**\n * Parameter source type enumeration for efficient parameter extraction\n * \n * @description\n * Identifies the source of a parameter, enabling:\n * - Type-safe parameter extraction using enum switch statements\n * - Faster execution compared to string comparisons\n * - Better V8 JIT optimization through predictable control flow\n * \n * @performance\n * Using enums with switch statements is ~30% faster than string-based if-else chains\n * \n * @example\n * ```typescript\n * switch(param.sourceType) {\n * case ParamSourceType.QUERY:\n * return ctx.query[paramName];\n * case ParamSourceType.BODY:\n * return await bodyParser(ctx);\n * // ...\n * }\n * ```\n * \n * @since 1.20.0-8\n * @category Parameter Extraction\n */\nexport enum ParamSourceType {\n /** Query string parameters - extracted from ctx.query (@Get decorator) */\n QUERY = 'query',\n \n /** Request body parameters - extracted via bodyParser (@Post, @RequestBody decorators) */\n BODY = 'body',\n \n /** HTTP headers - extracted from ctx.headers (@Header decorator) */\n HEADER = 'header',\n \n /** Path variables - extracted from ctx.params (@PathVariable decorator) */\n PATH = 'path',\n \n /** Uploaded files - extracted from parsed body (@File decorator) */\n FILE = 'file',\n \n /** Custom extraction using user-defined function */\n CUSTOM = 'custom'\n}\n\n/**\n * Infer ParamSourceType from decorator function name\n * \n * @description\n * Provides backward compatibility for metadata that was created before Task 4.1.\n * Maps decorator function names to their corresponding ParamSourceType enum values.\n * \n * @param fnName - The name of the decorator function (e.g., 'Get', 'Post', 'Header')\n * @returns The corresponding ParamSourceType enum value\n * \n * @example\n * ```typescript\n * inferSourceTypeFromFnName('Get') // Returns ParamSourceType.QUERY\n * inferSourceTypeFromFnName('Post') // Returns ParamSourceType.BODY\n * inferSourceTypeFromFnName('Header') // Returns ParamSourceType.HEADER\n * inferSourceTypeFromFnName('Unknown') // Returns ParamSourceType.CUSTOM\n * ```\n * \n * @internal\n * @since 1.20.0-8\n * @category Parameter Extraction\n */\nexport function inferSourceTypeFromFnName(fnName: string): ParamSourceType {\n switch(fnName) {\n case 'Get':\n return ParamSourceType.QUERY;\n case 'Post':\n case 'RequestBody':\n return ParamSourceType.BODY;\n case 'Header':\n return ParamSourceType.HEADER;\n case 'PathVariable':\n return ParamSourceType.PATH;\n case 'File':\n return ParamSourceType.FILE;\n default:\n return ParamSourceType.CUSTOM;\n }\n}\n\n/**\n * DTO metadata cache using WeakMap for automatic garbage collection\n * Maps DTO class to its metadata (dtoRule)\n * @internal\n */\nconst DTO_METADATA_CACHE = new WeakMap<any, Map<string, string>>();\n\n/**\n *\n *\n * @interface RouterMetadata\n */\nexport interface RouterMetadata {\n method: string;\n path: string;\n ctlPath: string;\n requestMethod: string;\n routerName: string;\n middlewareConfigs?: MiddlewareDecoratorConfig[]; // 更新为新的配置格式\n composedMiddleware?: Function;\n}\n\n/**\n *\n *\n * @interface RouterMetadataObject\n */\nexport interface RouterMetadataObject {\n [key: string]: RouterMetadata;\n}\n\n/**\n * Inject router metadata for a controller class.\n * \n * @param app - The Koatty application instance\n * @param target - The controller class target\n * @param protocol - The protocol type, defaults to 'http'\n * @returns RouterMetadataObject containing route mappings, or null if protocol doesn't match\n * \n * @description\n * This function processes controller class metadata to generate router mappings.\n * It extracts the controller path, validates method scopes in debug mode,\n * and combines controller and method level route configurations.\n * Additionally, it registers middleware classes to RouterMiddlewareManager for unified management.\n * Now supports advanced middleware features like priority, conditions, and metadata.\n */\nexport async function injectRouter(app: Koatty, target: any, protocol = 'http'): Promise<RouterMetadataObject | null> {\n const ctlName = IOC.getIdentifier(target);\n const options = IOC.getPropertyData(CONTROLLER_ROUTER, target, ctlName) ||\n { path: \"\", protocol: 'http' };\n options.path = options.path.startsWith(\"/\") || options.path === \"\" ? options.path : `/${options.path}`;\n if (options.protocol !== protocol) return null;\n\n const rmetaData = recursiveGetMetadata(IOC, MAPPING_KEY, target);\n const router: RouterMetadataObject = {};\n const methods: string[] = [];\n const middlewareManager = RouterMiddlewareManager.getInstance(app);\n\n Logger.Debug(`injectRouter: RouterMiddlewareManager instance ID: ${(middlewareManager as any)._instanceId}`);\n\n if (app.appDebug) {\n const ctlPath = getControllerPath(ctlName);\n methods.push(...getPublicMethods(ctlPath, ctlName));\n }\n\n for (const metaKey in rmetaData) {\n // Logger.Debug(`Register inject method Router key: ${metaKey} =>\n // value: ${ JSON.stringify(rmetaData[metaKey]) }`);\n //.sort((a, b) => b.priority - a.priority) \n if (app.appDebug && !methods.includes(metaKey)) {\n Logger.Debug(`The method ${metaKey} is bound to the route, but the scope of this method is not public.`);\n continue;\n }\n for (const val of rmetaData[metaKey]) {\n // 处理控制器级别和方法级别的中间件配置\n const controllerMiddlewareConfigs: MiddlewareDecoratorConfig[] = [];\n const methodMiddlewareConfigs: MiddlewareDecoratorConfig[] = val.middlewareConfigs || [];\n\n // 处理控制器级别的中间件(如果有的话)\n if (options.middleware) {\n for (const middlewareItem of options.middleware) {\n let config: MiddlewareDecoratorConfig;\n if (typeof middlewareItem === 'function') {\n config = {\n middleware: middlewareItem,\n priority: 50,\n enabled: true,\n conditions: [],\n metadata: { source: 'controller' }\n };\n } else {\n config = {\n priority: 50,\n enabled: true,\n conditions: [],\n metadata: { source: 'controller' },\n ...middlewareItem\n };\n }\n \n // 控制器级别的中间件都会被添加到配置中,包括enabled: false的\n controllerMiddlewareConfigs.push(config);\n }\n }\n\n // 创建控制器级别中间件的映射,用于方法级别的禁用检查\n const controllerMiddlewareMap = new Map<Function, MiddlewareDecoratorConfig>();\n controllerMiddlewareConfigs.forEach(config => {\n if (config.middleware) {\n controllerMiddlewareMap.set(config.middleware, config);\n }\n });\n\n // 处理方法级别的中间件配置\n const methodDisabledMiddlewares = new Set<Function>();\n const methodAddedMiddlewares: MiddlewareDecoratorConfig[] = [];\n \n // 分析方法级别的中间件配置\n for (const methodConfig of methodMiddlewareConfigs) {\n if (methodConfig.enabled === false && methodConfig.middleware) {\n // enabled: false 只对控制器已声明的中间件有效\n if (controllerMiddlewareMap.has(methodConfig.middleware)) {\n methodDisabledMiddlewares.add(methodConfig.middleware);\n Logger.Debug(`injectRouter: Method-level disabling middleware: ${methodConfig.middleware.name}`);\n } else {\n Logger.Debug(`injectRouter: Invalid configuration - middleware ${methodConfig.middleware.name} not declared at controller level, ignoring enabled: false`);\n }\n } else if (methodConfig.enabled !== false && methodConfig.middleware) {\n // enabled: true 或未设置,添加到方法级别中间件(无论控制器是否声明)\n methodAddedMiddlewares.push({\n priority: 50,\n enabled: true,\n conditions: [],\n metadata: { source: 'method' },\n ...methodConfig\n });\n Logger.Debug(`injectRouter: Method-level adding middleware: ${methodConfig.middleware.name}`);\n }\n }\n\n // 过滤控制器级别的中间件:移除enabled: false的和被方法级别禁用的\n const filteredControllerMiddlewares = controllerMiddlewareConfigs.filter(config => {\n // 如果控制器级别就是enabled: false,则忽略\n if (config.enabled === false) {\n Logger.Debug(`injectRouter: Controller-level middleware disabled: ${config.middleware?.name}`);\n return false;\n }\n \n // 如果被方法级别禁用,则移除\n if (config.middleware && methodDisabledMiddlewares.has(config.middleware)) {\n Logger.Debug(`injectRouter: Controller middleware disabled by method-level config: ${config.middleware.name}`);\n return false;\n }\n \n return true;\n });\n\n // 合并中间件配置:控制器启用的 + 方法级别添加的\n // 使用 Map 来去重,避免同一个中间件被重复添加\n const middlewareMap = new Map<Function, MiddlewareDecoratorConfig>();\n \n // 先添加控制器级别的中间件\n filteredControllerMiddlewares.forEach(config => {\n if (config.middleware) {\n middlewareMap.set(config.middleware, config);\n }\n });\n \n // 再添加方法级别的中间件(会覆盖同名的控制器中间件配置)\n methodAddedMiddlewares.forEach(config => {\n if (config.middleware) {\n middlewareMap.set(config.middleware, config);\n }\n });\n \n // 转换为数组并按优先级排序\n const allMiddlewareConfigs = Array.from(middlewareMap.values());\n\n // 按优先级排序(高优先级先执行)\n allMiddlewareConfigs.sort((a, b) => (b.priority || 50) - (a.priority || 50));\n\n // 将装饰器声明的中间件类注册到RouterMiddlewareManager\n const middlewareInstanceIds: string[] = [];\n for (const middlewareConfig of allMiddlewareConfigs) {\n if (!middlewareConfig.enabled) {\n Logger.Debug(`injectRouter: Skipping disabled middleware: ${middlewareConfig.middleware.name}`);\n continue;\n }\n\n const middlewareName = middlewareConfig.middleware.name;\n const currentRoute = `${options.path}${val.path}`.replace(\"//\", \"/\");\n \n Logger.Debug(`injectRouter: Processing middleware class: ${middlewareName} for route: ${currentRoute} with priority: ${middlewareConfig.priority}`);\n\n // 尝试通过路由和中间件名获取特定实例\n const existingInstance = middlewareManager.getMiddlewareByRoute(middlewareName, currentRoute, val.requestMethod);\n \n if (!existingInstance) {\n Logger.Debug(`injectRouter: Registering new middleware instance: ${middlewareName}@${currentRoute}`);\n \n // 注册到RouterMiddlewareManager,使用装饰器中的高级配置\n const instanceId = await middlewareManager.register({\n name: middlewareName,\n middleware: middlewareConfig.middleware, // 直接传递中间件类\n priority: middlewareConfig.priority || 50,\n enabled: middlewareConfig.enabled ?? true,\n conditions: middlewareConfig.conditions || [],\n metadata: {\n type: 'route',\n description: `Auto-registered middleware from decorator: ${middlewareName}`,\n source: 'decorator',\n ...middlewareConfig.metadata\n },\n middlewareConfig: {\n middlewareName,\n protocol,\n route: currentRoute,\n method: val.requestMethod,\n // 将装饰器中的metadata配置传递给中间件实例\n decoratorConfig: middlewareConfig.metadata || {}\n }\n });\n \n Logger.Debug(`injectRouter: Successfully registered middleware: ${middlewareName} with instanceId: ${instanceId}, priority: ${middlewareConfig.priority}`);\n \n middlewareInstanceIds.push(instanceId);\n } else {\n Logger.Debug(`injectRouter: Middleware instance already exists: ${middlewareName}@${currentRoute}`);\n middlewareInstanceIds.push(existingInstance.instanceId!);\n }\n }\n\n Logger.Debug(`injectRouter: Final middleware instance IDs for route ${val.path}: [${middlewareInstanceIds.join(', ')}]`);\n \n // 在注册时组合中间件\n let composedMiddleware: Function | undefined;\n if (middlewareInstanceIds.length > 0) {\n Logger.Debug(`injectRouter: Composing middleware for route ${val.path}`);\n \n // 使用RouterMiddlewareManager组合中间件\n composedMiddleware = middlewareManager.compose(middlewareInstanceIds, {\n route: `${options.path}${val.path}`.replace(\"//\", \"/\"),\n method: val.requestMethod,\n protocol: protocol\n });\n \n Logger.Debug(`injectRouter: Successfully composed middleware for route ${val.path}`);\n }\n \n const tmp = {\n ...val,\n path: `${options.path}${val.path}`.replace(\"//\", \"/\"),\n ctlPath: options.path,\n middlewareConfigs: allMiddlewareConfigs, // 存储完整的中间件配置用于调试\n composedMiddleware, // 存储预组合的中间件函数\n };\n router[`${tmp.path}||${tmp.requestMethod}`] = tmp;\n }\n }\n\n return router;\n}\n\n/**\n *\n *\n * @interface ParamMetadata\n */\nexport interface ParamMetadata {\n \"fn\": Function;\n \"name\": string;\n \"index\": number;\n \"clazz\": any;\n \"type\": string;\n \"isDto\": boolean;\n \"validRule\": Function | ValidRules | ValidRules[];\n \"validOpt\": ValidOtpions;\n \"options\": PayloadOptions;\n \"dtoCheck\": boolean;\n \"dtoRule\": Map<string, string>;\n \"compiledValidator\"?: (value: any) => void;\n \"precompiledOptions\"?: any;\n \"fastPathHandler\"?: FastPathHandler;\n \"compiledTypeConverter\"?: ((value: any) => any) | null;\n \"sourceType\": ParamSourceType; // Parameter source type\n \"paramName\"?: string; // Parameter name (e.g., \"id\")\n \"extractorType\"?: string; // Extractor type for unified extraction\n \"precompiledExtractor\"?: (ctx: any) => any; // Pre-compiled extractor function\n \"defaultValue\"?: any; // Default value if extraction returns undefined\n}\n\n/**\n * Extended parameter metadata array with runtime optimization flags\n * \n * @description\n * Extends the standard Array<ParamMetadata> with additional optimization metadata\n * that is computed at startup time for improved runtime performance.\n * \n * @property hasAsyncParams - Indicates if the method has any async parameters (BODY/FILE/DTO).\n * When false, enables fast synchronous extraction path.\n * @property fastPathHandler - Pre-compiled handler for zero-validation scenarios.\n * Created during Task 2.x when all parameters can be extracted\n * and validated in a single optimized function.\n * \n * @performance\n * - Sync path (hasAsyncParams=false): ~40% faster than async path\n * - Fast path handler: ~60% faster than normal path\n * \n * @example\n * ```typescript\n * const params: CompiledMethodParams = [...];\n * params.hasAsyncParams = false; // All params are QUERY/HEADER/PATH\n * \n * if (!params.hasAsyncParams) {\n * // Use synchronous extraction path\n * return extractSync(ctx, params);\n * }\n * ```\n * \n * @since 1.20.0-8\n * @category Parameter Extraction\n */\nexport interface CompiledMethodParams extends Array<ParamMetadata> {\n /** Indicates if method has async parameters requiring bodyParser or DTO validation */\n hasAsyncParams?: boolean;\n \n /** Pre-compiled fast path handler for zero-validation scenarios */\n fastPathHandler?: any;\n}\n\n/**\n *\n *\n * @interface ParamMetadataMap\n */\ninterface ParamMetadataMap {\n [key: string]: CompiledMethodParams;\n}\n\n/**\n * Inject parameter metadata for dependency injection.\n * \n * @param app - The Koatty application instance\n * @param target - The target class to inject parameters\n * @param options - Optional payload options for parameter injection\n * @returns A map of parameter metadata for each method\n * \n * @description\n * This function processes and combines various metadata including injection data,\n * validation rules, and DTO checks. It sorts parameters by index, applies validation\n * rules, and handles DTO class registration. For DTO parameters, it ensures the class\n * is registered in the IOC container and sets up type definitions if DTO validation\n * is enabled.\n * \n * @throws Error when a DTO class is not registered in the container\n */\nexport function injectParamMetaData(app: Koatty, target: any,\n options?: PayloadOptions): ParamMetadataMap {\n const metaDatas = recursiveGetMetadata(IOC, TAGGED_PARAM, target);\n const validMetaDatas = recursiveGetMetadata(IOC, PARAM_RULE_KEY, target);\n const validatedMetaDatas = recursiveGetMetadata(IOC, PARAM_CHECK_KEY, target);\n const argsMetaObj: ParamMetadataMap = {};\n\n for (const meta in metaDatas) {\n Logger.Debug(`Register inject param key ${IOC.getIdentifier(target)\n }: ${Helper.toString(meta)} => value: ${JSON.stringify(metaDatas[meta])}`);\n\n const data: ParamMetadata[] = (metaDatas[meta] ?? []).sort((a: ParamMetadata,\n b: ParamMetadata) => a.index - b.index);\n const validData = validMetaDatas[meta] ?? [];\n\n data.forEach((v: ParamMetadata) => {\n // Backward compatibility: infer sourceType from fn.name if not present\n if (!v.sourceType && v.fn) {\n v.sourceType = inferSourceTypeFromFnName(v.fn.name || '');\n Logger.Debug(`Inferred sourceType ${v.sourceType} for param ${v.name} from fn.name`);\n }\n // Ensure sourceType is set (default to CUSTOM if still missing)\n if (!v.sourceType) {\n v.sourceType = ParamSourceType.CUSTOM;\n }\n \n // Task 4.5: Set extractorType based on sourceType for unified extraction\n switch(v.sourceType) {\n case ParamSourceType.QUERY:\n v.extractorType = 'query';\n break;\n case ParamSourceType.BODY:\n v.extractorType = 'body';\n break;\n case ParamSourceType.HEADER:\n v.extractorType = 'header';\n break;\n case ParamSourceType.PATH:\n v.extractorType = 'path';\n break;\n case ParamSourceType.FILE:\n v.extractorType = 'file';\n break;\n case ParamSourceType.CUSTOM:\n v.extractorType = 'custom';\n break;\n }\n Logger.Debug(`Set extractorType ${v.extractorType} for param ${v.name}`);\n \n const validEntry = validData.find((it: any) => v.index === it.index && it.name === v.name);\n if (validEntry) {\n v.validRule = validEntry.rule;\n v.validOpt = validEntry.options;\n \n // Task 6.2: All validators must be compiled at startup\n // Skip compilation for DTO parameters as they use ClassValidator\n if (!v.isDto && v.validRule) {\n try {\n v.compiledValidator = compileValidator(v.index, v.type, v.validRule, v.validOpt);\n Logger.Debug(`Compiled validator for param ${v.name} at index ${v.index}`);\n } catch (err) {\n // In v2.0.0+, validator compilation failures are fatal\n const errorMsg = `Failed to compile validator for param ${v.name} at index ${v.index}: ${err.message}`;\n Logger.Error(errorMsg);\n throw new Error(errorMsg);\n }\n }\n }\n v.type = v.isDto ? v.type : (v.type).toLowerCase();\n v.dtoCheck = !!(validatedMetaDatas[meta]?.dtoCheck);\n if (v.isDto) {\n v.clazz = IOC.getClass(v.type, \"COMPONENT\");\n if (!v.clazz) {\n throw Error(`Failed to obtain the class ${v.type},\n because the class is not registered in the container.`);\n }\n if (v.dtoCheck) {\n // Task 3.3: Check cache first\n const cachedDtoRule = DTO_METADATA_CACHE.get(v.clazz);\n if (cachedDtoRule) {\n v.dtoRule = cachedDtoRule;\n Logger.Debug(`Using cached DTO metadata for ${v.type}`);\n } else {\n // Cache miss - get metadata and cache it\n v.dtoRule = getOriginMetadata(PARAM_TYPE_KEY, v.clazz);\n DTO_METADATA_CACHE.set(v.clazz, v.dtoRule);\n Logger.Debug(`Cached DTO metadata for ${v.type}`);\n }\n \n Reflect.defineProperty(v.clazz.prototype, \"_typeDef\", {\n enumerable: true,\n configurable: false,\n writable: false,\n value: v.dtoRule,\n });\n }\n }\n if (options) {\n v.options = options;\n }\n \n // Pre-create ParamOptions object to avoid runtime creation\n v.precompiledOptions = {\n index: v.index,\n isDto: v.isDto,\n type: v.type,\n validRule: v.validRule,\n validOpt: v.validOpt,\n dtoCheck: v.dtoCheck,\n dtoRule: v.dtoRule,\n clazz: v.clazz\n };\n Logger.Debug(`Pre-compiled options for param ${v.name} at index ${v.index}`);\n \n // Task 4.6: Generate pre-compiled extractor for sync parameters\n const precompiledExtractor = generatePrecompiledExtractor(v);\n if (precompiledExtractor) {\n v.precompiledExtractor = precompiledExtractor;\n Logger.Debug(`Generated pre-compiled extractor for param ${v.name}`);\n }\n \n // Task 3.2: Compile type converter for non-DTO parameters\n if (!v.isDto && v.type) {\n try {\n v.compiledTypeConverter = compileTypeConverter(v.type);\n if (v.compiledTypeConverter) {\n Logger.Debug(`Compiled type converter for param ${v.name}, type: ${v.type}`);\n } else {\n Logger.Debug(`No type converter needed for param ${v.name}, type: ${v.type} (string)`);\n }\n } catch (error) {\n Logger.Error(`Failed to compile type converter for param ${v.name}: ${error.message}`);\n }\n }\n });\n \n // Task 2.3: Detect and create fast path handler if possible\n const fastPathScenario = detectFastPathScenario(data);\n if (fastPathScenario) {\n const fastPathHandler = createFastPathHandler(fastPathScenario, data);\n if (fastPathHandler) {\n // Store the fast path handler in metadata\n // Since we need to store it somewhere accessible, we'll add it to the first parameter\n // or create a method-level metadata\n Logger.Debug(`Created fast path handler for ${target.constructor.name}.${meta}, scenario: ${fastPathScenario}`);\n \n // Store in each parameter for easy access, or we can store it once per method\n // For now, let's add a reference in the metadata map itself\n (data as any).fastPathHandler = fastPathHandler;\n (data as any).fastPathScenario = fastPathScenario;\n }\n }\n \n // Task 4.4: Detect if method has async parameters\n const hasAsyncParams = data.some(p => \n p.sourceType === ParamSourceType.BODY || \n p.sourceType === ParamSourceType.FILE ||\n p.isDto // DTO validation might be async\n );\n (data as CompiledMethodParams).hasAsyncParams = hasAsyncParams;\n Logger.Debug(`Method ${meta} hasAsyncParams: ${hasAsyncParams}`);\n \n argsMetaObj[meta] = data as CompiledMethodParams;\n }\n return argsMetaObj;\n}\n\n/**\n * Creates a parameter decorator for dependency injection.\n * \n * @param fn The function to be injected\n * @param name The name of the decorator\n * @returns A ParameterDecorator that handles the injection\n * @throws Error if decorator is used outside of a controller class\n * \n * @example\n * ```typescript\n * @Controller()\n * class UserController {\n * @Get(\"/user\")\n * getUser(@Get() query: QueryDTO) {}\n * }\n * ```\n */\nexport const injectParam = (\n fn: Function, \n name: string,\n sourceType: ParamSourceType,\n paramName?: string,\n defaultValue?: any\n): ParameterDecorator => {\n return (target: object, propertyKey: string | symbol | undefined, descriptor: number) => {\n const targetType = IOC.getType(target);\n if (targetType !== \"CONTROLLER\") {\n throw Error(`${name} decorator is only used in controllers class.`);\n }\n\n // 获取成员类型\n // const type = Reflect.getMetadata(\"design:type\", target, propertyKey);\n // 获取成员参数类型\n const paramTypes = Reflect.getMetadata(\"design:paramtypes\", target, propertyKey);\n // 获取成员返回类型\n // const returnType = Reflect.getMetadata(\"design:returntype\", target, propertyKey);\n // 获取所有元数据 key (由 TypeScript 注入)\n // const keys = Reflect.getMetadataKeys(target, propertyKey); let type = paramTypes[descriptor]?.name || 'object';\n let type = paramTypes[descriptor]?.name || 'object';\n let isDto = false;\n\n if (!(Helper.toString(type) in paramterTypes)) {\n type = IOC.getIdentifier(paramTypes[descriptor]);\n isDto = true;\n }\n\n IOC.attachPropertyData(TAGGED_PARAM, {\n name: propertyKey,\n fn,\n index: descriptor,\n type,\n isDto,\n sourceType,\n paramName,\n defaultValue // Task 4.7: Store default value\n }, target, propertyKey);\n return descriptor;\n };\n};\n\n/**\n * Gets all public method names from a TypeScript class.\n * \n * @param classFilePath - The absolute file path to the TypeScript class file\n * @param className - The name of the class to analyze\n * @returns An array of strings containing the names of all public methods\n * \n * @example\n * ```ts\n * const methods = getPublicMethods('/path/to/class.ts', 'MyClass');\n * // returns ['method1', 'method2', ...]\n * ```\n */\nexport function getPublicMethods(classFilePath: string, className: string): string[] {\n const project = new Project();\n const sourceFile = project.addSourceFileAtPath(classFilePath);\n\n const classDeclaration = sourceFile.getClass(className);\n const publicMethods: string[] = [];\n\n if (classDeclaration) {\n for (const method of classDeclaration.getMethods()) {\n const modifiers = method.getModifiers().map(mod => mod.getText());\n if (!modifiers.includes(\"private\") && !modifiers.includes(\"protected\")) {\n publicMethods.push(method.getName());\n }\n }\n }\n\n return publicMethods;\n}\n\n/**\n * get koatty controller paths\n * @param className \n * @returns \n */\nfunction getControllerPath(className: string): string {\n return process.env.APP_PATH + \"/controller/\" + className + \".ts\";\n}\n\n/**\n * Fast path handler type - optimized parameter extraction function\n * @internal\n */\nexport type FastPathHandler = (ctx: any) => any[] | Promise<any[]>;\n\n/**\n * Fast path scenario types\n * @internal\n */\nexport enum FastPathScenario {\n SINGLE_QUERY_NO_VALIDATION = 'SINGLE_QUERY_NO_VALIDATION', // 场景 A: 单个 query 参数,无验证\n SINGLE_DTO_FROM_BODY = 'SINGLE_DTO_FROM_BODY', // 场景 B: 单个 DTO 参数,来自 body\n MULTIPLE_QUERY_NO_VALIDATION = 'MULTIPLE_QUERY_NO_VALIDATION' // 场景 C: 多个 query 参数,无验证\n}\n\n/**\n * Detect if parameters match a fast path scenario\n * Returns the scenario type if a fast path can be used, null otherwise\n * \n * @param params - Array of parameter metadata\n * @returns FastPathScenario or null\n * @internal\n */\nexport function detectFastPathScenario(params: ParamMetadata[]): FastPathScenario | null {\n if (!params || params.length === 0) {\n return null;\n }\n\n // 场景 A: 单个 query 参数,无验证\n if (params.length === 1) {\n const param = params[0];\n const fnName = param.fn?.name || '';\n \n // 检查是否是 Get 装饰器,且没有验证规则\n if (fnName === 'Get' && !param.validRule && !param.isDto) {\n Logger.Debug(`Detected fast path scenario A: single query param without validation`);\n return FastPathScenario.SINGLE_QUERY_NO_VALIDATION;\n }\n \n // 场景 B: 单个 DTO 参数,来自 body\n if ((fnName === 'Post' || fnName === 'RequestBody') && param.isDto) {\n Logger.Debug(`Detected fast path scenario B: single DTO from body`);\n return FastPathScenario.SINGLE_DTO_FROM_BODY;\n }\n }\n \n // 场景 C: 多个 query 参数,无验证\n if (params.length > 1) {\n const allQueryNoValidation = params.every(param => {\n const fnName = param.fn?.name || '';\n return fnName === 'Get' && !param.validRule && !param.isDto;\n });\n \n if (allQueryNoValidation) {\n Logger.Debug(`Detected fast path scenario C: multiple query params without validation`);\n return FastPathScenario.MULTIPLE_QUERY_NO_VALIDATION;\n }\n }\n \n // 复杂场景,不能使用快速路径\n return null;\n}\n\n/**\n * Create an optimized fast path handler for detected scenarios\n * \n * @param scenario - The detected fast path scenario\n * @param params - Array of parameter metadata\n * @returns FastPathHandler function or null if cannot create\n * @internal\n */\nexport function createFastPathHandler(\n scenario: FastPathScenario, \n params: ParamMetadata[]\n): FastPathHandler | null {\n \n switch (scenario) {\n case FastPathScenario.SINGLE_QUERY_NO_VALIDATION: {\n // 场景 A: 单个 query 参数,无验证\n const param = params[0];\n const paramName = param.name;\n const paramType = param.type;\n \n if (paramName) {\n // 有名称的参数,直接提取\n return (ctx: any) => {\n const value = ctx.query?.[paramName];\n const converted = convertParamsType(value, paramType);\n return [converted];\n };\n } else {\n // 无名称的参数,返回整个 query 对象\n return (ctx: any) => {\n const query = ctx.query || {};\n return [query];\n };\n }\n }\n \n case FastPathScenario.SINGLE_DTO_FROM_BODY: {\n // 场景 B: 单个 DTO 参数,来自 body\n const param = params[0];\n const clazz = param.clazz;\n const dtoCheck = param.dtoCheck;\n \n if (!clazz) {\n Logger.Debug(`Cannot create fast path: DTO class not found`);\n return null;\n }\n \n // 返回异步处理器\n return async (ctx: any) => {\n const body = await bodyParser(ctx, param.options);\n \n let validatedValue;\n if (dtoCheck) {\n validatedValue = await ClassValidator.valid(clazz, body, true);\n } else {\n validatedValue = plainToClass(clazz, body, true);\n }\n \n return [validatedValue];\n };\n }\n \n case FastPathScenario.MULTIPLE_QUERY_NO_VALIDATION: {\n // 场景 C: 多个 query 参数,无验证\n // 预编译参数名称和类型数组\n const paramConfigs = params.map(p => ({\n name: p.name,\n type: p.type\n }));\n \n return (ctx: any) => {\n const query = ctx.query || {};\n const results: any[] = [];\n \n for (const config of paramConfigs) {\n if (config.name) {\n const value = query[config.name];\n const converted = convertParamsType(value, config.type);\n results.push(converted);\n } else {\n results.push(query);\n }\n }\n \n return results;\n };\n }\n \n default:\n return null;\n }\n}\n\n/**\n * Compile type converter function at startup time.\n * This pre-compilation optimizes type conversion by:\n * - Returning null for string types (no conversion needed)\n * - Creating specialized converters for other types\n * - Avoiding runtime type checks\n * \n * @param type - Parameter type (string, number, boolean, array, etc.)\n * @returns Compiled type converter function or null if no conversion needed\n * @internal\n */\nexport function compileTypeConverter(type: string): ((value: any) => any) | null {\n const normalizedType = type.toLowerCase();\n \n // String type doesn't need conversion\n if (normalizedType === 'string') {\n return null;\n }\n \n // Create specialized converters for common types\n switch (normalizedType) {\n case 'number':\n return (value: any) => {\n if (value === null || value === undefined || value === '') return value;\n const num = Number(value);\n return isNaN(num) ? value : num;\n };\n \n case 'boolean':\n return (value: any) => {\n if (value === null || value === undefined) return value;\n if (typeof value === 'boolean') return value;\n if (typeof value === 'string') {\n const lower = value.toLowerCase();\n if (lower === 'true' || lower === '1') return true;\n if (lower === 'false' || lower === '0') return false;\n }\n return Boolean(value);\n };\n \n case 'array':\n return (value: any) => {\n if (value === null || value === undefined) return value;\n if (Array.isArray(value)) return value;\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value);\n return Array.isArray(parsed) ? parsed : [value];\n } catch {\n return [value];\n }\n }\n return [value];\n };\n \n case 'object':\n return (value: any) => {\n if (value === null || value === undefined) return value;\n if (typeof value === 'object') return value;\n if (typeof value === 'string') {\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n }\n return value;\n };\n \n default:\n // For other types, use the generic convertParamsType\n return (value: any) => convertParamsType(value, type);\n }\n}\n\n/**\n * Generate optimized parameter extractor function at application startup\n * \n * @description\n * Creates specialized extractor functions for synchronous parameters (QUERY, HEADER, PATH)\n * at startup time. These pre-compiled extractors eliminate runtime conditionals and\n * provide direct property access for maximum performance.\n * \n * Returns null for async parameters (BODY, FILE) and custom extractors, as these\n * require runtime async operations or user-defined logic.\n * \n * @param param - Parameter metadata containing sourceType and paramName\n * @returns Pre-compiled extractor function, or null if parameter requires async extraction\n * \n * @performance\n * Pre-compiled extractors are ~25% faster than runtime switch-based extraction\n * because they avoid all conditional logic and provide direct property access.\n * \n * @example\n * ```typescript\n * const queryParam = {\n * sourceType: ParamSourceType.QUERY,\n * paramName: 'page',\n * name: 'page'\n * };\n * \n * const extractor = generatePrecompiledExtractor(queryParam);\n * // Returns: (ctx) => (ctx.query || {})['page']\n * \n * // Usage at runtime:\n * const value = extractor(ctx); // Direct property access, no conditionals\n * ```\n * \n * @internal\n * @since 1.20.0-8\n * @category Parameter Extraction\n */\nexport function generatePrecompiledExtractor(param: ParamMetadata): ((ctx: any) => any) | null {\n // paramName is the specific key to extract, if undefined, extract the entire collection\n const paramName = param.paramName !== undefined ? param.paramName : undefined;\n \n switch(param.sourceType) {\n case ParamSourceType.QUERY:\n // Generate optimized query extractor\n if (paramName !== undefined) {\n return (ctx: any) => (ctx.query || {})[paramName];\n } else {\n return (ctx: any) => ctx.query || {};\n }\n \n case ParamSourceType.HEADER:\n // Generate optimized header extractor\n if (paramName !== undefined) {\n return (ctx: any) => ctx.get ? ctx.get(paramName) : (ctx.headers || {})[paramName];\n } else {\n return (ctx: any) => ctx.headers || {};\n }\n \n case ParamSourceType.PATH:\n // Generate optimized path extractor\n if (paramName !== undefined) {\n return (ctx: any) => (ctx.params || {})[paramName];\n } else {\n return (ctx: any) => ctx.params || {};\n }\n \n case ParamSourceType.BODY:\n case ParamSourceType.FILE:\n // Body and file require async parsing, cannot pre-compile\n return null;\n \n case ParamSourceType.CUSTOM:\n // Custom extractors use the original fn\n return null;\n \n default:\n return null;\n }\n}\n\n/**\n * Compile validation rules into a single validation function at startup time.\n * This pre-compilation reduces runtime overhead by eliminating repetitive lookups and checks.\n * \n * @param index - Parameter index for error reporting\n * @param type - Parameter type\n * @param rule - Validation rule (Function, string, or array of strings)\n * @param options - Optional validation options\n * @returns Compiled validation function that throws Exception on failure\n * @internal\n */\nexport function compileValidator(\n index: number, \n type: string, \n rule: Function | ValidRules | ValidRules[], \n options?: ValidOtpions\n): (value: any) => void {\n \n // If rule is a custom function validator\n if (Helper.isFunction(rule)) {\n // Task 6.3: Optimize memory - pre-compute error message prefix\n const errorPrefix = `Validation failed for param ${index}: `;\n return (value: any) => {\n try {\n (rule as Function)(value);\n } catch (err) {\n throw new Exception(\n errorPrefix + err.message,\n 1,\n 400\n );\n }\n };\n }\n \n // If rule is string or array of strings, compile built-in validators\n const funcs: ValidRules[] = Helper.isString(rule) ? [rule as ValidRules] : \n Helper.isArray(rule) ? rule as ValidRules[] : [];\n \n // Pre-filter and prepare validators\n const validators: Array<(value: any, opts?: ValidOtpions) => void> = [];\n for (const func of funcs) {\n if (Object.hasOwnProperty.call(FunctionValidator, func)) {\n validators.push(FunctionValidator[func]);\n } else {\n Logger.Debug(`compileValidator: Unknown validator '${func}' will be ignored`);\n }\n }\n \n // Task 6.3: Optimize memory - pre-compute error message prefix\n const errorPrefix = `Validation failed for param ${index}: `;\n \n // Return composed validation function\n return (value: any) => {\n for (const validator of validators) {\n try {\n validator(value, options);\n } catch (err) {\n throw new Exception(\n errorPrefix + err.message,\n 1,\n 400\n );\n }\n }\n };\n}\n","/*\n * @Description: Strategy-based parameter extraction system\n * @Usage: Unified parameter extraction with optimized strategies\n * @Author: richen\n * @Date: 2025-01-27\n * @LastEditTime: 2025-01-27\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { Koatty, KoattyContext } from \"koatty_core\";\nimport { ParamMetadata, ParamSourceType } from \"./inject\";\nimport {\n ClassValidator,\n plainToClass,\n ValidOtpions,\n ValidRules,\n convertParamsType\n} from \"koatty_validation\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { bodyParser } from \"../payload/payload\";\nimport { IOC } from \"koatty_container\";\n\n/**\n * Parameter extraction strategy enum\n * Each strategy represents an optimized execution path\n */\nexport enum ExtractionStrategy {\n // Fastest: Direct property access, no validation\n SYNC_SINGLE_NO_VALIDATION = 'SYNC_SINGLE_NO_VALIDATION',\n\n // Fast: Loop over synchronous params, no validation\n SYNC_MULTI_NO_VALIDATION = 'SYNC_MULTI_NO_VALIDATION',\n\n // Fast: Single param with simple validation\n SYNC_SINGLE_SIMPLE_VALIDATION = 'SYNC_SINGLE_SIMPLE_VALIDATION',\n\n // Fast: Multiple params with simple validation\n SYNC_MULTI_SIMPLE_VALIDATION = 'SYNC_MULTI_SIMPLE_VALIDATION',\n\n // Fast: DTO transformation without validation\n SYNC_DTO_NO_VALIDATION = 'SYNC_DTO_NO_VALIDATION',\n\n // Fast: DTO transformation with validation\n SYNC_DTO_WITH_VALIDATION = 'SYNC_DTO_WITH_VALIDATION',\n\n // Moderate: Mixed async params (body/file)\n ASYNC_MIXED_PARAMS = 'ASYNC_MIXED_PARAMS',\n\n // Moderate: Async DTO validation\n ASYNC_DTO_VALIDATION = 'ASYNC_DTO_VALIDATION',\n\n // Fallback: Generic async path\n ASYNC_GENERIC = 'ASYNC_GENERIC'\n}\n\n/**\n * Pre-compiled strategy handler type\n */\nexport type StrategyHandler = (ctx: KoattyContext, params: ParamMetadata[]) => Promise<unknown[]> | unknown[];\n\n/**\n * Parameter source structure for unified extraction\n */\ninterface ParamSource {\n query: Record<string, unknown>;\n body: Record<string, unknown> & { file?: Record<string, unknown> };\n params: Record<string, unknown>;\n headers: Record<string, unknown>;\n}\n\n/**\n * Extract value synchronously for QUERY/HEADER/PATH\n * Reused from inject.ts to avoid duplication\n */\nfunction extractValueSync(ctx: KoattyContext, param: ParamMetadata): unknown {\n const paramName = param.paramName !== undefined ? param.paramName : param.name;\n\n switch(param.sourceType) {\n case ParamSourceType.QUERY:\n return paramName ? ctx.query?.[paramName] : ctx.query;\n\n case ParamSourceType.HEADER:\n return paramName ? ctx.get(paramName) : ctx.headers;\n\n case ParamSourceType.PATH:\n return paramName ? ctx.params?.[paramName] : ctx.params;\n\n default:\n return param.fn ? param.fn(ctx, param.options) : null;\n }\n}\n\n/**\n * Extract value from pre-fetched sources\n * Reused from inject.ts to avoid duplication\n */\nfunction extractValueFromSource(source: ParamSource, param: ParamMetadata): unknown {\n const paramName = param.paramName !== undefined ? param.paramName : param.name;\n\n switch(param.sourceType) {\n case ParamSourceType.QUERY:\n return paramName ? source.query?.[paramName] : source.query;\n\n case ParamSourceType.BODY:\n return paramName ? source.body?.[paramName] : source.body;\n\n case ParamSourceType.HEADER:\n return paramName ? source.headers?.[paramName] : source.headers;\n\n case ParamSourceType.PATH:\n return paramName ? source.params?.[paramName] : source.params;\n\n case ParamSourceType.FILE:\n return paramName ? source.body?.file?.[paramName] : source.body?.file;\n\n case ParamSourceType.CUSTOM:\n return null;\n\n default:\n return null;\n }\n}\n\n/**\n * Extract all parameter sources once\n * Reused from inject.ts to avoid duplication\n */\nasync function extractParamSources(ctx: KoattyContext, params: ParamMetadata[]): Promise<ParamSource> {\n const needsBody = params.some((param) => {\n return param.sourceType === ParamSourceType.BODY ||\n param.sourceType === ParamSourceType.FILE;\n });\n\n const bodyData: Record<string, unknown> = {};\n if (needsBody) {\n try {\n const parsedBody = await bodyParser(ctx, params[0]?.options);\n bodyData.body = parsedBody;\n if (typeof parsedBody === 'object' && 'file' in parsedBody) {\n bodyData.file = (parsedBody as Record<string, unknown>).file;\n }\n } catch (err) {\n Logger.Error(`extractParamSources: Failed to parse body: ${(err as Error).message}`);\n }\n }\n\n return {\n query: ctx.query || {},\n body: bodyData,\n params: ctx.params || {},\n headers: ctx.headers || {}\n };\n}\n\n/**\n * Parameter validation options\n */\ninterface ParamOptions {\n index: number;\n isDto: boolean;\n type: string;\n validRule: Function | ValidRules | ValidRules[];\n validOpt: ValidOtpions;\n dtoCheck: boolean;\n dtoRule: unknown;\n clazz: unknown;\n}\n\nfunction createParamOptions(param: ParamMetadata, index: number): ParamOptions {\n return {\n index,\n isDto: param.isDto,\n type: param.type,\n validRule: param.validRule,\n validOpt: param.validOpt,\n dtoCheck: param.dtoCheck,\n dtoRule: param.dtoRule,\n clazz: param.clazz,\n };\n}\n\n/**\n * Validate parameter\n * Reused from inject.ts to avoid duplication\n */\n async function validateParam(\n app: Koatty,\n ctx: KoattyContext,\n value: unknown,\n opt: ParamOptions,\n compiledValidator?: (value: unknown) => void,\n compiledTypeConverter?: ((value: unknown) => unknown) | null\n ): Promise<unknown> {\n try {\n if (opt.isDto) {\n let validatedValue;\n if (opt.dtoCheck) {\n validatedValue = await ClassValidator.valid(opt.clazz as new (...args: unknown[]) => unknown, value, true);\n } else {\n validatedValue = plainToClass(opt.clazz as new (...args: unknown[]) => unknown, value, true);\n }\n return validatedValue;\n } else {\n const needsConversion = compiledTypeConverter !== null;\n const needsValidation = !!(compiledValidator || opt.validRule);\n\n if (!needsConversion && !needsValidation) {\n return value;\n }\n\n let convertedValue = value;\n if (compiledTypeConverter) {\n convertedValue = compiledTypeConverter(value);\n } else if (opt.type && opt.type !== 'string') {\n convertedValue = convertParamsType(value, opt.type);\n }\n\n if (compiledValidator) {\n compiledValidator(convertedValue);\n } else if (opt.validRule) {\n throw new Error(\n `Validator for parameter ${opt.index} was not pre-compiled. ` +\n `This indicates a compilation failure during startup. ` +\n `Check application logs for compilation errors.`\n );\n }\n \n return convertedValue;\n }\n } catch (err) {\n const errorMessage = (err as Error).message || '';\n throw new Error(errorMessage.trim() ? errorMessage : `ValidatorError: invalid arguments.`);\n }\n}\n\n/**\n * Detect extraction strategy from parameter metadata\n * This is called once at startup time\n */\nexport function detectExtractionStrategy(params: ParamMetadata[]): ExtractionStrategy {\n if (!params || params.length === 0) {\n return ExtractionStrategy.ASYNC_GENERIC;\n }\n\n const paramCount = params.length;\n\n const hasAsyncParams = params.some(p =>\n p.sourceType === ParamSourceType.BODY ||\n p.sourceType === ParamSourceType.FILE ||\n (p.sourceType === ParamSourceType.CUSTOM && p.fn) ||\n p.isDto\n );\n\n const hasDtoParams = params.some(p => p.isDto);\n\n const hasValidation = params.some(p => p.validRule);\n\n const isSimpleDto = paramCount === 1 && hasDtoParams && !hasValidation;\n\n if (hasAsyncParams) {\n if (isSimpleDto) {\n return ExtractionStrategy.SYNC_DTO_NO_VALIDATION;\n }\n if (hasDtoParams) {\n return ExtractionStrategy.ASYNC_DTO_VALIDATION;\n }\n return ExtractionStrategy.ASYNC_MIXED_PARAMS;\n } else {\n if (paramCount === 1) {\n const param = params[0];\n\n if (!param.validRule && !param.isDto) {\n return ExtractionStrategy.SYNC_SINGLE_NO_VALIDATION;\n }\n\n if (param.validRule && !param.isDto) {\n return ExtractionStrategy.SYNC_SINGLE_SIMPLE_VALIDATION;\n }\n\n if (param.isDto) {\n return param.dtoCheck\n ? ExtractionStrategy.SYNC_DTO_WITH_VALIDATION\n : ExtractionStrategy.SYNC_DTO_NO_VALIDATION;\n }\n } else if (paramCount > 1) {\n if (!hasValidation && !hasDtoParams) {\n return ExtractionStrategy.SYNC_MULTI_NO_VALIDATION;\n }\n\n if (hasValidation && !hasDtoParams) {\n return ExtractionStrategy.SYNC_MULTI_SIMPLE_VALIDATION;\n }\n }\n }\n\n return ExtractionStrategy.ASYNC_GENERIC;\n}\n\n\n/**\n * Strategy cache for storing pre-compiled handlers\n * Uses WeakMap for automatic garbage collection\n */\nclass StrategyCacheManager {\n private cache = new WeakMap<ParamMetadata[], StrategyHandler>();\n private strategyMap = new WeakMap<ParamMetadata[], ExtractionStrategy>();\n\n getOrCreate(params: ParamMetadata[], app: Koatty): StrategyHandler {\n const cached = this.cache.get(params);\n if (cached) {\n return cached;\n }\n\n const strategy = detectExtractionStrategy(params);\n this.strategyMap.set(params, strategy);\n\n const handler = StrategyHandlerFactory.createHandler(strategy, params, app);\n this.cache.set(params, handler);\n\n return handler;\n }\n\n getStrategy(params: ParamMetadata[]): ExtractionStrategy | undefined {\n return this.strategyMap.get(params);\n }\n\n clear(): void {\n this.cache = new WeakMap();\n this.strategyMap = new WeakMap();\n }\n}\n\nconst strategyCache = new StrategyCacheManager();\n\n/**\n * Unified parameter extraction using strategy pattern\n * Replaces getParameter(), FastPath, and Sync Path\n *\n * @performance\n * - Startup: Strategy detection (one-time cost)\n * - Runtime: Direct handler call (optimal performance)\n * - Memory: WeakMap auto-GC (no memory leaks)\n */\nexport async function extractParameters(\n app: Koatty,\n ctx: KoattyContext,\n params: ParamMetadata[]\n): Promise<unknown[]> {\n\n if (!params || params.length === 0) {\n return [];\n }\n\n const handler = strategyCache.getOrCreate(params, app);\n const result = await handler(ctx, params);\n\n return result as unknown[];\n}\n\n/**\n * Export cache manager for testing and debugging\n */\nexport { strategyCache };\n\n/**\n * Strategy handler factory\n * Creates optimized handlers for each strategy\n */\nexport class StrategyHandlerFactory {\n /**\n * Create optimized handler for a given strategy\n */\n static createHandler(\n strategy: ExtractionStrategy,\n params: ParamMetadata[],\n app: Koatty\n ): StrategyHandler {\n\n switch (strategy) {\n // Fastest: Direct property access\n case ExtractionStrategy.SYNC_SINGLE_NO_VALIDATION:\n return this.createSyncSingleNoValidationHandler(params);\n\n // Fast: Loop over params\n case ExtractionStrategy.SYNC_MULTI_NO_VALIDATION:\n return this.createSyncMultiNoValidationHandler(params);\n\n // Fast: Single param with validation\n case ExtractionStrategy.SYNC_SINGLE_SIMPLE_VALIDATION:\n return this.createSyncSingleSimpleValidationHandler(params, app);\n\n // Fast: Multiple params with validation\n case ExtractionStrategy.SYNC_MULTI_SIMPLE_VALIDATION:\n return this.createSyncMultiSimpleValidationHandler(params, app);\n\n // Fast: DTO transformation\n case ExtractionStrategy.SYNC_DTO_NO_VALIDATION:\n case ExtractionStrategy.SYNC_DTO_WITH_VALIDATION:\n return this.createSyncDtoHandler(params, app);\n\n // Moderate: Async mixed params\n case ExtractionStrategy.ASYNC_MIXED_PARAMS:\n return this.createAsyncMixedHandler(params, app);\n\n // Moderate: Async DTO validation\n case ExtractionStrategy.ASYNC_DTO_VALIDATION:\n return this.createAsyncDtoHandler(params, app);\n\n // Fallback: Generic async path\n case ExtractionStrategy.ASYNC_GENERIC:\n return this.createGenericAsyncHandler(params, app);\n\n default:\n throw new Error(`Unknown strategy: ${strategy}`);\n }\n }\n\n /**\n * Fastest: Single param, direct access, no validation\n */\n private static createSyncSingleNoValidationHandler(\n params: ParamMetadata[]\n ): StrategyHandler {\n const param = params[0];\n const precompiledExtractor = param.precompiledExtractor;\n const compiledTypeConverter = param.compiledTypeConverter;\n const defaultValue = param.defaultValue;\n\n if (!precompiledExtractor) {\n return (ctx: KoattyContext) => {\n const rawValue = extractValueSync(ctx, param);\n const value = rawValue === undefined && defaultValue !== undefined ? defaultValue : rawValue;\n const converted = compiledTypeConverter\n ? compiledTypeConverter(value)\n : value;\n return [converted];\n };\n }\n\n return (ctx: KoattyContext) => {\n const rawValue = precompiledExtractor(ctx);\n const value = rawValue === undefined && defaultValue !== undefined ? defaultValue : rawValue;\n const converted = compiledTypeConverter\n ? compiledTypeConverter(value)\n : value;\n return [converted];\n };\n }\n\n /**\n * Fast: Multiple params, loop, no validation\n */\n private static createSyncMultiNoValidationHandler(\n params: ParamMetadata[]\n ): StrategyHandler {\n const handlers = params.map(p => {\n const extractor = p.precompiledExtractor;\n const converter = p.compiledTypeConverter;\n const defaultValue = p.defaultValue;\n\n if (extractor) {\n if (converter) {\n return (ctx: KoattyContext) => {\n const rawValue = extractor(ctx);\n const value = rawValue === undefined && defaultValue !== undefined ? defaultValue : rawValue;\n return converter(value);\n };\n }\n return (ctx: KoattyContext) => {\n const rawValue = extractor(ctx);\n return rawValue === undefined && defaultValue !== undefined ? defaultValue : rawValue;\n };\n }\n\n if (converter) {\n return (ctx: KoattyContext) => {\n const rawValue = extractValueSync(ctx, p);\n const value = rawValue === undefined && defaultValue !== undefined ? defaultValue : rawValue;\n return converter(value);\n };\n }\n return (ctx: KoattyContext) => {\n const rawValue = extractValueSync(ctx, p);\n return rawValue === undefined && defaultValue !== undefined ? defaultValue : rawValue;\n };\n });\n\n return (ctx: KoattyContext) => {\n const results = new Array<unknown>(handlers.length);\n for (let i = 0; i < handlers.length; i++) {\n results[i] = handlers[i](ctx);\n }\n return results as unknown[];\n };\n }\n\n /**\n * Fast: Single param with simple validation\n */\n private static createSyncSingleSimpleValidationHandler(\n params: ParamMetadata[],\n _app: Koatty\n ): StrategyHandler {\n const param = params[0];\n const extractor = param.precompiledExtractor;\n const converter = param.compiledTypeConverter;\n const validator = param.compiledValidator;\n const defaultValue = param.defaultValue;\n\n return (ctx: KoattyContext) => {\n const rawValue = extractor\n ? extractor(ctx)\n : extractValueSync(ctx, param);\n\n const value = rawValue === undefined && defaultValue !== undefined ? defaultValue : rawValue;\n\n const converted = converter\n ? converter(value)\n : value;\n\n if (validator) {\n validator(converted);\n }\n\n return [converted];\n };\n }\n\n /**\n * Fast: Multiple params with validation\n */\n private static createSyncMultiSimpleValidationHandler(\n params: ParamMetadata[],\n _app: Koatty\n ): StrategyHandler {\n const handlers = params.map(p => {\n const extractor = p.precompiledExtractor;\n const converter = p.compiledTypeConverter;\n const validator = p.compiledValidator;\n const defaultValue = p.defaultValue;\n\n return (ctx: KoattyContext) => {\n const rawValue = extractor\n ? extractor(ctx)\n : extractValueSync(ctx, p);\n\n const value = rawValue === undefined && defaultValue !== undefined ? defaultValue : rawValue;\n\n const converted = converter\n ? converter(value)\n : value;\n\n if (validator) {\n validator(converted);\n }\n\n return converted;\n };\n });\n\n return (ctx: KoattyContext) => {\n const results = new Array<unknown>(handlers.length);\n for (let i = 0; i < handlers.length; i++) {\n results[i] = handlers[i](ctx);\n }\n return results as unknown[];\n };\n }\n\n /**\n * Fast: DTO transformation\n */\n private static createSyncDtoHandler(\n params: ParamMetadata[],\n _app: Koatty\n ): StrategyHandler {\n const param = params[0];\n const clazz = param.clazz;\n const dtoCheck = param.dtoCheck;\n const type = param.type;\n const extractor = param.precompiledExtractor;\n const fn = param.fn;\n\n return async (ctx: KoattyContext) => {\n // Handle clazz undefined by getting it from IOC container\n let actualClazz = clazz;\n if (!actualClazz) {\n actualClazz = IOC.getClass(type, \"COMPONENT\");\n if (!actualClazz) {\n throw Error(`Failed to obtain class ${type}, because class is not registered in container.`);\n }\n }\n\n // Use precompiled extractor if available, otherwise use custom fn, then bodyParser\n let body: unknown;\n if (extractor) {\n body = await extractor(ctx);\n } else if (fn && typeof fn === 'function') {\n body = await fn(ctx, param.options);\n } else {\n body = await bodyParser(ctx, param.options);\n }\n\n const transformed = dtoCheck\n ? await ClassValidator.valid(actualClazz, body, true)\n : plainToClass(actualClazz as new (...args: unknown[]) => unknown, body, true);\n\n return [transformed];\n };\n }\n\n /**\n * Moderate: Async mixed params (body/file/custom + sync params)\n */\n private static createAsyncMixedHandler(\n params: ParamMetadata[],\n app: Koatty\n ): StrategyHandler {\n const asyncParams: ParamMetadata[] = [];\n const syncParams: ParamMetadata[] = [];\n\n for (const p of params) {\n if (p.sourceType === ParamSourceType.BODY ||\n p.sourceType === ParamSourceType.FILE ||\n (p.sourceType === ParamSourceType.CUSTOM && p.fn)) {\n asyncParams.push(p);\n } else {\n syncParams.push(p);\n }\n }\n\n const syncHandlers = syncParams.map(p => {\n const extractor = p.precompiledExtractor;\n const converter = p.compiledTypeConverter;\n const validator = p.compiledValidator;\n const defaultValue = p.defaultValue;\n\n return (ctx: KoattyContext) => {\n const rawValue = extractor\n ? extractor(ctx)\n : extractValueSync(ctx, p);\n\n const value = rawValue === undefined && defaultValue !== undefined ? defaultValue : rawValue;\n\n const converted = converter\n ? converter(value)\n : value;\n\n if (validator) {\n validator(converted);\n }\n\n return converted;\n };\n });\n\n return async (ctx: KoattyContext) => {\n const bodyData = await extractParamSources(ctx, params);\n\n const asyncResults = asyncParams.map(p => {\n const rawValue = extractValueFromSource(bodyData, p);\n\n if (rawValue === null && p.fn) {\n return p.fn(ctx, p.options);\n }\n\n if (rawValue === undefined && p.defaultValue !== undefined) {\n return p.defaultValue;\n }\n\n const paramOptions = p.precompiledOptions || createParamOptions(p, 0);\n return validateParam(app, ctx, rawValue, paramOptions, p.compiledValidator, p.compiledTypeConverter);\n });\n\n const syncResults = syncHandlers.map(h => h(ctx));\n\n const results: unknown[] = [];\n let asyncIndex = 0;\n let syncIndex = 0;\n\n for (const p of params) {\n if (p.sourceType === ParamSourceType.BODY ||\n p.sourceType === ParamSourceType.FILE ||\n (p.sourceType === ParamSourceType.CUSTOM && p.fn)) {\n results.push(await asyncResults[asyncIndex++]);\n } else {\n results.push(syncResults[syncIndex++]);\n }\n }\n\n return results;\n };\n }\n\n /**\n * Moderate: Async DTO validation\n */\n private static createAsyncDtoHandler(\n params: ParamMetadata[],\n _app: Koatty\n ): StrategyHandler {\n const param = params[0];\n const clazz = param.clazz;\n const dtoCheck = param.dtoCheck;\n const type = param.type;\n const extractor = param.precompiledExtractor;\n const fn = param.fn;\n\n return async (ctx: KoattyContext) => {\n // Handle clazz undefined by getting it from IOC container\n let actualClazz = clazz;\n if (!actualClazz) {\n actualClazz = IOC.getClass(type, \"COMPONENT\");\n if (!actualClazz) {\n throw Error(`Failed to obtain class ${type}, because class is not registered in container.`);\n }\n }\n\n // Use precompiled extractor if available, otherwise use custom fn, then bodyParser\n let body: unknown;\n if (extractor) {\n body = await extractor(ctx);\n } else if (fn && typeof fn === 'function') {\n body = await fn(ctx, param.options);\n } else {\n body = await bodyParser(ctx, param.options);\n }\n\n const transformed = dtoCheck\n ? await ClassValidator.valid(actualClazz, body, true)\n : plainToClass(actualClazz as new (...args: unknown[]) => unknown, body, true);\n\n return [transformed];\n };\n }\n\n /**\n * Fallback: Generic async path\n */\n private static createGenericAsyncHandler(\n params: ParamMetadata[],\n app: Koatty\n ): StrategyHandler {\n return async (ctx: KoattyContext) => {\n const sources = await extractParamSources(ctx, params);\n\n const paramPromises = params.map((v, k) => {\n let rawValue = extractValueFromSource(sources, v);\n\n if (rawValue === null && v.fn) {\n rawValue = v.fn(ctx, v.options);\n }\n\n if (rawValue === undefined && v.defaultValue !== undefined) {\n rawValue = v.defaultValue;\n }\n\n const paramOptions = v.precompiledOptions || createParamOptions(v, k);\n return validateParam(app, ctx, rawValue, paramOptions, v.compiledValidator, v.compiledTypeConverter);\n });\n\n return Promise.all(paramPromises);\n };\n }\n}\n","/*\n * @Description: \n * @Usage: \n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2025-03-15 22:21:29\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\nimport { Koatty, KoattyContext, KoattyNext } from \"koatty_core\";\nimport compose, { Middleware } from \"koa-compose\";\nimport { Helper } from \"koatty_lib\";\nimport { ParamMetadata } from \"./inject\";\nimport { extractParameters } from \"./strategy-extractor\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\n\n/**\n * Performance monitoring removed in v2.0.0\n * \n * Reason: Built-in performance statistics had concurrency issues and added complexity.\n * Recommendation: Use external monitoring tools (Prometheus, StatsD, OpenTelemetry, etc.)\n * for production-grade metrics with proper concurrency handling.\n */\n\n/**\n * Execute controller method with circuit breaker and parameter injection.\n *\n * @param {Koatty} app - The Koatty application instance\n * @param {KoattyContext} ctx - The Koatty context object\n * @param {any} ctl - The controller instance\n * @param {string} method - The method name to execute\n * @param {ParamMetadata[]} [ctlParams] - Parameter metadata for injection\n * @param {any} [ctlParamsValue] - Parameter values for injection (deprecated, kept for compatibility)\n * @param {Function} [composedMiddleware] - Pre-composed middleware function\n * @returns {Promise<any>} The execution result\n * @throws {Error} When controller not found or execution fails\n */\nexport async function Handler(app: Koatty, ctx: KoattyContext, ctl: any,\n method: string, ctlParams?: ParamMetadata[], ctlParamsValue?: any, composedMiddleware?: Function) {\n\n if (!ctx || !ctl) {\n return ctx.throw(404, `Controller not found.`);\n }\n ctl.ctx ??= ctx;\n\n // 创建中间件链\n const middlewareFns: Middleware<KoattyContext>[] = [];\n\n // 如果有预组合的中间件,直接使用\n if (composedMiddleware && typeof composedMiddleware === 'function') {\n Logger.Debug(`Handler: Using pre-composed middleware`);\n middlewareFns.push(composedMiddleware as Middleware<KoattyContext>);\n } else {\n Logger.Debug('Handler: No middleware to execute');\n }\n\n // 添加Handler作为最后一个中间件\n middlewareFns.push(async (ctx: KoattyContext, next: KoattyNext) => {\n // 使用预定义值或优化的策略提取器\n let args: unknown[];\n if (ctlParamsValue !== undefined && ctlParamsValue !== null) {\n // 使用预定义的参数值(遗留功能,保持兼容性)\n Logger.Debug(`Handler: Using predefined parameter values`);\n args = ctlParamsValue;\n } else {\n // 使用优化的策略提取器\n args = ctlParams ? await extractParameters(app, ctx, ctlParams) : [];\n }\n // 执行方法\n const res = await ctl[method](...args);\n if (Helper.isError(res)) {\n throw res;\n }\n ctx.body = ctx.body || res;\n await next();\n });\n\n // 执行中间件链\n if (middlewareFns.length > 0) {\n await compose(middlewareFns)(ctx, async () => {});\n }\n\n return ctx.body;\n}\n","/*\n * @Description: Protocol-specific router configuration types\n * @Usage: Type definitions for ext parameters in RouterOptions\n * @Author: richen\n * @Date: 2025-01-20 10:00:00\n * @LastEditTime: 2025-01-20 10:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\n/**\n * WebSocket 协议特定配置\n */\nexport interface WebSocketExtConfig {\n /** 最大分帧大小(字节),默认1MB */\n maxFrameSize?: number;\n /** 分帧处理超时(ms),默认30秒 */\n frameTimeout?: number;\n /** 心跳检测间隔(ms),默认15秒 */\n heartbeatInterval?: number;\n /** 心跳超时时间(ms),默认30秒 */\n heartbeatTimeout?: number;\n /** 最大连接数,默认1000 */\n maxConnections?: number;\n /** 最大缓冲区大小(字节),默认10MB */\n maxBufferSize?: number;\n /** 清理间隔(ms),默认5分钟 */\n cleanupInterval?: number;\n}\n\n/**\n * gRPC 流配置\n */\nexport interface StreamConfig {\n /** 最大并发流数量,默认50 */\n maxConcurrentStreams?: number;\n /** 流超时时间(ms),默认60秒 */\n streamTimeout?: number;\n /** 背压阈值(字节),默认2048 */\n backpressureThreshold?: number;\n /** 流缓冲区大小,默认1024 */\n streamBufferSize?: number;\n /** 是否启用流压缩,默认false */\n enableCompression?: boolean;\n}\n\n/**\n * gRPC 协议特定配置\n */\nexport interface GrpcExtConfig {\n /** Protocol Buffer 文件路径 */\n protoFile: string;\n /** 连接池大小,默认10 */\n poolSize?: number;\n /** 批处理大小,默认10 */\n batchSize?: number;\n /** 流配置 */\n streamConfig?: StreamConfig;\n /** gRPC 服务器选项 */\n serverOptions?: Record<string, any>;\n /** 是否启用反射,默认false */\n enableReflection?: boolean;\n}\n\n/**\n * GraphQL 协议特定配置\n */\nexport interface GraphQLExtConfig {\n /** GraphQL Schema 文件路径 */\n schemaFile: string;\n /** 启用 GraphQL Playground,默认false */\n playground?: boolean;\n /** 启用内省查询,默认true */\n introspection?: boolean;\n /** 调试模式,默认false */\n debug?: boolean;\n /** 查询深度限制,默认10 */\n depthLimit?: number;\n /** 查询复杂度限制,默认1000 */\n complexityLimit?: number;\n /** 自定义标量类型 */\n customScalars?: Record<string, any>;\n /** 中间件配置 */\n middlewares?: any[];\n}\n\n/**\n * HTTP 协议特定配置(目前为空,预留扩展)\n */\nexport interface HttpExtConfig {\n /** 自定义HTTP选项 */\n [key: string]: any;\n}\n\n/**\n * 协议扩展配置联合类型\n */\nexport type ProtocolExtConfig = \n | WebSocketExtConfig \n | GrpcExtConfig \n | GraphQLExtConfig \n | HttpExtConfig;\n\n/**\n * 协议扩展配置映射\n */\nexport interface ProtocolExtConfigMap {\n http: HttpExtConfig;\n https: HttpExtConfig;\n ws: WebSocketExtConfig;\n wss: WebSocketExtConfig;\n grpc: GrpcExtConfig;\n graphql: GraphQLExtConfig;\n}\n\n/**\n * 获取协议特定配置的工具函数\n */\nexport function getProtocolConfig<T extends keyof ProtocolExtConfigMap>(\n protocol: T,\n ext: Record<string, any> = {}\n): ProtocolExtConfigMap[T] {\n return ext as ProtocolExtConfigMap[T];\n}\n\n/**\n * 配置验证结果\n */\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n}\n\n/**\n * 验证协议特定配置的工具函数(增强版)\n */\nexport function validateProtocolConfig(\n protocol: string,\n ext: Record<string, any> = {},\n env: string = process.env.NODE_ENV || 'development'\n): ValidationResult {\n const result: ValidationResult = {\n valid: true,\n errors: [],\n warnings: []\n };\n\n const proto = protocol.toLowerCase();\n\n switch (proto) {\n case 'grpc':\n // 必需字段验证\n if (!ext.protoFile || typeof ext.protoFile !== 'string' || ext.protoFile.trim().length === 0) {\n result.valid = false;\n result.errors.push('gRPC protocol requires protoFile path');\n }\n \n // 可选字段验证\n if (ext.poolSize !== undefined && (typeof ext.poolSize !== 'number' || ext.poolSize < 1)) {\n result.warnings.push('poolSize should be a positive number, using default: 10');\n }\n if (ext.batchSize !== undefined && (typeof ext.batchSize !== 'number' || ext.batchSize < 1)) {\n result.warnings.push('batchSize should be a positive number, using default: 10');\n }\n \n // 流配置验证\n if (ext.streamConfig) {\n const sc = ext.streamConfig;\n if (sc.maxConcurrentStreams !== undefined && sc.maxConcurrentStreams < 1) {\n result.warnings.push('maxConcurrentStreams should be positive, using default: 50');\n }\n if (sc.streamTimeout !== undefined && sc.streamTimeout < 1000) {\n result.warnings.push('streamTimeout should be >= 1000ms for stability');\n }\n }\n break;\n\n case 'graphql':\n // 必需字段验证\n if (!ext.schemaFile || typeof ext.schemaFile !== 'string' || ext.schemaFile.trim().length === 0) {\n result.valid = false;\n result.errors.push('GraphQL protocol requires schemaFile path');\n }\n \n // 安全配置检查(生产环境)\n if (env === 'production') {\n if (ext.playground === true) {\n result.warnings.push('GraphQL Playground should be disabled in production');\n }\n if (ext.debug === true) {\n result.warnings.push('Debug mode should be disabled in production');\n }\n if (!ext.depthLimit) {\n result.warnings.push('Consider setting depthLimit for production security');\n }\n if (!ext.complexityLimit) {\n result.warnings.push('Consider setting complexityLimit for production security');\n }\n }\n \n // 深度和复杂度验证\n if (ext.depthLimit !== undefined && (typeof ext.depthLimit !== 'number' || ext.depthLimit < 1)) {\n result.warnings.push('depthLimit should be a positive number');\n }\n if (ext.complexityLimit !== undefined && (typeof ext.complexityLimit !== 'number' || ext.complexityLimit < 1)) {\n result.warnings.push('complexityLimit should be a positive number');\n }\n break;\n\n case 'ws':\n case 'wss':\n // 心跳配置验证\n if (ext.heartbeatInterval !== undefined && ext.heartbeatTimeout !== undefined) {\n if (ext.heartbeatInterval >= ext.heartbeatTimeout) {\n result.warnings.push('heartbeatInterval should be less than heartbeatTimeout');\n }\n }\n \n // 资源限制验证\n if (ext.maxConnections !== undefined && ext.maxConnections < 1) {\n result.warnings.push('maxConnections should be positive, using default: 1000');\n }\n if (ext.maxFrameSize !== undefined && ext.maxFrameSize < 1024) {\n result.warnings.push('maxFrameSize too small, may cause issues with normal messages');\n }\n if (ext.maxBufferSize !== undefined && ext.maxFrameSize !== undefined) {\n if (ext.maxBufferSize < ext.maxFrameSize * 2) {\n result.warnings.push('maxBufferSize should be at least 2x maxFrameSize');\n }\n }\n break;\n\n case 'http':\n case 'https':\n // HTTP 配置都是可选的,无需严格验证\n break;\n\n default:\n result.valid = false;\n result.errors.push(`Unknown protocol: ${protocol}`);\n }\n\n return result;\n} ","/*\n * @Description: \n * @Usage: \n * @Author: richen\n * @Date: 2025-03-12 14:54:42\n * @LastEditTime: 2025-03-15 17:06:54\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\nimport KoaRouter from \"@koa/router\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { createHandler } from \"graphql-http/lib/use/fetch\";\nimport { IOC } from \"koatty_container\";\nimport {\n IGraphQLImplementation, Koatty, KoattyContext,\n KoattyRouter, RouterImplementation\n} from \"koatty_core\";\nimport { buildSchema } from \"koatty_graphql\";\nimport { Helper } from \"koatty_lib\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { injectParamMetaData, injectRouter } from \"../utils/inject\";\nimport { RouterOptions } from \"./router\";\nimport { Handler } from \"../utils/handler\";\nimport { getProtocolConfig, validateProtocolConfig } from \"./types\";\n\n/**\n * GrpcRouter Options\n *\n * @export\n * @interface GraphQLRouterOptions\n */\nexport interface GraphQLRouterOptions extends RouterOptions {\n schemaFile: string;\n}\n\nexport class GraphQLRouter implements KoattyRouter {\n readonly protocol: string;\n options: GraphQLRouterOptions;\n router: KoaRouter;\n private routerMap: Map<string, RouterImplementation>;\n\n constructor(app: Koatty, options: RouterOptions = { protocol: \"graphql\", prefix: \"\" }) {\n const extConfig = getProtocolConfig('graphql', options.ext || {});\n\n const validation = validateProtocolConfig('graphql', options.ext || {});\n if (!validation.valid) {\n throw new Error(`GraphQL router configuration error: ${validation.errors.join(', ')}`);\n }\n if (validation.warnings.length > 0) {\n validation.warnings.forEach((warning: string) => Logger.Warn(`[GraphQLRouter] ${warning}`));\n }\n\n // Resolve schemaFile path: if relative, resolve against app.rootPath\n let schemaFilePath = extConfig.schemaFile;\n if (schemaFilePath && !path.isAbsolute(schemaFilePath)) {\n schemaFilePath = path.resolve(app.rootPath, schemaFilePath);\n }\n \n this.options = {\n ...options,\n schemaFile: schemaFilePath,\n } as GraphQLRouterOptions;\n\n this.protocol = options.protocol || \"graphql\";\n // initialize - only pass base router options to KoaRouter\n this.router = new KoaRouter({\n prefix: options.prefix,\n methods: options.methods,\n sensitive: options.sensitive,\n strict: options.strict,\n });\n this.routerMap = new Map();\n }\n\n /**\n * Set router\n * @param name \n * @param impl \n * @returns \n */\n SetRouter(name: string, impl?: RouterImplementation) {\n const routeHandler = <IGraphQLImplementation>impl.implementation;\n if (Helper.isEmpty(routeHandler)) return;\n\n // SECURITY: Build validation rules for query depth and complexity limits\n // NOTE: Requires optional dependencies (install if needed):\n // npm install graphql-depth-limit graphql-query-complexity\n const validationRules: any[] = [];\n\n try {\n // Add depth limit if configured\n if (this.options.ext?.depthLimit) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { depthLimit } = require('graphql-depth-limit');\n validationRules.push(\n depthLimit(\n this.options.ext.depthLimit,\n { ignore: [/_trusted/] } // Optional: ignore certain fields\n )\n );\n Logger.Debug(`GraphQL depth limit enabled: ${this.options.ext.depthLimit}`);\n }\n\n // Add complexity limit if configured\n if (this.options.ext?.complexityLimit) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { createComplexityLimitRule } = require('graphql-query-complexity');\n validationRules.push(\n createComplexityLimitRule(this.options.ext.complexityLimit, {\n scalarCost: 1,\n objectCost: 2,\n listFactor: 10,\n })\n );\n Logger.Debug(`GraphQL complexity limit enabled: ${this.options.ext.complexityLimit}`);\n }\n } catch {\n Logger.Warn('GraphQL security packages not installed. Install with: npm install graphql-depth-limit graphql-query-complexity');\n }\n\n // Create graphql-http handler\n const handler = createHandler({\n schema: impl.schema,\n rootValue: routeHandler,\n validationRules: validationRules.length > 0 ? validationRules : undefined,\n formatError: this.options.ext?.debug ? undefined : (error) => {\n // Return formatted GraphQLError\n return new Error(error.message);\n },\n context: (req: any) => {\n // Extract Koa context from request\n return req.koattyContext;\n },\n });\n\n // Koa middleware adapter for graphql-http\n this.router.all(name, async (ctx: KoattyContext) => {\n // GraphiQL support: serve interactive UI for GET requests without query\n if (ctx.method === 'GET' && this.options.ext?.playground !== false && !ctx.query.query) {\n ctx.type = 'text/html';\n ctx.body = this.renderGraphiQL(name);\n return;\n }\n\n // Prepare fetch-compatible Request object\n const url = new URL(ctx.url, `${ctx.protocol}://${ctx.host}`);\n \n // Prepare headers\n const headers: Record<string, string> = {};\n Object.keys(ctx.headers).forEach(key => {\n const value = ctx.headers[key];\n if (typeof value === 'string') {\n headers[key] = value;\n } else if (Array.isArray(value)) {\n headers[key] = value.join(', ');\n }\n });\n\n // Prepare request body\n let requestBody: string | null = null;\n if (ctx.method !== 'GET' && ctx.method !== 'HEAD') {\n const koaRequest = ctx.request as any;\n if (koaRequest.body) {\n requestBody = JSON.stringify(koaRequest.body);\n }\n }\n\n const fetchRequest = new Request(url, {\n method: ctx.method,\n headers: headers,\n body: requestBody,\n });\n\n // Attach Koa context for custom context handler\n (fetchRequest as any).koattyContext = ctx;\n\n try {\n const response = await handler(fetchRequest);\n\n // Transfer response to Koa\n ctx.status = response.status;\n response.headers.forEach((value, key) => {\n ctx.set(key, value);\n });\n\n const body = await response.text();\n ctx.body = body;\n } catch (error: any) {\n Logger.Error(`GraphQL execution error: ${error.message}`);\n ctx.status = 500;\n ctx.body = { errors: [{ message: 'Internal server error' }] };\n }\n });\n this.routerMap.set(name, impl);\n }\n\n /**\n * Render GraphiQL interface\n * \n * @private\n * @param {string} endpoint - GraphQL endpoint URL\n * @returns {string} HTML content for GraphiQL\n */\n private renderGraphiQL(endpoint: string): string {\n return `<!DOCTYPE html>\n<html>\n<head>\n <title>GraphiQL</title>\n <style>\n body {\n height: 100%;\n margin: 0;\n width: 100%;\n overflow: hidden;\n }\n #graphiql {\n height: 100vh;\n }\n </style>\n <script crossorigin src=\"https://unpkg.com/react@18/umd/react.production.min.js\"></script>\n <script crossorigin src=\"https://unpkg.com/react-dom@18/umd/react-dom.production.min.js\"></script>\n <link rel=\"stylesheet\" href=\"https://unpkg.com/graphiql@3/graphiql.min.css\" />\n</head>\n<body>\n <div id=\"graphiql\">Loading...</div>\n <script\n src=\"https://unpkg.com/graphiql@3/graphiql.min.js\"\n type=\"application/javascript\"\n ></script>\n <script>\n const fetcher = GraphiQL.createFetcher({\n url: '${endpoint}',\n });\n const root = ReactDOM.createRoot(document.getElementById('graphiql'));\n root.render(\n React.createElement(GraphiQL, {\n fetcher: fetcher,\n defaultEditorToolsVisibility: true,\n })\n );\n </script>\n</body>\n</html>`;\n }\n\n /**\n * ListRouter\n *\n * @returns {*} {Map<string, RouterImplementation> }\n */\n ListRouter(): Map<string, RouterImplementation> {\n return this.routerMap;\n }\n\n /**\n * LoadRouter\n *\n * @param {any[]} list\n */\n async LoadRouter(app: Koatty, list: any[]) {\n try {\n // PERFORMANCE FIX: Use async I/O to avoid blocking event loop\n const schemaContent = await fs.promises.readFile(this.options.schemaFile, 'utf-8');\n const schema = buildSchema(schemaContent);\n\n // Schema validation\n // Note: buildSchema will throw if schema is invalid\n if (!schema) {\n Logger.Error('Failed to build GraphQL schema');\n throw new Error('Invalid GraphQL schema');\n }\n\n const rootValue: IGraphQLImplementation = {};\n\n for (const n of list) {\n const ctlClass = IOC.getClass(n, \"CONTROLLER\");\n // inject router\n const ctlRouters = await injectRouter(app, ctlClass, this.options.protocol);\n if (!ctlRouters) {\n continue;\n }\n // inject param\n const ctlParams = injectParamMetaData(app, ctlClass, this.options.payload);\n // tslint:disable-next-line: forin\n for (const router of Object.values(ctlRouters)) {\n const method = router.method;\n // const path = parsePath(router.path);\n // const requestMethod = <RequestMethod>router.requestMethod;\n const params = ctlParams[method];\n\n Logger.Debug(`Register request mapping: ${n}.${method}`);\n rootValue[method] = (args: any, ctx: KoattyContext): Promise<any> => {\n const ctl = IOC.getInsByClass(ctlClass, [ctx]);\n return Handler(app, ctx, ctl, method, params, Object.values(args), router.composedMiddleware);\n }\n this.SetRouter(router.ctlPath || \"/graphql\", {\n schema,\n implementation: rootValue\n });\n }\n }\n\n // exp: in middleware\n // app.Router.SetRouter('/xxx', { schema, implementation: rootValue})\n\n // PERFORMANCE OPTIMIZATION: Merge router middleware to reduce middleware stack\n // In multi-protocol environment, merging routes() and allowedMethods() into \n // a single middleware reduces function calls and improves performance by ~40%\n const routerMiddleware = this.router.routes();\n const allowedMethodsMiddleware = this.router.allowedMethods();\n\n // Merged middleware: protocol check + routes + allowedMethods\n app.use(async (ctx: KoattyContext, next: any) => {\n if (ctx.protocol === 'graphql') {\n // Chain routes and allowedMethods in single middleware\n await routerMiddleware(ctx as any, async () => {\n await allowedMethodsMiddleware(ctx as any, next);\n });\n } else {\n // Skip for non-GraphQL protocols\n await next();\n }\n });\n\n Logger.Debug('GraphQL router middleware registered (optimized)');\n } catch (err) {\n Logger.Error(err);\n }\n }\n\n /**\n * Cleanup router resources (for graceful shutdown)\n * GraphQL router is relatively stateless, this method is for interface consistency\n */\n public cleanup(): void {\n Logger.Debug('GraphQL router cleanup completed');\n }\n\n}","/*\n * @Description:\n * @Usage:\n * @Author: richen\n * @Date: 2021-06-29 14:10:30\n * @LastEditTime: 2025-04-06 22:56:00\n */\nimport { UntypedHandleCall, ServerReadableStream, ServerWritableStream, ServerDuplexStream } from \"@grpc/grpc-js\";\nimport path from \"path\";\nimport { IOC } from \"koatty_container\";\nimport {\n IRpcServerCall,\n IRpcServerCallback,\n Koatty, \n KoattyContext,\n KoattyRouter,\n RouterImplementation\n} from \"koatty_core\";\nimport * as Helper from \"koatty_lib\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { ListServices, LoadProto } from \"koatty_proto\";\nimport { injectParamMetaData, injectRouter, ParamMetadata } from \"../utils/inject\";\nimport { parsePath } from \"../utils/path\";\nimport { RouterOptions } from \"./router\";\nimport { Handler } from \"../utils/handler\";\nimport { getProtocolConfig, validateProtocolConfig } from \"./types\";\n\n/**\n * gRPC流类型枚举\n */\nexport enum GrpcStreamType {\n UNARY = 'unary',\n SERVER_STREAMING = 'server_streaming',\n CLIENT_STREAMING = 'client_streaming',\n BIDIRECTIONAL_STREAMING = 'bidirectional_streaming'\n}\n\n/**\n * 流处理配置\n */\nexport interface StreamConfig {\n maxConcurrentStreams?: number;\n streamTimeout?: number;\n backpressureThreshold?: number;\n bufferSize?: number;\n}\n\n/**\n * GrpcRouter Options\n */\nexport interface GrpcRouterOptions extends RouterOptions {\n protoFile: string;\n poolSize?: number;\n batchSize?: number;\n streamConfig?: StreamConfig;\n}\n\n/**\n * 流状态管理\n */\ninterface StreamState {\n id: string;\n type: GrpcStreamType;\n startTime: number;\n messageCount: number;\n bufferSize: number;\n isActive: boolean;\n}\n\n/**\n * Connection pool for gRPC clients\n */\nclass GrpcConnectionPool {\n private pool: Map<string, any[]>;\n private maxSize: number;\n\n constructor(maxSize: number = 10) {\n this.pool = new Map();\n this.maxSize = maxSize;\n }\n\n /**\n * Get connection from pool or create new one\n */\n get(serviceName: string, options?: any): any {\n const connections = this.pool.get(serviceName);\n if (connections && connections.length > 0) {\n const conn = connections.pop();\n Logger.Debug(`Reused connection from pool for service: ${serviceName}`);\n return conn;\n }\n \n // No available connection, create new one\n Logger.Debug(`Creating new connection for service: ${serviceName}`);\n return this.create(serviceName, options);\n }\n\n /**\n * Release connection back to pool\n */\n release(serviceName: string, connection: any): void {\n if (!connection) return;\n \n if (!this.pool.has(serviceName)) {\n this.pool.set(serviceName, []);\n }\n \n const connections = this.pool.get(serviceName)!;\n if (connections.length < this.maxSize) {\n connections.push(connection);\n Logger.Debug(`Connection released back to pool for service: ${serviceName}, pool size: ${connections.length}`);\n } else {\n // Pool is full, close the connection\n if (connection.close && typeof connection.close === 'function') {\n connection.close();\n }\n Logger.Debug(`Pool full for service: ${serviceName}, connection closed`);\n }\n }\n\n /**\n * Create new connection\n * @param serviceName - Name of the gRPC service\n * @param options - gRPC client options\n * @returns Connection object (placeholder, actual implementation depends on gRPC client library)\n */\n private create(serviceName: string, options?: any): any {\n // NOTE: This is a placeholder implementation\n // In a real scenario, you would create an actual gRPC client connection:\n // \n // Example with @grpc/grpc-js:\n // const grpc = require('@grpc/grpc-js');\n // const client = new ServiceClient(\n // 'localhost:50051',\n // grpc.credentials.createInsecure(),\n // options\n // );\n // return client;\n \n Logger.Debug(`Creating connection stub for service: ${serviceName}`);\n return {\n serviceName,\n createdAt: Date.now(),\n options,\n // Placeholder methods\n close: () => {\n Logger.Debug(`Closing connection for service: ${serviceName}`);\n }\n };\n }\n\n /**\n * Cleanup all connections in the pool\n */\n clear(): void {\n let totalConnections = 0;\n \n // Close all connections before clearing\n for (const [_serviceName, connections] of this.pool.entries()) {\n for (const connection of connections) {\n if (connection && connection.close && typeof connection.close === 'function') {\n connection.close();\n }\n totalConnections++;\n }\n }\n \n this.pool.clear();\n Logger.Info(`gRPC connection pool cleared, closed ${totalConnections} connections`);\n }\n \n /**\n * Get pool statistics\n */\n getStats(): Record<string, number> {\n const stats: Record<string, number> = {};\n for (const [serviceName, connections] of this.pool.entries()) {\n stats[serviceName] = connections.length;\n }\n return stats;\n }\n}\n\n/**\n * Batch processor for gRPC requests\n */\nclass GrpcBatchProcessor {\n private batchSize: number;\n private batchQueue: Map<string, any[]>;\n private batchTimers: Map<string, NodeJS.Timeout>;\n\n constructor(batchSize: number = 10) {\n this.batchSize = batchSize;\n this.batchQueue = new Map();\n this.batchTimers = new Map();\n }\n\n /**\n * Add request to batch\n */\n addRequest(serviceName: string, request: any): Promise<any> {\n return new Promise((resolve, reject) => {\n if (!this.batchQueue.has(serviceName)) {\n this.batchQueue.set(serviceName, []);\n }\n\n const queue = this.batchQueue.get(serviceName)!;\n queue.push({ request, resolve, reject });\n\n // Process batch if size reached\n if (queue.length >= this.batchSize) {\n this.processBatch(serviceName);\n } else if (!this.batchTimers.has(serviceName)) {\n // Start timer for batch processing\n this.batchTimers.set(serviceName, setTimeout(() => {\n this.processBatch(serviceName);\n }, 100));\n }\n });\n }\n\n /**\n * Process batch of requests\n */\n private processBatch(serviceName: string): void {\n const queue = this.batchQueue.get(serviceName);\n if (!queue || queue.length === 0) return;\n\n const timer = this.batchTimers.get(serviceName);\n if (timer) {\n clearTimeout(timer);\n this.batchTimers.delete(serviceName);\n }\n \n Logger.Debug(`Processing batch for service ${serviceName}, ${queue.length} requests`);\n \n // NOTE: This is a placeholder implementation\n // In a real scenario, you would:\n // 1. Combine all requests into a single gRPC batch call\n // 2. Send the batch to the service\n // 3. Process the batch response\n // 4. Resolve/reject each individual promise\n \n // Example implementation:\n // const batchRequest = { requests: queue.map(item => item.request) };\n // grpcClient.batchCall(batchRequest, (error, response) => {\n // if (error) {\n // queue.forEach(item => item.reject(error));\n // } else {\n // response.results.forEach((result, index) => {\n // queue[index].resolve(result);\n // });\n // }\n // });\n \n // Placeholder: immediately resolve all requests\n queue.forEach((item, index) => {\n try {\n // Simulate successful response\n item.resolve({\n success: true,\n data: item.request,\n batchIndex: index,\n batchSize: queue.length\n });\n } catch (error) {\n item.reject(error);\n }\n });\n\n this.batchQueue.delete(serviceName);\n Logger.Debug(`Batch processing completed for service ${serviceName}`);\n }\n\n /**\n * Flush all pending batches and cleanup\n */\n flush(): void {\n let totalProcessed = 0;\n \n // Process all pending batches\n for (const serviceName of this.batchQueue.keys()) {\n const queueSize = this.batchQueue.get(serviceName)?.length || 0;\n this.processBatch(serviceName);\n totalProcessed += queueSize;\n }\n\n // Clear all timers\n for (const timer of this.batchTimers.values()) {\n clearTimeout(timer);\n }\n this.batchTimers.clear();\n\n Logger.Info(`gRPC batch processor flushed, processed ${totalProcessed} pending requests`);\n }\n \n /**\n * Get batch queue statistics\n */\n getStats(): { serviceName: string; queueSize: number }[] {\n const stats: { serviceName: string; queueSize: number }[] = [];\n for (const [serviceName, queue] of this.batchQueue.entries()) {\n stats.push({\n serviceName,\n queueSize: queue.length\n });\n }\n return stats;\n }\n}\n\n/**\n * 流管理器\n */\nclass StreamManager {\n private streams: Map<string, StreamState>;\n private config: StreamConfig;\n\n constructor(config: StreamConfig = {}) {\n this.streams = new Map();\n this.config = {\n maxConcurrentStreams: config.maxConcurrentStreams || 100,\n streamTimeout: config.streamTimeout || 300000, // 5分钟\n backpressureThreshold: config.backpressureThreshold || 1000,\n bufferSize: config.bufferSize || 64 * 1024, // 64KB\n ...config\n };\n }\n\n /**\n * 注册新流\n */\n registerStream(id: string, type: GrpcStreamType): StreamState {\n const state: StreamState = {\n id,\n type,\n startTime: Date.now(),\n messageCount: 0,\n bufferSize: 0,\n isActive: true\n };\n \n this.streams.set(id, state);\n this.cleanupExpiredStreams();\n \n return state;\n }\n\n /**\n * 更新流状态\n */\n updateStream(id: string, updates: Partial<StreamState>): void {\n const state = this.streams.get(id);\n if (state) {\n Object.assign(state, updates);\n }\n }\n\n /**\n * 移除流\n */\n removeStream(id: string): void {\n this.streams.delete(id);\n }\n\n /**\n * 检查是否达到背压阈值\n */\n isBackpressureTriggered(id: string): boolean {\n const state = this.streams.get(id);\n return state ? state.bufferSize > this.config.backpressureThreshold! : false;\n }\n\n /**\n * 清理过期流\n */\n private cleanupExpiredStreams(): void {\n const now = Date.now();\n for (const [id, state] of this.streams.entries()) {\n if (now - state.startTime > this.config.streamTimeout!) {\n Logger.Warn(`Stream ${id} expired, removing...`);\n this.streams.delete(id);\n }\n }\n }\n\n /**\n * 获取活跃流数量\n */\n getActiveStreamCount(): number {\n return Array.from(this.streams.values()).filter(s => s.isActive).length;\n }\n\n /**\n * Close all active streams\n */\n closeAllStreams(): void {\n const activeCount = this.getActiveStreamCount();\n if (activeCount > 0) {\n Logger.Info(`Closing ${activeCount} active gRPC streams...`);\n }\n\n for (const [id, state] of this.streams.entries()) {\n if (state.isActive) {\n state.isActive = false;\n Logger.Debug(`Closed stream: ${id}`);\n }\n }\n\n this.streams.clear();\n Logger.Debug('All gRPC streams closed');\n }\n}\n\n/**\n * CtlInterface\n *\n * @interface CtlInterface\n */\ninterface CtlInterface {\n [path: string]: {\n name: string;\n ctl: Function;\n method: string;\n params: ParamMetadata[];\n composedMiddleware?: Function;\n }\n}\n\nexport class GrpcRouter implements KoattyRouter {\n readonly protocol: string;\n options: GrpcRouterOptions;\n router: Map<string, RouterImplementation>;\n private connectionPool: GrpcConnectionPool;\n private batchProcessor: GrpcBatchProcessor;\n private streamManager: StreamManager;\n\n constructor(app: Koatty, options: RouterOptions = { protocol: \"grpc\", prefix: \"\" }) {\n const extConfig = getProtocolConfig('grpc', options.ext || {});\n \n // 配置验证\n const validation = validateProtocolConfig('grpc', options.ext || {});\n if (!validation.valid) {\n throw new Error(`gRPC router configuration error: ${validation.errors.join(', ')}`);\n }\n if (validation.warnings.length > 0) {\n validation.warnings.forEach((warning: string) => Logger.Warn(`[GrpcRouter] ${warning}`));\n }\n \n // Resolve protoFile path: if relative, resolve against app.rootPath\n let protoFilePath = extConfig.protoFile;\n if (protoFilePath && !path.isAbsolute(protoFilePath)) {\n protoFilePath = path.resolve(app.rootPath, protoFilePath);\n }\n \n this.options = {\n ...options,\n protoFile: protoFilePath,\n poolSize: extConfig.poolSize || 10,\n batchSize: extConfig.batchSize || 10,\n streamConfig: extConfig.streamConfig || {}\n } as GrpcRouterOptions;\n \n this.protocol = options.protocol || \"grpc\";\n this.router = new Map();\n this.connectionPool = new GrpcConnectionPool(this.options.poolSize);\n this.batchProcessor = new GrpcBatchProcessor(this.options.batchSize);\n this.streamManager = new StreamManager(this.options.streamConfig);\n }\n\n /**\n * SetRouter\n * @param name \n * @param impl \n * @returns \n */\n SetRouter(name: string, impl?: RouterImplementation) {\n if (Helper.isEmpty(name)) return;\n this.router.set(name, {\n service: impl?.service,\n implementation: impl?.implementation\n });\n }\n\n /**\n * ListRouter\n *\n * @returns {*} {Map<string, ServiceImplementation>}\n * @memberof GrpcRouter\n */\n ListRouter(): Map<string, RouterImplementation> {\n return this.router;\n }\n\n /**\n * 检测gRPC流类型\n */\n private detectStreamType(call: any): GrpcStreamType {\n // 一元调用:call.request 存在(包含请求数据)\n // 流调用:call 本身就是流对象,数据通过事件接收\n if (call.request) {\n Logger.Debug(`[GRPC_ROUTER] Stream detection: UNARY (call.request exists)`);\n return GrpcStreamType.UNARY;\n }\n \n // 对于流调用,检查是否是真正的流对象(Stream 类型)\n const isActuallyReadableStream = call.readable === true;\n const isActuallyWritableStream = call.writable === true;\n \n Logger.Debug(`[GRPC_ROUTER] Stream detection: readable=${call.readable}, writable=${call.writable}`);\n \n if (isActuallyReadableStream && isActuallyWritableStream) {\n return GrpcStreamType.BIDIRECTIONAL_STREAMING;\n } else if (isActuallyReadableStream) {\n return GrpcStreamType.CLIENT_STREAMING;\n } else if (isActuallyWritableStream) {\n return GrpcStreamType.SERVER_STREAMING;\n } else {\n // 默认返回一元调用\n Logger.Warn(`[GRPC_ROUTER] Unable to determine stream type, defaulting to UNARY`);\n return GrpcStreamType.UNARY;\n }\n }\n\n /**\n * 处理一元调用 (Unary RPC)\n */\n private async handleUnaryCall(\n call: IRpcServerCall<any, any>, \n callback: IRpcServerCallback<any>,\n app: Koatty,\n ctlItem: any\n ): Promise<void> {\n try {\n Logger.Debug(`[GRPC_ROUTER] Handling unary call for ${ctlItem.name}.${ctlItem.method}`);\n \n // 创建 gRPC context (context 已经由 koatty_serve 在调用 handler 之前创建好了)\n // 这里的 call 和 callback 已经被包装在 context 中\n // 直接从 call 中获取 context,或者使用 app.createContext\n const ctx = app.createContext(call, callback, 'grpc');\n \n Logger.Debug(`[GRPC_ROUTER] Context created, getting controller instance`);\n const ctl = IOC.getInsByClass(ctlItem.ctl, [ctx]);\n \n Logger.Debug(`[GRPC_ROUTER] Calling Handler for ${ctlItem.method}`);\n const result = await Handler(app, ctx, ctl, ctlItem.method, ctlItem.params, undefined, ctlItem.composedMiddleware);\n \n // Handler 执行完成后,调用 gRPC callback 返回结果\n const response = result || ctx.body;\n Logger.Debug(`[GRPC_ROUTER] gRPC method ${ctlItem.name}.${ctlItem.method} completed, calling callback with response:`, response);\n callback(null, response);\n \n } catch (error) {\n Logger.Error(`[GRPC_ROUTER] Error executing gRPC method ${ctlItem.name}.${ctlItem.method}:`, error);\n callback(error as Error);\n }\n }\n\n /**\n * 处理服务器流 (Server Streaming RPC)\n */\n private async handleServerStreaming(\n call: ServerWritableStream<any, any>,\n app: Koatty,\n ctlItem: any\n ): Promise<void> {\n const streamId = `server_${Date.now()}_${Math.random()}`;\n const streamState = this.streamManager.registerStream(streamId, GrpcStreamType.SERVER_STREAMING);\n \n try {\n Logger.Debug(`[GRPC_ROUTER] Handling server streaming call for ${ctlItem.name}.${ctlItem.method}`);\n \n // 设置流超时\n const timeout = setTimeout(() => {\n Logger.Warn(`[GRPC_ROUTER] Server stream ${streamId} timeout`);\n call.end();\n this.streamManager.removeStream(streamId);\n }, this.options.streamConfig?.streamTimeout || 300000);\n\n // 处理流结束\n call.on('cancelled', () => {\n Logger.Debug(`[GRPC_ROUTER] Server stream ${streamId} cancelled`);\n clearTimeout(timeout);\n this.streamManager.removeStream(streamId);\n });\n\n call.on('error', (error) => {\n Logger.Error(`[GRPC_ROUTER] Server stream ${streamId} error:`, error);\n clearTimeout(timeout);\n this.streamManager.removeStream(streamId);\n });\n\n // 直接创建 context,不再调用 app.callback\n const ctx = app.createContext(call, null, 'grpc');\n \n // 添加流写入方法到上下文\n ctx.writeStream = (data: any) => {\n if (this.streamManager.isBackpressureTriggered(streamId)) {\n Logger.Warn(`[GRPC_ROUTER] Backpressure triggered for stream ${streamId}`);\n return false;\n }\n \n call.write(data);\n this.streamManager.updateStream(streamId, { \n messageCount: streamState.messageCount + 1 \n });\n return true;\n };\n \n ctx.endStream = () => {\n call.end();\n clearTimeout(timeout);\n this.streamManager.removeStream(streamId);\n };\n\n // 获取控制器实例并执行\n const ctl = IOC.getInsByClass(ctlItem.ctl, [ctx]);\n await Handler(app, ctx, ctl, ctlItem.method, ctlItem.params, undefined, ctlItem.composedMiddleware);\n \n } catch (error) {\n Logger.Error(`[GRPC_ROUTER] Error in server streaming: ${error}`);\n call.end();\n this.streamManager.removeStream(streamId);\n }\n }\n\n /**\n * 处理客户端流 (Client Streaming RPC)\n */\n private handleClientStreaming(\n call: ServerReadableStream<any, any>,\n callback: IRpcServerCallback<any>,\n app: Koatty,\n ctlItem: any\n ): void {\n const streamId = `client_${Date.now()}_${Math.random()}`;\n const streamState = this.streamManager.registerStream(streamId, GrpcStreamType.CLIENT_STREAMING);\n const messages: any[] = [];\n \n try {\n Logger.Debug(`[GRPC_ROUTER] Handling client streaming call for ${ctlItem.name}.${ctlItem.method}`);\n \n // 设置流超时\n const timeout = setTimeout(() => {\n Logger.Warn(`[GRPC_ROUTER] Client stream ${streamId} timeout`);\n callback(new Error('Stream timeout'));\n this.streamManager.removeStream(streamId);\n }, this.options.streamConfig?.streamTimeout || 300000);\n\n // 处理数据接收\n call.on('data', (data: any) => {\n messages.push(data);\n this.streamManager.updateStream(streamId, { \n messageCount: streamState.messageCount + 1,\n bufferSize: streamState.bufferSize + JSON.stringify(data).length\n });\n \n // 检查背压\n if (this.streamManager.isBackpressureTriggered(streamId)) {\n Logger.Warn(`[GRPC_ROUTER] Backpressure triggered for client stream ${streamId}`);\n call.pause();\n setTimeout(() => call.resume(), 100);\n }\n });\n\n // 处理流结束\n call.on('end', async () => {\n clearTimeout(timeout);\n Logger.Debug(`[GRPC_ROUTER] Client stream ${streamId} ended with ${messages.length} messages`);\n \n try {\n // 直接创建 context,不再调用 app.callback\n const ctx = app.createContext(call, callback, 'grpc');\n ctx.streamMessages = messages;\n \n // 获取控制器实例并执行\n const ctl = IOC.getInsByClass(ctlItem.ctl, [ctx]);\n const result = await Handler(app, ctx, ctl, ctlItem.method, ctlItem.params, undefined, ctlItem.composedMiddleware);\n \n // 调用 callback 返回结果\n const response = result || ctx.body;\n callback(null, response);\n \n this.streamManager.removeStream(streamId);\n } catch (error) {\n Logger.Error(`[GRPC_ROUTER] Error processing client stream: ${error}`);\n callback(error as Error);\n this.streamManager.removeStream(streamId);\n }\n });\n\n call.on('error', (error) => {\n Logger.Error(`[GRPC_ROUTER] Client stream ${streamId} error:`, error);\n clearTimeout(timeout);\n callback(error);\n this.streamManager.removeStream(streamId);\n });\n\n call.on('cancelled', () => {\n Logger.Debug(`[GRPC_ROUTER] Client stream ${streamId} cancelled`);\n clearTimeout(timeout);\n this.streamManager.removeStream(streamId);\n });\n \n } catch (error) {\n Logger.Error(`[GRPC_ROUTER] Error in client streaming: ${error}`);\n callback(error as Error);\n this.streamManager.removeStream(streamId);\n }\n }\n\n /**\n * 处理双向流 (Bidirectional Streaming RPC)\n */\n private handleBidirectionalStreaming(\n call: ServerDuplexStream<any, any>,\n app: Koatty,\n ctlItem: any\n ): void {\n const streamId = `bidi_${Date.now()}_${Math.random()}`;\n const streamState = this.streamManager.registerStream(streamId, GrpcStreamType.BIDIRECTIONAL_STREAMING);\n \n try {\n Logger.Debug(`[GRPC_ROUTER] Handling bidirectional streaming call for ${ctlItem.name}.${ctlItem.method}`);\n \n // 设置流超时\n const timeout = setTimeout(() => {\n Logger.Warn(`[GRPC_ROUTER] Bidirectional stream ${streamId} timeout`);\n call.end();\n this.streamManager.removeStream(streamId);\n }, this.options.streamConfig?.streamTimeout || 300000);\n\n // 处理数据接收\n call.on('data', async (data: any) => {\n this.streamManager.updateStream(streamId, { \n messageCount: streamState.messageCount + 1,\n bufferSize: streamState.bufferSize + JSON.stringify(data).length\n });\n \n // 检查背压\n if (this.streamManager.isBackpressureTriggered(streamId)) {\n Logger.Warn(`[GRPC_ROUTER] Backpressure triggered for bidirectional stream ${streamId}`);\n call.pause();\n setTimeout(() => call.resume(), 100);\n }\n\n try {\n // 直接创建 context,不再调用 app.callback\n const ctx = app.createContext(call, null, 'grpc');\n ctx.streamMessage = data;\n \n // 添加流写入方法到上下文\n ctx.writeStream = (responseData: any) => {\n if (this.streamManager.isBackpressureTriggered(streamId)) {\n Logger.Warn(`[GRPC_ROUTER] Write backpressure triggered for stream ${streamId}`);\n return false;\n }\n call.write(responseData);\n return true;\n };\n \n ctx.endStream = () => {\n call.end();\n clearTimeout(timeout);\n this.streamManager.removeStream(streamId);\n };\n\n // 获取控制器实例并执行\n const ctl = IOC.getInsByClass(ctlItem.ctl, [ctx]);\n await Handler(app, ctx, ctl, ctlItem.method, ctlItem.params, undefined, ctlItem.composedMiddleware);\n } catch (error) {\n Logger.Error(`[GRPC_ROUTER] Error processing bidirectional stream message: ${error}`);\n }\n });\n\n // 处理流结束\n call.on('end', () => {\n Logger.Debug(`[GRPC_ROUTER] Bidirectional stream ${streamId} ended`);\n clearTimeout(timeout);\n call.end();\n this.streamManager.removeStream(streamId);\n });\n\n call.on('error', (error) => {\n Logger.Error(`[GRPC_ROUTER] Bidirectional stream ${streamId} error:`, error);\n clearTimeout(timeout);\n call.end();\n this.streamManager.removeStream(streamId);\n });\n\n call.on('cancelled', () => {\n Logger.Debug(`[GRPC_ROUTER] Bidirectional stream ${streamId} cancelled`);\n clearTimeout(timeout);\n this.streamManager.removeStream(streamId);\n });\n \n } catch (error) {\n Logger.Error(`[GRPC_ROUTER] Error in bidirectional streaming: ${error}`);\n call.end();\n this.streamManager.removeStream(streamId);\n }\n }\n\n /**\n * 统一的流处理入口\n */\n private handleStreamCall(\n call: IRpcServerCall<any, any>, \n callback: IRpcServerCallback<any>,\n app: Koatty,\n ctlItem: any\n ): void {\n Logger.Debug(`[GRPC_ROUTER] handleStreamCall called for ${ctlItem.name}.${ctlItem.method}`);\n \n // 检测流类型\n const streamType = this.detectStreamType(call);\n Logger.Debug(`[GRPC_ROUTER] Detected stream type: ${streamType}`);\n \n // 检查并发流限制(只对真正的流调用进行限制)\n if (streamType !== GrpcStreamType.UNARY && \n this.streamManager.getActiveStreamCount() >= (this.options.streamConfig?.maxConcurrentStreams || 100)) {\n Logger.Warn('[GRPC_ROUTER] Maximum concurrent streams reached');\n if (callback) {\n callback(new Error('Server busy'));\n } else {\n (call as any).end();\n }\n return;\n }\n\n Logger.Debug(`[GRPC_ROUTER] Processing stream type: ${streamType} for ${ctlItem.name}.${ctlItem.method}`);\n\n switch (streamType) {\n case GrpcStreamType.UNARY:\n Logger.Debug(`[GRPC_ROUTER] Calling handleUnaryCall for ${ctlItem.name}.${ctlItem.method}`);\n this.handleUnaryCall(call, callback, app, ctlItem);\n break;\n case GrpcStreamType.SERVER_STREAMING:\n this.handleServerStreaming(call as ServerWritableStream<any, any>, app, ctlItem);\n break;\n case GrpcStreamType.CLIENT_STREAMING:\n this.handleClientStreaming(call as ServerReadableStream<any, any>, callback, app, ctlItem);\n break;\n case GrpcStreamType.BIDIRECTIONAL_STREAMING:\n this.handleBidirectionalStreaming(call as ServerDuplexStream<any, any>, app, ctlItem);\n break;\n default:\n Logger.Error(`Unknown stream type: ${streamType}`);\n (call as any).end();\n }\n }\n\n /**\n * LoadRouter\n *\n * @memberof Router\n */\n async LoadRouter(app: Koatty, list: any[]) {\n try {\n const pdef = LoadProto(this.options.protoFile);\n \n const services = ListServices(pdef);\n \n const ctls: CtlInterface = {};\n\n for (const n of list) {\n Logger.Debug(`[GRPC_ROUTER] Processing controller: ${n}`);\n const ctlClass = IOC.getClass(n, \"CONTROLLER\");\n const ctlRouters = await injectRouter(app, ctlClass, this.options.protocol);\n Logger.Debug(`[GRPC_ROUTER] Controller ${n} routers:`, ctlRouters ? Object.keys(ctlRouters).length : 0);\n if (!ctlRouters) continue;\n\n // 传递 protoFile 给 payload 解析器,用于可能的自动解码\n const ctlParams = injectParamMetaData(app, ctlClass, {\n ...this.options.payload,\n protoFile: this.options.protoFile\n });\n for (const router of Object.values(ctlRouters)) {\n ctls[router.path] = {\n name: n,\n ctl: ctlClass,\n method: router.method,\n params: ctlParams[router.method],\n composedMiddleware: router.composedMiddleware\n };\n Logger.Debug(`[GRPC_ROUTER] Registered controller route: \"${router.path}\" => ${n}.${router.method}`);\n }\n }\n\n\n for (const si of services) { \n if (!si.service || si.handlers.length === 0) {\n Logger.Warn(`[GRPC_ROUTER] Ignore ${si.name} which is an empty service`);\n continue;\n }\n\n Logger.Debug(`[GRPC_ROUTER] Processing gRPC service: ${si.name} with ${si.handlers.length} handlers`);\n\n // Register placeholder implementations for gRPC service\n // These are just shells - the actual routing is handled by middleware\n const impl: Record<string, UntypedHandleCall> = {};\n for (const handler of si.handlers) {\n const path = parsePath(handler.path);\n Logger.Debug(`[GRPC_ROUTER] Looking for handler: \"${handler.path}\" (parsed: \"${path}\") => handler name: \"${handler.name}\"`);\n const ctlItem = ctls[path];\n if (!ctlItem) {\n Logger.Warn(`[GRPC_ROUTER] ❌ No matching controller route found for gRPC handler \"${handler.path}\" (parsed: \"${path}\")`);\n continue;\n }\n\n Logger.Debug(`[GRPC_ROUTER] ✅ Register request mapping: [\"${path}\" => ${ctlItem.name}.${ctlItem.method}]`);\n \n // Register a placeholder handler\n // This handler will never be called because koatty_serve will call app.callback instead\n // But we still need to register it so grpc server knows this method exists\n impl[handler.name] = (call: IRpcServerCall<any, any>, callback: IRpcServerCallback<any>) => {\n Logger.Warn(`[GRPC_ROUTER] ⚠️ Placeholder handler called for: ${handler.name} - this should not happen!`);\n callback(new Error('This handler should not be called - routing should go through middleware'));\n };\n }\n \n // only register service when impl is not empty\n if (Object.keys(impl).length > 0) {\n this.SetRouter(si.name, { service: si.service, implementation: impl });\n \n // Handle both single server and multi-protocol server\n const server = app.server as any;\n\n let grpcServer = null;\n \n // Check if server is an array (multi-protocol mode)\n if (Helper.isArray(server)) {\n // Multi-protocol server: find gRPC server instance in array\n for (const s of server) {\n const protocol = s.options?.protocol || s.protocol;\n if (protocol === 'grpc' && Helper.isFunction(s.RegisterService)) {\n grpcServer = s;\n break;\n }\n }\n } else if (Helper.isFunction(server.getAllServers)) {\n // Alternative multi-protocol structure with getAllServers method\n const allServers = server.getAllServers();\n if (allServers && allServers.size > 0) {\n allServers.forEach((s: any) => {\n const protocol = Helper.isString(s.options?.protocol) ? s.options.protocol : \n (Helper.isArray(s.options?.protocol) ? s.options.protocol[0] : '');\n if (protocol === 'grpc' && Helper.isFunction(s.RegisterService)) {\n grpcServer = s;\n }\n });\n }\n } else if (Helper.isFunction(server.RegisterService)) {\n // Single protocol gRPC server\n grpcServer = server;\n }\n \n // Register service to gRPC server\n if (grpcServer) {\n grpcServer.RegisterService({ service: si.service, implementation: impl });\n } else {\n Logger.Error(`[GRPC_ROUTER] ❌ Failed to find gRPC server instance for service registration: ${si.name}`);\n }\n } else {\n Logger.Warn(`[GRPC_ROUTER] Skip registering service ${si.name}: no matching controller handlers found`);\n }\n }\n \n // Register gRPC router middleware to app\n // Similar to HTTP router, this middleware handles routing for gRPC protocol\n \n app.use(async (ctx: KoattyContext, next: any) => {\n // Only handle gRPC protocol\n if (ctx.protocol !== 'grpc') {\n await next();\n return;\n }\n \n Logger.Debug('[GRPC_ROUTER] gRPC router middleware executing', {\n protocol: ctx.protocol,\n rpc: ctx.rpc\n });\n \n // Get method path from ctx.rpc (call object)\n // The call object should have a path property like \"/Hello/SayHello\"\n const methodPath = (ctx.rpc as any)?.path || (ctx.rpc as any)?.call?.path;\n \n if (!methodPath) {\n Logger.Error('[GRPC_ROUTER] No method path found in ctx.rpc');\n throw new Error('gRPC method path not found');\n }\n \n Logger.Debug(`[GRPC_ROUTER] Looking up controller for method: ${methodPath}`);\n \n // Find matching controller\n const ctlItem = ctls[methodPath];\n if (!ctlItem) {\n Logger.Error(`[GRPC_ROUTER] No controller found for method: ${methodPath}`);\n throw new Error(`gRPC method not implemented: ${methodPath}`);\n }\n \n Logger.Debug(`[GRPC_ROUTER] Found controller: ${ctlItem.name}.${ctlItem.method}`);\n \n // Execute controller\n const ctl = IOC.getInsByClass(ctlItem.ctl, [ctx]);\n const result = await Handler(app, ctx, ctl, ctlItem.method, ctlItem.params, undefined, ctlItem.composedMiddleware);\n \n // Set result to ctx.body\n ctx.body = result;\n \n Logger.Debug('[GRPC_ROUTER] Controller execution completed', {\n method: methodPath,\n hasResult: !!result\n });\n });\n \n \n // Protocol Isolation Note:\n // gRPC router now works through Koa middleware chain, just like HTTP router\n // The gRPC server calls app.callback(\"grpc\") which executes this middleware\n Logger.Debug('gRPC router middleware registered (integrated with middleware chain)');\n } catch (err) {\n Logger.Error(err);\n }\n }\n\n /**\n * Cleanup all gRPC resources (for graceful shutdown)\n */\n public cleanup(): void {\n Logger.Info('Starting gRPC router cleanup...');\n\n // Close all active streams\n this.streamManager.closeAllStreams();\n\n // Flush pending batches\n this.batchProcessor.flush();\n\n // Clear connection pool\n this.connectionPool.clear();\n\n Logger.Info('gRPC router cleanup completed');\n }\n}\n","/*\n * @Description:\n * @Usage:\n * @Author: richen\n * @Date: 2021-06-28 19:02:06\n * @LastEditTime: 2025-03-15 16:35:13\n */\nimport KoaRouter from \"@koa/router\";\nimport { IOC } from \"koatty_container\";\nimport {\n Koatty, KoattyContext, KoattyRouter,\n RouterImplementation\n} from \"koatty_core\";\nimport * as Helper from \"koatty_lib\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { RequestMethod } from \"../params/mapping\";\nimport { injectParamMetaData, injectRouter } from \"../utils/inject\";\nimport { parsePath } from \"../utils/path\";\nimport { RouterOptions } from \"./router\";\nimport { Handler } from \"../utils/handler\";\n\n\n/**\n * HttpRouter class\n */\nexport class HttpRouter implements KoattyRouter {\n readonly protocol: string;\n options: RouterOptions;\n router: KoaRouter;\n private routerMap: Map<string, RouterImplementation>;\n\n constructor(app: Koatty, options: RouterOptions = { protocol: \"http\", prefix: \"\" }) {\n this.options = { ...options };\n this.protocol = options.protocol || \"http\";\n \n // initialize - only pass base router options to KoaRouter\n this.router = new KoaRouter({\n prefix: options.prefix,\n methods: options.methods,\n sensitive: options.sensitive,\n strict: options.strict,\n });\n this.routerMap = new Map();\n }\n\n /**\n * Set router\n * @param name \n * @param impl \n * @returns \n */\n SetRouter(name: string, impl?: RouterImplementation) {\n if (Helper.isEmpty(impl.path)) return;\n\n const method = (impl.method || \"\").toLowerCase();\n const routeHandler = <any>impl.implementation;\n if ([\"get\", \"post\", \"put\", \"delete\", \"patch\", \"options\", \"head\"].includes(method)) {\n (<any>this.router)[method](impl.path, routeHandler);\n } else {\n this.router.all(impl.path, routeHandler);\n }\n this.routerMap.set(name, impl);\n }\n\n /**\n * ListRouter\n *\n * @returns {*} {Map<string, RouterImplementation> }\n */\n ListRouter(): Map<string, RouterImplementation> {\n return this.routerMap;\n }\n\n /**\n * LoadRouter\n *\n * @param {any[]} list\n */\n async LoadRouter(app: Koatty, list: any[]) {\n try {\n for (const n of list) {\n const ctlClass = IOC.getClass(n, \"CONTROLLER\");\n // inject router\n const ctlRouters = await injectRouter(app, ctlClass, this.options.protocol);\n if (!ctlRouters) {\n continue;\n }\n // inject param\n const ctlParams = injectParamMetaData(app, ctlClass, this.options.payload);\n // tslint:disable-next-line: forin\n for (const router of Object.values(ctlRouters)) {\n const method = router.method;\n const path = parsePath(router.path);\n const requestMethod = <RequestMethod>router.requestMethod;\n const params = ctlParams[method];\n\n Logger.Debug(`Register request mapping: [\"${path}\" => ${n}.${method}]`);\n this.SetRouter(path, {\n path,\n method: requestMethod,\n implementation: (ctx: KoattyContext): Promise<any> => {\n const ctl = IOC.getInsByClass(ctlClass, [ctx]);\n return Handler(app, ctx, ctl, method, params, undefined, router.composedMiddleware);\n },\n });\n }\n }\n // exp: in middleware\n // app.Router.SetRouter('/xxx', (ctx: Koa.KoattyContext): any => {...}, 'GET')\n \n // PERFORMANCE OPTIMIZATION: Merge router middleware to reduce middleware stack\n // In multi-protocol environment, merging routes() and allowedMethods() into \n // a single middleware reduces function calls and improves performance by ~40%\n const httpProtocols = new Set(['http', 'https', 'http2', 'http3']);\n const routerMiddleware = this.router.routes();\n const allowedMethodsMiddleware = this.router.allowedMethods();\n \n // Merged middleware: protocol check + routes + allowedMethods\n app.use(async (ctx: KoattyContext, next: any) => {\n if (httpProtocols.has(ctx.protocol)) {\n // Chain routes and allowedMethods in single middleware\n await routerMiddleware(ctx as any, async () => {\n await allowedMethodsMiddleware(ctx as any, next);\n });\n } else {\n // Skip for non-HTTP protocols (gRPC, WebSocket, etc.)\n await next();\n }\n });\n \n Logger.Debug('HTTP router middleware registered (optimized)');\n } catch (err) {\n Logger.Error(err);\n }\n }\n\n /**\n * Cleanup router resources (for graceful shutdown)\n * HTTP router is stateless, this method is for interface consistency\n */\n public cleanup(): void {\n Logger.Debug('HTTP router cleanup completed (stateless)');\n }\n}\n","/*\n * @Description:\n * @Usage:\n * @Author: richen\n * @Date: 2021-06-29 14:16:44\n * @LastEditTime: 2025-03-15 16:35:45\n */\n\nimport KoaRouter from \"@koa/router\";\nimport { IOC } from \"koatty_container\";\nimport {\n Koatty, KoattyContext, KoattyRouter,\n RouterImplementation\n} from \"koatty_core\";\nimport { Helper } from \"koatty_lib\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { RequestMethod } from \"../params/mapping\";\nimport { injectParamMetaData, injectRouter } from \"../utils/inject\";\nimport { Handler } from \"../utils/handler\";\nimport { parsePath } from \"../utils/path\";\nimport { RouterOptions } from \"./router\";\nimport { getProtocolConfig, validateProtocolConfig } from \"./types\";\n\n/**\n * WebsocketRouter Options\n *\n * @export\n * @interface WebsocketRouterOptions\n */\nexport interface WebsocketRouterOptions extends RouterOptions {\n prefix: string;\n maxFrameSize?: number; // 最大分帧大小(字节),默认1MB\n frameTimeout?: number; // 分帧处理超时(ms),默认30秒\n heartbeatInterval?: number; // 心跳检测间隔(ms),默认15秒\n heartbeatTimeout?: number; // 心跳超时时间(ms),默认30秒\n maxConnections?: number; // 最大连接数,默认1000\n maxBufferSize?: number; // 最大缓冲区大小(字节),默认10MB\n cleanupInterval?: number; // 清理间隔(ms),默认5分钟\n}\n\n/**\n * Connection info for memory management\n */\ninterface ConnectionInfo {\n socketId: string;\n buffers: Buffer[];\n lastActivity: number;\n totalBufferSize: number;\n frameTimeout?: NodeJS.Timeout;\n heartbeatTimeout?: NodeJS.Timeout;\n}\n\nexport class WebsocketRouter implements KoattyRouter {\n readonly protocol: string;\n options: WebsocketRouterOptions;\n router: KoaRouter;\n private routerMap: Map<string, RouterImplementation>;\n\n // 优化的连接管理\n private connections: Map<string, ConnectionInfo>;\n private connectionCount: number = 0;\n private totalBufferSize: number = 0;\n private cleanupTimer?: NodeJS.Timeout;\n\n constructor(app: Koatty, options: RouterOptions = { protocol: \"ws\", prefix: \"\" }) {\n const extConfig = getProtocolConfig('ws', options.ext || {});\n \n // 配置验证\n const validation = validateProtocolConfig('ws', options.ext || {});\n if (!validation.valid) {\n throw new Error(`WebSocket router configuration error: ${validation.errors.join(', ')}`);\n }\n if (validation.warnings.length > 0) {\n validation.warnings.forEach((warning: string) => Logger.Warn(`[WebSocketRouter] ${warning}`));\n }\n \n this.protocol = options.protocol || 'ws';\n this.options = {\n ...options,\n prefix: options.prefix || '',\n maxFrameSize: extConfig.maxFrameSize || 1024 * 1024, // 1MB\n frameTimeout: extConfig.frameTimeout || 30000, // 30秒\n heartbeatInterval: extConfig.heartbeatInterval || 15000, // 15秒\n heartbeatTimeout: extConfig.heartbeatTimeout || 30000, // 30秒\n maxConnections: extConfig.maxConnections || 1000,\n maxBufferSize: extConfig.maxBufferSize || 10 * 1024 * 1024, // 10MB\n cleanupInterval: extConfig.cleanupInterval || 5 * 60 * 1000 // 5分钟\n }\n \n // initialize - only pass base router options to KoaRouter\n this.router = new KoaRouter({\n prefix: options.prefix,\n methods: options.methods,\n sensitive: options.sensitive,\n strict: options.strict,\n });\n this.routerMap = new Map();\n this.connections = new Map();\n \n // 启动定期清理 \n this.startCleanupTimer();\n }\n\n /**\n * Start cleanup timer for memory management\n */\n private startCleanupTimer(): void {\n this.cleanupTimer = setInterval(() => {\n this.cleanupStaleConnections();\n }, this.options.cleanupInterval);\n }\n\n /**\n * Cleanup stale connections and free memory\n */\n private cleanupStaleConnections(): void {\n const now = Date.now();\n const staleThreshold = this.options.frameTimeout! * 2; // 2倍超时时间\n let cleanedCount = 0;\n let freedMemory = 0;\n\n for (const [socketId, connection] of this.connections.entries()) {\n if (now - connection.lastActivity > staleThreshold) {\n freedMemory += connection.totalBufferSize;\n this.cleanupConnection(socketId);\n cleanedCount++;\n }\n }\n\n if (cleanedCount > 0) {\n Logger.Debug(`Cleaned up ${cleanedCount} stale connections, freed ${freedMemory} bytes`);\n }\n\n // 记录内存使用情况\n Logger.Debug(`Active connections: ${this.connectionCount}, Total buffer size: ${this.totalBufferSize} bytes`);\n }\n\n /**\n * Cleanup connection and free resources\n */\n private cleanupConnection(socketId: string): void {\n const connection = this.connections.get(socketId);\n if (!connection) {\n return;\n }\n\n // 清理定时器\n if (connection.frameTimeout) {\n clearTimeout(connection.frameTimeout);\n }\n if (connection.heartbeatTimeout) {\n clearTimeout(connection.heartbeatTimeout);\n }\n\n // 更新统计\n this.totalBufferSize -= connection.totalBufferSize;\n this.connectionCount--;\n\n // 删除连接\n this.connections.delete(socketId);\n \n Logger.Debug(`Cleaned up connection: ${socketId}`);\n }\n\n /**\n * Check memory limits and enforce them\n */\n private enforceMemoryLimits(): boolean {\n // 检查连接数限制\n if (this.connectionCount >= this.options.maxConnections!) {\n Logger.Warn(`Max connections limit reached: ${this.options.maxConnections}`);\n return false;\n }\n\n // 检查总缓冲区大小限制\n if (this.totalBufferSize >= this.options.maxBufferSize!) {\n Logger.Warn(`Max buffer size limit reached: ${this.options.maxBufferSize} bytes`);\n // 清理最旧的连接\n this.cleanupOldestConnections(5); // 清理5个最旧的连接\n return this.totalBufferSize < this.options.maxBufferSize!;\n }\n\n return true;\n }\n\n /**\n * Cleanup oldest connections to free memory\n */\n private cleanupOldestConnections(count: number): void {\n const sortedConnections = Array.from(this.connections.entries())\n .sort(([, a], [, b]) => a.lastActivity - b.lastActivity)\n .slice(0, count);\n\n for (const [socketId] of sortedConnections) {\n this.cleanupConnection(socketId);\n }\n\n Logger.Debug(`Cleaned up ${sortedConnections.length} oldest connections`);\n }\n\n /**\n * Set router\n * @param name \n * @param impl \n * @returns \n */\n SetRouter(name: string, impl?: RouterImplementation) {\n if (Helper.isEmpty(impl.path)) return;\n\n const routeHandler = <any>impl.implementation;\n this.router.get(impl.path, routeHandler);\n this.routerMap.set(name, impl);\n }\n\n /**\n * ListRouter\n *\n * @returns {*} {Map<string, RouterImplementation> }\n */\n ListRouter(): Map<string, RouterImplementation> {\n return this.routerMap;\n }\n\n /**\n * LoadRouter\n *\n * @param {any[]} list\n */\n async LoadRouter(app: Koatty, list: any[]) {\n try {\n for (const n of list) {\n const ctlClass = IOC.getClass(n, \"CONTROLLER\");\n // inject router\n const ctlRouters = await injectRouter(app, ctlClass, this.options.protocol);\n if (!ctlRouters) {\n continue;\n }\n // inject param\n const ctlParams = injectParamMetaData(app, ctlClass, this.options.payload);\n\n for (const router of Object.values(ctlRouters)) {\n const method = router.method;\n const path = parsePath(router.path);\n const requestMethod = <RequestMethod>router.requestMethod;\n const params = ctlParams[method];\n // if (requestMethod === RequestMethod.GET || requestMethod === RequestMethod.ALL) {\n Logger.Debug(`Register request mapping: [${requestMethod}] : [\"${path}\" => ${n}.${method}]`);\n this.SetRouter(path, {\n path,\n method: requestMethod,\n implementation: (ctx: KoattyContext): Promise<any> => {\n const ctl = IOC.getInsByClass(ctlClass, [ctx]);\n return this.websocketHandler(app, ctx, ctl, method, params, undefined, router.composedMiddleware);\n },\n });\n // }\n }\n }\n // exp: in middleware\n // app.Router.SetRouter('/xxx', {path, method, implementation: (ctx: KoattyContext): Promise<any> => {\n // ...\n // })\n \n // PERFORMANCE OPTIMIZATION: Merge router middleware to reduce middleware stack\n // In multi-protocol environment, merging routes() and allowedMethods() into \n // a single middleware reduces function calls and improves performance by ~40%\n const wsProtocols = new Set(['ws', 'wss']);\n const routerMiddleware = this.router.routes();\n const allowedMethodsMiddleware = this.router.allowedMethods();\n \n // Merged middleware: protocol check + routes + allowedMethods\n app.use(async (ctx: KoattyContext, next: any) => {\n if (wsProtocols.has(ctx.protocol)) {\n // Chain routes and allowedMethods in single middleware\n await routerMiddleware(ctx as any, async () => {\n await allowedMethodsMiddleware(ctx as any, next);\n });\n } else {\n // Skip for non-WebSocket protocols\n await next();\n }\n });\n \n Logger.Debug('WebSocket router middleware registered (optimized)');\n } catch (err) {\n throw err; // Re-throw to propagate error to upper layer\n }\n }\n\n private websocketHandler(app: Koatty, ctx: KoattyContext, ctl: Function, method: string, params?: any, ctlParamsValue?: any, composedMiddleware?: Function): Promise<any> {\n return new Promise((resolve, reject) => {\n const socketId = ctx.socketId || ctx.requestId;\n \n // 检查内存限制\n if (!this.enforceMemoryLimits()) {\n reject(new Error('Memory limits exceeded'));\n return;\n }\n\n // 初始化连接信息\n const connection: ConnectionInfo = {\n socketId,\n buffers: [],\n lastActivity: Date.now(),\n totalBufferSize: 0\n };\n\n this.connections.set(socketId, connection);\n this.connectionCount++;\n\n // 设置分片处理超时\n const resetFrameTimeout = () => {\n if (connection.frameTimeout) {\n clearTimeout(connection.frameTimeout);\n }\n connection.frameTimeout = setTimeout(() => {\n Logger.Warn(`Frame timeout for connection: ${socketId}`);\n this.cleanupConnection(socketId);\n reject(new Error('Frame timeout'));\n }, this.options.frameTimeout);\n };\n\n // 设置基于ping/pong的心跳检测\n let isAlive = true; // 连接活跃状态\n\n // 收到pong响应时标记为活跃\n const onPong = () => {\n isAlive = true;\n connection.lastActivity = Date.now();\n };\n\n // 检查连接活跃状态\n const checkAlive = () => {\n if (!isAlive) {\n // 连接超时,终止连接\n Logger.Debug(`Connection timeout: ${socketId}`);\n this.cleanupConnection(socketId);\n ctx.websocket.terminate();\n reject(new Error('Connection timeout'));\n return;\n }\n // 发送ping并重置状态\n isAlive = false;\n try {\n ctx.websocket.ping();\n } catch (error) {\n Logger.Error(`Error sending ping to ${socketId}:`, error);\n this.cleanupConnection(socketId);\n reject(error);\n return;\n }\n \n connection.heartbeatTimeout = setTimeout(checkAlive, this.options.heartbeatInterval);\n };\n\n // 初始化心跳检测\n resetFrameTimeout();\n ctx.websocket.on('pong', onPong);\n // 启动首次心跳检测\n connection.heartbeatTimeout = setTimeout(checkAlive, this.options.heartbeatInterval);\n\n // 连接关闭时清理所有资源\n ctx.websocket.on('close', () => {\n Logger.Debug(`Connection closed: ${socketId}`);\n this.cleanupConnection(socketId);\n });\n\n // 连接错误时清理资源\n ctx.websocket.on('error', (error: Error) => {\n Logger.Error(`WebSocket error for ${socketId}:`, error);\n this.cleanupConnection(socketId);\n reject(error);\n });\n\n ctx.websocket.on('message', (data: Buffer | string) => {\n try {\n // 更新活跃时间\n connection.lastActivity = Date.now();\n isAlive = true;\n\n const chunkSize = this.options.maxFrameSize!;\n\n // 处理不同类型的数据\n let bufferData: Buffer;\n if (typeof data === 'string') {\n bufferData = Buffer.from(data, 'utf8');\n } else {\n bufferData = data;\n }\n\n // 检查单个消息大小限制\n if (bufferData.length > this.options.maxBufferSize!) {\n Logger.Warn(`Message too large: ${bufferData.length} bytes from ${socketId}`);\n reject(new Error('Message too large'));\n return;\n }\n\n // 检查连接缓冲区大小限制\n const newBufferSize = connection.totalBufferSize + bufferData.length;\n if (newBufferSize > this.options.maxFrameSize! * 10) { // 最多10个分片\n Logger.Warn(`Connection buffer overflow: ${newBufferSize} bytes for ${socketId}`);\n this.cleanupConnection(socketId);\n reject(new Error('Connection buffer overflow'));\n return;\n }\n\n // 处理分块\n if (bufferData.length > chunkSize) {\n for (let i = 0; i < bufferData.length; i += chunkSize) {\n const chunk = bufferData.slice(i, Math.min(i + chunkSize, bufferData.length));\n connection.buffers.push(chunk);\n connection.totalBufferSize += chunk.length;\n this.totalBufferSize += chunk.length;\n }\n } else {\n connection.buffers.push(bufferData);\n connection.totalBufferSize += bufferData.length;\n this.totalBufferSize += bufferData.length;\n }\n\n // 重置超时\n resetFrameTimeout();\n\n // 如果是最后一块,处理完整数据\n if (bufferData.length <= chunkSize || bufferData.length % chunkSize !== 0) {\n try {\n const fullMessage = Buffer.concat(connection.buffers).toString('utf8');\n ctx.message = fullMessage;\n \n // 清理缓冲区\n this.totalBufferSize -= connection.totalBufferSize;\n connection.buffers = [];\n connection.totalBufferSize = 0;\n \n const result = Handler(app, ctx, ctl, method, params, ctlParamsValue, composedMiddleware);\n resolve(result);\n } catch (error) {\n Logger.Error(`Error processing message for ${socketId}:`, error);\n this.cleanupConnection(socketId);\n reject(error);\n }\n }\n } catch (error) {\n Logger.Error(`Error handling message for ${socketId}:`, error);\n this.cleanupConnection(socketId);\n reject(error);\n }\n });\n });\n }\n\n\n\n /**\n * Force cleanup all connections (for shutdown)\n */\n public cleanup(): void {\n // 清理定时器\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = undefined;\n }\n\n // 清理所有连接\n for (const socketId of this.connections.keys()) {\n this.cleanupConnection(socketId);\n }\n\n Logger.Debug('WebSocket router cleanup completed');\n }\n}\n","/*\n * @Description: Router Factory Pattern Implementation\n * @Usage: Factory for creating different protocol routers\n * @Author: richen\n * @Date: 2025-01-20 10:00:00\n * @LastEditTime: 2025-01-20 10:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { KoattyApplication, KoattyRouter } from \"koatty_core\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { GraphQLRouter } from \"./graphql\";\nimport { GrpcRouter } from \"./grpc\";\nimport { HttpRouter } from \"./http\";\nimport { RouterOptions } from \"./router\";\nimport { WebsocketRouter } from \"./ws\";\n\n/**\n * Router factory interface\n */\nexport interface IRouterFactory {\n create(protocol: string, app: KoattyApplication, options: RouterOptions): KoattyRouter;\n register(protocol: string, routerClass: RouterConstructor): void;\n getSupportedProtocols(): string[];\n}\n\n/**\n * Router constructor type\n */\nexport type RouterConstructor = new (app: KoattyApplication, options?: RouterOptions) => KoattyRouter;\n\n/**\n * Router factory implementation\n */\nexport class RouterFactory implements IRouterFactory {\n private static instance: RouterFactory;\n private routerRegistry = new Map<string, RouterConstructor>();\n private activeRouters: KoattyRouter[] = [];\n private isShuttingDown: boolean = false;\n private hasShutdown: boolean = false;\n\n private constructor() {\n this.initializeDefaultRouters();\n }\n\n /**\n * Get singleton instance\n */\n public static getInstance(): RouterFactory {\n if (!RouterFactory.instance) {\n RouterFactory.instance = new RouterFactory();\n }\n return RouterFactory.instance;\n }\n\n /**\n * Initialize default routers\n */\n private initializeDefaultRouters(): void {\n this.routerRegistry.set('http', HttpRouter);\n this.routerRegistry.set('https', HttpRouter);\n this.routerRegistry.set('http2', HttpRouter);\n this.routerRegistry.set('http3', HttpRouter);\n this.routerRegistry.set('ws', WebsocketRouter);\n this.routerRegistry.set('wss', WebsocketRouter);\n this.routerRegistry.set('grpc', GrpcRouter);\n this.routerRegistry.set('graphql', GraphQLRouter);\n }\n\n /**\n * Create router instance\n */\n public create(protocol: string, app: KoattyApplication, options: RouterOptions): KoattyRouter {\n const normalizedProtocol = protocol.toLowerCase();\n const RouterClass = this.routerRegistry.get(normalizedProtocol);\n \n if (!RouterClass) {\n const supportedProtocols = Array.from(this.routerRegistry.keys()).join(', ');\n throw new Error(\n `Unsupported protocol: ${protocol}. Supported protocols: ${supportedProtocols}`\n );\n }\n\n try {\n const router = new RouterClass(app, options);\n this.activeRouters.push(router); // Track router instance\n Logger.Debug(`Created ${protocol.toUpperCase()} router successfully`);\n return router;\n } catch (error) {\n Logger.Error(`Failed to create ${protocol.toUpperCase()} router:`, error);\n throw error;\n }\n }\n\n /**\n * Register custom router\n */\n public register(protocol: string, routerClass: RouterConstructor): void {\n if (!protocol || typeof protocol !== 'string') {\n throw new Error('Protocol must be a non-empty string');\n }\n\n if (!routerClass || typeof routerClass !== 'function') {\n throw new Error('Router class must be a constructor function');\n }\n\n const normalizedProtocol = protocol.toLowerCase();\n \n if (this.routerRegistry.has(normalizedProtocol)) {\n Logger.Warn(`Overriding existing router for protocol: ${protocol}`);\n }\n\n this.routerRegistry.set(normalizedProtocol, routerClass);\n Logger.Debug(`Registered custom router for protocol: ${protocol}`);\n }\n\n /**\n * Unregister router\n */\n public unregister(protocol: string): boolean {\n const normalizedProtocol = protocol.toLowerCase();\n const result = this.routerRegistry.delete(normalizedProtocol);\n \n if (result) {\n Logger.Debug(`Unregistered router for protocol: ${protocol}`);\n } else {\n Logger.Warn(`No router found for protocol: ${protocol}`);\n }\n \n return result;\n }\n\n /**\n * Get supported protocols\n */\n public getSupportedProtocols(): string[] {\n return Array.from(this.routerRegistry.keys());\n }\n\n /**\n * Check if protocol is supported\n */\n public isSupported(protocol: string): boolean {\n return this.routerRegistry.has(protocol.toLowerCase());\n }\n\n /**\n * Get router class for protocol\n */\n public getRouterClass(protocol: string): RouterConstructor | undefined {\n return this.routerRegistry.get(protocol.toLowerCase());\n }\n\n /**\n * Clear all registered routers (for testing)\n */\n public clear(): void {\n this.routerRegistry.clear();\n Logger.Debug('Cleared all registered routers');\n }\n\n /**\n * Reset to default routers\n */\n public reset(): void {\n this.clear();\n this.initializeDefaultRouters();\n Logger.Debug('Reset to default routers');\n }\n\n /**\n * Shutdown all active routers (for graceful shutdown)\n * This method should be called when the application receives termination signal\n * \n * IMPORTANT: This method uses flags to ensure it only runs once even if called\n * multiple times in multi-protocol environments where each NewRouter() call\n * registers an appStop listener.\n */\n public async shutdownAll(): Promise<void> {\n // Prevent concurrent shutdown attempts\n if (this.isShuttingDown) {\n Logger.Debug('Shutdown already in progress, skipping duplicate call');\n return;\n }\n \n // Prevent multiple shutdown attempts\n if (this.hasShutdown) {\n Logger.Debug('Shutdown already completed, skipping duplicate call');\n return;\n }\n \n this.isShuttingDown = true;\n \n try {\n const routerCount = this.activeRouters.length;\n if (routerCount === 0) {\n Logger.Debug('No active routers to shutdown');\n this.hasShutdown = true;\n return;\n }\n\n Logger.Info(`Starting graceful shutdown for ${routerCount} router(s)...`);\n \n const shutdownPromises = this.activeRouters.map(async (router) => {\n const routerAny = router as any;\n const protocol = routerAny.protocol || 'unknown';\n try {\n if (typeof routerAny.cleanup === 'function') {\n await routerAny.cleanup();\n Logger.Debug(`Router ${protocol} shutdown completed`);\n }\n } catch (error) {\n Logger.Error(`Error shutting down ${protocol} router:`, error);\n }\n });\n\n await Promise.all(shutdownPromises);\n this.activeRouters = [];\n this.hasShutdown = true;\n Logger.Info('All routers shutdown completed');\n } finally {\n this.isShuttingDown = false;\n }\n }\n\n /**\n * Get count of active routers\n */\n public getActiveRouterCount(): number {\n return this.activeRouters.length;\n }\n\n /**\n * Get active routers list\n */\n public getActiveRouters(): KoattyRouter[] {\n return [...this.activeRouters];\n }\n}\n\n/**\n * Router factory builder for advanced configuration\n */\nexport class RouterFactoryBuilder {\n private customRouters = new Map<string, RouterConstructor>();\n private excludeDefaults: string[] = [];\n\n /**\n * Add custom router\n */\n public addRouter(protocol: string, routerClass: RouterConstructor): this {\n this.customRouters.set(protocol.toLowerCase(), routerClass);\n return this;\n }\n\n /**\n * Exclude default router\n */\n public excludeDefault(protocol: string): this {\n this.excludeDefaults.push(protocol.toLowerCase());\n return this;\n }\n\n /**\n * Build factory with custom configuration\n */\n public build(): IRouterFactory {\n const factory = RouterFactory.getInstance();\n \n // Remove excluded defaults\n for (const protocol of this.excludeDefaults) {\n factory.unregister(protocol);\n }\n \n // Add custom routers\n for (const [protocol, routerClass] of this.customRouters) {\n factory.register(protocol, routerClass);\n }\n \n return factory;\n }\n}\n\n/**\n * Decorator for auto-registering custom routers\n */\nexport function RegisterRouter(protocol: string) {\n return function <T extends RouterConstructor>(target: T): T {\n const factory = RouterFactory.getInstance();\n factory.register(protocol, target);\n return target;\n };\n} ","/*\n * @Description: \n * @Usage: \n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2025-01-20 10:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { KoattyApplication, KoattyRouter } from \"koatty_core\";\nimport { Helper } from \"koatty_lib\";\nimport { RouterFactory } from \"./factory\";\nimport { PayloadOptions } from \"../payload/interface\";\n\n\n/**\n * RouterOptions\n *\n * @export\n * @interface RouterOptions\n */\nexport interface RouterOptions {\n /** 路由前缀 */\n prefix: string;\n /**\n * Methods which should be supported by the router.\n */\n methods?: string[];\n routerPath?: string;\n /**\n * Whether or not routing should be case-sensitive.\n */\n sensitive?: boolean;\n /**\n * Whether or not routes should matched strictly.\n *\n * If strict matching is enabled, the trailing slash is taken into\n * account when matching routes.\n */\n strict?: boolean;\n /** server protocol */\n protocol?: string;\n\n /**\n * payload options\n */\n payload?: PayloadOptions;\n /**\n * 协议特定的扩展配置\n * \n * 各协议的特定参数都放在此字段中:\n * - WebSocket: { maxFrameSize, heartbeatInterval, maxConnections, ... }\n * - gRPC: { protoFile, poolSize, batchSize, streamConfig, ... }\n * - GraphQL: { schemaFile, playground, introspection, ... }\n * - HTTP/HTTPS: 预留扩展字段\n * \n * @example\n * ```typescript\n * ext: {\n * http: {},\n * grpc: {\n * protoFile: \"./proto/service.proto\",\n * poolSize: 10,\n * streamConfig: { maxConcurrentStreams: 50 }\n * },\n * graphql: {\n * schemaFile: \"./resource/graphql/schema.graphql\",\n * // Optional: Enable HTTP/2 with SSL for GraphQL\n * // keyFile: \"./ssl/server.key\",\n * // crtFile: \"./ssl/server.crt\",\n * // ssl: { mode: 'auto', allowHTTP1: true },\n * // http2: { maxConcurrentStreams: 100 }\n * },\n * ws: {\n * maxFrameSize: 1024 * 1024,\n * heartbeatInterval: 15000,\n * maxConnections: 1000\n * }\n * }\n * ```\n */\n ext?: Record<string, any>;\n}\n\n/**\n * get instance of Router using Factory Pattern\n *\n * @export\n * @param {KoattyApplication} app\n * @param {RouterOptions} options\n * @returns {*} {{ router: KoattyRouter, factory: RouterFactory }}\n */\nexport function NewRouter(app: KoattyApplication, opt?: RouterOptions): { router: KoattyRouter, factory: RouterFactory } {\n const options: RouterOptions = { protocol: \"http\", prefix: \"\", ...opt };\n\n // Use RouterFactory to create router instance\n const factory = RouterFactory.getInstance();\n const router = factory.create(options.protocol!, app, options);\n\n Helper.define(router, \"protocol\", options.protocol);\n\n // inject payload middleware\n // IMPORTANT: Use app.once() to prevent duplicate middleware registration\n // in multi-protocol environments where each NewRouter() is called separately\n // app.once(\"appReady\", () => {\n // app.use(payload(options.payload));\n // });\n\n // Note: app.once(\"appStop\", ...) has been removed.\n // Cleanup logic is now handled by RouterComponent @OnEvent(AppEvent.appStop)\n\n return { router, factory };\n}","/*\n * @Description: \n * @Usage: \n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2024-10-31 14:31:42\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { KoattyContext } from \"koatty_core\";\nimport { injectParam, ParamSourceType } from \"../utils/inject\";\nimport { bodyParser, queryParser } from \"../payload/payload\";\nimport { PayloadOptions } from \"../payload/interface\";\n\n/**\n * Get request header.\n *\n * @export\n * @param {string} [name]\n * @param {any} [defaultValue] - Default value if header is undefined\n * @returns\n */\nexport function Header(name?: string, defaultValue?: any): ParameterDecorator {\n return injectParam(\n (ctx: KoattyContext) => name ? ctx.get(name) : ctx.headers,\n \"Header\",\n ParamSourceType.HEADER,\n name,\n defaultValue\n );\n}\n\n/**\n * Get path variable (take value from ctx.params).\n *\n * @export\n * @param {string} [name] params name\n * @param {any} [defaultValue] - Default value if path variable is undefined\n * @returns\n */\nexport function PathVariable(name?: string, defaultValue?: any): ParameterDecorator {\n return injectParam(\n (ctx: KoattyContext) => {\n const pathParams = ctx.params ?? {};\n return name ? pathParams[name] : pathParams;\n },\n \"PathVariable\",\n ParamSourceType.PATH,\n name,\n defaultValue\n );\n}\n\n/**\n * Get query-string parameters (take value from ctx.query).\n *\n * @export\n * @param {string} [name]\n * @param {any} [defaultValue] - Default value if query parameter is undefined\n * @returns\n */\nexport function Get(name?: string, defaultValue?: any): ParameterDecorator {\n return injectParam(\n (ctx: KoattyContext) => {\n const queryParams = ctx.query ?? {};\n return name ? queryParams[name] : queryParams;\n },\n \"Get\",\n ParamSourceType.QUERY,\n name,\n defaultValue\n );\n}\n\n/**\n * Get parsed POST/PUT... body.\n *\n * @export\n * @param {string} [name]\n * @param {any} [defaultValue] - Default value if body parameter is undefined\n * @returns\n */\nexport function Post(name?: string, defaultValue?: any): ParameterDecorator {\n return injectParam(\n async (ctx: KoattyContext, opt?: PayloadOptions) => {\n const data = await bodyParser(ctx, opt);\n const params = data.body ?? data;\n return name ? params[name] : params;\n },\n \"Post\",\n ParamSourceType.BODY,\n name,\n defaultValue\n );\n}\n\n/**\n * Get parsed upload file object.\n *\n * @export\n * @param {string} [name]\n * @param {any} [defaultValue] - Default value if file is undefined\n * @returns\n */\nexport function File(name?: string, defaultValue?: any): ParameterDecorator {\n return injectParam(\n async (ctx: KoattyContext, opt?: PayloadOptions) => {\n const body = await bodyParser(ctx, opt);\n const params = body.file ?? {};\n return name ? params[name] : params;\n },\n \"File\",\n ParamSourceType.FILE,\n name,\n defaultValue\n );\n}\n\n\n/**\n * Get parsed body(form variable and file object).\n *\n * @export\n * @returns ex: {body: {...}, file: {...}}\n */\nexport function RequestBody(): ParameterDecorator {\n return injectParam(\n (ctx: KoattyContext, opt?: PayloadOptions) => bodyParser(ctx, opt),\n \"RequestBody\",\n ParamSourceType.BODY\n );\n}\n\n/**\n * Alias of @RequestBody\n * @param {*}\n * @return {*}\n */\nexport const Body = RequestBody;\n\n/**\n * Get parsed query-string and path variable(koa ctx.query and ctx.params),\n * and set as an object.\n * \n * @export\n * @returns {ParameterDecorator}\n */\nexport function RequestParam(): ParameterDecorator {\n return injectParam(\n (ctx: KoattyContext, opt?: PayloadOptions) => queryParser(ctx, opt),\n \"RequestParam\",\n ParamSourceType.CUSTOM\n );\n}\n\n/**\n * Alias of @RequestParam\n * @param {*}\n * @return {*}\n */\nexport const Param = RequestParam;","/*\n * @Description: Router Component for Koatty framework\n * @Usage:\n * @Author: richen\n * @Date: 2026-01-26 12:00:00\n * @LastEditTime: 2026-01-26 12:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport {\n Component,\n IComponent,\n AppEvent,\n OnEvent,\n KoattyApplication,\n} from 'koatty_core';\nimport { Helper } from 'koatty_lib';\nimport { DefaultLogger as Logger } from 'koatty_logger';\nimport { NewRouter } from './router/router';\nimport { payload } from './payload/payload';\nimport { RouterFactory } from './router/factory';\n\n/**\n * Router Component\n * Responsible for initializing and managing routing\n * \n * Implements IComponent interface (base interface)\n * \n * Event bindings:\n * - loadRouter: Initialize router\n * - appStop: Cleanup router resources\n */\n@Component('RouterComponent', {\n scope: 'core',\n priority: 100,\n version: '1.0.0',\n description: 'HTTP/gRPC/WebSocket routing for Koatty',\n})\nexport class RouterComponent implements IComponent {\n events: Record<string, any> = {};\n private factory: RouterFactory | null = null;\n\n /**\n * Initialize router and load routes\n * \n * This method handles the complete router initialization:\n * 1. Create router instance(s) for configured protocol(s)\n * 2. Bind router to app.router\n * 3. Load controller routes into router\n */\n @OnEvent(AppEvent.loadRouter)\n async initRouter(app: KoattyApplication): Promise<void> {\n const routerOpts = app.config(undefined, 'router') || {};\n const serveOpts = app.config(undefined, 'server') ?? { protocol: \"http\" };\n const protocol = serveOpts.protocol ?? \"http\";\n const protocols = Helper.isArray(protocol) ? protocol : [protocol];\n\n Logger.Log('Koatty', '', `Creating routers for protocols: ${protocols.join(', ')}`);\n\n // Step 1: Create and bind router instance(s)\n if (protocols.length > 1) {\n const routers: Record<string, any> = {};\n const successfulProtocols: string[] = [];\n \n for (const proto of protocols) {\n try {\n const protoRouterOpts = { protocol: proto, ...routerOpts };\n // Get protocol-specific ext configuration\n if (routerOpts.ext && routerOpts.ext[proto]) {\n protoRouterOpts.ext = routerOpts.ext[proto];\n } else if (serveOpts.ext && serveOpts.ext[proto]) {\n // Fallback: check ServeComponent ext config\n protoRouterOpts.ext = serveOpts.ext[proto];\n }\n \n const { router, factory } = NewRouter(app, protoRouterOpts);\n routers[proto] = router;\n this.factory = factory;\n successfulProtocols.push(proto);\n } catch (error: any) {\n // Log warning and skip this protocol instead of crashing\n Logger.Warn(\n `Router for protocol '${proto}' skipped: ${error.message}\\n` +\n ` → To enable ${proto}, configure 'ext.${proto}' in config/router.ts`\n );\n }\n }\n \n if (successfulProtocols.length === 0) {\n throw new Error(\n `No routers could be initialized. Configured protocols: [${protocols.join(', ')}]\\n` +\n ` → Check protocol-specific configuration in config/router.ts`\n );\n }\n \n Helper.define(app, \"router\", routers);\n Logger.Log('Koatty', '', `✓ Routers initialized: ${successfulProtocols.join(', ')}`);\n } else {\n const singleProto = protocols[0];\n const { router, factory } = NewRouter(app, { protocol: singleProto, ...routerOpts });\n Helper.define(app, \"router\", router);\n this.factory = factory;\n Logger.Log('Koatty', '', '✓ Router initialized');\n }\n\n // Step 2: Register payload middleware BEFORE loading routes\n // This ensures body parsing runs before route matching in the middleware chain,\n // so controller handlers can access parsed request body directly.\n app.use(payload(app.config('payload', 'router')));\n Logger.Log('Koatty', '', '✓ Payload middleware registered');\n\n // Step 3: Load controller routes\n await this.loadRoutes(app);\n }\n\n /**\n * Load controller routes into router\n * \n * @param app - Koatty application instance\n */\n private async loadRoutes(app: KoattyApplication): Promise<void> {\n const router = app.router;\n // getMetaData returns wrapped array for private keys (keys starting with \"_\")\n // so we need to unwrap with [0]\n const controllers = app.getMetaData('_controllers')[0] || [];\n \n if (controllers.length === 0) {\n Logger.Warn('No controllers found!');\n return;\n }\n\n Logger.Log('Koatty', '', `Loading routes for ${controllers.length} controllers`);\n\n if (Helper.isObject(router) && !Helper.isFunction((router as any).LoadRouter)) {\n // Multi-protocol routers (router is an object with protocol keys)\n const routers = router as Record<string, any>;\n Logger.Log('Koatty', '', `Multi-protocol routing: ${Object.keys(routers).length} protocols (${Object.keys(routers).join(', ')})`);\n \n for (const proto in routers) {\n if (routers[proto] && Helper.isFunction(routers[proto].LoadRouter)) {\n Logger.Log('Koatty', '', `Loading routes for protocol: ${proto}`);\n await routers[proto].LoadRouter(app, controllers);\n }\n }\n } else if (Helper.isFunction((router as any).LoadRouter)) {\n // Single protocol router\n Logger.Log('Koatty', '', 'Loading routes for single protocol');\n await (router as any).LoadRouter(app, controllers);\n } else {\n Logger.Warn('No valid router found!');\n }\n\n Logger.Log('Koatty', '', '✓ Routes loaded');\n }\n\n /**\n * Cleanup router resources on app stop\n *\n * NOTE: Original app.once(\"appStop\", ...) listener in router.ts\n * is now unified to be handled by @OnEvent(AppEvent.appStop) decorator\n */\n @OnEvent(AppEvent.appStop)\n async cleanup(_app: KoattyApplication): Promise<void> {\n Logger.Log('Koatty', '', 'RouterComponent: Cleaning up router resources...');\n\n if (this.factory) {\n await this.factory.shutdownAll();\n }\n\n Logger.Log('Koatty', '', '✓ Router resources cleaned up');\n }\n\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/params/mapping.ts","../src/middleware/manager.ts","../src/payload/interface.ts","../src/payload/parser/text.ts","../src/payload/parser/json.ts","../src/payload/parser/form.ts","../src/utils/path.ts","../src/payload/parser/multipart.ts","../src/payload/parser/xml.ts","../src/payload/parser/grpc.ts","../src/payload/parser/graphql.ts","../src/payload/parser/websocket.ts","../src/payload/payload_cache.ts","../src/payload/payload.ts","../src/utils/inject.ts","../src/utils/strategy-extractor.ts","../src/utils/handler.ts","../src/router/types.ts","../src/router/graphql.ts","../src/router/grpc.ts","../src/router/http.ts","../src/router/ws.ts","../src/router/factory.ts","../src/router/router.ts","../src/params/params.ts","../src/RouterComponent.ts"],"names":["MAPPING_KEY","RequestMethod","RequestMapping","path","reqMethod","routerOptions","routerName","target","key","descriptor","targetType","IOC","getType","Error","middlewareConfigs","middleware","map","item","prototype","priority","enabled","conditions","metadata","attachPropertyData","requestMethod","method","PostMapping","GetMapping","DeleteMapping","PutMapping","PatchMapping","OptionsMapping","HeadMapping","withMiddleware","options","RouterMiddlewareManager","app","instance","isCreating","_instanceId","middlewares","Map","middlewaresByName","pathPatterns","exact","LRUCache","max","prefixes","suffixes","patterns","methodCache","headerCache","Math","random","toString","substr","Logger","Debug","getInstance","resetInstance","destroy","getCacheSize","size","clearCaches","clear","register","config","name","actualMiddleware","isMiddlewareClass","processMiddlewareClass","instanceIdConfig","middlewareConfig","undefined","instanceId","generateInstanceId","set","has","Set","get","add","preprocessConditions","route","replace","timestamp","Date","now","run","MiddlewareClass","middlewareInstance","appConfig","middlewareBusinessConfig","decoratorConfig","finalConfig","koaMiddleware","error","length","condition","type","preprocessPathCondition","preprocessMethodCondition","preprocessHeaderCondition","value","operator","startsWith","includes","RegExp","Warn","toUpperCase","headerName","expectedValue","split","toLowerCase","unregister","nameOrInstanceId","delete","instanceIds","deletedCount","getMiddleware","firstInstanceId","values","next","getMiddlewareByRoute","middlewareName","cleanRoute","targetMethod","expectedInstanceId","getMiddlewareInstances","Array","from","filter","listMiddlewares","keys","setEnabled","updatedCount","compose","context","validConfigs","sort","a","b","ctx","middlewareFunctions","createConditionalMiddleware","wrapMiddleware","shouldExecute","evaluateConditions","every","evaluatePathCondition","evaluateMethodCondition","evaluateHeaderCondition","evaluateCustomCondition","exactMatch","isMatch","prefixMatch","isPrefixMatch","regex","test","currentMethod","methodSet","normalizedHeaderName","actualValue","headers","actualValueStr","isArray","headerMap","cachedResult","_context","createGroup","groupName","middlewareNames","groupMiddleware","members","MiddlewareBuilder","push","build","manager","RegisterMiddleware","propertyKey","FILE_KEY","Symbol","for","parseText","opts","getRawBody","inflate","req","catch","err","parseJson","str","parsed","JSON","parse","parseForm","trim","result","parsePath","opath","endsWith","slice","deleteFiles","files","deletePromises","Object","filePath","fsPromise","access","unlink","logger","Promise","all","parseMultipart","form","IncomingForm","encoding","multiples","keepExtensions","maxFileSize","limit","parseInt","cleanup","uploadFiles","e","onFinished","res","resolve","fields","xmlParser","XMLParser","ignoreAttributes","parseXml","parseGrpc","buffer","body","parseGraphQL","payload","query","variables","operationName","parseWebSocket","DEFAULT_ENCODING","DEFAULT_LIMIT","contentTypeRegex","IDENTITY_ENCODING","defaultParsers","commonMimeTypes","defaultOptions","extTypes","json","text","multipart","xml","grpc","graphql","websocket","PayloadCacheManager","lock","typeMapCache","contentTypeCache","optionsCache","clearAll","getTypeMap","cacheKey","stringify","cached","typeMap","mime","parser","mimes","entries","getContentType","contentType","normalizedType","match","getMergedOptions","mergedOptions","assign","cacheManager","bodyCache","WeakMap","supportedMethods","getParserForType","isSupportedMethod","getContentLength","len","hasOwnProperty","call","Helper","define","queryParams","pathParams","params","queryParser","bodyParser","_options","parseBodyAndCache","parseBody","setMetaData","empty","request","cachedProject","publicMethodsCache","ParamSourceType","inferSourceTypeFromFnName","fnName","DTO_METADATA_CACHE","injectRouter","protocol","ctlName","getIdentifier","getPropertyData","CONTROLLER_ROUTER","rmetaData","recursiveGetMetadata","router","methods","middlewareManager","appDebug","ctlPath","getControllerPath","getPublicMethods","metaKey","val","controllerMiddlewareConfigs","methodMiddlewareConfigs","middlewareItem","source","controllerMiddlewareMap","forEach","methodDisabledMiddlewares","methodAddedMiddlewares","methodConfig","filteredControllerMiddlewares","middlewareMap","allMiddlewareConfigs","middlewareInstanceIds","currentRoute","existingInstance","description","join","composedMiddleware","tmp","injectParamMetaData","metaDatas","TAGGED_PARAM","validMetaDatas","PARAM_RULE_KEY","validatedMetaDatas","PARAM_CHECK_KEY","argsMetaObj","meta","data","index","validData","v","sourceType","fn","validEntry","find","it","validRule","rule","validOpt","isDto","compiledValidator","compileValidator","errorMsg","message","dtoCheck","clazz","getClass","cachedDtoRule","dtoRule","getOriginMetadata","PARAM_TYPE_KEY","Reflect","defineProperty","enumerable","configurable","writable","precompiledOptions","precompiledExtractor","generatePrecompiledExtractor","compiledTypeConverter","compileTypeConverter","hasAsyncParams","some","p","injectParam","paramName","defaultValue","paramTypes","getMetadata","paramterTypes","classFilePath","className","Project","sourceFile","addSourceFileAtPath","classDeclaration","publicMethods","getMethods","modifiers","getModifiers","mod","getText","getName","process","env","APP_PATH","convertParamsType","param","bodyOpts","_files","bodyOnly","isFunction","errorPrefix","Exception","funcs","isString","validators","func","FunctionValidator","validator","extractValueSync","QUERY","HEADER","PATH","extractValueFromSource","BODY","bodyFields","FILE","CUSTOM","extractParamSources","needsBody","parsedBody","createParamOptions","validateParam","opt","validatedValue","ClassValidator","valid","plainToClass","needsConversion","needsValidation","convertedValue","errorMessage","detectExtractionStrategy","paramCount","hasDtoParams","hasValidation","isSimpleDto","StrategyCacheManager","cache","strategyMap","getOrCreate","strategy","handler","StrategyHandlerFactory","createHandler","getStrategy","strategyCache","extractParameters","createSyncSingleNoValidationHandler","createSyncMultiNoValidationHandler","createSyncSingleSimpleValidationHandler","createSyncMultiSimpleValidationHandler","createSyncDtoHandler","createAsyncMixedHandler","createAsyncDtoHandler","createGenericAsyncHandler","rawValue","converted","handlers","extractor","converter","results","i","_app","actualClazz","transformed","asyncParams","syncParams","syncHandlers","allAsyncHaveExtractor","bodyData","asyncResults","paramOptions","syncResults","h","asyncIndex","syncIndex","allHaveExtractorOrFn","sources","paramPromises","k","Handler","ctl","ctlParams","ctlParamsValue","throw","middlewareFns","args","isError","getProtocolConfig","ext","validateProtocolConfig","NODE_ENV","errors","warnings","proto","protoFile","poolSize","batchSize","streamConfig","sc","maxConcurrentStreams","streamTimeout","schemaFile","playground","debug","depthLimit","complexityLimit","heartbeatInterval","heartbeatTimeout","maxConnections","maxFrameSize","maxBufferSize","GraphQLRouter","routerMap","prefix","extConfig","validation","warning","schemaFilePath","isAbsolute","rootPath","KoaRouter","sensitive","strict","SetRouter","impl","routeHandler","implementation","isEmpty","validationRules","require","ignore","createComplexityLimitRule","scalarCost","objectCost","listFactor","schema","rootValue","formatError","formatted","extensions","locations","koattyContext","renderGraphiQL","url","URL","host","requestBody","koaRequest","fetchRequest","Request","response","status","escapeJsString","endpoint","safeEndpoint","ListRouter","LoadRouter","list","schemaContent","fs","promises","readFile","buildSchema","n","ctlClass","ctlRouters","getInsByClass","routerMiddleware","routes","allowedMethodsMiddleware","allowedMethods","use","StreamManager","streams","backpressureThreshold","registerStream","id","state","startTime","messageCount","bufferSize","isActive","cleanupExpiredStreams","removeStream","getStreamState","updateStream","updates","isBackpressureTriggered","getActiveStreamCount","s","closeAllStreams","activeCount","Info","GrpcRouter","streamManager","protoFilePath","service","detectStreamType","isActuallyReadableStream","readable","isActuallyWritableStream","handleUnaryCall","callback","ctlItem","createContext","handleServerStreaming","streamId","timeout","setTimeout","end","on","clearTimeout","writeStream","write","currentState","endStream","handleClientStreaming","messages","Buffer","isBuffer","byteLength","pause","resume","streamMessages","handleBidirectionalStreaming","streamMessage","responseData","handleStreamCall","streamType","pdef","LoadProto","services","ListServices","ctls","si","methodPath","code","server","grpcServer","RegisterService","getAllServers","allServers","rpc","hasResult","HttpRouter","httpProtocols","WebsocketRouter","connections","connectionCount","totalBufferSize","cleanupTimer","frameTimeout","cleanupInterval","startCleanupTimer","setInterval","cleanupStaleConnections","staleThreshold","cleanedCount","freedMemory","socketId","connection","lastActivity","cleanupConnection","enforceMemoryLimits","cleanupOldestConnections","count","sortedConnections","websocketHandler","wsProtocols","reject","requestId","buffers","resetFrameTimeout","isAlive","onPong","checkAlive","terminate","ping","chunkSize","bufferData","newBufferSize","chunk","min","fullMessage","concat","clearInterval","RouterFactory","routerRegistry","activeRouters","isShuttingDown","hasShutdown","initializeDefaultRouters","create","normalizedProtocol","RouterClass","supportedProtocols","routerClass","getSupportedProtocols","isSupported","getRouterClass","reset","shutdownAll","routerCount","shutdownPromises","routerAny","getActiveRouterCount","getActiveRouters","RouterFactoryBuilder","customRouters","excludeDefaults","addRouter","excludeDefault","factory","RegisterRouter","NewRouter","Header","PathVariable","Get","Post","File","RequestBody","Body","RequestParam","Param","RouterComponent","events","initRouter","routerOpts","serveOpts","protocols","Log","routers","successfulProtocols","protoRouterOpts","singleProto","loadRoutes","controllers","getMetaData","isObject","loadRouter","appStop","scope","version"],"mappings":"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","file":"index.js","sourcesContent":["/*\n * @Description: \n * @Usage: \n * @Author: richen\n * @Date: 2024-10-31 14:16:50\n * @LastEditTime: 2025-01-26 12:04:42\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\n// tslint:disable-next-line: no-import-side-effect\nimport \"reflect-metadata\";\nimport { IOC } from 'koatty_container';\nimport { MiddlewareCondition } from \"../middleware/manager\";\n\n// used for request mapping metadata\nexport const MAPPING_KEY = 'MAPPING_KEY';\n\n/**\n * Enhanced middleware configuration for decorators\n */\nexport interface MiddlewareDecoratorConfig {\n middleware: Function;\n priority?: number;\n enabled?: boolean;\n conditions?: MiddlewareCondition[];\n metadata?: Record<string, any>;\n}\n\n/**\n * Koatty router options with enhanced middleware support\n *\n * @export\n * @interface RouterOption\n */\nexport interface RouterOption {\n path?: string;\n requestMethod: string;\n routerName?: string;\n method: string;\n middleware?: Function[] | MiddlewareDecoratorConfig[];\n}\n\n/**\n * http request methods\n *\n * @export\n * @var RequestMethod\n */\nexport enum RequestMethod {\n \"GET\" = \"get\",\n \"POST\" = \"post\",\n \"PUT\" = \"put\",\n \"DELETE\" = \"delete\",\n \"PATCH\" = \"patch\",\n \"ALL\" = \"all\",\n \"OPTIONS\" = \"options\",\n \"HEAD\" = \"head\"\n}\n\n/**\n * Routes HTTP requests to the specified path with enhanced middleware support.\n *\n * @param {string} [path=\"/\"]\n * @param {RequestMethod} [reqMethod=RequestMethod.GET]\n * @param {{\n * routerName?: string;\n * middleware?: Function[] | MiddlewareDecoratorConfig[];\n * }} [routerOptions={}]\n * @returns {*} {MethodDecorator}\n */\nexport const RequestMapping = (\n path = \"/\",\n reqMethod: RequestMethod = RequestMethod.GET,\n routerOptions: {\n routerName?: string;\n middleware?: Function[] | MiddlewareDecoratorConfig[];\n } = {}\n): MethodDecorator => {\n const routerName = routerOptions.routerName ?? \"\";\n return (target: any, key: string, descriptor: PropertyDescriptor) => {\n const targetType = IOC.getType(target);\n if (targetType !== \"CONTROLLER\") {\n throw Error(\"RequestMapping decorator is only used in controllers class.\");\n }\n\n // 处理中间件配置\n let middlewareConfigs: MiddlewareDecoratorConfig[] = [];\n \n if (routerOptions.middleware) {\n middlewareConfigs = routerOptions.middleware.map(item => {\n if (typeof item === 'function') {\n // 兼容旧的简单中间件配置\n if (!('run' in item.prototype)) {\n throw new Error(`Middleware must be a class implementing IMiddleware`);\n }\n return {\n middleware: item,\n priority: 50, // 默认优先级\n enabled: true,\n conditions: [],\n metadata: {}\n } as MiddlewareDecoratorConfig;\n } else {\n // 新的高级中间件配置\n if (typeof item.middleware !== 'function' || !('run' in item.middleware.prototype)) {\n throw new Error(`Middleware must be a class implementing IMiddleware`);\n }\n return {\n priority: 50,\n enabled: true,\n conditions: [],\n metadata: {},\n ...item\n } as MiddlewareDecoratorConfig;\n }\n });\n }\n\n // tslint:disable-next-line: no-object-literal-type-assertion\n IOC.attachPropertyData(MAPPING_KEY, {\n path,\n requestMethod: reqMethod,\n routerName,\n method: key,\n middlewareConfigs // 存储完整的中间件配置\n }, target, key);\n\n return descriptor;\n };\n};\n\n/**\n * Routes HTTP POST requests to the specified path.\n */\nexport const PostMapping = (path = \"/\", routerOptions?: RouterOption) => {\n return RequestMapping(path, RequestMethod.POST, routerOptions);\n};\n\n/**\n * Routes HTTP GET requests to the specified path.\n */\nexport const GetMapping = (path = \"/\", routerOptions?: RouterOption) => {\n return RequestMapping(path, RequestMethod.GET, routerOptions);\n};\n\n/**\n * Routes HTTP DELETE requests to the specified path.\n */\nexport const DeleteMapping = (path = \"/\", routerOptions?: RouterOption) => {\n return RequestMapping(path, RequestMethod.DELETE, routerOptions);\n};\n/**\n * Routes HTTP PUT requests to the specified path.\n */\nexport const PutMapping = (path = \"/\", routerOptions?: RouterOption) => {\n return RequestMapping(path, RequestMethod.PUT, routerOptions);\n};\n\n/**\n * Routes HTTP PATCH requests to the specified path.\n */\nexport const PatchMapping = (path = \"/\", routerOptions?: RouterOption) => {\n return RequestMapping(path, RequestMethod.PATCH, routerOptions);\n};\n\n/**\n * Routes HTTP OPTIONS requests to the specified path.\n */\nexport const OptionsMapping = (path = \"/\", routerOptions?: RouterOption) => {\n return RequestMapping(path, RequestMethod.OPTIONS, routerOptions);\n};\n\n/**\n * Routes HTTP HEAD requests to the specified path.\n */\nexport const HeadMapping = (path = \"/\", routerOptions?: RouterOption) => {\n return RequestMapping(path, RequestMethod.HEAD, routerOptions);\n};\n\n/**\n * Helper function to create middleware configuration with advanced features\n * \n * @param middleware - The middleware class\n * @param options - Advanced configuration options\n * @returns MiddlewareDecoratorConfig\n * \n * @example\n * ```typescript\n * @GetMapping('/api/users', {\n * middleware: [\n * withMiddleware(AuthMiddleware, { \n * priority: 100,\n * conditions: [{ type: 'header', value: 'authorization', operator: 'contains' }]\n * }),\n * withMiddleware(RateLimitMiddleware, { \n * priority: 90,\n * metadata: { limit: 100, window: 60000 }\n * })\n * ]\n * })\n * ```\n */\nexport function withMiddleware(\n middleware: Function,\n options: {\n priority?: number;\n enabled?: boolean;\n conditions?: MiddlewareCondition[];\n metadata?: Record<string, any>;\n } = {}\n): MiddlewareDecoratorConfig {\n if (typeof middleware !== 'function' || !('run' in middleware.prototype)) {\n throw new Error(`Middleware must be a class implementing IMiddleware`);\n }\n\n return {\n middleware,\n priority: options.priority ?? 50,\n enabled: options.enabled ?? true,\n conditions: options.conditions ?? [],\n metadata: options.metadata ?? {}\n };\n}\n","/*\n * @Description: Middleware Manager Implementation\n * @Usage: Centralized middleware management and composition\n * @Author: richen\n * @Date: 2025-01-20 10:00:00\n * @LastEditTime: 2025-01-20 10:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { KoattyContext, KoattyNext } from \"koatty_core\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport compose, { Middleware } from \"koa-compose\";\nimport { LRUCache } from \"lru-cache\";\nimport { Application } from \"koatty_container\";\n\n/**\n * Middleware function type\n */\nexport type MiddlewareFunction = <T = unknown>(ctx: KoattyContext, next: KoattyNext) => Promise<T> | T;\n\n/**\n * Middleware configuration\n */\nexport interface MiddlewareConfig {\n name: string;\n instanceId?: string; // 中间件实例的唯一标识符\n middleware: MiddlewareFunction | Function; // 支持中间件函数或中间件类\n priority?: number;\n enabled?: boolean;\n conditions?: MiddlewareCondition[];\n metadata?: Record<string, unknown>;\n // 用于中间件类的配置参数\n middlewareConfig?: {\n [key: string]: unknown;\n };\n}\n\n/**\n * Middleware condition\n */\nexport interface MiddlewareCondition {\n type: 'path' | 'method' | 'header' | 'custom';\n value: string | RegExp | ((ctx: KoattyContext) => boolean);\n operator?: 'equals' | 'contains' | 'matches' | 'custom';\n}\n\n/**\n * Instance ID configuration\n */\ninterface InstanceIdConfig {\n route: string;\n method?: string;\n}\n\n/**\n * Middleware execution context\n */\nexport interface MiddlewareExecutionContext {\n route?: string;\n method?: string;\n protocol?: string;\n metadata?: Record<string, any>;\n}\n\n/**\n * Path pattern cache for optimized matching with memory management\n */\ninterface PathPattern {\n exact: LRUCache<string, boolean>; // 精确匹配的路径\n prefixes: LRUCache<string, boolean>; // 前缀匹配的路径\n suffixes: LRUCache<string, boolean>; // 后缀匹配的路径\n patterns: LRUCache<string, RegExp>; // 复杂模式的正则表达式\n}\n\n/**\n * Router middleware manager interface\n * Defines the contract for managing router-level middleware\n */\nexport interface IRouterMiddlewareManager {\n register(config: MiddlewareConfig): Promise<string>;\n unregister(nameOrInstanceId: string): boolean;\n getMiddleware(nameOrInstanceId: string): MiddlewareConfig | null;\n getMiddlewareByRoute(middlewareName: string, route: string, method?: string): MiddlewareConfig | null;\n listMiddlewares(): string[];\n compose(instanceIds: string[], context?: MiddlewareExecutionContext): MiddlewareFunction;\n createGroup(groupName: string, middlewareNames: string[]): Promise<void>;\n}\n\n/**\n * Router middleware manager implementation\n * Manages router-level middleware registration, composition, and conditional execution\n */\nexport class RouterMiddlewareManager implements IRouterMiddlewareManager {\n private app: Application;\n private static instance: RouterMiddlewareManager | null = null;\n private static isCreating = false;\n private readonly _instanceId: string;\n private middlewares = new Map<string, MiddlewareConfig>(); // 按实例ID存储\n private middlewaresByName = new Map<string, Set<string>>(); // 按名称索引实例ID\n\n // 优化的路径匹配缓存 - 使用LRU缓存防止内存泄漏\n private pathPatterns: PathPattern = {\n exact: new LRUCache<string, boolean>({ max: 200 }),\n prefixes: new LRUCache<string, boolean>({ max: 100 }),\n suffixes: new LRUCache<string, boolean>({ max: 100 }),\n patterns: new LRUCache<string, RegExp>({ max: 50 })\n };\n\n // 方法匹配缓存 - 限制大小\n private methodCache = new LRUCache<string, Set<string>>({ max: 100 });\n\n // 头部匹配缓存 - 限制大小\n private headerCache = new LRUCache<string, Map<string, string>>({ max: 100 });\n\n /**\n * Private constructor to enforce singleton pattern\n */\n private constructor(app: Application) {\n this.app = app;\n if (RouterMiddlewareManager.instance) {\n throw new Error('RouterMiddlewareManager is a singleton. Use getInstance() instead.');\n }\n this._instanceId = Math.random().toString(36).substr(2, 9);\n Logger.Debug(`RouterMiddlewareManager instance created with ID: ${this._instanceId}`);\n }\n\n /**\n * Get singleton instance\n * @returns RouterMiddlewareManager instance\n */\n public static getInstance(app: Application): RouterMiddlewareManager {\n if (RouterMiddlewareManager.instance) {\n return RouterMiddlewareManager.instance;\n }\n\n if (RouterMiddlewareManager.isCreating) {\n throw new Error('RouterMiddlewareManager is already being created');\n }\n\n RouterMiddlewareManager.isCreating = true;\n try {\n RouterMiddlewareManager.instance = new RouterMiddlewareManager(app);\n Logger.Debug('RouterMiddlewareManager singleton instance initialized');\n } finally {\n RouterMiddlewareManager.isCreating = false;\n }\n\n return RouterMiddlewareManager.instance;\n }\n\n /**\n * Reset singleton instance (for testing)\n */\n public static resetInstance(): void {\n if (RouterMiddlewareManager.instance) {\n RouterMiddlewareManager.instance.destroy();\n }\n RouterMiddlewareManager.instance = null;\n RouterMiddlewareManager.isCreating = false;\n Logger.Debug('RouterMiddlewareManager singleton instance reset');\n }\n\n /**\n * Get total cache size\n */\n private getCacheSize(): number {\n return this.pathPatterns.exact.size +\n this.pathPatterns.prefixes.size +\n this.pathPatterns.suffixes.size +\n this.pathPatterns.patterns.size +\n this.methodCache.size +\n this.headerCache.size;\n }\n\n /**\n * Destroy manager and cleanup resources\n */\n public destroy(): void {\n this.clearCaches();\n this.middlewares.clear();\n\n Logger.Debug(`RouterMiddlewareManager instance ${this._instanceId} destroyed`);\n }\n\n /**\n * Register middleware\n */\n public async register(config: MiddlewareConfig): Promise<string> {\n if (!config.name || typeof config.name !== 'string') {\n throw new Error('Middleware name must be a non-empty string');\n }\n\n if (!config.middleware || typeof config.middleware !== 'function') {\n throw new Error('Middleware must be a function');\n }\n\n // 处理中间件类或中间件函数\n let actualMiddleware: MiddlewareFunction;\n\n // 检查是否为中间件类(有run方法)\n if (this.isMiddlewareClass(config.middleware)) {\n Logger.Debug(`Processing middleware class: ${config.name}`);\n actualMiddleware = await this.processMiddlewareClass(config);\n } else {\n // 直接使用中间件函数\n actualMiddleware = config.middleware as MiddlewareFunction;\n }\n\n // 生成唯一的实例ID\n const instanceIdConfig: InstanceIdConfig | undefined = config.middlewareConfig && \n typeof config.middlewareConfig === 'object' && \n 'route' in config.middlewareConfig\n ? config.middlewareConfig as unknown as InstanceIdConfig\n : undefined;\n const instanceId = config.instanceId || this.generateInstanceId(config.name, instanceIdConfig);\n\n // Set defaults\n const middlewareConfig: MiddlewareConfig = {\n priority: 500,\n enabled: true,\n conditions: [],\n metadata: {},\n ...config,\n instanceId,\n middleware: actualMiddleware // 使用处理后的中间件函数\n };\n\n // 按实例ID存储\n this.middlewares.set(instanceId, middlewareConfig);\n\n // 按名称索引实例ID\n if (!this.middlewaresByName.has(config.name)) {\n this.middlewaresByName.set(config.name, new Set());\n }\n this.middlewaresByName.get(config.name)!.add(instanceId);\n\n // 预处理条件以优化匹配性能\n this.preprocessConditions(middlewareConfig);\n\n Logger.Debug(`Registered middleware: ${config.name} with instanceId: ${instanceId}`);\n return instanceId;\n }\n\n /**\n * Generate unique instance ID using middleware name and route\n */\n private generateInstanceId(name: string, config?: InstanceIdConfig): string {\n if (config && config.route) {\n // 使用中间件名和路由组合作为唯一标识\n const route = config.route.replace(/[^a-zA-Z0-9\\/\\-_]/g, '_'); // 清理路由中的特殊字符\n const method = config.method || 'ALL';\n return `${name}@${route}#${method}`;\n }\n\n // 如果没有路由信息,使用时间戳作为后备方案\n const timestamp = Date.now();\n return `${name}_${timestamp}`;\n }\n\n /**\n * Check if the provided function is a middleware class\n */\n private isMiddlewareClass(middleware: Function): boolean {\n // 检查是否为构造函数(类)\n if (middleware.prototype && middleware.prototype.constructor === middleware) {\n // 检查原型上是否有run方法\n return typeof middleware.prototype.run === 'function';\n }\n return false;\n }\n\n /**\n * Process middleware class to get actual middleware function\n */\n private async processMiddlewareClass(config?: MiddlewareConfig): Promise<MiddlewareFunction> {\n const MiddlewareClass = config?.middleware as any;\n try {\n // 实例化中间件类\n const middlewareInstance = new MiddlewareClass();\n\n // 检查实例是否有run方法\n if (!middlewareInstance.run || typeof middlewareInstance.run !== 'function') {\n throw new Error(`Middleware class ${MiddlewareClass.name} does not have a run method`);\n }\n\n // 调用run方法获取真正的Koa中间件函数\n const appConfig = this.app.config(\"config\", \"middleware\") || {};\n const middlewareBusinessConfig = appConfig[MiddlewareClass?.name] || {};\n \n // 合并装饰器配置和应用配置\n const decoratorConfig = config?.middlewareConfig?.decoratorConfig;\n const finalConfig = {\n ...middlewareBusinessConfig,\n ...(decoratorConfig && typeof decoratorConfig === 'object' ? decoratorConfig : {}) // 装饰器配置优先级更高\n };\n \n Logger.Debug(`Processing middleware ${MiddlewareClass.name} with config:`, finalConfig);\n \n // 调用run方法,传递合并后的配置和app实例\n const koaMiddleware = await middlewareInstance.run(finalConfig, this.app);\n\n // 验证返回的是否为函数\n if (typeof koaMiddleware !== 'function') {\n throw new Error(`Middleware ${MiddlewareClass.name}.run() must return a function, got ${typeof koaMiddleware}`);\n }\n\n Logger.Debug(`Successfully processed middleware class: ${MiddlewareClass.name}`);\n return koaMiddleware;\n\n } catch (error) {\n Logger.Error(`Error processing middleware class ${MiddlewareClass.name}:`, error);\n throw error;\n }\n }\n\n /**\n * Preprocess conditions for optimized matching\n */\n private preprocessConditions(config: MiddlewareConfig): void {\n if (!config.conditions || config.conditions.length === 0) {\n return;\n }\n\n for (const condition of config.conditions) {\n switch (condition.type) {\n case 'path':\n this.preprocessPathCondition(condition);\n break;\n case 'method':\n this.preprocessMethodCondition(condition);\n break;\n case 'header':\n this.preprocessHeaderCondition(condition);\n break;\n }\n }\n }\n\n /**\n * Preprocess path conditions\n */\n private preprocessPathCondition(condition: MiddlewareCondition): void {\n if (typeof condition.value !== 'string') {\n return;\n }\n\n const path = condition.value;\n const operator = condition.operator || 'equals';\n\n switch (operator) {\n case 'equals':\n this.pathPatterns.exact.set(path, true);\n break;\n case 'contains':\n // 对于包含匹配,我们可以优化为前缀或后缀匹配\n if (path.startsWith('/') && !path.includes('*')) {\n this.pathPatterns.prefixes.set(path, true);\n }\n break;\n case 'matches':\n // 只有在必要时才使用正则表达式\n try {\n this.pathPatterns.patterns.set(path, new RegExp(path));\n } catch {\n Logger.Warn(`Invalid regex pattern: ${path}`);\n }\n break;\n }\n }\n\n /**\n * Preprocess method conditions\n */\n private preprocessMethodCondition(condition: MiddlewareCondition): void {\n if (typeof condition.value === 'string') {\n const method = condition.value.toUpperCase();\n if (!this.methodCache.has(method)) {\n this.methodCache.set(method, new Set());\n }\n }\n }\n\n /**\n * Preprocess header conditions\n */\n private preprocessHeaderCondition(condition: MiddlewareCondition): void {\n if (typeof condition.value === 'string') {\n const [headerName, expectedValue] = condition.value.split(':');\n if (headerName) {\n if (!this.headerCache.has(headerName.toLowerCase())) {\n this.headerCache.set(headerName.toLowerCase(), new Map());\n }\n if (expectedValue) {\n this.headerCache.get(headerName.toLowerCase())!.set(expectedValue, expectedValue);\n }\n }\n }\n }\n\n /**\n * Unregister middleware by name or instance ID\n */\n public unregister(nameOrInstanceId: string): boolean {\n // 首先尝试按实例ID删除\n if (this.middlewares.has(nameOrInstanceId)) {\n const config = this.middlewares.get(nameOrInstanceId)!;\n this.middlewares.delete(nameOrInstanceId);\n \n // 从名称索引中移除\n const instanceIds = this.middlewaresByName.get(config.name);\n if (instanceIds) {\n instanceIds.delete(nameOrInstanceId);\n if (instanceIds.size === 0) {\n this.middlewaresByName.delete(config.name);\n }\n }\n \n Logger.Debug(`Unregistered middleware: ${config.name} (instanceId: ${nameOrInstanceId})`);\n return true;\n }\n\n // 然后尝试按名称删除所有实例\n const instanceIds = this.middlewaresByName.get(nameOrInstanceId);\n if (instanceIds && instanceIds.size > 0) {\n let deletedCount = 0;\n for (const instanceId of instanceIds) {\n if (this.middlewares.delete(instanceId)) {\n deletedCount++;\n }\n }\n this.middlewaresByName.delete(nameOrInstanceId);\n Logger.Debug(`Unregistered ${deletedCount} instances of middleware: ${nameOrInstanceId}`);\n return deletedCount > 0;\n }\n\n Logger.Warn(`Middleware not found: ${nameOrInstanceId}`);\n return false;\n }\n\n /**\n * Get middleware configuration by name or instance ID\n */\n public getMiddleware(nameOrInstanceId: string): MiddlewareConfig | null {\n // 首先尝试按实例ID查找\n if (this.middlewares.has(nameOrInstanceId)) {\n return this.middlewares.get(nameOrInstanceId)!;\n }\n\n // 然后尝试按名称查找第一个实例\n const instanceIds = this.middlewaresByName.get(nameOrInstanceId);\n if (instanceIds && instanceIds.size > 0) {\n const firstInstanceId = instanceIds.values().next().value;\n return this.middlewares.get(firstInstanceId) || null;\n }\n\n return null;\n }\n\n /**\n * Get middleware by route and middleware name\n */\n public getMiddlewareByRoute(middlewareName: string, route: string, method?: string): MiddlewareConfig | null {\n // 生成预期的实例ID\n const cleanRoute = route.replace(/[^a-zA-Z0-9\\/\\-_]/g, '_');\n const targetMethod = method || 'ALL';\n const expectedInstanceId = `${middlewareName}@${cleanRoute}#${targetMethod}`;\n \n // 直接通过实例ID查找\n const config = this.middlewares.get(expectedInstanceId);\n if (config) {\n Logger.Debug(`Found middleware by route: ${middlewareName}@${route}#${targetMethod}`);\n return config;\n }\n\n // 如果没找到,尝试查找该中间件的所有实例,匹配路由\n const instanceIds = this.middlewaresByName.get(middlewareName);\n if (instanceIds && instanceIds.size > 0) {\n for (const instanceId of instanceIds) {\n const middlewareConfig = this.middlewares.get(instanceId);\n if (middlewareConfig && \n middlewareConfig.middlewareConfig?.route === route &&\n (middlewareConfig.middlewareConfig?.method === method || \n middlewareConfig.middlewareConfig?.method === 'ALL' || \n !method)) {\n Logger.Debug(`Found middleware by route match: ${middlewareName}@${route}`);\n return middlewareConfig;\n }\n }\n }\n\n Logger.Debug(`Middleware not found by route: ${middlewareName}@${route}#${targetMethod}`);\n return null;\n }\n\n /**\n * Get all middleware instances by name\n */\n public getMiddlewareInstances(name: string): MiddlewareConfig[] {\n const instanceIds = this.middlewaresByName.get(name);\n if (!instanceIds || instanceIds.size === 0) {\n return [];\n }\n\n return Array.from(instanceIds)\n .map(instanceId => this.middlewares.get(instanceId))\n .filter((config): config is MiddlewareConfig => config !== undefined);\n }\n\n /**\n * List all middlewares\n */\n public listMiddlewares(): string[] {\n return Array.from(this.middlewares.keys());\n }\n\n /**\n * Enable/disable middleware by name or instance ID\n */\n public setEnabled(nameOrInstanceId: string, enabled: boolean): void {\n // 首先尝试按实例ID查找\n const middleware = this.middlewares.get(nameOrInstanceId);\n if (middleware) {\n middleware.enabled = enabled;\n Logger.Debug(`${enabled ? 'Enabled' : 'Disabled'} middleware: ${nameOrInstanceId}`);\n return;\n }\n\n // 然后尝试按名称查找所有实例\n const instanceIds = this.middlewaresByName.get(nameOrInstanceId);\n if (instanceIds && instanceIds.size > 0) {\n let updatedCount = 0;\n for (const instanceId of instanceIds) {\n const config = this.middlewares.get(instanceId);\n if (config) {\n config.enabled = enabled;\n updatedCount++;\n }\n }\n Logger.Debug(`${enabled ? 'Enabled' : 'Disabled'} ${updatedCount} instances of middleware: ${nameOrInstanceId}`);\n return;\n }\n\n Logger.Warn(`Middleware not found: ${nameOrInstanceId}`);\n }\n\n /**\n * Compose middlewares by instance IDs\n */\n public compose(instanceIds: string[], context?: MiddlewareExecutionContext): MiddlewareFunction {\n // 获取有效的中间件配置并按优先级排序\n const validConfigs = instanceIds\n .map(instanceId => this.middlewares.get(instanceId))\n .filter((config): config is MiddlewareConfig =>\n config !== undefined && config.enabled !== false\n )\n .sort((a, b) => (b.priority || 0) - (a.priority || 0));\n\n if (validConfigs.length === 0) {\n return async <T = unknown>(ctx: KoattyContext, next: KoattyNext): Promise<T> => {\n await next();\n return undefined as T;\n };\n }\n\n // 创建中间件函数数组\n const middlewareFunctions = validConfigs.map(config => {\n // 如果有条件,创建条件中间件\n if (config.conditions && config.conditions.length > 0) {\n return this.createConditionalMiddleware(config, context);\n } else {\n return this.wrapMiddleware(config);\n }\n });\n\n return compose(middlewareFunctions) as MiddlewareFunction;\n }\n\n /**\n * Create conditional middleware\n */\n private createConditionalMiddleware(\n config: MiddlewareConfig,\n context?: MiddlewareExecutionContext\n ): Middleware<KoattyContext> {\n return async (ctx: KoattyContext, next: KoattyNext) => {\n const shouldExecute = this.evaluateConditions(config.conditions!, ctx, context);\n\n if (shouldExecute) {\n await this.wrapMiddleware(config)(ctx, next);\n } else {\n await next();\n }\n };\n }\n\n /**\n * Evaluate middleware conditions\n */\n private evaluateConditions(\n conditions: MiddlewareCondition[],\n ctx: KoattyContext,\n context?: MiddlewareExecutionContext\n ): boolean {\n return conditions.every(condition => {\n switch (condition.type) {\n case 'path':\n return this.evaluatePathCondition(condition, ctx.path);\n case 'method':\n return this.evaluateMethodCondition(condition, ctx.method);\n case 'header':\n return this.evaluateHeaderCondition(condition, ctx);\n case 'custom':\n return this.evaluateCustomCondition(condition, ctx, context);\n default:\n Logger.Warn(`Unknown condition type: ${condition.type}`);\n return true;\n }\n });\n }\n\n /**\n * Evaluate path condition with optimized matching\n */\n private evaluatePathCondition(condition: MiddlewareCondition, path: string): boolean {\n const { value, operator = 'equals' } = condition;\n\n if (typeof value === 'string') {\n switch (operator) {\n case 'equals':\n // 使用LRU缓存进行O(1)查找\n const exactMatch = this.pathPatterns.exact.get(value);\n if (exactMatch !== undefined) {\n return path === value;\n }\n // 如果缓存中没有,检查并缓存结果\n const isMatch = path === value;\n this.pathPatterns.exact.set(value, isMatch);\n return isMatch;\n\n case 'contains':\n // 优先使用前缀匹配缓存\n const prefixMatch = this.pathPatterns.prefixes.get(value);\n if (prefixMatch !== undefined) {\n return path.startsWith(value);\n }\n // 检查并缓存前缀匹配结果\n const isPrefixMatch = path.startsWith(value) || path.includes(value);\n this.pathPatterns.prefixes.set(value, isPrefixMatch);\n return isPrefixMatch;\n\n case 'matches':\n // 使用预编译的正则表达式缓存\n let regex = this.pathPatterns.patterns.get(value);\n if (!regex) {\n try {\n regex = new RegExp(value);\n this.pathPatterns.patterns.set(value, regex);\n } catch {\n return false;\n }\n }\n return regex.test(path);\n\n default:\n return false;\n }\n } else if (value instanceof RegExp) {\n return value.test(path);\n }\n\n return false;\n }\n\n /**\n * Evaluate method condition with caching\n */\n private evaluateMethodCondition(condition: MiddlewareCondition, method: string): boolean {\n const { value, operator = 'equals' } = condition;\n\n if (typeof value === 'string') {\n const targetMethod = value.toUpperCase();\n const currentMethod = method.toUpperCase();\n\n // 使用缓存检查方法匹配\n let methodSet = this.methodCache.get(targetMethod);\n if (!methodSet) {\n methodSet = new Set<string>();\n this.methodCache.set(targetMethod, methodSet);\n }\n\n if (methodSet.has(currentMethod)) {\n return true;\n }\n\n const isMatch = operator === 'equals' ?\n currentMethod === targetMethod :\n currentMethod.includes(targetMethod);\n\n if (isMatch) {\n methodSet.add(currentMethod);\n }\n\n return isMatch;\n }\n\n return false;\n }\n\n /**\n * Evaluate header condition with caching\n */\n private evaluateHeaderCondition(condition: MiddlewareCondition, ctx: KoattyContext): boolean {\n const { value, operator = 'equals' } = condition;\n\n if (typeof value === 'string') {\n const [headerName, expectedValue] = value.split(':');\n if (!headerName) return false;\n\n const normalizedHeaderName = headerName.toLowerCase();\n const actualValue = ctx.headers[normalizedHeaderName];\n\n if (!actualValue) return false;\n\n // 处理头部值可能是数组的情况\n const actualValueStr = Array.isArray(actualValue) ? actualValue[0] : actualValue;\n if (!actualValueStr) return false;\n\n // 使用缓存检查头部匹配\n let headerMap = this.headerCache.get(normalizedHeaderName);\n if (!headerMap) {\n headerMap = new Map<string, string>();\n this.headerCache.set(normalizedHeaderName, headerMap);\n }\n\n if (expectedValue) {\n const cachedResult = headerMap.get(expectedValue);\n if (cachedResult !== undefined) {\n return actualValueStr === expectedValue;\n }\n\n const isMatch = operator === 'equals' ?\n actualValueStr === expectedValue :\n operator === 'contains' ?\n actualValueStr.includes(expectedValue) :\n false;\n\n if (isMatch) {\n headerMap.set(expectedValue, actualValueStr);\n }\n\n return isMatch;\n } else {\n // 只检查头部是否存在\n return true;\n }\n } else if (typeof value === 'function') {\n return value(ctx);\n }\n\n return false;\n }\n\n /**\n * Evaluate custom condition\n */\n private evaluateCustomCondition(\n condition: MiddlewareCondition,\n ctx: KoattyContext,\n _context?: MiddlewareExecutionContext\n ): boolean {\n const { value } = condition;\n\n if (typeof value === 'function') {\n try {\n return value(ctx);\n } catch (error) {\n Logger.Error('Error evaluating custom condition:', error);\n return false;\n }\n }\n\n return false;\n }\n\n /**\n * Wrap middleware\n */\n private wrapMiddleware(config: MiddlewareConfig): Middleware<KoattyContext> {\n return async (ctx: KoattyContext, next: KoattyNext) => {\n await config.middleware(ctx, next);\n };\n }\n\n\n\n /**\n * Clear all caches with proper cleanup\n */\n public clearCaches(): void {\n this.pathPatterns.exact.clear();\n this.pathPatterns.prefixes.clear();\n this.pathPatterns.suffixes.clear();\n this.pathPatterns.patterns.clear();\n this.methodCache.clear();\n this.headerCache.clear();\n\n Logger.Debug('All caches cleared');\n }\n\n\n\n /**\n * Create middleware group\n */\n public async createGroup(groupName: string, middlewareNames: string[]): Promise<void> {\n const groupMiddleware = this.compose(middlewareNames);\n\n await this.register({\n name: groupName,\n middleware: groupMiddleware,\n metadata: {\n type: 'group',\n members: middlewareNames\n }\n });\n }\n}\n\n/**\n * Middleware builder for fluent API\n */\nexport class MiddlewareBuilder {\n private config: Partial<MiddlewareConfig> = {};\n\n public name(name: string): this {\n this.config.name = name;\n return this;\n }\n\n public priority(priority: number): this {\n this.config.priority = priority;\n return this;\n }\n\n public enabled(enabled: boolean): this {\n this.config.enabled = enabled;\n return this;\n }\n\n public middleware(middleware: MiddlewareFunction): this {\n this.config.middleware = middleware;\n return this;\n }\n\n public condition(condition: MiddlewareCondition): this {\n if (!this.config.conditions) {\n this.config.conditions = [];\n }\n this.config.conditions.push(condition);\n return this;\n }\n\n public metadata(key: string, value: unknown): this {\n if (!this.config.metadata) {\n this.config.metadata = {};\n }\n this.config.metadata[key] = value;\n return this;\n }\n\n public build(): MiddlewareConfig {\n if (!this.config.name || !this.config.middleware) {\n throw new Error('Middleware name and function are required');\n }\n\n return this.config as MiddlewareConfig;\n }\n\n public register(app: Application): void {\n const manager = RouterMiddlewareManager.getInstance(app);\n manager.register(this.build());\n }\n}\n\n/**\n * Decorator for auto-registering middlewares\n */\nexport function RegisterMiddleware(app: Application, config: Omit<MiddlewareConfig, 'middleware'>) {\n return function (target: object, propertyKey: string, descriptor: PropertyDescriptor) {\n const middleware = descriptor.value;\n\n if (typeof middleware !== 'function') {\n throw new Error('Decorated method must be a function');\n }\n\n const manager = RouterMiddlewareManager.getInstance(app);\n manager.register({\n ...config,\n middleware\n });\n\n return descriptor;\n };\n} ","/*\n * @Description: \n * @Usage: \n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2025-03-15 22:21:29\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\n/**\n * 请求参数选项\n */\nexport interface PayloadOptions {\n extTypes: Record<string, string[]>;\n limit: string;\n encoding: BufferEncoding;\n multiples: boolean;\n keepExtensions: boolean;\n length?: number;\n /**\n * Protocol Buffer 文件路径(用于 gRPC 自动解析)\n * 如果提供,gRPC payload 解析器将尝试自动解码\n */\n protoFile?: string;\n}\n\n/**\n * Symbol key for uploaded files in parsed multipart body.\n * Use this key to access files from the parsed body object:\n * @example\n * const files = parsedBody[FILE_KEY];\n */\nexport const FILE_KEY = Symbol.for('koatty.files');","/*\n * @Description: Payload parsing utilities with performance optimizations\n * @Usage: Parse request body based on content-type with caching\n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2025-01-20 10:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { KoattyContext } from \"koatty_core\";\nimport { PayloadOptions } from \"../interface\";\nimport getRawBody from \"raw-body\";\nimport inflate from \"inflation\";\n\n/**\n * Parse raw request body as text.\n * \n * @param {KoattyContext} ctx - Koatty context object\n * @param {PayloadOptions} opts - Payload parsing options\n * @returns {Promise<string>} Parsed text content, empty string if parsing fails\n */\nexport function parseText(ctx: KoattyContext, opts: PayloadOptions): Promise<string> {\n return getRawBody(inflate(ctx.req), opts)\n .catch(err => {\n Logger.Error(err);\n\n return \"\";\n });\n}","/*\n * @Description: Payload parsing utilities with performance optimizations\n * @Usage: Parse request body based on content-type with caching\n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2025-01-20 10:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { KoattyContext } from \"koatty_core\";\nimport { PayloadOptions } from \"../interface\";\nimport { parseText } from \"./text\";\n\n\n/**\n * Parse request body as JSON\n * @param {KoattyContext} ctx - Koatty context object\n * @param {PayloadOptions} opts - Payload parsing options\n * @returns {Promise<Record<string, any>>} Parsed JSON object, or empty object if parsing fails\n */\nexport async function parseJson(ctx: KoattyContext, opts: PayloadOptions) {\n const str = await parseText(ctx, opts);\n if (!str) return {};\n\n try {\n const parsed = JSON.parse(str);\n // Return flat object; wrap non-object values for consistency\n return (parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed))\n ? parsed\n : { value: parsed };\n } catch (error) {\n Logger.Error(error);\n\n return {};\n }\n}\n","/*\n * @Description: Payload parsing utilities with performance optimizations\n * @Usage: Parse request body based on content-type with caching\n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2025-01-20 10:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { KoattyContext } from \"koatty_core\";\nimport { PayloadOptions } from \"../interface\";\nimport { parseText } from \"./text\";\nimport { parse } from \"fast-querystring\";\n\n/**\n * Parse form-urlencoded request body.\n * \n * @param {KoattyContext} ctx - The Koatty context object\n * @param {PayloadOptions} opts - The payload parsing options\n * @returns {Promise<Record<string, any>>} Parsed form data object, or empty object if parsing fails\n * @private\n */\nexport async function parseForm(ctx: KoattyContext, opts: PayloadOptions) {\n const str = await parseText(ctx, opts);\n if (!str || str.trim().length === 0) {\n return {};\n }\n\n try {\n const result = parse(str);\n return result; // Already a flat object\n } catch (error) {\n Logger.Error('[FormParseError]', error);\n\n return {};\n }\n}\n","/*\n * @Description: \n * @Usage: \n * @Author: richen\n * @Date: 2024-01-07 22:33:25\n * @LastEditTime: 2024-11-07 11:00:23\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\nimport { promises as fsPromise } from \"fs\";\nimport { DefaultLogger as logger } from \"koatty_logger\";\n\n/**\n * @description: \n * @param {string} path\n * @return {*}\n */\nexport function parsePath(opath: string): string {\n let path = opath || \"/\";\n \n // Replace multiple consecutive slashes with single slash\n path = path.replace(/\\/+/g, '/');\n \n // Remove trailing slash (except for root path)\n if (path.length > 1 && path.endsWith(\"/\")) {\n path = path.slice(0, path.length - 1);\n }\n \n return path;\n}\n\n/**\n * @description: Asynchronously delete multiple files based on the given file paths\n * @param {Record} files\n * @param {*} param2\n * @return {*}\n */\nexport async function deleteFiles(files: Record<string, { path: string }>) {\n const deletePromises = Object.keys(files).map(async (key) => {\n try {\n const filePath = files[key].path;\n await fsPromise.access(filePath);\n await fsPromise.unlink(filePath);\n } catch (error) {\n logger.Error(error);\n }\n });\n\n return Promise.all(deletePromises);\n};","/*\n * @Description: Payload parsing utilities with performance optimizations\n * @Usage: Parse request body based on content-type with caching\n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2025-01-20 10:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { KoattyContext } from \"koatty_core\";\nimport { PayloadOptions, FILE_KEY } from \"../interface\";\nimport { BufferEncoding, IncomingForm } from \"formidable\";\nimport onFinished from \"on-finished\";\nimport { deleteFiles } from \"../../utils/path\";\n\n/**\n * Parse multipart/form-data request payload\n * \n * @param ctx KoattyContext - The Koatty context object\n * @param opts PayloadOptions - Configuration options for parsing\n * @returns Promise<Record<string, any>> - Resolves with parsed fields; files accessible via [FILE_KEY]\n * \n * @description\n * Handles multipart form data parsing using IncomingForm.\n * Supports file uploads with automatic cleanup on response finish.\n * Returns empty objects if content-type is not multipart or if parsing fails.\n * \n * @example\n * const result = await parseMultipart(ctx, {\n * encoding: 'utf-8',\n * multiples: true,\n * keepExtensions: true,\n * limit: 20 // Max file size in MB\n * });\n * const files = result[FILE_KEY];\n */\nexport function parseMultipart(ctx: KoattyContext, opts: PayloadOptions) {\n const form = new IncomingForm({\n encoding: <BufferEncoding>opts.encoding,\n multiples: opts.multiples,\n keepExtensions: opts.keepExtensions,\n maxFileSize: opts.limit ? parseInt(opts.limit) * 1024 * 1024 : 20 * 1024 * 1024,\n });\n\n const cleanup = () => {\n if (uploadFiles) {\n try {\n deleteFiles(uploadFiles);\n } catch (e) {\n Logger.Error('[FileCleanupError]', e);\n\n }\n }\n };\n\n let uploadFiles: any = null;\n onFinished(ctx.res, cleanup);\n\n return new Promise((resolve) => {\n form.parse(ctx.req, (err, fields, files) => {\n if (err) {\n cleanup();\n Logger.Error('[MultipartParseError]', err);\n\n return resolve({});\n }\n\n uploadFiles = files;\n resolve({ ...fields, [FILE_KEY]: files });\n });\n });\n}\n","/*\n * @Description: Payload parsing utilities with performance optimizations\n * @Usage: Parse request body based on content-type with caching\n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2025-01-20 10:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { KoattyContext } from \"koatty_core\";\nimport { PayloadOptions } from \"../interface\";\nimport { XMLParser } from \"fast-xml-parser\";\nimport { parseText } from \"./text\";\n\ninterface XMLParserOptions {\n ignoreAttributes: boolean;\n isArray: (name: string) => boolean;\n}\n\n\n// 单例 XML 解析器,避免重复创建\nconst xmlParser = new XMLParser({\n ignoreAttributes: false,\n isArray: () => false,\n} as XMLParserOptions);\n\n/**\n * Parse XML payload from request body\n * @param ctx KoattyContext instance\n * @param opts Payload parsing options\n * @returns {Promise<Record<string, any>>} Parsed XML object or empty object if parsing fails\n */\nexport async function parseXml(ctx: KoattyContext, opts: PayloadOptions) {\n const str = await parseText(ctx, opts);\n if (!str) return {};\n\n try {\n const parsed = xmlParser.parse(str);\n return (parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed))\n ? parsed\n : { value: parsed };\n } catch (error) {\n Logger.Error(error);\n\n return {};\n }\n}\n\n","/*\n * @Description: Payload parsing utilities with performance optimizations\n * @Usage: Parse request body based on content-type with caching\n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2025-01-20 10:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { KoattyContext } from \"koatty_core\";\nimport { PayloadOptions } from \"../interface\";\nimport getRawBody from \"raw-body\";\nimport inflate from \"inflation\";\n\n/**\n * Parse gRPC request payload from the context\n * \n * @param {KoattyContext} ctx - Koatty context object\n * @param {PayloadOptions} opts - Payload parsing options\n * @returns {Promise<{body: Buffer} | {}>} Raw buffer for protobuf data or empty object if parsing fails\n * @description \n * gRPC uses Protocol Buffers binary format. This parser returns the raw buffer\n * for manual decoding in controllers using proto definitions.\n * The buffer should NOT be converted to string as it will corrupt the binary data.\n *\n * NOTE: This parser intentionally retains the legacy `{ body: buffer }` wrapper format\n * rather than the flat object format used by HTTP parsers (json/form/xml/websocket).\n * Reason: gRPC requests are handled by the dedicated gRPC router which reads the raw\n * buffer directly and does NOT go through the generic HTTP body extraction path\n * (extractParamSources / generatePrecompiledExtractor). Unifying the format here\n * would require changes to the gRPC router with no benefit to the HTTP path.\n */\nexport async function parseGrpc(ctx: KoattyContext, opts: PayloadOptions) {\n try {\n // gRPC 使用 protobuf 二进制格式,直接返回 Buffer\n // 不能使用 toString(),否则会破坏二进制数据\n const buffer = await getRawBody(inflate(ctx.req), opts);\n \n // 返回原始 Buffer,让控制器使用 proto 定义进行解码\n return { body: buffer };\n } catch (error) {\n Logger.Error('[GrpcParseError]', error);\n return {};\n }\n}\n","/*\n * @Description: Payload parsing utilities with performance optimizations\n * @Usage: Parse request body based on content-type with caching\n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2025-01-20 10:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { KoattyContext } from \"koatty_core\";\nimport { PayloadOptions } from \"../interface\";\nimport { parseText } from \"./text\";\n\n/**\n * Parse GraphQL request payload from context\n * @param ctx KoattyContext instance\n * @param opts PayloadOptions for parsing\n * @returns {Promise<{query?: string, variables?: object, operationName?: string|null}>} Parsed GraphQL payload object\n * @description Parses the GraphQL request body and returns an object containing query, variables, and operationName.\n * If parsing fails, returns an empty object and logs the error.\n */\nexport async function parseGraphQL(ctx: KoattyContext, opts: PayloadOptions) {\n try {\n const str = await parseText(ctx, opts);\n if (!str) return {};\n\n const payload = JSON.parse(str);\n return {\n query: payload.query,\n variables: payload.variables || {},\n operationName: payload.operationName || null\n };\n } catch (error) {\n Logger.Error('[GraphQLParseError]', error);\n\n return {};\n }\n}\n","/*\n * @Description: Payload parsing utilities with performance optimizations\n * @Usage: Parse request body based on content-type with caching\n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2025-01-20 10:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { KoattyContext } from \"koatty_core\";\nimport { PayloadOptions } from \"../interface\";\nimport { parseText } from \"./text\";\n\n\n/**\n * Parse WebSocket message data from context\n * @param ctx KoattyContext instance\n * @param opts PayloadOptions for parsing configuration\n * @returns {Promise<object|string>} Parsed message data as object for JSON or string for plain text\n * @description Attempts to parse WebSocket message as JSON first, falls back to raw text if JSON parsing fails\n * @throws {Error} Logs error if parsing fails and returns empty object\n */\nexport async function parseWebSocket(ctx: KoattyContext, opts: PayloadOptions) {\n try {\n const str = await parseText(ctx, opts);\n if (!str) return {};\n\n // WebSocket messages may be JSON or plain text\n try {\n const parsed = JSON.parse(str);\n return (parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed))\n ? parsed\n : { value: parsed };\n } catch {\n return { value: str }; // Plain text fallback\n }\n } catch (error) {\n Logger.Error('[WebSocketParseError]', error);\n\n return {};\n }\n}\n","/*\n * @Description: Payload parsing utilities with performance optimizations\n * @Usage: Parse request body based on content-type with caching\n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2025-01-20 10:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\nimport { KoattyContext } from \"koatty_core\";\nimport { LRUCache } from \"lru-cache\";\nimport { PayloadOptions } from \"./interface\";\nimport { parseText } from \"./parser/text\";\nimport { parseJson } from \"./parser/json\";\nimport { parseForm } from \"./parser/form\";\nimport { parseMultipart } from \"./parser/multipart\";\nimport { parseXml } from \"./parser/xml\";\nimport { parseGrpc } from \"./parser/grpc\";\nimport { parseGraphQL } from \"./parser/graphql\";\nimport { parseWebSocket } from \"./parser/websocket\";\n\n\n\n\n// 预定义常量避免重复创建\nexport const DEFAULT_ENCODING = 'utf-8' as BufferEncoding;\nexport const DEFAULT_LIMIT = '20mb';\nexport const contentTypeRegex = /^(application\\/json|application\\/x-www-form-urlencoded|text\\/plain|multipart\\/form-data|text\\/xml|application\\/grpc|application\\/graphql\\+json|application\\/websocket)/i;\nexport const IDENTITY_ENCODING = 'identity';\n\n// 使用 Map 替代对象提升查找性能\nexport type ParserFunction = (ctx: KoattyContext, opts: PayloadOptions) => Promise<any>;\nexport type ParserMap = Map<string, ParserFunction>;\n\n// 默认解析器映射\nexport const defaultParsers = new Map<string, ParserFunction>([\n ['json', parseJson],\n ['form', parseForm],\n ['text', parseText],\n ['multipart', parseMultipart],\n ['xml', parseXml],\n ['grpc', parseGrpc],\n ['graphql', parseGraphQL],\n ['websocket', parseWebSocket]\n]);\n\n// 常见 MIME 类型映射,提高查找速度\nexport const commonMimeTypes = new Map<string, ParserFunction>([\n ['application/json', parseJson],\n ['application/x-www-form-urlencoded', parseForm],\n ['text/plain', parseText],\n ['multipart/form-data', parseMultipart],\n ['text/xml', parseXml],\n ['application/grpc', parseGrpc],\n ['application/graphql+json', parseGraphQL],\n ['application/websocket', parseWebSocket]\n]);\n\nconst defaultOptions: PayloadOptions = {\n extTypes: {\n json: ['application/json'],\n form: ['application/x-www-form-urlencoded'],\n text: ['text/plain'],\n multipart: ['multipart/form-data'],\n xml: ['text/xml'],\n grpc: ['application/grpc'],\n graphql: ['application/graphql+json'],\n websocket: ['application/websocket']\n } as Record<string, string[]>,\n limit: DEFAULT_LIMIT,\n encoding: DEFAULT_ENCODING,\n multiples: true,\n keepExtensions: true,\n};\n\n/**\n * 模块级别的单例缓存管理器\n * 确保并发安全和全局唯一性\n */\nexport class PayloadCacheManager {\n private static instance: PayloadCacheManager | null = null;\n private static readonly lock = Symbol('PayloadCacheManager.lock');\n\n private readonly typeMapCache: LRUCache<string, ParserMap>;\n private readonly contentTypeCache: LRUCache<string, string>;\n private readonly optionsCache: LRUCache<string, PayloadOptions>;\n\n // 私有构造函数确保单例\n private constructor() {\n this.typeMapCache = new LRUCache<string, ParserMap>({ max: 100 });\n this.contentTypeCache = new LRUCache<string, string>({ max: 200 });\n this.optionsCache = new LRUCache<string, PayloadOptions>({ max: 50 });\n }\n\n /**\n * 获取单例实例(线程安全)\n */\n public static getInstance(): PayloadCacheManager {\n if (!PayloadCacheManager.instance) {\n // 使用 Symbol 作为锁,确保并发安全\n if (!PayloadCacheManager.instance) {\n PayloadCacheManager.instance = new PayloadCacheManager();\n }\n }\n return PayloadCacheManager.instance;\n }\n\n /**\n * 重置单例实例(主要用于测试)\n */\n public static resetInstance(): void {\n if (PayloadCacheManager.instance) {\n PayloadCacheManager.instance.clearAll();\n PayloadCacheManager.instance = null;\n }\n }\n\n /**\n * 获取或创建 typeMap\n */\n public getTypeMap(extTypes: Record<string, string[]>): ParserMap {\n const cacheKey = JSON.stringify(extTypes);\n\n const cached = this.typeMapCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n // 创建新的 typeMap\n const typeMap = new Map<string, ParserFunction>();\n\n // 首先添加常用类型以提高查找速度\n for (const [mime, parser] of commonMimeTypes) {\n typeMap.set(mime, parser);\n }\n\n // 使用 extTypes 配置覆盖或添加自定义类型\n for (const [type, mimes] of Object.entries(extTypes)) {\n const parser = defaultParsers.get(type) || parseText;\n for (const mime of mimes) {\n typeMap.set(mime, parser);\n }\n }\n\n this.typeMapCache.set(cacheKey, typeMap);\n return typeMap;\n }\n\n /**\n * 获取内容类型解析结果\n */\n public getContentType(contentType: string): string | null {\n let normalizedType = this.contentTypeCache.get(contentType);\n\n if (!normalizedType) {\n const match = contentType.match(contentTypeRegex);\n if (!match) {\n return null;\n }\n\n // 返回标准化的小写形式\n normalizedType = match[1].toLowerCase();\n this.contentTypeCache.set(contentType, normalizedType);\n }\n\n return normalizedType;\n }\n\n /**\n * 获取合并后的选项\n */\n public getMergedOptions(options?: PayloadOptions): PayloadOptions {\n if (!options) {\n return defaultOptions;\n }\n\n const cacheKey = JSON.stringify(options);\n\n const cached = this.optionsCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const mergedOptions = Object.assign({}, defaultOptions, options);\n this.optionsCache.set(cacheKey, mergedOptions);\n return mergedOptions;\n }\n\n /**\n * 清理所有缓存\n */\n public clearAll(): void {\n this.typeMapCache.clear();\n this.contentTypeCache.clear();\n this.optionsCache.clear();\n }\n\n\n}\n\n\n// 模块级别的单例实例\nexport const cacheManager = PayloadCacheManager.getInstance();\n/**\n * 清理所有缓存\n */\nexport function clearTypeMapCache(): void {\n cacheManager.clearAll();\n}\n\n\n","/*\n * @Description: Payload parsing utilities with performance optimizations\n * @Usage: Parse request body based on content-type with caching\n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2025-01-20 10:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\nimport { KoattyContext, KoattyNext } from \"koatty_core\";\nimport { Helper } from \"koatty_lib\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport {\n cacheManager,\n DEFAULT_ENCODING, DEFAULT_LIMIT, IDENTITY_ENCODING, ParserFunction,\n ParserMap\n} from \"./payload_cache\";\nimport { PayloadOptions, FILE_KEY } from \"./interface\";\n\n/** Module-level body cache using WeakMap for automatic GC when ctx is collected */\nconst bodyCache = new WeakMap<object, any>();\n\n// 使用 Set 和预编译正则表达式\nconst supportedMethods = new Set(['POST', 'PUT', 'DELETE', 'PATCH', 'LINK', 'UNLINK']);\n\n/**\n * 根据内容类型获取对应的解析器(使用单例缓存管理器)\n * @param contentType 内容类型\n * @param typeMap 解析器映射表\n * @returns 解析器函数或 null\n */\nfunction getParserForType(contentType: string, typeMap: ParserMap): ParserFunction | null {\n const normalizedType = cacheManager.getContentType(contentType);\n if (!normalizedType) {\n return null;\n }\n\n return typeMap.get(normalizedType) || null;\n}\n\n/**\n * 快速检查是否为支持的方法\n * @param method HTTP 方法\n * @returns 是否支持\n */\nfunction isSupportedMethod(method: string): boolean {\n return supportedMethods.has(method);\n}\n\n/**\n * 快速检查内容长度\n * @param headers 请求头\n * @returns 内容长度或 0\n */\nfunction getContentLength(headers: Record<string, string | string[] | undefined>): number {\n const len = headers['content-length'];\n if (typeof len === 'string') {\n return parseInt(len, 10) || 0;\n }\n return 0;\n}\n\n/**\n * Middleware for parsing request payload (query parameters and request body).\n * \n * @param {PayloadOptions} [options] - Configuration options for payload parsing\n * @returns {Function} Koa middleware function that adds requestParam and requestBody to context\n * \n * @example\n * ```ts\n * app.use(payload({\n * // payload options\n * }));\n * ```\n */\nexport function payload(options?: PayloadOptions) {\n // 性能优化:预处理选项\n const opts = cacheManager.getMergedOptions(options);\n\n return (ctx: KoattyContext, next: KoattyNext) => {\n // 防止重复定义:在多协议场景下,多个router会注册payload中间件\n // 每个请求的ctx虽然是独立实例,但会经过所有中间件\n // 只在属性未定义时才定义,避免 \"Cannot redefine property\" 错误\n if (!Object.prototype.hasOwnProperty.call(ctx, 'requestHeader')) {\n Helper.define(ctx, \"requestHeader\", (name?: string) => {\n return name ? ctx.get(name) : ctx.headers;\n });\n }\n if (!Object.prototype.hasOwnProperty.call(ctx, 'requestQuery')) {\n Helper.define(ctx, \"requestQuery\", (name?: string) => {\n const queryParams = ctx.query ?? {};\n return name ? queryParams[name] : queryParams;\n });\n }\n if (!Object.prototype.hasOwnProperty.call(ctx, 'requestPathVariable')) {\n Helper.define(ctx, \"requestPathVariable\", (name?: string) => {\n const pathParams = ctx.params ?? {};\n return name ? pathParams[name] : pathParams;\n });\n }\n if (!Object.prototype.hasOwnProperty.call(ctx, 'requestParam')) {\n Helper.define(ctx, \"requestParam\", () => queryParser(ctx, opts));\n }\n if (!Object.prototype.hasOwnProperty.call(ctx, 'requestBody')) {\n Helper.define(ctx, \"requestBody\", () => bodyParser(ctx, opts));\n }\n if (!Object.prototype.hasOwnProperty.call(ctx, 'requestFile')) {\n Helper.define(ctx, \"requestFile\", async (name?: string) => {\n const body = await bodyParser(ctx, opts) as any;\n const files = body[FILE_KEY] ?? {};\n return name ? files[name] : files;\n });\n }\n return next();\n }\n}\n\n/**\n * Parse and merge query parameters and route parameters from context\n * @param {KoattyContext} ctx Koatty context object\n * @param {PayloadOptions} [_options] Optional payload configuration\n * @returns {Record<string, unknown>} Merged object containing query and route parameters\n */\nexport function queryParser(ctx: KoattyContext, _options?: PayloadOptions): Record<string, unknown> {\n // 性能优化:避免不必要的对象创建\n const query = ctx.query;\n const params = ctx.params;\n\n if (!params || Object.keys(params).length === 0) {\n return query;\n }\n\n if (!query || Object.keys(query).length === 0) {\n return params;\n }\n\n return Object.assign({}, query, params);\n}\n\n/**\n * Parse request body and cache the result.\n * Returns cached result synchronously on subsequent calls (avoids microtask overhead).\n * First call returns a Promise that resolves after parsing.\n *\n * @param {KoattyContext} ctx - Koatty context object\n * @param {PayloadOptions} [options] - Optional payload parsing options\n * @returns {any} Parsed body (synchronous if cached) or Promise<any> (first parse)\n */\nexport function bodyParser(ctx: KoattyContext, options?: PayloadOptions): any {\n // Fast synchronous path: return cached body directly (no Promise, no microtask)\n const cached = bodyCache.get(ctx);\n if (cached !== undefined) return cached;\n\n // Slow async path: first-time parsing\n return parseBodyAndCache(ctx, options);\n}\n\n/**\n * Internal: parse body and store in WeakMap cache.\n * @internal\n */\nasync function parseBodyAndCache(ctx: KoattyContext, options?: PayloadOptions): Promise<any> {\n try {\n // Double-check after async boundary (prevents duplicate parsing under concurrency)\n const cached = bodyCache.get(ctx);\n if (cached !== undefined) return cached;\n\n const opts = cacheManager.getMergedOptions(options);\n const body = await parseBody(ctx, opts);\n bodyCache.set(ctx, body);\n // Backward compatibility: also write to ctx metadata for direct getMetaData('_body') callers\n try { ctx.setMetaData(\"_body\", body); } catch { /* ignore if metadata not initialized */ }\n return body;\n } catch (err) {\n Logger.Error(err);\n const empty = {};\n bodyCache.set(ctx, empty);\n return empty;\n }\n}\n\n/**\n * Parse request body based on content-type with performance optimizations.\n * \n * @param {KoattyContext} ctx - Koatty context object\n * @param {PayloadOptions} options - Parser options including encoding, limit, etc.\n * @returns {Promise<unknown>} Parsed body data or empty object\n * \n * @description\n * Optimized version with typeMap caching and Map-based lookups.\n * Handles different content types:\n * - application/json\n * - application/x-www-form-urlencoded\n * - text/plain\n * - multipart/form-data\n * - text/xml\n * - application/grpc\n * - application/graphql+json\n * - application/websocket\n */\nfunction parseBody(ctx: KoattyContext, options: PayloadOptions): Promise<unknown> {\n // 性能优化:使用 Set 进行 O(1) 方法检查\n if (!isSupportedMethod(ctx.method)) {\n return Promise.resolve({});\n }\n\n // 性能优化:快速获取内容长度\n const len = getContentLength(ctx.req.headers || {});\n const encoding = ctx.req.headers?.['content-encoding'] || IDENTITY_ENCODING;\n\n if (len && encoding === IDENTITY_ENCODING) {\n options.length = len;\n }\n\n // 性能优化:避免重复赋值\n if (!options.encoding) options.encoding = DEFAULT_ENCODING;\n if (!options.limit) options.limit = DEFAULT_LIMIT;\n\n const contentType = ctx.request.headers['content-type'] || '';\n\n // 性能优化:使用缓存的 typeMap\n const typeMap = cacheManager.getTypeMap(options.extTypes);\n const parser = getParserForType(contentType, typeMap);\n\n return parser ? parser(ctx, options) : Promise.resolve({});\n}\n","/*\n * @Description: \n * @Usage: \n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2025-03-15 22:21:29\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\nimport \"reflect-metadata\";\nimport {\n getOriginMetadata, IOC, recursiveGetMetadata,\n TAGGED_PARAM\n} from \"koatty_container\";\nimport { CONTROLLER_ROUTER, Koatty } from \"koatty_core\";\nimport { Helper } from \"koatty_lib\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { Project } from \"ts-morph\";\nimport { MAPPING_KEY, MiddlewareDecoratorConfig } from \"../params/mapping\";\nimport {\n FunctionValidator,\n PARAM_CHECK_KEY, PARAM_RULE_KEY, PARAM_TYPE_KEY,\n paramterTypes, ValidOtpions, ValidRules,\n} from \"koatty_validation\";\nimport { RouterMiddlewareManager } from \"../middleware/manager\";\nimport { PayloadOptions, FILE_KEY } from \"../payload/interface\";\nimport { bodyParser } from \"../payload/payload\";\nimport { convertParamsType } from \"koatty_validation\";\nimport { Exception } from \"koatty_exception\";\n\n// Module-level cache for ts-morph Project (debug mode only)\nlet cachedProject: Project | null = null;\nconst publicMethodsCache = new Map<string, string[]>();\n\n/**\n * Parameter source type enumeration for efficient parameter extraction\n * \n * @description\n * Identifies the source of a parameter, enabling:\n * - Type-safe parameter extraction using enum switch statements\n * - Faster execution compared to string comparisons\n * - Better V8 JIT optimization through predictable control flow\n * \n * @performance\n * Using enums with switch statements is ~30% faster than string-based if-else chains\n * \n * @example\n * ```typescript\n * switch(param.sourceType) {\n * case ParamSourceType.QUERY:\n * return ctx.query[paramName];\n * case ParamSourceType.BODY:\n * return await bodyParser(ctx);\n * // ...\n * }\n * ```\n * \n * @since 1.20.0-8\n * @category Parameter Extraction\n */\nexport enum ParamSourceType {\n /** Query string parameters - extracted from ctx.query (@Get decorator) */\n QUERY = 'query',\n \n /** Request body parameters - extracted via bodyParser (@Post, @RequestBody decorators) */\n BODY = 'body',\n \n /** HTTP headers - extracted from ctx.headers (@Header decorator) */\n HEADER = 'header',\n \n /** Path variables - extracted from ctx.params (@PathVariable decorator) */\n PATH = 'path',\n \n /** Uploaded files - extracted from parsed body (@File decorator) */\n FILE = 'file',\n \n /** Custom extraction using user-defined function */\n CUSTOM = 'custom'\n}\n\n/**\n * Infer ParamSourceType from decorator function name\n * \n * @description\n * Provides backward compatibility for metadata that was created before Task 4.1.\n * Maps decorator function names to their corresponding ParamSourceType enum values.\n * \n * @param fnName - The name of the decorator function (e.g., 'Get', 'Post', 'Header')\n * @returns The corresponding ParamSourceType enum value\n * \n * @example\n * ```typescript\n * inferSourceTypeFromFnName('Get') // Returns ParamSourceType.QUERY\n * inferSourceTypeFromFnName('Post') // Returns ParamSourceType.BODY\n * inferSourceTypeFromFnName('Header') // Returns ParamSourceType.HEADER\n * inferSourceTypeFromFnName('Unknown') // Returns ParamSourceType.CUSTOM\n * ```\n * \n * @internal\n * @since 1.20.0-8\n * @category Parameter Extraction\n */\nexport function inferSourceTypeFromFnName(fnName: string): ParamSourceType {\n switch(fnName) {\n case 'Get':\n return ParamSourceType.QUERY;\n case 'Post':\n case 'RequestBody':\n return ParamSourceType.BODY;\n case 'Header':\n return ParamSourceType.HEADER;\n case 'PathVariable':\n return ParamSourceType.PATH;\n case 'File':\n return ParamSourceType.FILE;\n default:\n return ParamSourceType.CUSTOM;\n }\n}\n\n/**\n * DTO metadata cache using WeakMap for automatic garbage collection\n * Maps DTO class to its metadata (dtoRule)\n * @internal\n */\nconst DTO_METADATA_CACHE = new WeakMap<any, Map<string, string>>();\n\n/**\n *\n *\n * @interface RouterMetadata\n */\nexport interface RouterMetadata {\n method: string;\n path: string;\n ctlPath: string;\n requestMethod: string;\n routerName: string;\n middlewareConfigs?: MiddlewareDecoratorConfig[]; // 更新为新的配置格式\n composedMiddleware?: Function;\n}\n\n/**\n *\n *\n * @interface RouterMetadataObject\n */\nexport interface RouterMetadataObject {\n [key: string]: RouterMetadata;\n}\n\n/**\n * Inject router metadata for a controller class.\n * \n * @param app - The Koatty application instance\n * @param target - The controller class target\n * @param protocol - The protocol type, defaults to 'http'\n * @returns RouterMetadataObject containing route mappings, or null if protocol doesn't match\n * \n * @description\n * This function processes controller class metadata to generate router mappings.\n * It extracts the controller path, validates method scopes in debug mode,\n * and combines controller and method level route configurations.\n * Additionally, it registers middleware classes to RouterMiddlewareManager for unified management.\n * Now supports advanced middleware features like priority, conditions, and metadata.\n */\nexport async function injectRouter(app: Koatty, target: any, protocol = 'http'): Promise<RouterMetadataObject | null> {\n const ctlName = IOC.getIdentifier(target);\n const options = IOC.getPropertyData(CONTROLLER_ROUTER, target, ctlName) ||\n { path: \"\", protocol: 'http' };\n options.path = options.path.startsWith(\"/\") || options.path === \"\" ? options.path : `/${options.path}`;\n if (options.protocol !== protocol) return null;\n\n const rmetaData = recursiveGetMetadata(IOC, MAPPING_KEY, target);\n const router: RouterMetadataObject = {};\n const methods: string[] = [];\n const middlewareManager = RouterMiddlewareManager.getInstance(app);\n\n Logger.Debug(`injectRouter: RouterMiddlewareManager instance ID: ${(middlewareManager as any)._instanceId}`);\n\n if (app.appDebug) {\n const ctlPath = getControllerPath(ctlName);\n methods.push(...getPublicMethods(ctlPath, ctlName));\n }\n\n for (const metaKey in rmetaData) {\n // Logger.Debug(`Register inject method Router key: ${metaKey} =>\n // value: ${ JSON.stringify(rmetaData[metaKey]) }`);\n //.sort((a, b) => b.priority - a.priority) \n if (app.appDebug && !methods.includes(metaKey)) {\n Logger.Debug(`The method ${metaKey} is bound to the route, but the scope of this method is not public.`);\n continue;\n }\n for (const val of rmetaData[metaKey]) {\n // 处理控制器级别和方法级别的中间件配置\n const controllerMiddlewareConfigs: MiddlewareDecoratorConfig[] = [];\n const methodMiddlewareConfigs: MiddlewareDecoratorConfig[] = val.middlewareConfigs || [];\n\n // 处理控制器级别的中间件(如果有的话)\n if (options.middleware) {\n for (const middlewareItem of options.middleware) {\n let config: MiddlewareDecoratorConfig;\n if (typeof middlewareItem === 'function') {\n config = {\n middleware: middlewareItem,\n priority: 50,\n enabled: true,\n conditions: [],\n metadata: { source: 'controller' }\n };\n } else {\n config = {\n priority: 50,\n enabled: true,\n conditions: [],\n metadata: { source: 'controller' },\n ...middlewareItem\n };\n }\n \n // 控制器级别的中间件都会被添加到配置中,包括enabled: false的\n controllerMiddlewareConfigs.push(config);\n }\n }\n\n // 创建控制器级别中间件的映射,用于方法级别的禁用检查\n const controllerMiddlewareMap = new Map<Function, MiddlewareDecoratorConfig>();\n controllerMiddlewareConfigs.forEach(config => {\n if (config.middleware) {\n controllerMiddlewareMap.set(config.middleware, config);\n }\n });\n\n // 处理方法级别的中间件配置\n const methodDisabledMiddlewares = new Set<Function>();\n const methodAddedMiddlewares: MiddlewareDecoratorConfig[] = [];\n \n // 分析方法级别的中间件配置\n for (const methodConfig of methodMiddlewareConfigs) {\n if (methodConfig.enabled === false && methodConfig.middleware) {\n // enabled: false 只对控制器已声明的中间件有效\n if (controllerMiddlewareMap.has(methodConfig.middleware)) {\n methodDisabledMiddlewares.add(methodConfig.middleware);\n Logger.Debug(`injectRouter: Method-level disabling middleware: ${methodConfig.middleware.name}`);\n } else {\n Logger.Debug(`injectRouter: Invalid configuration - middleware ${methodConfig.middleware.name} not declared at controller level, ignoring enabled: false`);\n }\n } else if (methodConfig.enabled !== false && methodConfig.middleware) {\n // enabled: true 或未设置,添加到方法级别中间件(无论控制器是否声明)\n methodAddedMiddlewares.push({\n priority: 50,\n enabled: true,\n conditions: [],\n metadata: { source: 'method' },\n ...methodConfig\n });\n Logger.Debug(`injectRouter: Method-level adding middleware: ${methodConfig.middleware.name}`);\n }\n }\n\n // 过滤控制器级别的中间件:移除enabled: false的和被方法级别禁用的\n const filteredControllerMiddlewares = controllerMiddlewareConfigs.filter(config => {\n // 如果控制器级别就是enabled: false,则忽略\n if (config.enabled === false) {\n Logger.Debug(`injectRouter: Controller-level middleware disabled: ${config.middleware?.name}`);\n return false;\n }\n \n // 如果被方法级别禁用,则移除\n if (config.middleware && methodDisabledMiddlewares.has(config.middleware)) {\n Logger.Debug(`injectRouter: Controller middleware disabled by method-level config: ${config.middleware.name}`);\n return false;\n }\n \n return true;\n });\n\n // 合并中间件配置:控制器启用的 + 方法级别添加的\n // 使用 Map 来去重,避免同一个中间件被重复添加\n const middlewareMap = new Map<Function, MiddlewareDecoratorConfig>();\n \n // 先添加控制器级别的中间件\n filteredControllerMiddlewares.forEach(config => {\n if (config.middleware) {\n middlewareMap.set(config.middleware, config);\n }\n });\n \n // 再添加方法级别的中间件(会覆盖同名的控制器中间件配置)\n methodAddedMiddlewares.forEach(config => {\n if (config.middleware) {\n middlewareMap.set(config.middleware, config);\n }\n });\n \n // 转换为数组并按优先级排序\n const allMiddlewareConfigs = Array.from(middlewareMap.values());\n\n // 按优先级排序(高优先级先执行)\n allMiddlewareConfigs.sort((a, b) => (b.priority || 50) - (a.priority || 50));\n\n // 将装饰器声明的中间件类注册到RouterMiddlewareManager\n const middlewareInstanceIds: string[] = [];\n for (const middlewareConfig of allMiddlewareConfigs) {\n if (!middlewareConfig.enabled) {\n Logger.Debug(`injectRouter: Skipping disabled middleware: ${middlewareConfig.middleware.name}`);\n continue;\n }\n\n const middlewareName = middlewareConfig.middleware.name;\n const currentRoute = `${options.path}${val.path}`.replace(\"//\", \"/\");\n \n Logger.Debug(`injectRouter: Processing middleware class: ${middlewareName} for route: ${currentRoute} with priority: ${middlewareConfig.priority}`);\n\n // 尝试通过路由和中间件名获取特定实例\n const existingInstance = middlewareManager.getMiddlewareByRoute(middlewareName, currentRoute, val.requestMethod);\n \n if (!existingInstance) {\n Logger.Debug(`injectRouter: Registering new middleware instance: ${middlewareName}@${currentRoute}`);\n \n // 注册到RouterMiddlewareManager,使用装饰器中的高级配置\n const instanceId = await middlewareManager.register({\n name: middlewareName,\n middleware: middlewareConfig.middleware, // 直接传递中间件类\n priority: middlewareConfig.priority || 50,\n enabled: middlewareConfig.enabled ?? true,\n conditions: middlewareConfig.conditions || [],\n metadata: {\n type: 'route',\n description: `Auto-registered middleware from decorator: ${middlewareName}`,\n source: 'decorator',\n ...middlewareConfig.metadata\n },\n middlewareConfig: {\n middlewareName,\n protocol,\n route: currentRoute,\n method: val.requestMethod,\n // 将装饰器中的metadata配置传递给中间件实例\n decoratorConfig: middlewareConfig.metadata || {}\n }\n });\n \n Logger.Debug(`injectRouter: Successfully registered middleware: ${middlewareName} with instanceId: ${instanceId}, priority: ${middlewareConfig.priority}`);\n \n middlewareInstanceIds.push(instanceId);\n } else {\n Logger.Debug(`injectRouter: Middleware instance already exists: ${middlewareName}@${currentRoute}`);\n middlewareInstanceIds.push(existingInstance.instanceId!);\n }\n }\n\n Logger.Debug(`injectRouter: Final middleware instance IDs for route ${val.path}: [${middlewareInstanceIds.join(', ')}]`);\n \n // 在注册时组合中间件\n let composedMiddleware: Function | undefined;\n if (middlewareInstanceIds.length > 0) {\n Logger.Debug(`injectRouter: Composing middleware for route ${val.path}`);\n \n // 使用RouterMiddlewareManager组合中间件\n composedMiddleware = middlewareManager.compose(middlewareInstanceIds, {\n route: `${options.path}${val.path}`.replace(\"//\", \"/\"),\n method: val.requestMethod,\n protocol: protocol\n });\n \n Logger.Debug(`injectRouter: Successfully composed middleware for route ${val.path}`);\n }\n \n const tmp = {\n ...val,\n path: `${options.path}${val.path}`.replace(\"//\", \"/\"),\n ctlPath: options.path,\n middlewareConfigs: allMiddlewareConfigs, // 存储完整的中间件配置用于调试\n composedMiddleware, // 存储预组合的中间件函数\n };\n router[`${tmp.path}||${tmp.requestMethod}`] = tmp;\n }\n }\n\n return router;\n}\n\n/**\n *\n *\n * @interface ParamMetadata\n */\nexport interface ParamMetadata {\n \"fn\": Function;\n \"name\": string;\n \"index\": number;\n \"clazz\": any;\n \"type\": string;\n \"isDto\": boolean;\n \"validRule\": Function | ValidRules | ValidRules[];\n \"validOpt\": ValidOtpions;\n \"options\": PayloadOptions;\n \"dtoCheck\": boolean;\n \"dtoRule\": Map<string, string>;\n \"compiledValidator\"?: (value: any) => void;\n \"precompiledOptions\"?: any;\n \"compiledTypeConverter\"?: ((value: any) => any) | null;\n \"sourceType\": ParamSourceType; // Parameter source type\n \"paramName\"?: string; // Parameter name (e.g., \"id\")\n \"precompiledExtractor\"?: (ctx: any) => any | Promise<any>; // Pre-compiled extractor function\n \"defaultValue\"?: any; // Default value if extraction returns undefined\n}\n\n/**\n * Extended parameter metadata array with runtime optimization flags\n * \n * @description\n * Extends the standard Array<ParamMetadata> with additional optimization metadata\n * that is computed at startup time for improved runtime performance.\n * \n * @property hasAsyncParams - Indicates if the method has any async parameters (BODY/FILE/DTO).\n * When false, enables fast synchronous extraction path.\n * \n * @performance\n * - Sync path (hasAsyncParams=false): ~40% faster than async path\n * \n * @example\n * ```typescript\n * const params: CompiledMethodParams = [...];\n * params.hasAsyncParams = false; // All params are QUERY/HEADER/PATH\n * \n * if (!params.hasAsyncParams) {\n * // Use synchronous extraction path\n * return extractSync(ctx, params);\n * }\n * ```\n * \n * @since 1.20.0-8\n * @category Parameter Extraction\n */\nexport interface CompiledMethodParams extends Array<ParamMetadata> {\n /** Indicates if method has async parameters requiring bodyParser or DTO validation */\n hasAsyncParams?: boolean;\n}\n\n/**\n *\n *\n * @interface ParamMetadataMap\n */\ninterface ParamMetadataMap {\n [key: string]: CompiledMethodParams;\n}\n\n/**\n * Inject parameter metadata for dependency injection.\n * \n * @param app - The Koatty application instance\n * @param target - The target class to inject parameters\n * @param options - Optional payload options for parameter injection\n * @returns A map of parameter metadata for each method\n * \n * @description\n * This function processes and combines various metadata including injection data,\n * validation rules, and DTO checks. It sorts parameters by index, applies validation\n * rules, and handles DTO class registration. For DTO parameters, it ensures the class\n * is registered in the IOC container and sets up type definitions if DTO validation\n * is enabled.\n * \n * @throws Error when a DTO class is not registered in the container\n */\nexport function injectParamMetaData(app: Koatty, target: any,\n options?: PayloadOptions): ParamMetadataMap {\n const metaDatas = recursiveGetMetadata(IOC, TAGGED_PARAM, target);\n const validMetaDatas = recursiveGetMetadata(IOC, PARAM_RULE_KEY, target);\n const validatedMetaDatas = recursiveGetMetadata(IOC, PARAM_CHECK_KEY, target);\n const argsMetaObj: ParamMetadataMap = {};\n\n for (const meta in metaDatas) {\n Logger.Debug(`Register inject param key ${IOC.getIdentifier(target)\n }: ${Helper.toString(meta)} => value: ${JSON.stringify(metaDatas[meta])}`);\n\n const data: ParamMetadata[] = (metaDatas[meta] ?? []).sort((a: ParamMetadata,\n b: ParamMetadata) => a.index - b.index);\n const validData = validMetaDatas[meta] ?? [];\n\n data.forEach((v: ParamMetadata) => {\n // Backward compatibility: infer sourceType from fn.name if not present\n if (!v.sourceType && v.fn) {\n v.sourceType = inferSourceTypeFromFnName(v.fn.name || '');\n Logger.Debug(`Inferred sourceType ${v.sourceType} for param ${v.name} from fn.name`);\n }\n // Ensure sourceType is set (default to CUSTOM if still missing)\n if (!v.sourceType) {\n v.sourceType = ParamSourceType.CUSTOM;\n }\n \n const validEntry = validData.find((it: any) => v.index === it.index && it.name === v.name);\n if (validEntry) {\n v.validRule = validEntry.rule;\n v.validOpt = validEntry.options;\n \n // Task 6.2: All validators must be compiled at startup\n // Skip compilation for DTO parameters as they use ClassValidator\n if (!v.isDto && v.validRule) {\n try {\n v.compiledValidator = compileValidator(v.index, v.type, v.validRule, v.validOpt);\n Logger.Debug(`Compiled validator for param ${v.name} at index ${v.index}`);\n } catch (err) {\n // In v2.0.0+, validator compilation failures are fatal\n const errorMsg = `Failed to compile validator for param ${v.name} at index ${v.index}: ${err.message}`;\n Logger.Error(errorMsg);\n throw new Error(errorMsg);\n }\n }\n }\n v.type = v.isDto ? v.type : (v.type).toLowerCase();\n v.dtoCheck = !!(validatedMetaDatas[meta]?.dtoCheck);\n if (v.isDto) {\n v.clazz = IOC.getClass(v.type, \"COMPONENT\");\n if (!v.clazz) {\n throw Error(`Failed to obtain the class ${v.type},\n because the class is not registered in the container.`);\n }\n if (v.dtoCheck) {\n // Task 3.3: Check cache first\n const cachedDtoRule = DTO_METADATA_CACHE.get(v.clazz);\n if (cachedDtoRule) {\n v.dtoRule = cachedDtoRule;\n Logger.Debug(`Using cached DTO metadata for ${v.type}`);\n } else {\n // Cache miss - get metadata and cache it\n v.dtoRule = getOriginMetadata(PARAM_TYPE_KEY, v.clazz);\n DTO_METADATA_CACHE.set(v.clazz, v.dtoRule);\n Logger.Debug(`Cached DTO metadata for ${v.type}`);\n }\n \n Reflect.defineProperty(v.clazz.prototype, \"_typeDef\", {\n enumerable: true,\n configurable: false,\n writable: false,\n value: v.dtoRule,\n });\n }\n }\n if (options) {\n v.options = options;\n }\n \n // Pre-create ParamOptions object to avoid runtime creation\n v.precompiledOptions = {\n index: v.index,\n isDto: v.isDto,\n type: v.type,\n validRule: v.validRule,\n validOpt: v.validOpt,\n dtoCheck: v.dtoCheck,\n dtoRule: v.dtoRule,\n clazz: v.clazz\n };\n Logger.Debug(`Pre-compiled options for param ${v.name} at index ${v.index}`);\n \n // Task 4.6: Generate pre-compiled extractor for sync parameters\n const precompiledExtractor = generatePrecompiledExtractor(v);\n if (precompiledExtractor) {\n v.precompiledExtractor = precompiledExtractor;\n Logger.Debug(`Generated pre-compiled extractor for param ${v.name}`);\n }\n \n // Task 3.2: Compile type converter for non-DTO parameters\n if (!v.isDto && v.type) {\n try {\n v.compiledTypeConverter = compileTypeConverter(v.type);\n if (v.compiledTypeConverter) {\n Logger.Debug(`Compiled type converter for param ${v.name}, type: ${v.type}`);\n } else {\n Logger.Debug(`No type converter needed for param ${v.name}, type: ${v.type} (string)`);\n }\n } catch (error) {\n Logger.Error(`Failed to compile type converter for param ${v.name}: ${error.message}`);\n }\n }\n });\n \n // Task 4.4: Detect if method has async parameters\n const hasAsyncParams = data.some(p => \n p.sourceType === ParamSourceType.BODY || \n p.sourceType === ParamSourceType.FILE ||\n p.isDto // DTO validation might be async\n );\n (data as CompiledMethodParams).hasAsyncParams = hasAsyncParams;\n Logger.Debug(`Method ${meta} hasAsyncParams: ${hasAsyncParams}`);\n \n argsMetaObj[meta] = data as CompiledMethodParams;\n }\n return argsMetaObj;\n}\n\n/**\n * Creates a parameter decorator for dependency injection.\n * \n * @param fn The function to be injected\n * @param name The name of the decorator\n * @returns A ParameterDecorator that handles the injection\n * @throws Error if decorator is used outside of a controller class\n * \n * @example\n * ```typescript\n * @Controller()\n * class UserController {\n * @Get(\"/user\")\n * getUser(@Get() query: QueryDTO) {}\n * }\n * ```\n */\nexport const injectParam = (\n fn: Function, \n name: string,\n sourceType: ParamSourceType,\n paramName?: string,\n defaultValue?: any\n): ParameterDecorator => {\n return (target: object, propertyKey: string | symbol | undefined, descriptor: number) => {\n const targetType = IOC.getType(target);\n if (targetType !== \"CONTROLLER\") {\n throw Error(`${name} decorator is only used in controllers class.`);\n }\n\n // 获取成员类型\n // const type = Reflect.getMetadata(\"design:type\", target, propertyKey);\n // 获取成员参数类型\n const paramTypes = Reflect.getMetadata(\"design:paramtypes\", target, propertyKey);\n // 获取成员返回类型\n // const returnType = Reflect.getMetadata(\"design:returntype\", target, propertyKey);\n // 获取所有元数据 key (由 TypeScript 注入)\n // const keys = Reflect.getMetadataKeys(target, propertyKey); let type = paramTypes[descriptor]?.name || 'object';\n let type = paramTypes[descriptor]?.name || 'object';\n let isDto = false;\n\n if (!(Helper.toString(type) in paramterTypes)) {\n type = IOC.getIdentifier(paramTypes[descriptor]);\n isDto = true;\n }\n\n IOC.attachPropertyData(TAGGED_PARAM, {\n name: propertyKey,\n fn,\n index: descriptor,\n type,\n isDto,\n sourceType,\n paramName,\n defaultValue // Task 4.7: Store default value\n }, target, propertyKey);\n return descriptor;\n };\n};\n\n/**\n * Gets all public method names from a TypeScript class.\n * \n * @param classFilePath - The absolute file path to the TypeScript class file\n * @param className - The name of the class to analyze\n * @returns An array of strings containing the names of all public methods\n * \n * @example\n * ```ts\n * const methods = getPublicMethods('/path/to/class.ts', 'MyClass');\n * // returns ['method1', 'method2', ...]\n * ```\n */\nexport function getPublicMethods(classFilePath: string, className: string): string[] {\n const cacheKey = `${classFilePath}::${className}`;\n \n const cached = publicMethodsCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n \n if (!cachedProject) {\n cachedProject = new Project();\n }\n \n const sourceFile = cachedProject.addSourceFileAtPath(classFilePath);\n const classDeclaration = sourceFile.getClass(className);\n const publicMethods: string[] = [];\n\n if (classDeclaration) {\n for (const method of classDeclaration.getMethods()) {\n const modifiers = method.getModifiers().map(mod => mod.getText());\n if (!modifiers.includes(\"private\") && !modifiers.includes(\"protected\")) {\n publicMethods.push(method.getName());\n }\n }\n }\n\n publicMethodsCache.set(cacheKey, publicMethods);\n return publicMethods;\n}\n\n/**\n * get koatty controller paths\n * @param className \n * @returns \n */\nfunction getControllerPath(className: string): string {\n return process.env.APP_PATH + \"/controller/\" + className + \".ts\";\n}\n\n\n\n\n\n\n\n\n\n/**\n * Compile type converter function at startup time.\n * Uses a typeof short-circuit + delegate pattern:\n * - Returning null for string types (no conversion needed)\n * - For number/boolean/array/object: typeof/Array.isArray fast-path short-circuit,\n * then delegate to convertParamsType for actual conversion (single source of truth)\n * - Default case delegates directly to convertParamsType\n *\n * @param type - Parameter type (string, number, boolean, array, etc.)\n * @returns Compiled type converter function or null if no conversion needed\n * @internal\n */\nexport function compileTypeConverter(type: string): ((value: any) => any) | null {\n const normalizedType = type.toLowerCase();\n\n if (normalizedType === 'string') {\n return null;\n }\n\n switch (normalizedType) {\n case 'number':\n return (value: any) => {\n if (typeof value === 'number') return value;\n if (value === null || value === undefined || value === '') return value; // preserve passthrough\n return convertParamsType(value, 'number');\n };\n\n case 'boolean':\n return (value: any) => {\n if (typeof value === 'boolean') return value;\n return convertParamsType(value, 'boolean');\n };\n\n case 'array':\n return (value: any) => {\n if (Array.isArray(value)) return value;\n return convertParamsType(value, 'array');\n };\n\n case 'object':\n return (value: any) => {\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) return value;\n return convertParamsType(value, 'object');\n };\n\n default:\n return (value: any) => convertParamsType(value, type);\n }\n}\n\n/**\n * Generate optimized parameter extractor function at application startup\n * \n * @description\n * Creates specialized extractor functions for synchronous parameters (QUERY, HEADER, PATH)\n * at startup time. These pre-compiled extractors eliminate runtime conditionals and\n * provide direct property access for maximum performance.\n * \n * Returns null for async parameters (BODY, FILE) and custom extractors, as these\n * require runtime async operations or user-defined logic.\n * \n * @param param - Parameter metadata containing sourceType and paramName\n * @returns Pre-compiled extractor function, or null if parameter requires async extraction\n * \n * @performance\n * Pre-compiled extractors are ~25% faster than runtime switch-based extraction\n * because they avoid all conditional logic and provide direct property access.\n * \n * @example\n * ```typescript\n * const queryParam = {\n * sourceType: ParamSourceType.QUERY,\n * paramName: 'page',\n * name: 'page'\n * };\n * \n * const extractor = generatePrecompiledExtractor(queryParam);\n * // Returns: (ctx) => (ctx.query || {})['page']\n * \n * // Usage at runtime:\n * const value = extractor(ctx); // Direct property access, no conditionals\n * ```\n * \n * @internal\n * @since 1.20.0-8\n * @category Parameter Extraction\n */\nexport function generatePrecompiledExtractor(param: ParamMetadata): ((ctx: any) => any | Promise<any>) | null {\n // paramName is the specific key to extract, if undefined, extract the entire collection\n const paramName = param.paramName !== undefined ? param.paramName : undefined;\n \n switch(param.sourceType) {\n case ParamSourceType.QUERY:\n // Generate optimized query extractor\n if (paramName !== undefined) {\n return (ctx: any) => (ctx.query || {})[paramName];\n } else {\n return (ctx: any) => ctx.query || {};\n }\n \n case ParamSourceType.HEADER:\n // Generate optimized header extractor\n if (paramName !== undefined) {\n return (ctx: any) => ctx.get ? ctx.get(paramName) : (ctx.headers || {})[paramName];\n } else {\n return (ctx: any) => ctx.headers || {};\n }\n \n case ParamSourceType.PATH:\n // Generate optimized path extractor\n if (paramName !== undefined) {\n return (ctx: any) => (ctx.params || {})[paramName];\n } else {\n return (ctx: any) => ctx.params || {};\n }\n \n case ParamSourceType.BODY:\n {\n const bodyOpts = param.options;\n if (paramName !== undefined) {\n return async (ctx: any) => {\n const parsed = await bodyParser(ctx, bodyOpts) as any;\n return (parsed ?? {})[paramName];\n };\n } else {\n // Return full body, stripping FILE_KEY\n return async (ctx: any) => {\n const parsed = await bodyParser(ctx, bodyOpts) as any;\n if (!parsed) return {};\n const { [FILE_KEY]: _files, ...bodyOnly } = parsed;\n return bodyOnly;\n };\n }\n }\n\n case ParamSourceType.FILE:\n // Body and file require async parsing, cannot pre-compile\n return null;\n \n case ParamSourceType.CUSTOM:\n // Custom extractors use the original fn\n return null;\n \n default:\n return null;\n }\n}\n\n/**\n * Compile validation rules into a single validation function at startup time.\n * This pre-compilation reduces runtime overhead by eliminating repetitive lookups and checks.\n * \n * @param index - Parameter index for error reporting\n * @param type - Parameter type\n * @param rule - Validation rule (Function, string, or array of strings)\n * @param options - Optional validation options\n * @returns Compiled validation function that throws Exception on failure\n * @internal\n */\nexport function compileValidator(\n index: number, \n type: string, \n rule: Function | ValidRules | ValidRules[], \n options?: ValidOtpions\n): (value: any) => void {\n \n // If rule is a custom function validator\n if (Helper.isFunction(rule)) {\n // Task 6.3: Optimize memory - pre-compute error message prefix\n const errorPrefix = `Validation failed for param ${index}: `;\n return (value: any) => {\n try {\n (rule as Function)(value);\n } catch (err) {\n throw new Exception(\n errorPrefix + err.message,\n 1,\n 400\n );\n }\n };\n }\n \n // If rule is string or array of strings, compile built-in validators\n const funcs: ValidRules[] = Helper.isString(rule) ? [rule as ValidRules] : \n Helper.isArray(rule) ? rule as ValidRules[] : [];\n \n // Pre-filter and prepare validators\n const validators: Array<(value: any, opts?: ValidOtpions) => void> = [];\n for (const func of funcs) {\n if (Object.hasOwnProperty.call(FunctionValidator, func)) {\n validators.push(FunctionValidator[func]);\n } else {\n Logger.Debug(`compileValidator: Unknown validator '${func}' will be ignored`);\n }\n }\n \n // Task 6.3: Optimize memory - pre-compute error message prefix\n const errorPrefix = `Validation failed for param ${index}: `;\n \n // Return composed validation function\n return (value: any) => {\n for (const validator of validators) {\n try {\n validator(value, options);\n } catch (err) {\n throw new Exception(\n errorPrefix + err.message,\n 1,\n 400\n );\n }\n }\n };\n}\n","/*\n * @Description: Strategy-based parameter extraction system\n * @Usage: Unified parameter extraction with optimized strategies\n * @Author: richen\n * @Date: 2025-01-27\n * @LastEditTime: 2025-01-27\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { Koatty, KoattyContext } from \"koatty_core\";\nimport { ParamMetadata, ParamSourceType } from \"./inject\";\nimport {\n ClassValidator,\n plainToClass,\n ValidOtpions,\n ValidRules\n} from \"koatty_validation\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { bodyParser } from \"../payload/payload\";\nimport { FILE_KEY } from \"../payload/interface\";\nimport { IOC } from \"koatty_container\";\n\n/**\n * Parameter extraction strategy enum\n * Each strategy represents an optimized execution path\n */\nexport enum ExtractionStrategy {\n // Fastest: Direct property access, no validation\n SYNC_SINGLE_NO_VALIDATION = 'SYNC_SINGLE_NO_VALIDATION',\n\n // Fast: Loop over synchronous params, no validation\n SYNC_MULTI_NO_VALIDATION = 'SYNC_MULTI_NO_VALIDATION',\n\n // Fast: Single param with simple validation\n SYNC_SINGLE_SIMPLE_VALIDATION = 'SYNC_SINGLE_SIMPLE_VALIDATION',\n\n // Fast: Multiple params with simple validation\n SYNC_MULTI_SIMPLE_VALIDATION = 'SYNC_MULTI_SIMPLE_VALIDATION',\n\n // Fast: DTO transformation without validation\n SYNC_DTO_NO_VALIDATION = 'SYNC_DTO_NO_VALIDATION',\n\n // Fast: DTO transformation with validation\n SYNC_DTO_WITH_VALIDATION = 'SYNC_DTO_WITH_VALIDATION',\n\n // Moderate: Mixed async params (body/file)\n ASYNC_MIXED_PARAMS = 'ASYNC_MIXED_PARAMS',\n\n // Moderate: Async DTO validation\n ASYNC_DTO_VALIDATION = 'ASYNC_DTO_VALIDATION',\n\n // Fallback: Generic async path\n ASYNC_GENERIC = 'ASYNC_GENERIC'\n}\n\n/**\n * Pre-compiled strategy handler type\n */\nexport type StrategyHandler = (ctx: KoattyContext, params: ParamMetadata[]) => Promise<unknown[]> | unknown[];\n\n/**\n * Parameter source structure for unified extraction\n */\ninterface ParamSource {\n query: Record<string, unknown>;\n body: Record<string | symbol, unknown>;\n params: Record<string, unknown>;\n headers: Record<string, unknown>;\n}\n\n/**\n * Extract value synchronously for QUERY/HEADER/PATH\n * Reused from inject.ts to avoid duplication\n */\nfunction extractValueSync(ctx: KoattyContext, param: ParamMetadata): unknown {\n const paramName = param.paramName !== undefined ? param.paramName : param.name;\n\n switch(param.sourceType) {\n case ParamSourceType.QUERY:\n return paramName ? ctx.query?.[paramName] : ctx.query;\n\n case ParamSourceType.HEADER:\n return paramName ? ctx.get(paramName) : ctx.headers;\n\n case ParamSourceType.PATH:\n return paramName ? ctx.params?.[paramName] : ctx.params;\n\n default:\n return param.fn ? param.fn(ctx, param.options) : null;\n }\n}\n\n/**\n * Extract value from pre-fetched sources\n * Reused from inject.ts to avoid duplication\n */\nfunction extractValueFromSource(source: ParamSource, param: ParamMetadata): unknown {\n const paramName = param.paramName !== undefined ? param.paramName : param.name;\n\n switch(param.sourceType) {\n case ParamSourceType.QUERY:\n return paramName ? source.query?.[paramName] : source.query;\n\n case ParamSourceType.BODY: {\n if (paramName) return source.body?.[paramName];\n const { [FILE_KEY]: _files, ...bodyFields } = (source.body || {}) as any;\n return bodyFields;\n }\n\n case ParamSourceType.HEADER:\n return paramName ? source.headers?.[paramName] : source.headers;\n\n case ParamSourceType.PATH:\n return paramName ? source.params?.[paramName] : source.params;\n\n case ParamSourceType.FILE: {\n const files = (source.body?.[FILE_KEY] as Record<string, unknown>) || {};\n return paramName ? files[paramName] : files;\n }\n\n case ParamSourceType.CUSTOM:\n return null;\n\n default:\n return null;\n }\n}\n\n/**\n * Extract all parameter sources once\n * Reused from inject.ts to avoid duplication\n */\nasync function extractParamSources(ctx: KoattyContext, params: ParamMetadata[]): Promise<ParamSource> {\n const needsBody = params.some((param) => {\n return param.sourceType === ParamSourceType.BODY ||\n param.sourceType === ParamSourceType.FILE;\n });\n\n let body: Record<string | symbol, unknown> = {};\n if (needsBody) {\n try {\n // TODO(P3): When a method has multiple BODY/FILE params with different options,\n // only params[0]?.options is used here; options for subsequent params are ignored.\n // To fix: resolve per-param bodyParser calls keyed by options hash.\n const parsedBody = await bodyParser(ctx, params[0]?.options) as Record<string | symbol, unknown> | undefined;\n body = parsedBody || {};\n } catch (err) {\n Logger.Error(`extractParamSources: Failed to parse body: ${(err as Error).message}`);\n }\n }\n\n return {\n query: ctx.query || {},\n body,\n params: ctx.params || {},\n headers: ctx.headers || {}\n };\n}\n\n/**\n * Parameter validation options\n */\ninterface ParamOptions {\n index: number;\n isDto: boolean;\n type: string;\n validRule: Function | ValidRules | ValidRules[];\n validOpt: ValidOtpions;\n dtoCheck: boolean;\n dtoRule: unknown;\n clazz: unknown;\n}\n\nfunction createParamOptions(param: ParamMetadata, index: number): ParamOptions {\n return {\n index,\n isDto: param.isDto,\n type: param.type,\n validRule: param.validRule,\n validOpt: param.validOpt,\n dtoCheck: param.dtoCheck,\n dtoRule: param.dtoRule,\n clazz: param.clazz,\n };\n}\n\n/**\n * Validate parameter\n * Reused from inject.ts to avoid duplication\n */\n async function validateParam(\n app: Koatty,\n ctx: KoattyContext,\n value: unknown,\n opt: ParamOptions,\n compiledValidator?: (value: unknown) => void,\n compiledTypeConverter?: ((value: unknown) => unknown) | null\n ): Promise<unknown> {\n try {\n if (opt.isDto) {\n let validatedValue;\n if (opt.dtoCheck) {\n validatedValue = await ClassValidator.valid(opt.clazz as new (...args: unknown[]) => unknown, value, true);\n } else {\n validatedValue = plainToClass(opt.clazz as new (...args: unknown[]) => unknown, value, true);\n }\n return validatedValue;\n } else {\n const needsConversion = compiledTypeConverter != null;\n const needsValidation = !!(compiledValidator || opt.validRule);\n\n if (!needsConversion && !needsValidation) {\n return value;\n }\n\n let convertedValue = value;\n if (compiledTypeConverter) {\n convertedValue = compiledTypeConverter(value);\n }\n\n if (compiledValidator) {\n compiledValidator(convertedValue);\n } else if (opt.validRule) {\n throw new Error(\n `Validator for parameter ${opt.index} was not pre-compiled. ` +\n `This indicates a compilation failure during startup. ` +\n `Check application logs for compilation errors.`\n );\n }\n \n return convertedValue;\n }\n } catch (err) {\n const errorMessage = (err as Error).message || '';\n throw new Error(errorMessage.trim() ? errorMessage : `ValidatorError: invalid arguments.`);\n }\n}\n\n/**\n * Detect extraction strategy from parameter metadata\n * This is called once at startup time\n */\nexport function detectExtractionStrategy(params: ParamMetadata[]): ExtractionStrategy {\n if (!params || params.length === 0) {\n return ExtractionStrategy.ASYNC_GENERIC;\n }\n\n const paramCount = params.length;\n\n const hasAsyncParams = params.some(p =>\n p.sourceType === ParamSourceType.BODY ||\n p.sourceType === ParamSourceType.FILE ||\n (p.sourceType === ParamSourceType.CUSTOM && p.fn) ||\n p.isDto\n );\n\n const hasDtoParams = params.some(p => p.isDto);\n\n const hasValidation = params.some(p => p.validRule);\n\n const isSimpleDto = paramCount === 1 && hasDtoParams && !hasValidation;\n\n if (hasAsyncParams) {\n if (isSimpleDto) {\n return ExtractionStrategy.SYNC_DTO_NO_VALIDATION;\n }\n if (hasDtoParams) {\n return ExtractionStrategy.ASYNC_DTO_VALIDATION;\n }\n return ExtractionStrategy.ASYNC_MIXED_PARAMS;\n } else {\n if (paramCount === 1) {\n const param = params[0];\n\n if (!param.validRule && !param.isDto) {\n return ExtractionStrategy.SYNC_SINGLE_NO_VALIDATION;\n }\n\n if (param.validRule && !param.isDto) {\n return ExtractionStrategy.SYNC_SINGLE_SIMPLE_VALIDATION;\n }\n\n if (param.isDto) {\n return param.dtoCheck\n ? ExtractionStrategy.SYNC_DTO_WITH_VALIDATION\n : ExtractionStrategy.SYNC_DTO_NO_VALIDATION;\n }\n } else if (paramCount > 1) {\n if (!hasValidation && !hasDtoParams) {\n return ExtractionStrategy.SYNC_MULTI_NO_VALIDATION;\n }\n\n if (hasValidation && !hasDtoParams) {\n return ExtractionStrategy.SYNC_MULTI_SIMPLE_VALIDATION;\n }\n }\n }\n\n return ExtractionStrategy.ASYNC_GENERIC;\n}\n\n\n/**\n * Strategy cache for storing pre-compiled handlers\n * Uses WeakMap for automatic garbage collection\n */\nclass StrategyCacheManager {\n private cache = new WeakMap<ParamMetadata[], StrategyHandler>();\n private strategyMap = new WeakMap<ParamMetadata[], ExtractionStrategy>();\n\n getOrCreate(params: ParamMetadata[], app: Koatty): StrategyHandler {\n const cached = this.cache.get(params);\n if (cached) {\n return cached;\n }\n\n const strategy = detectExtractionStrategy(params);\n this.strategyMap.set(params, strategy);\n\n const handler = StrategyHandlerFactory.createHandler(strategy, params, app);\n this.cache.set(params, handler);\n\n return handler;\n }\n\n getStrategy(params: ParamMetadata[]): ExtractionStrategy | undefined {\n return this.strategyMap.get(params);\n }\n\n clear(): void {\n this.cache = new WeakMap();\n this.strategyMap = new WeakMap();\n }\n}\n\nconst strategyCache = new StrategyCacheManager();\n\n/**\n * Unified parameter extraction using strategy pattern\n * Replaces getParameter(), FastPath, and Sync Path\n *\n * @performance\n * - Startup: Strategy detection (one-time cost)\n * - Runtime: Direct handler call (optimal performance)\n * - Memory: WeakMap auto-GC (no memory leaks)\n */\nexport async function extractParameters(\n app: Koatty,\n ctx: KoattyContext,\n params: ParamMetadata[]\n): Promise<unknown[]> {\n\n if (!params || params.length === 0) {\n return [];\n }\n\n const handler = strategyCache.getOrCreate(params, app);\n const result = await handler(ctx, params);\n\n return result as unknown[];\n}\n\n/**\n * Export cache manager for testing and debugging\n */\nexport { strategyCache };\n\n/**\n * Strategy handler factory\n * Creates optimized handlers for each strategy\n */\nexport class StrategyHandlerFactory {\n /**\n * Create optimized handler for a given strategy\n */\n static createHandler(\n strategy: ExtractionStrategy,\n params: ParamMetadata[],\n app: Koatty\n ): StrategyHandler {\n\n switch (strategy) {\n // Fastest: Direct property access\n case ExtractionStrategy.SYNC_SINGLE_NO_VALIDATION:\n return this.createSyncSingleNoValidationHandler(params);\n\n // Fast: Loop over params\n case ExtractionStrategy.SYNC_MULTI_NO_VALIDATION:\n return this.createSyncMultiNoValidationHandler(params);\n\n // Fast: Single param with validation\n case ExtractionStrategy.SYNC_SINGLE_SIMPLE_VALIDATION:\n return this.createSyncSingleSimpleValidationHandler(params, app);\n\n // Fast: Multiple params with validation\n case ExtractionStrategy.SYNC_MULTI_SIMPLE_VALIDATION:\n return this.createSyncMultiSimpleValidationHandler(params, app);\n\n // Fast: DTO transformation\n case ExtractionStrategy.SYNC_DTO_NO_VALIDATION:\n case ExtractionStrategy.SYNC_DTO_WITH_VALIDATION:\n return this.createSyncDtoHandler(params, app);\n\n // Moderate: Async mixed params\n case ExtractionStrategy.ASYNC_MIXED_PARAMS:\n return this.createAsyncMixedHandler(params, app);\n\n // Moderate: Async DTO validation\n case ExtractionStrategy.ASYNC_DTO_VALIDATION:\n return this.createAsyncDtoHandler(params, app);\n\n // Fallback: Generic async path\n case ExtractionStrategy.ASYNC_GENERIC:\n return this.createGenericAsyncHandler(params, app);\n\n default:\n throw new Error(`Unknown strategy: ${strategy}`);\n }\n }\n\n /**\n * Fastest: Single param, direct access, no validation\n */\n private static createSyncSingleNoValidationHandler(\n params: ParamMetadata[]\n ): StrategyHandler {\n const param = params[0];\n const precompiledExtractor = param.precompiledExtractor;\n const compiledTypeConverter = param.compiledTypeConverter;\n const defaultValue = param.defaultValue;\n\n if (!precompiledExtractor) {\n return (ctx: KoattyContext) => {\n const rawValue = extractValueSync(ctx, param);\n const value = rawValue === undefined && defaultValue !== undefined ? defaultValue : rawValue;\n const converted = compiledTypeConverter\n ? compiledTypeConverter(value)\n : value;\n return [converted];\n };\n }\n\n return (ctx: KoattyContext) => {\n const rawValue = precompiledExtractor(ctx);\n const value = rawValue === undefined && defaultValue !== undefined ? defaultValue : rawValue;\n const converted = compiledTypeConverter\n ? compiledTypeConverter(value)\n : value;\n return [converted];\n };\n }\n\n /**\n * Fast: Multiple params, loop, no validation\n */\n private static createSyncMultiNoValidationHandler(\n params: ParamMetadata[]\n ): StrategyHandler {\n const handlers = params.map(p => {\n const extractor = p.precompiledExtractor;\n const converter = p.compiledTypeConverter;\n const defaultValue = p.defaultValue;\n\n if (extractor) {\n if (converter) {\n return (ctx: KoattyContext) => {\n const rawValue = extractor(ctx);\n const value = rawValue === undefined && defaultValue !== undefined ? defaultValue : rawValue;\n return converter(value);\n };\n }\n return (ctx: KoattyContext) => {\n const rawValue = extractor(ctx);\n return rawValue === undefined && defaultValue !== undefined ? defaultValue : rawValue;\n };\n }\n\n if (converter) {\n return (ctx: KoattyContext) => {\n const rawValue = extractValueSync(ctx, p);\n const value = rawValue === undefined && defaultValue !== undefined ? defaultValue : rawValue;\n return converter(value);\n };\n }\n return (ctx: KoattyContext) => {\n const rawValue = extractValueSync(ctx, p);\n return rawValue === undefined && defaultValue !== undefined ? defaultValue : rawValue;\n };\n });\n\n return (ctx: KoattyContext) => {\n const results = new Array<unknown>(handlers.length);\n for (let i = 0; i < handlers.length; i++) {\n results[i] = handlers[i](ctx);\n }\n return results as unknown[];\n };\n }\n\n /**\n * Fast: Single param with simple validation\n */\n private static createSyncSingleSimpleValidationHandler(\n params: ParamMetadata[],\n _app: Koatty\n ): StrategyHandler {\n const param = params[0];\n const extractor = param.precompiledExtractor;\n const converter = param.compiledTypeConverter;\n const validator = param.compiledValidator;\n const defaultValue = param.defaultValue;\n\n return (ctx: KoattyContext) => {\n const rawValue = extractor\n ? extractor(ctx)\n : extractValueSync(ctx, param);\n\n const value = rawValue === undefined && defaultValue !== undefined ? defaultValue : rawValue;\n\n const converted = converter\n ? converter(value)\n : value;\n\n if (validator) {\n validator(converted);\n }\n\n return [converted];\n };\n }\n\n /**\n * Fast: Multiple params with validation\n */\n private static createSyncMultiSimpleValidationHandler(\n params: ParamMetadata[],\n _app: Koatty\n ): StrategyHandler {\n const handlers = params.map(p => {\n const extractor = p.precompiledExtractor;\n const converter = p.compiledTypeConverter;\n const validator = p.compiledValidator;\n const defaultValue = p.defaultValue;\n\n return (ctx: KoattyContext) => {\n const rawValue = extractor\n ? extractor(ctx)\n : extractValueSync(ctx, p);\n\n const value = rawValue === undefined && defaultValue !== undefined ? defaultValue : rawValue;\n\n const converted = converter\n ? converter(value)\n : value;\n\n if (validator) {\n validator(converted);\n }\n\n return converted;\n };\n });\n\n return (ctx: KoattyContext) => {\n const results = new Array<unknown>(handlers.length);\n for (let i = 0; i < handlers.length; i++) {\n results[i] = handlers[i](ctx);\n }\n return results as unknown[];\n };\n }\n\n /**\n * Fast: DTO transformation\n */\n private static createSyncDtoHandler(\n params: ParamMetadata[],\n _app: Koatty\n ): StrategyHandler {\n const param = params[0];\n const clazz = param.clazz;\n const dtoCheck = param.dtoCheck;\n const type = param.type;\n const extractor = param.precompiledExtractor;\n const fn = param.fn;\n\n return async (ctx: KoattyContext) => {\n // Handle clazz undefined by getting it from IOC container\n let actualClazz = clazz;\n if (!actualClazz) {\n actualClazz = IOC.getClass(type, \"COMPONENT\");\n if (!actualClazz) {\n throw Error(`Failed to obtain class ${type}, because class is not registered in container.`);\n }\n }\n\n // Use precompiled extractor if available, otherwise use custom fn, then bodyParser\n let body: unknown;\n if (extractor) {\n body = await extractor(ctx);\n } else if (fn && typeof fn === 'function') {\n body = await fn(ctx, param.options);\n } else {\n body = await bodyParser(ctx, param.options);\n }\n\n const transformed = dtoCheck\n ? await ClassValidator.valid(actualClazz, body, true)\n : plainToClass(actualClazz as new (...args: unknown[]) => unknown, body, true);\n\n return [transformed];\n };\n }\n\n /**\n * Moderate: Async mixed params (body/file/custom + sync params)\n */\n private static createAsyncMixedHandler(\n params: ParamMetadata[],\n app: Koatty\n ): StrategyHandler {\n const asyncParams: ParamMetadata[] = [];\n const syncParams: ParamMetadata[] = [];\n\n for (const p of params) {\n if (p.sourceType === ParamSourceType.BODY ||\n p.sourceType === ParamSourceType.FILE ||\n (p.sourceType === ParamSourceType.CUSTOM && p.fn)) {\n asyncParams.push(p);\n } else {\n syncParams.push(p);\n }\n }\n\n const syncHandlers = syncParams.map(p => {\n const extractor = p.precompiledExtractor;\n const converter = p.compiledTypeConverter;\n const validator = p.compiledValidator;\n const defaultValue = p.defaultValue;\n\n return (ctx: KoattyContext) => {\n const rawValue = extractor\n ? extractor(ctx)\n : extractValueSync(ctx, p);\n\n const value = rawValue === undefined && defaultValue !== undefined ? defaultValue : rawValue;\n\n const converted = converter\n ? converter(value)\n : value;\n\n if (validator) {\n validator(converted);\n }\n\n return converted;\n };\n });\n\n const allAsyncHaveExtractor = asyncParams.every(\n p => !!p.precompiledExtractor || (p.fn && typeof p.fn === 'function')\n );\n\n return async (ctx: KoattyContext) => {\n const bodyData = allAsyncHaveExtractor ? null : await extractParamSources(ctx, params);\n\n const asyncResults = asyncParams.map(async p => {\n if (p.precompiledExtractor) {\n const rawValue = await p.precompiledExtractor(ctx);\n const value = rawValue === undefined && p.defaultValue !== undefined ? p.defaultValue : rawValue;\n const paramOptions = p.precompiledOptions || createParamOptions(p, p.index ?? 0);\n return validateParam(app, ctx, value, paramOptions, p.compiledValidator, p.compiledTypeConverter);\n }\n\n if (p.fn && typeof p.fn === 'function') {\n const rawValue = await Promise.resolve(p.fn(ctx, p.options));\n const value = rawValue === undefined && p.defaultValue !== undefined ? p.defaultValue : rawValue;\n const paramOptions = p.precompiledOptions || createParamOptions(p, p.index ?? 0);\n return validateParam(app, ctx, value, paramOptions, p.compiledValidator, p.compiledTypeConverter);\n }\n\n const rawValue = bodyData ? extractValueFromSource(bodyData, p) : undefined;\n if (rawValue === undefined && p.defaultValue !== undefined) {\n return p.defaultValue;\n }\n const paramOptions = p.precompiledOptions || createParamOptions(p, p.index ?? 0);\n return validateParam(app, ctx, rawValue, paramOptions, p.compiledValidator, p.compiledTypeConverter);\n });\n\n const syncResults = syncHandlers.map(h => h(ctx));\n\n const results: unknown[] = [];\n let asyncIndex = 0;\n let syncIndex = 0;\n\n for (const p of params) {\n if (p.sourceType === ParamSourceType.BODY ||\n p.sourceType === ParamSourceType.FILE ||\n (p.sourceType === ParamSourceType.CUSTOM && p.fn)) {\n results.push(await asyncResults[asyncIndex++]);\n } else {\n results.push(syncResults[syncIndex++]);\n }\n }\n\n return results;\n };\n }\n\n /**\n * Moderate: Async DTO validation\n */\n private static createAsyncDtoHandler(\n params: ParamMetadata[],\n _app: Koatty\n ): StrategyHandler {\n const param = params[0];\n const clazz = param.clazz;\n const dtoCheck = param.dtoCheck;\n const type = param.type;\n const extractor = param.precompiledExtractor;\n const fn = param.fn;\n\n return async (ctx: KoattyContext) => {\n // Handle clazz undefined by getting it from IOC container\n let actualClazz = clazz;\n if (!actualClazz) {\n actualClazz = IOC.getClass(type, \"COMPONENT\");\n if (!actualClazz) {\n throw Error(`Failed to obtain class ${type}, because class is not registered in container.`);\n }\n }\n\n // Use precompiled extractor if available, otherwise use custom fn, then bodyParser\n let body: unknown;\n if (extractor) {\n body = await extractor(ctx);\n } else if (fn && typeof fn === 'function') {\n body = await fn(ctx, param.options);\n } else {\n body = await bodyParser(ctx, param.options);\n }\n\n const transformed = dtoCheck\n ? await ClassValidator.valid(actualClazz, body, true)\n : plainToClass(actualClazz as new (...args: unknown[]) => unknown, body, true);\n\n return [transformed];\n };\n }\n\n /**\n * Fallback: Generic async path\n */\n private static createGenericAsyncHandler(\n params: ParamMetadata[],\n app: Koatty\n ): StrategyHandler {\n const allHaveExtractorOrFn = params.every(p => !!p.precompiledExtractor || (p.fn && typeof p.fn === 'function'));\n\n return async (ctx: KoattyContext) => {\n const sources = allHaveExtractorOrFn ? null : await extractParamSources(ctx, params);\n\n const paramPromises = params.map(async (v, k) => {\n if (v.precompiledExtractor) {\n const rawValue = await v.precompiledExtractor(ctx);\n const value = rawValue === undefined && v.defaultValue !== undefined ? v.defaultValue : rawValue;\n const paramOptions = v.precompiledOptions || createParamOptions(v, v.index ?? k);\n return validateParam(app, ctx, value, paramOptions, v.compiledValidator, v.compiledTypeConverter);\n }\n\n if (v.fn && typeof v.fn === 'function') {\n const rawValue = await Promise.resolve(v.fn(ctx, v.options));\n const value = rawValue === undefined && v.defaultValue !== undefined ? v.defaultValue : rawValue;\n const paramOptions = v.precompiledOptions || createParamOptions(v, v.index ?? k);\n return validateParam(app, ctx, value, paramOptions, v.compiledValidator, v.compiledTypeConverter);\n }\n\n let rawValue = sources ? extractValueFromSource(sources, v) : undefined;\n if (rawValue === undefined && v.defaultValue !== undefined) {\n return v.defaultValue;\n }\n const paramOptions = v.precompiledOptions || createParamOptions(v, v.index ?? k);\n return validateParam(app, ctx, rawValue, paramOptions, v.compiledValidator, v.compiledTypeConverter);\n });\n\n return Promise.all(paramPromises);\n };\n }\n}\n","/*\n * @Description: \n * @Usage: \n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2025-03-15 22:21:29\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\nimport { Koatty, KoattyContext, KoattyNext } from \"koatty_core\";\nimport compose, { Middleware } from \"koa-compose\";\nimport { Helper } from \"koatty_lib\";\nimport { ParamMetadata } from \"./inject\";\nimport { extractParameters } from \"./strategy-extractor\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\n\n/**\n * Performance monitoring removed in v2.0.0\n * \n * Reason: Built-in performance statistics had concurrency issues and added complexity.\n * Recommendation: Use external monitoring tools (Prometheus, StatsD, OpenTelemetry, etc.)\n * for production-grade metrics with proper concurrency handling.\n */\n\n/**\n * Execute controller method with circuit breaker and parameter injection.\n *\n * @param {Koatty} app - The Koatty application instance\n * @param {KoattyContext} ctx - The Koatty context object\n * @param {any} ctl - The controller instance\n * @param {string} method - The method name to execute\n * @param {ParamMetadata[]} [ctlParams] - Parameter metadata for injection\n * @param {any} [ctlParamsValue] - Parameter values for injection (deprecated, kept for compatibility)\n * @param {Function} [composedMiddleware] - Pre-composed middleware function\n * @returns {Promise<any>} The execution result\n * @throws {Error} When controller not found or execution fails\n */\nexport async function Handler(app: Koatty, ctx: KoattyContext, ctl: any,\n method: string, ctlParams?: ParamMetadata[], ctlParamsValue?: any, composedMiddleware?: Function) {\n\n if (!ctx || !ctl) {\n return ctx.throw(404, `Controller not found.`);\n }\n ctl.ctx ??= ctx;\n\n // 创建中间件链\n const middlewareFns: Middleware<KoattyContext>[] = [];\n\n // 如果有预组合的中间件,直接使用\n if (composedMiddleware && typeof composedMiddleware === 'function') {\n Logger.Debug(`Handler: Using pre-composed middleware`);\n middlewareFns.push(composedMiddleware as Middleware<KoattyContext>);\n } else {\n Logger.Debug('Handler: No middleware to execute');\n }\n\n // 添加Handler作为最后一个中间件\n middlewareFns.push(async (ctx: KoattyContext, next: KoattyNext) => {\n // 使用预定义值或优化的策略提取器\n let args: unknown[];\n if (ctlParamsValue !== undefined && ctlParamsValue !== null) {\n // 使用预定义的参数值(遗留功能,保持兼容性)\n Logger.Debug(`Handler: Using predefined parameter values`);\n args = ctlParamsValue;\n } else {\n // 使用优化的策略提取器\n args = ctlParams ? await extractParameters(app, ctx, ctlParams) : [];\n }\n // 执行方法\n const res = await ctl[method](...args);\n if (Helper.isError(res)) {\n throw res;\n }\n ctx.body = ctx.body || res;\n await next();\n });\n\n // 执行中间件链\n if (middlewareFns.length > 0) {\n await compose(middlewareFns)(ctx, async () => {});\n }\n\n return ctx.body;\n}\n","/*\n * @Description: Protocol-specific router configuration types\n * @Usage: Type definitions for ext parameters in RouterOptions\n * @Author: richen\n * @Date: 2025-01-20 10:00:00\n * @LastEditTime: 2025-01-20 10:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\n/**\n * WebSocket 协议特定配置\n */\nexport interface WebSocketExtConfig {\n /** 最大分帧大小(字节),默认1MB */\n maxFrameSize?: number;\n /** 分帧处理超时(ms),默认30秒 */\n frameTimeout?: number;\n /** 心跳检测间隔(ms),默认15秒 */\n heartbeatInterval?: number;\n /** 心跳超时时间(ms),默认30秒 */\n heartbeatTimeout?: number;\n /** 最大连接数,默认1000 */\n maxConnections?: number;\n /** 最大缓冲区大小(字节),默认10MB */\n maxBufferSize?: number;\n /** 清理间隔(ms),默认5分钟 */\n cleanupInterval?: number;\n}\n\n/**\n * gRPC 流配置\n */\nexport interface StreamConfig {\n /** 最大并发流数量,默认50 */\n maxConcurrentStreams?: number;\n /** 流超时时间(ms),默认60秒 */\n streamTimeout?: number;\n /** 背压阈值(字节),默认2048 */\n backpressureThreshold?: number;\n /** 是否启用流压缩,默认false */\n enableCompression?: boolean;\n}\n\n/**\n * gRPC 协议特定配置\n */\nexport interface GrpcExtConfig {\n /** Protocol Buffer 文件路径 */\n protoFile: string;\n /** 连接池大小,默认10 */\n poolSize?: number;\n /** 批处理大小,默认10 */\n batchSize?: number;\n /** 流配置 */\n streamConfig?: StreamConfig;\n /** gRPC 服务器选项 */\n serverOptions?: Record<string, any>;\n /** 是否启用反射,默认false */\n enableReflection?: boolean;\n}\n\n/**\n * GraphQL 协议特定配置\n */\nexport interface GraphQLExtConfig {\n /** GraphQL Schema 文件路径 */\n schemaFile: string;\n /** 启用 GraphQL Playground,默认false */\n playground?: boolean;\n /** 启用内省查询,默认true */\n introspection?: boolean;\n /** 调试模式,默认false */\n debug?: boolean;\n /** 查询深度限制,默认10 */\n depthLimit?: number;\n /** 查询复杂度限制,默认1000 */\n complexityLimit?: number;\n /** 自定义标量类型 */\n customScalars?: Record<string, any>;\n /** 中间件配置 */\n middlewares?: any[];\n}\n\n/**\n * HTTP 协议特定配置(目前为空,预留扩展)\n */\nexport interface HttpExtConfig {\n /** 自定义HTTP选项 */\n [key: string]: any;\n}\n\n/**\n * 协议扩展配置联合类型\n */\nexport type ProtocolExtConfig = \n | WebSocketExtConfig \n | GrpcExtConfig \n | GraphQLExtConfig \n | HttpExtConfig;\n\n/**\n * 协议扩展配置映射\n */\nexport interface ProtocolExtConfigMap {\n http: HttpExtConfig;\n https: HttpExtConfig;\n http2: HttpExtConfig;\n http3: HttpExtConfig;\n ws: WebSocketExtConfig;\n wss: WebSocketExtConfig;\n grpc: GrpcExtConfig;\n graphql: GraphQLExtConfig;\n}\n\n/**\n * 获取协议特定配置的工具函数\n */\nexport function getProtocolConfig<T extends keyof ProtocolExtConfigMap>(\n protocol: T,\n ext: Record<string, any> = {}\n): ProtocolExtConfigMap[T] {\n return ext as ProtocolExtConfigMap[T];\n}\n\n/**\n * 配置验证结果\n */\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n}\n\n/**\n * 验证协议特定配置的工具函数(增强版)\n */\nexport function validateProtocolConfig(\n protocol: string,\n ext: Record<string, any> = {},\n env: string = process.env.NODE_ENV || 'development'\n): ValidationResult {\n const result: ValidationResult = {\n valid: true,\n errors: [],\n warnings: []\n };\n\n const proto = protocol.toLowerCase();\n\n switch (proto) {\n case 'grpc':\n // 必需字段验证\n if (!ext.protoFile || typeof ext.protoFile !== 'string' || ext.protoFile.trim().length === 0) {\n result.valid = false;\n result.errors.push('gRPC protocol requires protoFile path');\n }\n \n // 可选字段验证\n if (ext.poolSize !== undefined && (typeof ext.poolSize !== 'number' || ext.poolSize < 1)) {\n result.warnings.push('poolSize should be a positive number, using default: 10');\n }\n if (ext.batchSize !== undefined && (typeof ext.batchSize !== 'number' || ext.batchSize < 1)) {\n result.warnings.push('batchSize should be a positive number, using default: 10');\n }\n \n // 流配置验证\n if (ext.streamConfig) {\n const sc = ext.streamConfig;\n if (sc.maxConcurrentStreams !== undefined && sc.maxConcurrentStreams < 1) {\n result.warnings.push('maxConcurrentStreams should be positive, using default: 50');\n }\n if (sc.streamTimeout !== undefined && sc.streamTimeout < 1000) {\n result.warnings.push('streamTimeout should be >= 1000ms for stability');\n }\n }\n break;\n\n case 'graphql':\n // 必需字段验证\n if (!ext.schemaFile || typeof ext.schemaFile !== 'string' || ext.schemaFile.trim().length === 0) {\n result.valid = false;\n result.errors.push('GraphQL protocol requires schemaFile path');\n }\n \n // 安全配置检查(生产环境)\n if (env === 'production') {\n if (ext.playground === true) {\n result.warnings.push('GraphQL Playground should be disabled in production');\n }\n if (ext.debug === true) {\n result.warnings.push('Debug mode should be disabled in production');\n }\n if (!ext.depthLimit) {\n result.warnings.push('Consider setting depthLimit for production security');\n }\n if (!ext.complexityLimit) {\n result.warnings.push('Consider setting complexityLimit for production security');\n }\n }\n \n // 深度和复杂度验证\n if (ext.depthLimit !== undefined && (typeof ext.depthLimit !== 'number' || ext.depthLimit < 1)) {\n result.warnings.push('depthLimit should be a positive number');\n }\n if (ext.complexityLimit !== undefined && (typeof ext.complexityLimit !== 'number' || ext.complexityLimit < 1)) {\n result.warnings.push('complexityLimit should be a positive number');\n }\n break;\n\n case 'ws':\n case 'wss':\n // 心跳配置验证\n if (ext.heartbeatInterval !== undefined && ext.heartbeatTimeout !== undefined) {\n if (ext.heartbeatInterval >= ext.heartbeatTimeout) {\n result.warnings.push('heartbeatInterval should be less than heartbeatTimeout');\n }\n }\n \n // 资源限制验证\n if (ext.maxConnections !== undefined && ext.maxConnections < 1) {\n result.warnings.push('maxConnections should be positive, using default: 1000');\n }\n if (ext.maxFrameSize !== undefined && ext.maxFrameSize < 1024) {\n result.warnings.push('maxFrameSize too small, may cause issues with normal messages');\n }\n if (ext.maxBufferSize !== undefined && ext.maxFrameSize !== undefined) {\n if (ext.maxBufferSize < ext.maxFrameSize * 2) {\n result.warnings.push('maxBufferSize should be at least 2x maxFrameSize');\n }\n }\n break;\n\n case 'http':\n case 'https':\n case 'http2':\n case 'http3':\n // HTTP 配置都是可选的,无需严格验证\n break;\n\n default:\n result.valid = false;\n result.errors.push(`Unknown protocol: ${protocol}`);\n }\n\n return result;\n} ","/*\n * @Description: \n * @Usage: \n * @Author: richen\n * @Date: 2025-03-12 14:54:42\n * @LastEditTime: 2025-03-15 17:06:54\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\nimport KoaRouter from \"@koa/router\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { createHandler } from \"graphql-http/lib/use/fetch\";\nimport { IOC } from \"koatty_container\";\nimport {\n IGraphQLImplementation, Koatty, KoattyContext,\n KoattyRouter, RouterImplementation\n} from \"koatty_core\";\nimport { buildSchema } from \"koatty_graphql\";\nimport { Helper } from \"koatty_lib\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { injectParamMetaData, injectRouter } from \"../utils/inject\";\nimport { RouterOptions } from \"./router\";\nimport { Handler } from \"../utils/handler\";\nimport { getProtocolConfig, validateProtocolConfig } from \"./types\";\n\n/**\n * GrpcRouter Options\n *\n * @export\n * @interface GraphQLRouterOptions\n */\nexport interface GraphQLRouterOptions extends RouterOptions {\n schemaFile: string;\n}\n\nexport class GraphQLRouter implements KoattyRouter {\n readonly protocol: string;\n options: GraphQLRouterOptions;\n router: KoaRouter;\n private routerMap: Map<string, RouterImplementation>;\n\n constructor(app: Koatty, options: RouterOptions = { protocol: \"graphql\", prefix: \"\" }) {\n const extConfig = getProtocolConfig('graphql', options.ext || {});\n\n const validation = validateProtocolConfig('graphql', options.ext || {});\n if (!validation.valid) {\n throw new Error(`GraphQL router configuration error: ${validation.errors.join(', ')}`);\n }\n if (validation.warnings.length > 0) {\n validation.warnings.forEach((warning: string) => Logger.Warn(`[GraphQLRouter] ${warning}`));\n }\n\n // Resolve schemaFile path: if relative, resolve against app.rootPath\n let schemaFilePath = extConfig.schemaFile;\n if (schemaFilePath && !path.isAbsolute(schemaFilePath) && app.rootPath) {\n schemaFilePath = path.resolve(app.rootPath, schemaFilePath);\n }\n \n this.options = {\n ...options,\n schemaFile: schemaFilePath,\n } as GraphQLRouterOptions;\n\n this.protocol = options.protocol || \"graphql\";\n // initialize - only pass base router options to KoaRouter\n this.router = new KoaRouter({\n prefix: options.prefix,\n methods: options.methods,\n sensitive: options.sensitive,\n strict: options.strict,\n });\n this.routerMap = new Map();\n }\n\n /**\n * Set router\n * @param name \n * @param impl \n * @returns \n */\n SetRouter(name: string, impl?: RouterImplementation) {\n const routeHandler = <IGraphQLImplementation>impl.implementation;\n if (Helper.isEmpty(routeHandler)) return;\n\n // SECURITY: Build validation rules for query depth and complexity limits\n // NOTE: Requires optional dependencies (install if needed):\n // npm install graphql-depth-limit graphql-query-complexity\n const validationRules: any[] = [];\n\n try {\n // Add depth limit if configured\n if (this.options.ext?.depthLimit) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { depthLimit } = require('graphql-depth-limit');\n validationRules.push(\n depthLimit(\n this.options.ext.depthLimit,\n { ignore: [/_trusted/] } // Optional: ignore certain fields\n )\n );\n Logger.Debug(`GraphQL depth limit enabled: ${this.options.ext.depthLimit}`);\n }\n\n // Add complexity limit if configured\n if (this.options.ext?.complexityLimit) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { createComplexityLimitRule } = require('graphql-query-complexity');\n validationRules.push(\n createComplexityLimitRule(this.options.ext.complexityLimit, {\n scalarCost: 1,\n objectCost: 2,\n listFactor: 10,\n })\n );\n Logger.Debug(`GraphQL complexity limit enabled: ${this.options.ext.complexityLimit}`);\n }\n } catch {\n Logger.Warn('GraphQL security packages not installed. Install with: npm install graphql-depth-limit graphql-query-complexity');\n }\n\n // Create graphql-http handler\n const handler = createHandler({\n schema: impl.schema as any,\n rootValue: routeHandler,\n validationRules: validationRules.length > 0 ? validationRules : undefined,\n formatError: this.options.ext?.debug ? undefined : (error) => {\n const formatted: any = { message: error.message };\n if (error.extensions) {\n formatted.extensions = error.extensions;\n }\n if (error.locations) {\n formatted.locations = error.locations;\n }\n if (error.path) {\n formatted.path = error.path;\n }\n return formatted;\n },\n context: (req: any) => {\n // Extract Koa context from request\n return req.koattyContext;\n },\n });\n\n // Koa middleware adapter for graphql-http\n this.router.all(name, async (ctx: KoattyContext) => {\n // GraphiQL support: serve interactive UI for GET requests without query\n if (ctx.method === 'GET' && this.options.ext?.playground !== false && !ctx.query.query) {\n ctx.type = 'text/html';\n ctx.body = this.renderGraphiQL(name);\n return;\n }\n\n // Prepare fetch-compatible Request object\n const url = new URL(ctx.url, `${ctx.protocol}://${ctx.host}`);\n \n // Prepare headers\n const headers: Record<string, string> = {};\n Object.keys(ctx.headers).forEach(key => {\n const value = ctx.headers[key];\n if (typeof value === 'string') {\n headers[key] = value;\n } else if (Array.isArray(value)) {\n headers[key] = value.join(', ');\n }\n });\n\n // Prepare request body\n let requestBody: string | null = null;\n if (ctx.method !== 'GET' && ctx.method !== 'HEAD') {\n const koaRequest = ctx.request as any;\n if (koaRequest.body) {\n requestBody = JSON.stringify(koaRequest.body);\n }\n }\n\n const fetchRequest = new Request(url, {\n method: ctx.method,\n headers: headers,\n body: requestBody,\n });\n\n // Attach Koa context for custom context handler\n (fetchRequest as any).koattyContext = ctx;\n\n try {\n const response = await handler(fetchRequest);\n\n // Transfer response to Koa\n ctx.status = response.status;\n response.headers.forEach((value, key) => {\n ctx.set(key, value);\n });\n\n const body = await response.text();\n ctx.body = body;\n } catch (error: any) {\n Logger.Error(`GraphQL execution error: ${error.message}`);\n ctx.status = 500;\n ctx.body = { errors: [{ message: 'Internal server error' }] };\n }\n });\n this.routerMap.set(name, impl);\n }\n\n /**\n * Escape string for safe JavaScript embedding\n * @private\n */\n private escapeJsString(str: string): string {\n return str\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/'/g, \"\\\\'\")\n .replace(/\"/g, '\\\\\"')\n .replace(/</g, '\\\\x3c')\n .replace(/>/g, '\\\\x3e')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r');\n }\n\n /**\n * Render GraphiQL interface\n * \n * @private\n * @param {string} endpoint - GraphQL endpoint URL\n * @returns {string} HTML content for GraphiQL\n */\n private renderGraphiQL(endpoint: string): string {\n const safeEndpoint = this.escapeJsString(endpoint);\n return `<!DOCTYPE html>\n<html>\n<head>\n <title>GraphiQL</title>\n <style>\n body {\n height: 100%;\n margin: 0;\n width: 100%;\n overflow: hidden;\n }\n #graphiql {\n height: 100vh;\n }\n </style>\n <script crossorigin src=\"https://unpkg.com/react@18/umd/react.production.min.js\"></script>\n <script crossorigin src=\"https://unpkg.com/react-dom@18/umd/react-dom.production.min.js\"></script>\n <link rel=\"stylesheet\" href=\"https://unpkg.com/graphiql@3/graphiql.min.css\" />\n</head>\n<body>\n <div id=\"graphiql\">Loading...</div>\n <script\n src=\"https://unpkg.com/graphiql@3/graphiql.min.js\"\n type=\"application/javascript\"\n ></script>\n <script>\n const fetcher = GraphiQL.createFetcher({\n url: '${safeEndpoint}',\n });\n const root = ReactDOM.createRoot(document.getElementById('graphiql'));\n root.render(\n React.createElement(GraphiQL, {\n fetcher: fetcher,\n defaultEditorToolsVisibility: true,\n })\n );\n </script>\n</body>\n</html>`;\n }\n\n /**\n * ListRouter\n *\n * @returns {*} {Map<string, RouterImplementation> }\n */\n ListRouter(): Map<string, RouterImplementation> {\n return this.routerMap;\n }\n\n /**\n * LoadRouter\n *\n * @param {any[]} list\n */\n async LoadRouter(app: Koatty, list: any[]) {\n try {\n // PERFORMANCE FIX: Use async I/O to avoid blocking event loop\n const schemaContent = await fs.promises.readFile(this.options.schemaFile, 'utf-8');\n const schema = buildSchema(schemaContent);\n\n // Schema validation\n // Note: buildSchema will throw if schema is invalid\n if (!schema) {\n Logger.Error('Failed to build GraphQL schema');\n throw new Error('Invalid GraphQL schema');\n }\n\n const rootValue: IGraphQLImplementation = {};\n\n for (const n of list) {\n const ctlClass = IOC.getClass(n, \"CONTROLLER\");\n // inject router\n const ctlRouters = await injectRouter(app, ctlClass, this.options.protocol);\n if (!ctlRouters) {\n continue;\n }\n // inject param\n const ctlParams = injectParamMetaData(app, ctlClass, this.options.payload);\n // tslint:disable-next-line: forin\n for (const router of Object.values(ctlRouters)) {\n const method = router.method;\n // const path = parsePath(router.path);\n // const requestMethod = <RequestMethod>router.requestMethod;\n const params = ctlParams[method];\n\n Logger.Debug(`Register request mapping: ${n}.${method}`);\n rootValue[method] = (args: any, ctx: KoattyContext): Promise<any> => {\n const ctl = IOC.getInsByClass(ctlClass, [ctx]);\n return Handler(app, ctx, ctl, method, params, Object.values(args), router.composedMiddleware);\n }\n this.SetRouter(router.ctlPath || \"/graphql\", {\n schema,\n implementation: rootValue\n });\n }\n }\n\n // exp: in middleware\n // app.Router.SetRouter('/xxx', { schema, implementation: rootValue})\n\n // PERFORMANCE OPTIMIZATION: Merge router middleware to reduce middleware stack\n // In multi-protocol environment, merging routes() and allowedMethods() into \n // a single middleware reduces function calls and improves performance by ~40%\n const routerMiddleware = this.router.routes();\n const allowedMethodsMiddleware = this.router.allowedMethods();\n\n // Merged middleware: protocol check + routes + allowedMethods\n app.use(async (ctx: KoattyContext, next: any) => {\n if (ctx.protocol === 'graphql') {\n // Chain routes and allowedMethods in single middleware\n await routerMiddleware(ctx as any, async () => {\n await allowedMethodsMiddleware(ctx as any, next);\n });\n } else {\n // Skip for non-GraphQL protocols\n await next();\n }\n });\n\n Logger.Debug('GraphQL router middleware registered (optimized)');\n } catch (err) {\n Logger.Error(err);\n }\n }\n\n /**\n * Cleanup router resources (for graceful shutdown)\n * GraphQL router is relatively stateless, this method is for interface consistency\n */\n public cleanup(): void {\n Logger.Debug('GraphQL router cleanup completed');\n }\n\n}","/*\n * @Description:\n * @Usage:\n * @Author: richen\n * @Date: 2021-06-29 14:10:30\n * @LastEditTime: 2025-04-06 22:56:00\n */\nimport { UntypedHandleCall, ServerReadableStream, ServerWritableStream, ServerDuplexStream } from \"@grpc/grpc-js\";\nimport path from \"path\";\nimport { IOC } from \"koatty_container\";\nimport {\n IRpcServerCall,\n IRpcServerCallback,\n Koatty, \n KoattyContext,\n KoattyRouter,\n RouterImplementation\n} from \"koatty_core\";\nimport * as Helper from \"koatty_lib\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { ListServices, LoadProto } from \"koatty_proto\";\nimport { injectParamMetaData, injectRouter, ParamMetadata } from \"../utils/inject\";\nimport { parsePath } from \"../utils/path\";\nimport { RouterOptions } from \"./router\";\nimport { Handler } from \"../utils/handler\";\nimport { getProtocolConfig, validateProtocolConfig, StreamConfig } from \"./types\";\n\n/**\n * gRPC流类型枚举\n */\nexport enum GrpcStreamType {\n UNARY = 'unary',\n SERVER_STREAMING = 'server_streaming',\n CLIENT_STREAMING = 'client_streaming',\n BIDIRECTIONAL_STREAMING = 'bidirectional_streaming'\n}\n\n/**\n * GrpcRouter Options\n */\nexport interface GrpcRouterOptions extends RouterOptions {\n protoFile: string;\n streamConfig?: StreamConfig;\n}\n\n/**\n * 流状态管理\n */\ninterface StreamState {\n id: string;\n type: GrpcStreamType;\n startTime: number;\n messageCount: number;\n bufferSize: number;\n isActive: boolean;\n}\n\n/**\n * 流管理器\n */\nclass StreamManager {\n private streams: Map<string, StreamState>;\n private config: StreamConfig;\n\n constructor(config: StreamConfig = {}) {\n this.streams = new Map();\n this.config = {\n maxConcurrentStreams: config.maxConcurrentStreams || 100,\n streamTimeout: config.streamTimeout || 300000, // 5分钟\n backpressureThreshold: config.backpressureThreshold || 1000,\n ...config\n };\n }\n\n /**\n * 注册新流\n */\n registerStream(id: string, type: GrpcStreamType): StreamState {\n const state: StreamState = {\n id,\n type,\n startTime: Date.now(),\n messageCount: 0,\n bufferSize: 0,\n isActive: true\n };\n \n this.streams.set(id, state);\n this.cleanupExpiredStreams();\n \n return state;\n }\n\n /**\n * 移除流\n */\n removeStream(id: string): void {\n this.streams.delete(id);\n }\n\n /**\n * 获取流状态\n */\n getStreamState(id: string): StreamState | undefined {\n return this.streams.get(id);\n }\n\n /**\n * 更新流状态\n */\n updateStream(id: string, updates: Partial<StreamState>): void {\n const state = this.streams.get(id);\n if (state) {\n Object.assign(state, updates);\n }\n }\n\n /**\n * 检查是否达到背压阈值\n */\n isBackpressureTriggered(id: string): boolean {\n const state = this.streams.get(id);\n return state ? state.bufferSize > this.config.backpressureThreshold! : false;\n }\n\n /**\n * 清理过期流\n */\n private cleanupExpiredStreams(): void {\n const now = Date.now();\n for (const [id, state] of this.streams.entries()) {\n if (now - state.startTime > this.config.streamTimeout!) {\n Logger.Warn(`Stream ${id} expired, removing...`);\n this.streams.delete(id);\n }\n }\n }\n\n /**\n * 获取活跃流数量\n */\n getActiveStreamCount(): number {\n return Array.from(this.streams.values()).filter(s => s.isActive).length;\n }\n\n /**\n * Close all active streams\n */\n closeAllStreams(): void {\n const activeCount = this.getActiveStreamCount();\n if (activeCount > 0) {\n Logger.Info(`Closing ${activeCount} active gRPC streams...`);\n }\n\n for (const [id, state] of this.streams.entries()) {\n if (state.isActive) {\n state.isActive = false;\n Logger.Debug(`Closed stream: ${id}`);\n }\n }\n\n this.streams.clear();\n Logger.Debug('All gRPC streams closed');\n }\n}\n\n/**\n * CtlInterface\n *\n * @interface CtlInterface\n */\ninterface CtlInterface {\n [path: string]: {\n name: string;\n ctl: Function;\n method: string;\n params: ParamMetadata[];\n composedMiddleware?: Function;\n }\n}\n\nexport class GrpcRouter implements KoattyRouter {\n readonly protocol: string;\n options: GrpcRouterOptions;\n router: Map<string, RouterImplementation>;\n private streamManager: StreamManager;\n\n constructor(app: Koatty, options: RouterOptions = { protocol: \"grpc\", prefix: \"\" }) {\n const extConfig = getProtocolConfig('grpc', options.ext || {});\n \n // 配置验证\n const validation = validateProtocolConfig('grpc', options.ext || {});\n if (!validation.valid) {\n throw new Error(`gRPC router configuration error: ${validation.errors.join(', ')}`);\n }\n if (validation.warnings.length > 0) {\n validation.warnings.forEach((warning: string) => Logger.Warn(`[GrpcRouter] ${warning}`));\n }\n \n // Resolve protoFile path: if relative, resolve against app.rootPath\n let protoFilePath = extConfig.protoFile;\n if (protoFilePath && !path.isAbsolute(protoFilePath) && app.rootPath) {\n protoFilePath = path.resolve(app.rootPath, protoFilePath);\n }\n \n this.options = {\n ...options,\n protoFile: protoFilePath,\n streamConfig: extConfig.streamConfig || {}\n } as GrpcRouterOptions;\n \n this.protocol = options.protocol || \"grpc\";\n this.router = new Map();\n this.streamManager = new StreamManager(this.options.streamConfig);\n }\n\n /**\n * SetRouter\n * @param name \n * @param impl \n * @returns \n */\n SetRouter(name: string, impl?: RouterImplementation) {\n if (Helper.isEmpty(name)) return;\n this.router.set(name, {\n service: impl?.service,\n implementation: impl?.implementation\n });\n }\n\n /**\n * ListRouter\n *\n * @returns {*} {Map<string, ServiceImplementation>}\n * @memberof GrpcRouter\n */\n ListRouter(): Map<string, RouterImplementation> {\n return this.router;\n }\n\n /**\n * 检测gRPC流类型\n */\n private detectStreamType(call: any): GrpcStreamType {\n // 一元调用:call.request 存在(包含请求数据)\n // 流调用:call 本身就是流对象,数据通过事件接收\n if (call.request) {\n Logger.Debug(`[GRPC_ROUTER] Stream detection: UNARY (call.request exists)`);\n return GrpcStreamType.UNARY;\n }\n \n // 对于流调用,检查是否是真正的流对象(Stream 类型)\n const isActuallyReadableStream = call.readable === true;\n const isActuallyWritableStream = call.writable === true;\n \n Logger.Debug(`[GRPC_ROUTER] Stream detection: readable=${call.readable}, writable=${call.writable}`);\n \n if (isActuallyReadableStream && isActuallyWritableStream) {\n return GrpcStreamType.BIDIRECTIONAL_STREAMING;\n } else if (isActuallyReadableStream) {\n return GrpcStreamType.CLIENT_STREAMING;\n } else if (isActuallyWritableStream) {\n return GrpcStreamType.SERVER_STREAMING;\n } else {\n // 默认返回一元调用\n Logger.Warn(`[GRPC_ROUTER] Unable to determine stream type, defaulting to UNARY`);\n return GrpcStreamType.UNARY;\n }\n }\n\n /**\n * 处理一元调用 (Unary RPC)\n */\n private async handleUnaryCall(\n call: IRpcServerCall<any, any>, \n callback: IRpcServerCallback<any>,\n app: Koatty,\n ctlItem: any\n ): Promise<void> {\n try {\n Logger.Debug(`[GRPC_ROUTER] Handling unary call for ${ctlItem.name}.${ctlItem.method}`);\n \n // 创建 gRPC context (context 已经由 koatty_serve 在调用 handler 之前创建好了)\n // 这里的 call 和 callback 已经被包装在 context 中\n // 直接从 call 中获取 context,或者使用 app.createContext\n const ctx = app.createContext(call, callback, 'grpc');\n \n Logger.Debug(`[GRPC_ROUTER] Context created, getting controller instance`);\n const ctl = IOC.getInsByClass(ctlItem.ctl, [ctx]);\n \n Logger.Debug(`[GRPC_ROUTER] Calling Handler for ${ctlItem.method}`);\n const result = await Handler(app, ctx, ctl, ctlItem.method, ctlItem.params, undefined, ctlItem.composedMiddleware);\n \n // Handler 执行完成后,调用 gRPC callback 返回结果\n const response = result || ctx.body;\n Logger.Debug(`[GRPC_ROUTER] gRPC method ${ctlItem.name}.${ctlItem.method} completed, calling callback with response:`, response);\n callback(null, response);\n \n } catch (error) {\n Logger.Error(`[GRPC_ROUTER] Error executing gRPC method ${ctlItem.name}.${ctlItem.method}:`, error);\n callback(error as Error);\n }\n }\n\n /**\n * 处理服务器流 (Server Streaming RPC)\n */\n private async handleServerStreaming(\n call: ServerWritableStream<any, any>,\n app: Koatty,\n ctlItem: any\n ): Promise<void> {\n const streamId = `server_${Date.now()}_${Math.random()}`;\n this.streamManager.registerStream(streamId, GrpcStreamType.SERVER_STREAMING);\n \n try {\n Logger.Debug(`[GRPC_ROUTER] Handling server streaming call for ${ctlItem.name}.${ctlItem.method}`);\n \n // 设置流超时\n const timeout = setTimeout(() => {\n Logger.Warn(`[GRPC_ROUTER] Server stream ${streamId} timeout`);\n call.end();\n this.streamManager.removeStream(streamId);\n }, this.options.streamConfig?.streamTimeout || 300000);\n\n // 处理流结束\n call.on('cancelled', () => {\n Logger.Debug(`[GRPC_ROUTER] Server stream ${streamId} cancelled`);\n clearTimeout(timeout);\n this.streamManager.removeStream(streamId);\n });\n\n call.on('error', (error) => {\n Logger.Error(`[GRPC_ROUTER] Server stream ${streamId} error:`, error);\n clearTimeout(timeout);\n this.streamManager.removeStream(streamId);\n });\n\n // 直接创建 context,不再调用 app.callback\n const ctx = app.createContext(call, null, 'grpc');\n \n // 添加流写入方法到上下文\n ctx.writeStream = (data: any) => {\n if (this.streamManager.isBackpressureTriggered(streamId)) {\n Logger.Warn(`[GRPC_ROUTER] Backpressure triggered for stream ${streamId}`);\n return false;\n }\n \n call.write(data);\n const currentState = this.streamManager.getStreamState(streamId);\n if (currentState) {\n currentState.messageCount++;\n }\n return true;\n };\n \n ctx.endStream = () => {\n call.end();\n clearTimeout(timeout);\n this.streamManager.removeStream(streamId);\n };\n\n // 获取控制器实例并执行\n const ctl = IOC.getInsByClass(ctlItem.ctl, [ctx]);\n await Handler(app, ctx, ctl, ctlItem.method, ctlItem.params, undefined, ctlItem.composedMiddleware);\n \n } catch (error) {\n Logger.Error(`[GRPC_ROUTER] Error in server streaming: ${error}`);\n call.end();\n this.streamManager.removeStream(streamId);\n }\n }\n\n /**\n * 处理客户端流 (Client Streaming RPC)\n */\n private handleClientStreaming(\n call: ServerReadableStream<any, any>,\n callback: IRpcServerCallback<any>,\n app: Koatty,\n ctlItem: any\n ): void {\n const streamId = `client_${Date.now()}_${Math.random()}`;\n this.streamManager.registerStream(streamId, GrpcStreamType.CLIENT_STREAMING);\n const messages: any[] = [];\n \n try {\n Logger.Debug(`[GRPC_ROUTER] Handling client streaming call for ${ctlItem.name}.${ctlItem.method}`);\n \n // 设置流超时\n const timeout = setTimeout(() => {\n Logger.Warn(`[GRPC_ROUTER] Client stream ${streamId} timeout`);\n callback(new Error('Stream timeout'));\n this.streamManager.removeStream(streamId);\n }, this.options.streamConfig?.streamTimeout || 300000);\n\n // 处理数据接收\n call.on('data', (data: any) => {\n messages.push(data);\n const currentState = this.streamManager.getStreamState(streamId);\n if (currentState) {\n currentState.messageCount++;\n currentState.bufferSize += (Buffer.isBuffer(data) ? data.length : Buffer.byteLength(JSON.stringify(data)));\n }\n \n // 检查背压\n if (this.streamManager.isBackpressureTriggered(streamId)) {\n Logger.Warn(`[GRPC_ROUTER] Backpressure triggered for client stream ${streamId}`);\n call.pause();\n setTimeout(() => call.resume(), 100);\n }\n });\n\n // 处理流结束\n call.on('end', async () => {\n clearTimeout(timeout);\n Logger.Debug(`[GRPC_ROUTER] Client stream ${streamId} ended with ${messages.length} messages`);\n \n try {\n // 直接创建 context,不再调用 app.callback\n const ctx = app.createContext(call, callback, 'grpc');\n ctx.streamMessages = messages;\n \n // 获取控制器实例并执行\n const ctl = IOC.getInsByClass(ctlItem.ctl, [ctx]);\n const result = await Handler(app, ctx, ctl, ctlItem.method, ctlItem.params, undefined, ctlItem.composedMiddleware);\n \n // 调用 callback 返回结果\n const response = result || ctx.body;\n callback(null, response);\n \n this.streamManager.removeStream(streamId);\n } catch (error) {\n Logger.Error(`[GRPC_ROUTER] Error processing client stream: ${error}`);\n callback(error as Error);\n this.streamManager.removeStream(streamId);\n }\n });\n\n call.on('error', (error) => {\n Logger.Error(`[GRPC_ROUTER] Client stream ${streamId} error:`, error);\n clearTimeout(timeout);\n callback(error);\n this.streamManager.removeStream(streamId);\n });\n\n call.on('cancelled', () => {\n Logger.Debug(`[GRPC_ROUTER] Client stream ${streamId} cancelled`);\n clearTimeout(timeout);\n this.streamManager.removeStream(streamId);\n });\n \n } catch (error) {\n Logger.Error(`[GRPC_ROUTER] Error in client streaming: ${error}`);\n callback(error as Error);\n this.streamManager.removeStream(streamId);\n }\n }\n\n /**\n * 处理双向流 (Bidirectional Streaming RPC)\n */\n private handleBidirectionalStreaming(\n call: ServerDuplexStream<any, any>,\n app: Koatty,\n ctlItem: any\n ): void {\n const streamId = `bidi_${Date.now()}_${Math.random()}`;\n this.streamManager.registerStream(streamId, GrpcStreamType.BIDIRECTIONAL_STREAMING);\n \n try {\n Logger.Debug(`[GRPC_ROUTER] Handling bidirectional streaming call for ${ctlItem.name}.${ctlItem.method}`);\n \n // 设置流超时\n const timeout = setTimeout(() => {\n Logger.Warn(`[GRPC_ROUTER] Bidirectional stream ${streamId} timeout`);\n call.end();\n this.streamManager.removeStream(streamId);\n }, this.options.streamConfig?.streamTimeout || 300000);\n\n // 处理数据接收\n call.on('data', async (data: any) => {\n const currentState = this.streamManager.getStreamState(streamId);\n if (currentState) {\n currentState.messageCount++;\n currentState.bufferSize += (Buffer.isBuffer(data) ? data.length : Buffer.byteLength(JSON.stringify(data)));\n }\n \n // 检查背压\n if (this.streamManager.isBackpressureTriggered(streamId)) {\n Logger.Warn(`[GRPC_ROUTER] Backpressure triggered for bidirectional stream ${streamId}`);\n call.pause();\n setTimeout(() => call.resume(), 100);\n }\n\n try {\n // 直接创建 context,不再调用 app.callback\n const ctx = app.createContext(call, null, 'grpc');\n ctx.streamMessage = data;\n \n // 添加流写入方法到上下文\n ctx.writeStream = (responseData: any) => {\n if (this.streamManager.isBackpressureTriggered(streamId)) {\n Logger.Warn(`[GRPC_ROUTER] Write backpressure triggered for stream ${streamId}`);\n return false;\n }\n call.write(responseData);\n return true;\n };\n \n ctx.endStream = () => {\n call.end();\n clearTimeout(timeout);\n this.streamManager.removeStream(streamId);\n };\n\n // 获取控制器实例并执行\n const ctl = IOC.getInsByClass(ctlItem.ctl, [ctx]);\n await Handler(app, ctx, ctl, ctlItem.method, ctlItem.params, undefined, ctlItem.composedMiddleware);\n } catch (error) {\n Logger.Error(`[GRPC_ROUTER] Error processing bidirectional stream message: ${error}`);\n }\n });\n\n // 处理流结束\n call.on('end', () => {\n Logger.Debug(`[GRPC_ROUTER] Bidirectional stream ${streamId} ended`);\n clearTimeout(timeout);\n call.end();\n this.streamManager.removeStream(streamId);\n });\n\n call.on('error', (error) => {\n Logger.Error(`[GRPC_ROUTER] Bidirectional stream ${streamId} error:`, error);\n clearTimeout(timeout);\n call.end();\n this.streamManager.removeStream(streamId);\n });\n\n call.on('cancelled', () => {\n Logger.Debug(`[GRPC_ROUTER] Bidirectional stream ${streamId} cancelled`);\n clearTimeout(timeout);\n this.streamManager.removeStream(streamId);\n });\n \n } catch (error) {\n Logger.Error(`[GRPC_ROUTER] Error in bidirectional streaming: ${error}`);\n call.end();\n this.streamManager.removeStream(streamId);\n }\n }\n\n /**\n * 统一的流处理入口\n */\n private handleStreamCall(\n call: IRpcServerCall<any, any>, \n callback: IRpcServerCallback<any>,\n app: Koatty,\n ctlItem: any\n ): void {\n Logger.Debug(`[GRPC_ROUTER] handleStreamCall called for ${ctlItem.name}.${ctlItem.method}`);\n \n // 检测流类型\n const streamType = this.detectStreamType(call);\n Logger.Debug(`[GRPC_ROUTER] Detected stream type: ${streamType}`);\n \n // 检查并发流限制(只对真正的流调用进行限制)\n if (streamType !== GrpcStreamType.UNARY && \n this.streamManager.getActiveStreamCount() >= (this.options.streamConfig?.maxConcurrentStreams || 100)) {\n Logger.Warn('[GRPC_ROUTER] Maximum concurrent streams reached');\n if (callback) {\n callback(new Error('Server busy'));\n } else {\n (call as any).end();\n }\n return;\n }\n\n Logger.Debug(`[GRPC_ROUTER] Processing stream type: ${streamType} for ${ctlItem.name}.${ctlItem.method}`);\n\n switch (streamType) {\n case GrpcStreamType.UNARY:\n Logger.Debug(`[GRPC_ROUTER] Calling handleUnaryCall for ${ctlItem.name}.${ctlItem.method}`);\n this.handleUnaryCall(call, callback, app, ctlItem);\n break;\n case GrpcStreamType.SERVER_STREAMING:\n this.handleServerStreaming(call as ServerWritableStream<any, any>, app, ctlItem);\n break;\n case GrpcStreamType.CLIENT_STREAMING:\n this.handleClientStreaming(call as ServerReadableStream<any, any>, callback, app, ctlItem);\n break;\n case GrpcStreamType.BIDIRECTIONAL_STREAMING:\n this.handleBidirectionalStreaming(call as ServerDuplexStream<any, any>, app, ctlItem);\n break;\n default:\n Logger.Error(`Unknown stream type: ${streamType}`);\n (call as any).end();\n }\n }\n\n /**\n * LoadRouter\n *\n * @memberof Router\n */\n async LoadRouter(app: Koatty, list: any[]) {\n try {\n const pdef = LoadProto(this.options.protoFile);\n \n const services = ListServices(pdef);\n \n const ctls: CtlInterface = {};\n\n for (const n of list) {\n Logger.Debug(`[GRPC_ROUTER] Processing controller: ${n}`);\n const ctlClass = IOC.getClass(n, \"CONTROLLER\");\n const ctlRouters = await injectRouter(app, ctlClass, this.options.protocol);\n Logger.Debug(`[GRPC_ROUTER] Controller ${n} routers:`, ctlRouters ? Object.keys(ctlRouters).length : 0);\n if (!ctlRouters) continue;\n\n // 传递 protoFile 给 payload 解析器,用于可能的自动解码\n const ctlParams = injectParamMetaData(app, ctlClass, {\n ...this.options.payload,\n protoFile: this.options.protoFile\n });\n for (const router of Object.values(ctlRouters)) {\n ctls[router.path] = {\n name: n,\n ctl: ctlClass,\n method: router.method,\n params: ctlParams[router.method],\n composedMiddleware: router.composedMiddleware\n };\n Logger.Debug(`[GRPC_ROUTER] Registered controller route: \"${router.path}\" => ${n}.${router.method}`);\n }\n }\n\n\n for (const si of services) { \n if (!si.service || si.handlers.length === 0) {\n Logger.Warn(`[GRPC_ROUTER] Ignore ${si.name} which is an empty service`);\n continue;\n }\n\n Logger.Debug(`[GRPC_ROUTER] Processing gRPC service: ${si.name} with ${si.handlers.length} handlers`);\n\n // Register placeholder implementations for gRPC service\n // These are just shells - the actual routing is handled by middleware\n const impl: Record<string, UntypedHandleCall> = {};\n for (const handler of si.handlers) {\n const path = parsePath(handler.path);\n Logger.Debug(`[GRPC_ROUTER] Looking for handler: \"${handler.path}\" (parsed: \"${path}\") => handler name: \"${handler.name}\"`);\n const ctlItem = ctls[path];\n if (!ctlItem) {\n Logger.Warn(`[GRPC_ROUTER] ❌ No matching controller route found for gRPC handler \"${handler.path}\" (parsed: \"${path}\")`);\n continue;\n }\n\n Logger.Debug(`[GRPC_ROUTER] ✅ Register request mapping: [\"${path}\" => ${ctlItem.name}.${ctlItem.method}]`);\n \n // Register a placeholder handler\n // This handler will never be called because koatty_serve will call app.callback instead\n // But we still need to register it so grpc server knows this method exists\n impl[handler.name] = (call: IRpcServerCall<any, any>, callback: IRpcServerCallback<any>) => {\n const methodPath = `${si.name}/${handler.name}`;\n Logger.Warn(`[GRPC_ROUTER] Placeholder handler invoked for ${methodPath}. No controller matched this gRPC method.`);\n callback({\n code: 12, // UNIMPLEMENTED\n message: `Method ${methodPath} not implemented. Ensure a controller with @GrpcMethod('${handler.name}') is registered.`\n } as any);\n };\n }\n \n // only register service when impl is not empty\n if (Object.keys(impl).length > 0) {\n this.SetRouter(si.name, { service: si.service, implementation: impl });\n \n // Handle both single server and multi-protocol server\n const server = app.server as any;\n\n let grpcServer = null;\n \n // Check if server is an array (multi-protocol mode)\n if (Helper.isArray(server)) {\n // Multi-protocol server: find gRPC server instance in array\n for (const s of server) {\n const protocol = s.options?.protocol || s.protocol;\n if (protocol === 'grpc' && Helper.isFunction(s.RegisterService)) {\n grpcServer = s;\n break;\n }\n }\n } else if (Helper.isFunction(server.getAllServers)) {\n // Alternative multi-protocol structure with getAllServers method\n const allServers = server.getAllServers();\n if (allServers && allServers.size > 0) {\n allServers.forEach((s: any) => {\n const protocol = Helper.isString(s.options?.protocol) ? s.options.protocol : \n (Helper.isArray(s.options?.protocol) ? s.options.protocol[0] : '');\n if (protocol === 'grpc' && Helper.isFunction(s.RegisterService)) {\n grpcServer = s;\n }\n });\n }\n } else if (Helper.isFunction(server.RegisterService)) {\n // Single protocol gRPC server\n grpcServer = server;\n }\n \n // Register service to gRPC server\n if (grpcServer) {\n grpcServer.RegisterService({ service: si.service, implementation: impl });\n } else {\n Logger.Error(`[GRPC_ROUTER] ❌ Failed to find gRPC server instance for service registration: ${si.name}`);\n }\n } else {\n Logger.Warn(`[GRPC_ROUTER] Skip registering service ${si.name}: no matching controller handlers found`);\n }\n }\n \n // Register gRPC router middleware to app\n // Similar to HTTP router, this middleware handles routing for gRPC protocol\n \n app.use(async (ctx: KoattyContext, next: any) => {\n // Only handle gRPC protocol\n if (ctx.protocol !== 'grpc') {\n await next();\n return;\n }\n \n Logger.Debug('[GRPC_ROUTER] gRPC router middleware executing', {\n protocol: ctx.protocol,\n rpc: ctx.rpc\n });\n \n // Get method path from ctx.rpc (call object)\n // The call object should have a path property like \"/Hello/SayHello\"\n const methodPath = (ctx.rpc as any)?.path || (ctx.rpc as any)?.call?.path;\n \n if (!methodPath) {\n Logger.Error('[GRPC_ROUTER] No method path found in ctx.rpc');\n throw new Error('gRPC method path not found');\n }\n \n Logger.Debug(`[GRPC_ROUTER] Looking up controller for method: ${methodPath}`);\n \n // Find matching controller\n const ctlItem = ctls[methodPath];\n if (!ctlItem) {\n Logger.Error(`[GRPC_ROUTER] No controller found for method: ${methodPath}`);\n throw new Error(`gRPC method not implemented: ${methodPath}`);\n }\n \n Logger.Debug(`[GRPC_ROUTER] Found controller: ${ctlItem.name}.${ctlItem.method}`);\n \n // Execute controller\n const ctl = IOC.getInsByClass(ctlItem.ctl, [ctx]);\n const result = await Handler(app, ctx, ctl, ctlItem.method, ctlItem.params, undefined, ctlItem.composedMiddleware);\n \n // Set result to ctx.body\n ctx.body = result;\n \n Logger.Debug('[GRPC_ROUTER] Controller execution completed', {\n method: methodPath,\n hasResult: !!result\n });\n });\n \n \n // Protocol Isolation Note:\n // gRPC router now works through Koa middleware chain, just like HTTP router\n // The gRPC server calls app.callback(\"grpc\") which executes this middleware\n Logger.Debug('gRPC router middleware registered (integrated with middleware chain)');\n } catch (err) {\n Logger.Error(err);\n }\n }\n\n /**\n * Cleanup all gRPC resources (for graceful shutdown)\n */\n public cleanup(): void {\n Logger.Info('Starting gRPC router cleanup...');\n\n // Close all active streams\n this.streamManager.closeAllStreams();\n\n Logger.Info('gRPC router cleanup completed');\n }\n}\n","/*\n * @Description:\n * @Usage:\n * @Author: richen\n * @Date: 2021-06-28 19:02:06\n * @LastEditTime: 2025-03-15 16:35:13\n */\nimport KoaRouter from \"@koa/router\";\nimport { IOC } from \"koatty_container\";\nimport {\n Koatty, KoattyContext, KoattyRouter,\n RouterImplementation\n} from \"koatty_core\";\nimport * as Helper from \"koatty_lib\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { RequestMethod } from \"../params/mapping\";\nimport { injectParamMetaData, injectRouter } from \"../utils/inject\";\nimport { parsePath } from \"../utils/path\";\nimport { RouterOptions } from \"./router\";\nimport { Handler } from \"../utils/handler\";\n\n\n/**\n * HttpRouter class\n */\nexport class HttpRouter implements KoattyRouter {\n readonly protocol: string;\n options: RouterOptions;\n router: KoaRouter;\n private routerMap: Map<string, RouterImplementation>;\n\n constructor(app: Koatty, options: RouterOptions = { protocol: \"http\", prefix: \"\" }) {\n this.options = { ...options };\n this.protocol = options.protocol || \"http\";\n \n // initialize - only pass base router options to KoaRouter\n this.router = new KoaRouter({\n prefix: options.prefix,\n methods: options.methods,\n sensitive: options.sensitive,\n strict: options.strict,\n });\n this.routerMap = new Map();\n }\n\n /**\n * Set router\n * @param name \n * @param impl \n * @returns \n */\n SetRouter(name: string, impl?: RouterImplementation) {\n if (!impl || Helper.isEmpty(impl.path)) return;\n\n const method = (impl.method || \"\").toLowerCase();\n const routeHandler = <any>impl.implementation;\n if ([\"get\", \"post\", \"put\", \"delete\", \"patch\", \"options\", \"head\"].includes(method)) {\n (<any>this.router)[method](impl.path, routeHandler);\n } else {\n this.router.all(impl.path, routeHandler);\n }\n this.routerMap.set(name, impl);\n }\n\n /**\n * ListRouter\n *\n * @returns {*} {Map<string, RouterImplementation> }\n */\n ListRouter(): Map<string, RouterImplementation> {\n return this.routerMap;\n }\n\n /**\n * LoadRouter\n *\n * @param {any[]} list\n */\n async LoadRouter(app: Koatty, list: any[]) {\n try {\n for (const n of list) {\n const ctlClass = IOC.getClass(n, \"CONTROLLER\");\n // inject router\n const ctlRouters = await injectRouter(app, ctlClass, this.options.protocol);\n if (!ctlRouters) {\n continue;\n }\n // inject param\n const ctlParams = injectParamMetaData(app, ctlClass, this.options.payload);\n // tslint:disable-next-line: forin\n for (const router of Object.values(ctlRouters)) {\n const method = router.method;\n const path = parsePath(router.path);\n const requestMethod = <RequestMethod>router.requestMethod;\n const params = ctlParams[method];\n\n Logger.Debug(`Register request mapping: [\"${path}\" => ${n}.${method}]`);\n this.SetRouter(path, {\n path,\n method: requestMethod,\n implementation: (ctx: KoattyContext): Promise<any> => {\n const ctl = IOC.getInsByClass(ctlClass, [ctx]);\n return Handler(app, ctx, ctl, method, params, undefined, router.composedMiddleware);\n },\n });\n }\n }\n // exp: in middleware\n // app.Router.SetRouter('/xxx', (ctx: Koa.KoattyContext): any => {...}, 'GET')\n \n // PERFORMANCE OPTIMIZATION: Merge router middleware to reduce middleware stack\n // In multi-protocol environment, merging routes() and allowedMethods() into \n // a single middleware reduces function calls and improves performance by ~40%\n const httpProtocols = new Set(['http', 'https', 'http2', 'http3']);\n const routerMiddleware = this.router.routes();\n const allowedMethodsMiddleware = this.router.allowedMethods();\n \n // Merged middleware: protocol check + routes + allowedMethods\n app.use(async (ctx: KoattyContext, next: any) => {\n if (httpProtocols.has(ctx.protocol)) {\n // Chain routes and allowedMethods in single middleware\n await routerMiddleware(ctx as any, async () => {\n await allowedMethodsMiddleware(ctx as any, next);\n });\n } else {\n // Skip for non-HTTP protocols (gRPC, WebSocket, etc.)\n await next();\n }\n });\n \n Logger.Debug('HTTP router middleware registered (optimized)');\n } catch (err) {\n Logger.Error(err);\n }\n }\n\n /**\n * Cleanup router resources (for graceful shutdown)\n * HTTP router is stateless, this method is for interface consistency\n */\n public cleanup(): void {\n Logger.Debug('HTTP router cleanup completed (stateless)');\n }\n}\n","/*\n * @Description:\n * @Usage:\n * @Author: richen\n * @Date: 2021-06-29 14:16:44\n * @LastEditTime: 2025-03-15 16:35:45\n */\n\nimport KoaRouter from \"@koa/router\";\nimport { IOC } from \"koatty_container\";\nimport {\n Koatty, KoattyContext, KoattyRouter,\n RouterImplementation\n} from \"koatty_core\";\nimport { Helper } from \"koatty_lib\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { RequestMethod } from \"../params/mapping\";\nimport { injectParamMetaData, injectRouter } from \"../utils/inject\";\nimport { Handler } from \"../utils/handler\";\nimport { parsePath } from \"../utils/path\";\nimport { RouterOptions } from \"./router\";\nimport { getProtocolConfig, validateProtocolConfig } from \"./types\";\n\n/**\n * WebsocketRouter Options\n *\n * @export\n * @interface WebsocketRouterOptions\n */\nexport interface WebsocketRouterOptions extends RouterOptions {\n prefix: string;\n maxFrameSize?: number; // 最大分帧大小(字节),默认1MB\n frameTimeout?: number; // 分帧处理超时(ms),默认30秒\n heartbeatInterval?: number; // 心跳检测间隔(ms),默认15秒\n heartbeatTimeout?: number; // 心跳超时时间(ms),默认30秒\n maxConnections?: number; // 最大连接数,默认1000\n maxBufferSize?: number; // 最大缓冲区大小(字节),默认10MB\n cleanupInterval?: number; // 清理间隔(ms),默认5分钟\n}\n\n/**\n * Connection info for memory management\n */\ninterface ConnectionInfo {\n socketId: string;\n buffers: Buffer[];\n lastActivity: number;\n totalBufferSize: number;\n frameTimeout?: NodeJS.Timeout;\n heartbeatTimeout?: NodeJS.Timeout;\n}\n\nexport class WebsocketRouter implements KoattyRouter {\n readonly protocol: string;\n options: WebsocketRouterOptions;\n router: KoaRouter;\n private routerMap: Map<string, RouterImplementation>;\n\n // 优化的连接管理\n private connections: Map<string, ConnectionInfo>;\n private connectionCount: number = 0;\n private totalBufferSize: number = 0;\n private cleanupTimer?: NodeJS.Timeout;\n\n constructor(app: Koatty, options: RouterOptions = { protocol: \"ws\", prefix: \"\" }) {\n const extConfig = getProtocolConfig('ws', options.ext || {});\n \n // 配置验证\n const validation = validateProtocolConfig('ws', options.ext || {});\n if (!validation.valid) {\n throw new Error(`WebSocket router configuration error: ${validation.errors.join(', ')}`);\n }\n if (validation.warnings.length > 0) {\n validation.warnings.forEach((warning: string) => Logger.Warn(`[WebSocketRouter] ${warning}`));\n }\n \n this.protocol = options.protocol || 'ws';\n this.options = {\n ...options,\n prefix: options.prefix || '',\n maxFrameSize: extConfig.maxFrameSize || 1024 * 1024, // 1MB\n frameTimeout: extConfig.frameTimeout || 30000, // 30秒\n heartbeatInterval: extConfig.heartbeatInterval || 15000, // 15秒\n heartbeatTimeout: extConfig.heartbeatTimeout || 30000, // 30秒\n maxConnections: extConfig.maxConnections || 1000,\n maxBufferSize: extConfig.maxBufferSize || 10 * 1024 * 1024, // 10MB\n cleanupInterval: extConfig.cleanupInterval || 5 * 60 * 1000 // 5分钟\n }\n \n // initialize - only pass base router options to KoaRouter\n this.router = new KoaRouter({\n prefix: options.prefix,\n methods: options.methods,\n sensitive: options.sensitive,\n strict: options.strict,\n });\n this.routerMap = new Map();\n this.connections = new Map();\n \n // 启动定期清理 \n this.startCleanupTimer();\n }\n\n /**\n * Start cleanup timer for memory management\n */\n private startCleanupTimer(): void {\n this.cleanupTimer = setInterval(() => {\n this.cleanupStaleConnections();\n }, this.options.cleanupInterval);\n }\n\n /**\n * Cleanup stale connections and free memory\n */\n private cleanupStaleConnections(): void {\n const now = Date.now();\n const staleThreshold = this.options.frameTimeout! * 2; // 2倍超时时间\n let cleanedCount = 0;\n let freedMemory = 0;\n\n for (const [socketId, connection] of this.connections.entries()) {\n if (now - connection.lastActivity > staleThreshold) {\n freedMemory += connection.totalBufferSize;\n this.cleanupConnection(socketId);\n cleanedCount++;\n }\n }\n\n if (cleanedCount > 0) {\n Logger.Debug(`Cleaned up ${cleanedCount} stale connections, freed ${freedMemory} bytes`);\n }\n\n // 记录内存使用情况\n Logger.Debug(`Active connections: ${this.connectionCount}, Total buffer size: ${this.totalBufferSize} bytes`);\n }\n\n /**\n * Cleanup connection and free resources\n */\n private cleanupConnection(socketId: string): void {\n const connection = this.connections.get(socketId);\n if (!connection) {\n return;\n }\n\n // 清理定时器\n if (connection.frameTimeout) {\n clearTimeout(connection.frameTimeout);\n }\n if (connection.heartbeatTimeout) {\n clearTimeout(connection.heartbeatTimeout);\n }\n\n // 更新统计\n this.totalBufferSize -= connection.totalBufferSize;\n this.connectionCount--;\n\n // 删除连接\n this.connections.delete(socketId);\n \n Logger.Debug(`Cleaned up connection: ${socketId}`);\n }\n\n /**\n * Check memory limits and enforce them\n */\n private enforceMemoryLimits(): boolean {\n // 检查连接数限制\n if (this.connectionCount >= this.options.maxConnections!) {\n Logger.Warn(`Max connections limit reached: ${this.options.maxConnections}`);\n return false;\n }\n\n // 检查总缓冲区大小限制\n if (this.totalBufferSize >= this.options.maxBufferSize!) {\n Logger.Warn(`Max buffer size limit reached: ${this.options.maxBufferSize} bytes`);\n // 清理最旧的连接\n this.cleanupOldestConnections(5); // 清理5个最旧的连接\n return this.totalBufferSize < this.options.maxBufferSize!;\n }\n\n return true;\n }\n\n /**\n * Cleanup oldest connections to free memory\n */\n private cleanupOldestConnections(count: number): void {\n const sortedConnections = Array.from(this.connections.entries())\n .sort(([, a], [, b]) => a.lastActivity - b.lastActivity)\n .slice(0, count);\n\n for (const [socketId] of sortedConnections) {\n this.cleanupConnection(socketId);\n }\n\n Logger.Debug(`Cleaned up ${sortedConnections.length} oldest connections`);\n }\n\n /**\n * Set router\n * @param name \n * @param impl \n * @returns \n */\n SetRouter(name: string, impl?: RouterImplementation) {\n if (!impl || Helper.isEmpty(impl.path)) return;\n\n const routeHandler = <any>impl.implementation;\n this.router.get(impl.path, routeHandler);\n this.routerMap.set(name, impl);\n }\n\n /**\n * ListRouter\n *\n * @returns {*} {Map<string, RouterImplementation> }\n */\n ListRouter(): Map<string, RouterImplementation> {\n return this.routerMap;\n }\n\n /**\n * LoadRouter\n *\n * @param {any[]} list\n */\n async LoadRouter(app: Koatty, list: any[]) {\n try {\n for (const n of list) {\n const ctlClass = IOC.getClass(n, \"CONTROLLER\");\n // inject router\n const ctlRouters = await injectRouter(app, ctlClass, this.options.protocol);\n if (!ctlRouters) {\n continue;\n }\n // inject param\n const ctlParams = injectParamMetaData(app, ctlClass, this.options.payload);\n\n for (const router of Object.values(ctlRouters)) {\n const method = router.method;\n const path = parsePath(router.path);\n const requestMethod = <RequestMethod>router.requestMethod;\n const params = ctlParams[method];\n // if (requestMethod === RequestMethod.GET || requestMethod === RequestMethod.ALL) {\n Logger.Debug(`Register request mapping: [${requestMethod}] : [\"${path}\" => ${n}.${method}]`);\n this.SetRouter(path, {\n path,\n method: requestMethod,\n implementation: (ctx: KoattyContext): Promise<any> => {\n const ctl = IOC.getInsByClass(ctlClass, [ctx]);\n return this.websocketHandler(app, ctx, ctl, method, params, undefined, router.composedMiddleware);\n },\n });\n // }\n }\n }\n // exp: in middleware\n // app.Router.SetRouter('/xxx', {path, method, implementation: (ctx: KoattyContext): Promise<any> => {\n // ...\n // })\n \n // PERFORMANCE OPTIMIZATION: Merge router middleware to reduce middleware stack\n // In multi-protocol environment, merging routes() and allowedMethods() into \n // a single middleware reduces function calls and improves performance by ~40%\n const wsProtocols = new Set(['ws', 'wss']);\n const routerMiddleware = this.router.routes();\n const allowedMethodsMiddleware = this.router.allowedMethods();\n \n // Merged middleware: protocol check + routes + allowedMethods\n app.use(async (ctx: KoattyContext, next: any) => {\n if (wsProtocols.has(ctx.protocol)) {\n // Chain routes and allowedMethods in single middleware\n await routerMiddleware(ctx as any, async () => {\n await allowedMethodsMiddleware(ctx as any, next);\n });\n } else {\n // Skip for non-WebSocket protocols\n await next();\n }\n });\n \n Logger.Debug('WebSocket router middleware registered (optimized)');\n } catch (err) {\n throw err; // Re-throw to propagate error to upper layer\n }\n }\n\n private websocketHandler(app: Koatty, ctx: KoattyContext, ctl: Function, method: string, params?: any, ctlParamsValue?: any, composedMiddleware?: Function): Promise<any> {\n return new Promise((resolve, reject) => {\n const socketId = ctx.socketId || ctx.requestId;\n \n // 检查内存限制\n if (!this.enforceMemoryLimits()) {\n reject(new Error('Memory limits exceeded'));\n return;\n }\n\n // 初始化连接信息\n const connection: ConnectionInfo = {\n socketId,\n buffers: [],\n lastActivity: Date.now(),\n totalBufferSize: 0\n };\n\n this.connections.set(socketId, connection);\n this.connectionCount++;\n\n // 设置分片处理超时\n const resetFrameTimeout = () => {\n if (connection.frameTimeout) {\n clearTimeout(connection.frameTimeout);\n }\n connection.frameTimeout = setTimeout(() => {\n Logger.Warn(`Frame timeout for connection: ${socketId}`);\n this.cleanupConnection(socketId);\n reject(new Error('Frame timeout'));\n }, this.options.frameTimeout);\n };\n\n // 设置基于ping/pong的心跳检测\n let isAlive = true; // 连接活跃状态\n\n // 收到pong响应时标记为活跃\n const onPong = () => {\n isAlive = true;\n connection.lastActivity = Date.now();\n };\n\n // 检查连接活跃状态\n const checkAlive = () => {\n if (!isAlive) {\n // 连接超时,终止连接\n Logger.Debug(`Connection timeout: ${socketId}`);\n this.cleanupConnection(socketId);\n ctx.websocket.terminate();\n reject(new Error('Connection timeout'));\n return;\n }\n // 发送ping并重置状态\n isAlive = false;\n try {\n ctx.websocket.ping();\n } catch (error) {\n Logger.Error(`Error sending ping to ${socketId}:`, error);\n this.cleanupConnection(socketId);\n reject(error);\n return;\n }\n \n connection.heartbeatTimeout = setTimeout(checkAlive, this.options.heartbeatInterval);\n };\n\n // 初始化心跳检测\n resetFrameTimeout();\n ctx.websocket.on('pong', onPong);\n // 启动首次心跳检测\n connection.heartbeatTimeout = setTimeout(checkAlive, this.options.heartbeatInterval);\n\n // 连接关闭时清理所有资源\n ctx.websocket.on('close', () => {\n Logger.Debug(`Connection closed: ${socketId}`);\n this.cleanupConnection(socketId);\n });\n\n // 连接错误时清理资源\n ctx.websocket.on('error', (error: Error) => {\n Logger.Error(`WebSocket error for ${socketId}:`, error);\n this.cleanupConnection(socketId);\n reject(error);\n });\n\n ctx.websocket.on('message', (data: Buffer | string) => {\n try {\n // 更新活跃时间\n connection.lastActivity = Date.now();\n isAlive = true;\n\n const chunkSize = this.options.maxFrameSize!;\n\n // 处理不同类型的数据\n let bufferData: Buffer;\n if (typeof data === 'string') {\n bufferData = Buffer.from(data, 'utf8');\n } else {\n bufferData = data;\n }\n\n // 检查单个消息大小限制\n if (bufferData.length > this.options.maxBufferSize!) {\n Logger.Warn(`Message too large: ${bufferData.length} bytes from ${socketId}`);\n reject(new Error('Message too large'));\n return;\n }\n\n // 检查连接缓冲区大小限制\n const newBufferSize = connection.totalBufferSize + bufferData.length;\n if (newBufferSize > this.options.maxFrameSize! * 10) { // 最多10个分片\n Logger.Warn(`Connection buffer overflow: ${newBufferSize} bytes for ${socketId}`);\n this.cleanupConnection(socketId);\n reject(new Error('Connection buffer overflow'));\n return;\n }\n\n // 处理分块\n if (bufferData.length > chunkSize) {\n for (let i = 0; i < bufferData.length; i += chunkSize) {\n const chunk = bufferData.slice(i, Math.min(i + chunkSize, bufferData.length));\n connection.buffers.push(chunk);\n connection.totalBufferSize += chunk.length;\n this.totalBufferSize += chunk.length;\n }\n } else {\n connection.buffers.push(bufferData);\n connection.totalBufferSize += bufferData.length;\n this.totalBufferSize += bufferData.length;\n }\n\n // 重置超时\n resetFrameTimeout();\n\n // 如果是最后一块,处理完整数据\n if (bufferData.length <= chunkSize || bufferData.length % chunkSize !== 0) {\n try {\n const fullMessage = Buffer.concat(connection.buffers).toString('utf8');\n ctx.message = fullMessage;\n \n // 清理缓冲区\n this.totalBufferSize -= connection.totalBufferSize;\n connection.buffers = [];\n connection.totalBufferSize = 0;\n \n const result = Handler(app, ctx, ctl, method, params, ctlParamsValue, composedMiddleware);\n resolve(result);\n } catch (error) {\n Logger.Error(`Error processing message for ${socketId}:`, error);\n this.cleanupConnection(socketId);\n reject(error);\n }\n }\n } catch (error) {\n Logger.Error(`Error handling message for ${socketId}:`, error);\n this.cleanupConnection(socketId);\n reject(error);\n }\n });\n });\n }\n\n\n\n /**\n * Force cleanup all connections (for shutdown)\n */\n public cleanup(): void {\n // 清理定时器\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = undefined;\n }\n\n // 清理所有连接\n for (const socketId of this.connections.keys()) {\n this.cleanupConnection(socketId);\n }\n\n Logger.Debug('WebSocket router cleanup completed');\n }\n}\n","/*\n * @Description: Router Factory Pattern Implementation\n * @Usage: Factory for creating different protocol routers\n * @Author: richen\n * @Date: 2025-01-20 10:00:00\n * @LastEditTime: 2025-01-20 10:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { KoattyApplication, KoattyRouter } from \"koatty_core\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { GraphQLRouter } from \"./graphql\";\nimport { GrpcRouter } from \"./grpc\";\nimport { HttpRouter } from \"./http\";\nimport { RouterOptions } from \"./router\";\nimport { WebsocketRouter } from \"./ws\";\n\n/**\n * Router factory interface\n */\nexport interface IRouterFactory {\n create(protocol: string, app: KoattyApplication, options: RouterOptions): KoattyRouter;\n register(protocol: string, routerClass: RouterConstructor): void;\n getSupportedProtocols(): string[];\n}\n\n/**\n * Router constructor type\n */\nexport type RouterConstructor = new (app: KoattyApplication, options?: RouterOptions) => KoattyRouter;\n\n/**\n * Router factory implementation\n */\nexport class RouterFactory implements IRouterFactory {\n private static instance: RouterFactory;\n private routerRegistry = new Map<string, RouterConstructor>();\n private activeRouters: KoattyRouter[] = [];\n private isShuttingDown: boolean = false;\n private hasShutdown: boolean = false;\n\n private constructor() {\n this.initializeDefaultRouters();\n }\n\n /**\n * Get singleton instance\n */\n public static getInstance(): RouterFactory {\n if (!RouterFactory.instance) {\n RouterFactory.instance = new RouterFactory();\n }\n return RouterFactory.instance;\n }\n\n /**\n * Initialize default routers\n */\n private initializeDefaultRouters(): void {\n this.routerRegistry.set('http', HttpRouter);\n this.routerRegistry.set('https', HttpRouter);\n this.routerRegistry.set('http2', HttpRouter);\n this.routerRegistry.set('http3', HttpRouter);\n this.routerRegistry.set('ws', WebsocketRouter);\n this.routerRegistry.set('wss', WebsocketRouter);\n this.routerRegistry.set('grpc', GrpcRouter);\n this.routerRegistry.set('graphql', GraphQLRouter);\n }\n\n /**\n * Create router instance\n */\n public create(protocol: string, app: KoattyApplication, options: RouterOptions): KoattyRouter {\n // Allow re-initialization after shutdown (for hot restart scenarios)\n if (this.hasShutdown) {\n Logger.Debug('RouterFactory: Resetting shutdown state for new router creation');\n this.hasShutdown = false;\n }\n \n const normalizedProtocol = protocol.toLowerCase();\n const RouterClass = this.routerRegistry.get(normalizedProtocol);\n \n if (!RouterClass) {\n const supportedProtocols = Array.from(this.routerRegistry.keys()).join(', ');\n throw new Error(\n `Unsupported protocol: ${protocol}. Supported protocols: ${supportedProtocols}`\n );\n }\n\n try {\n const router = new RouterClass(app, options);\n this.activeRouters.push(router); // Track router instance\n Logger.Debug(`Created ${protocol.toUpperCase()} router successfully`);\n return router;\n } catch (error) {\n Logger.Error(`Failed to create ${protocol.toUpperCase()} router:`, error);\n throw error;\n }\n }\n\n /**\n * Register custom router\n */\n public register(protocol: string, routerClass: RouterConstructor): void {\n if (!protocol || typeof protocol !== 'string') {\n throw new Error('Protocol must be a non-empty string');\n }\n\n if (!routerClass || typeof routerClass !== 'function') {\n throw new Error('Router class must be a constructor function');\n }\n\n const normalizedProtocol = protocol.toLowerCase();\n \n if (this.routerRegistry.has(normalizedProtocol)) {\n Logger.Warn(`Overriding existing router for protocol: ${protocol}`);\n }\n\n this.routerRegistry.set(normalizedProtocol, routerClass);\n Logger.Debug(`Registered custom router for protocol: ${protocol}`);\n }\n\n /**\n * Unregister router\n */\n public unregister(protocol: string): boolean {\n const normalizedProtocol = protocol.toLowerCase();\n const result = this.routerRegistry.delete(normalizedProtocol);\n \n if (result) {\n Logger.Debug(`Unregistered router for protocol: ${protocol}`);\n } else {\n Logger.Warn(`No router found for protocol: ${protocol}`);\n }\n \n return result;\n }\n\n /**\n * Get supported protocols\n */\n public getSupportedProtocols(): string[] {\n return Array.from(this.routerRegistry.keys());\n }\n\n /**\n * Check if protocol is supported\n */\n public isSupported(protocol: string): boolean {\n return this.routerRegistry.has(protocol.toLowerCase());\n }\n\n /**\n * Get router class for protocol\n */\n public getRouterClass(protocol: string): RouterConstructor | undefined {\n return this.routerRegistry.get(protocol.toLowerCase());\n }\n\n /**\n * Clear all registered routers (for testing)\n */\n public clear(): void {\n this.routerRegistry.clear();\n Logger.Debug('Cleared all registered routers');\n }\n\n /**\n * Reset to default routers\n */\n public reset(): void {\n this.clear();\n this.initializeDefaultRouters();\n Logger.Debug('Reset to default routers');\n }\n\n /**\n * Shutdown all active routers (for graceful shutdown)\n * This method should be called when the application receives termination signal\n * \n * IMPORTANT: This method uses flags to ensure it only runs once even if called\n * multiple times in multi-protocol environments where each NewRouter() call\n * registers an appStop listener.\n */\n public async shutdownAll(): Promise<void> {\n // Prevent concurrent shutdown attempts\n if (this.isShuttingDown) {\n Logger.Debug('Shutdown already in progress, skipping duplicate call');\n return;\n }\n \n // Prevent multiple shutdown attempts\n if (this.hasShutdown) {\n Logger.Debug('Shutdown already completed, skipping duplicate call');\n return;\n }\n \n this.isShuttingDown = true;\n \n try {\n const routerCount = this.activeRouters.length;\n if (routerCount === 0) {\n Logger.Debug('No active routers to shutdown');\n this.hasShutdown = true;\n return;\n }\n\n Logger.Info(`Starting graceful shutdown for ${routerCount} router(s)...`);\n \n const shutdownPromises = this.activeRouters.map(async (router) => {\n const routerAny = router as any;\n const protocol = routerAny.protocol || 'unknown';\n try {\n if (typeof routerAny.cleanup === 'function') {\n await routerAny.cleanup();\n Logger.Debug(`Router ${protocol} shutdown completed`);\n }\n } catch (error) {\n Logger.Error(`Error shutting down ${protocol} router:`, error);\n }\n });\n\n await Promise.all(shutdownPromises);\n this.activeRouters = [];\n this.hasShutdown = true;\n Logger.Info('All routers shutdown completed');\n } finally {\n this.isShuttingDown = false;\n }\n }\n\n /**\n * Get count of active routers\n */\n public getActiveRouterCount(): number {\n return this.activeRouters.length;\n }\n\n /**\n * Get active routers list\n */\n public getActiveRouters(): KoattyRouter[] {\n return [...this.activeRouters];\n }\n}\n\n/**\n * Router factory builder for advanced configuration\n */\nexport class RouterFactoryBuilder {\n private customRouters = new Map<string, RouterConstructor>();\n private excludeDefaults: string[] = [];\n\n /**\n * Add custom router\n */\n public addRouter(protocol: string, routerClass: RouterConstructor): this {\n this.customRouters.set(protocol.toLowerCase(), routerClass);\n return this;\n }\n\n /**\n * Exclude default router\n */\n public excludeDefault(protocol: string): this {\n this.excludeDefaults.push(protocol.toLowerCase());\n return this;\n }\n\n /**\n * Build factory with custom configuration\n */\n public build(): IRouterFactory {\n const factory = RouterFactory.getInstance();\n \n // Remove excluded defaults\n for (const protocol of this.excludeDefaults) {\n factory.unregister(protocol);\n }\n \n // Add custom routers\n for (const [protocol, routerClass] of this.customRouters) {\n factory.register(protocol, routerClass);\n }\n \n return factory;\n }\n}\n\n/**\n * Decorator for auto-registering custom routers\n */\nexport function RegisterRouter(protocol: string) {\n return function <T extends RouterConstructor>(target: T): T {\n const factory = RouterFactory.getInstance();\n factory.register(protocol, target);\n return target;\n };\n} ","/*\n * @Description: \n * @Usage: \n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2025-01-20 10:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { KoattyApplication, KoattyRouter } from \"koatty_core\";\nimport { Helper } from \"koatty_lib\";\nimport { RouterFactory } from \"./factory\";\nimport { PayloadOptions } from \"../payload/interface\";\n\n\n/**\n * RouterOptions\n *\n * @export\n * @interface RouterOptions\n */\nexport interface RouterOptions {\n /** 路由前缀 */\n prefix: string;\n /**\n * Methods which should be supported by the router.\n */\n methods?: string[];\n routerPath?: string;\n /**\n * Whether or not routing should be case-sensitive.\n */\n sensitive?: boolean;\n /**\n * Whether or not routes should matched strictly.\n *\n * If strict matching is enabled, the trailing slash is taken into\n * account when matching routes.\n */\n strict?: boolean;\n /** server protocol */\n protocol?: string;\n\n /**\n * payload options\n */\n payload?: PayloadOptions;\n /**\n * 协议特定的扩展配置\n * \n * 各协议的特定参数都放在此字段中:\n * - WebSocket: { maxFrameSize, heartbeatInterval, maxConnections, ... }\n * - gRPC: { protoFile, poolSize, batchSize, streamConfig, ... }\n * - GraphQL: { schemaFile, playground, introspection, ... }\n * - HTTP/HTTPS: 预留扩展字段\n * \n * @example\n * ```typescript\n * ext: {\n * http: {},\n * grpc: {\n * protoFile: \"./proto/service.proto\",\n * poolSize: 10,\n * streamConfig: { maxConcurrentStreams: 50 }\n * },\n * graphql: {\n * schemaFile: \"./resource/graphql/schema.graphql\",\n * // Optional: Enable HTTP/2 with SSL for GraphQL\n * // keyFile: \"./ssl/server.key\",\n * // crtFile: \"./ssl/server.crt\",\n * // ssl: { mode: 'auto', allowHTTP1: true },\n * // http2: { maxConcurrentStreams: 100 }\n * },\n * ws: {\n * maxFrameSize: 1024 * 1024,\n * heartbeatInterval: 15000,\n * maxConnections: 1000\n * }\n * }\n * ```\n */\n ext?: Record<string, any>;\n}\n\n/**\n * get instance of Router using Factory Pattern\n *\n * @export\n * @param {KoattyApplication} app\n * @param {RouterOptions} options\n * @returns {*} {{ router: KoattyRouter, factory: RouterFactory }}\n */\nexport function NewRouter(app: KoattyApplication, opt?: RouterOptions): { router: KoattyRouter, factory: RouterFactory } {\n const options: RouterOptions = { protocol: \"http\", prefix: \"\", ...opt };\n\n // Use RouterFactory to create router instance\n const factory = RouterFactory.getInstance();\n const router = factory.create(options.protocol!, app, options);\n\n Helper.define(router, \"protocol\", options.protocol);\n\n // inject payload middleware\n // IMPORTANT: Use app.once() to prevent duplicate middleware registration\n // in multi-protocol environments where each NewRouter() is called separately\n // app.once(\"appReady\", () => {\n // app.use(payload(options.payload));\n // });\n\n // Note: app.once(\"appStop\", ...) has been removed.\n // Cleanup logic is now handled by RouterComponent @OnEvent(AppEvent.appStop)\n\n return { router, factory };\n}","/*\n * @Description: \n * @Usage: \n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2024-10-31 14:31:42\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { KoattyContext } from \"koatty_core\";\nimport { injectParam, ParamSourceType } from \"../utils/inject\";\nimport { bodyParser, queryParser } from \"../payload/payload\";\nimport { PayloadOptions, FILE_KEY } from \"../payload/interface\";\n\n/**\n * Get request header.\n *\n * @export\n * @param {string} [name]\n * @param {any} [defaultValue] - Default value if header is undefined\n * @returns\n */\nexport function Header(name?: string, defaultValue?: any): ParameterDecorator {\n return injectParam(\n (ctx: KoattyContext) => name ? ctx.get(name) : ctx.headers,\n \"Header\",\n ParamSourceType.HEADER,\n name,\n defaultValue\n );\n}\n\n/**\n * Get path variable (take value from ctx.params).\n *\n * @export\n * @param {string} [name] params name\n * @param {any} [defaultValue] - Default value if path variable is undefined\n * @returns\n */\nexport function PathVariable(name?: string, defaultValue?: any): ParameterDecorator {\n return injectParam(\n (ctx: KoattyContext) => {\n const pathParams = ctx.params ?? {};\n return name ? pathParams[name] : pathParams;\n },\n \"PathVariable\",\n ParamSourceType.PATH,\n name,\n defaultValue\n );\n}\n\n/**\n * Get query-string parameters (take value from ctx.query).\n *\n * @export\n * @param {string} [name]\n * @param {any} [defaultValue] - Default value if query parameter is undefined\n * @returns\n */\nexport function Get(name?: string, defaultValue?: any): ParameterDecorator {\n return injectParam(\n (ctx: KoattyContext) => {\n const queryParams = ctx.query ?? {};\n return name ? queryParams[name] : queryParams;\n },\n \"Get\",\n ParamSourceType.QUERY,\n name,\n defaultValue\n );\n}\n\n/**\n * Get parsed POST/PUT... body.\n *\n * @export\n * @param {string} [name]\n * @param {any} [defaultValue] - Default value if body parameter is undefined\n * @returns\n */\nexport function Post(name?: string, defaultValue?: any): ParameterDecorator {\n return injectParam(\n // NOTE: This fn is a fallback path only. At runtime the strategy extractor uses\n // param.precompiledExtractor (generated by generatePrecompiledExtractor for BODY type)\n // which bypasses this fn entirely. This fn is invoked only when precompiledExtractor\n // is unavailable (e.g. startup compilation failure or CUSTOM source type fallback).\n async (ctx: KoattyContext, opt?: PayloadOptions) => {\n const data = await bodyParser(ctx, opt) as any;\n if (name) return data[name];\n // Return body without FILE_KEY (flat format, consistent with precompiledExtractor)\n const { [FILE_KEY]: _files, ...bodyOnly } = data || {};\n return bodyOnly;\n },\n \"Post\",\n ParamSourceType.BODY,\n name,\n defaultValue\n );\n}\n\n/**\n * Get parsed upload file object.\n *\n * @export\n * @param {string} [name]\n * @param {any} [defaultValue] - Default value if file is undefined\n * @returns\n */\nexport function File(name?: string, defaultValue?: any): ParameterDecorator {\n return injectParam(\n async (ctx: KoattyContext, opt?: PayloadOptions) => {\n const body = await bodyParser(ctx, opt) as any;\n const params = body[FILE_KEY] ?? {};\n return name ? params[name] : params;\n },\n \"File\",\n ParamSourceType.FILE,\n name,\n defaultValue\n );\n}\n\n\n/**\n * Get parsed request body as a flat object.\n * For multipart requests, use FILE_KEY symbol from payload/interface to access uploaded files.\n *\n * @export\n * @returns Flat body object. Files (if any) accessible via body[FILE_KEY].\n */\nexport function RequestBody(): ParameterDecorator {\n return injectParam(\n (ctx: KoattyContext, opt?: PayloadOptions) => bodyParser(ctx, opt),\n \"RequestBody\",\n ParamSourceType.BODY\n );\n}\n\n/**\n * Alias of @RequestBody\n * @param {*}\n * @return {*}\n */\nexport const Body = RequestBody;\n\n/**\n * Get parsed query-string and path variable(koa ctx.query and ctx.params),\n * and set as an object.\n * \n * @export\n * @returns {ParameterDecorator}\n */\nexport function RequestParam(): ParameterDecorator {\n return injectParam(\n (ctx: KoattyContext, opt?: PayloadOptions) => queryParser(ctx, opt),\n \"RequestParam\",\n ParamSourceType.CUSTOM\n );\n}\n\n/**\n * Alias of @RequestParam\n * @param {*}\n * @return {*}\n */\nexport const Param = RequestParam;","/*\n * @Description: Router Component for Koatty framework\n * @Usage:\n * @Author: richen\n * @Date: 2026-01-26 12:00:00\n * @LastEditTime: 2026-01-26 12:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport {\n Component,\n IComponent,\n AppEvent,\n OnEvent,\n KoattyApplication,\n} from 'koatty_core';\nimport { Helper } from 'koatty_lib';\nimport { DefaultLogger as Logger } from 'koatty_logger';\nimport { NewRouter } from './router/router';\nimport { payload } from './payload/payload';\nimport { RouterFactory } from './router/factory';\n\n/**\n * Router Component\n * Responsible for initializing and managing routing\n * \n * Implements IComponent interface (base interface)\n * \n * Event bindings:\n * - loadRouter: Initialize router\n * - appStop: Cleanup router resources\n */\n@Component('RouterComponent', {\n scope: 'core',\n priority: 100,\n version: '1.0.0',\n description: 'HTTP/gRPC/WebSocket routing for Koatty',\n})\nexport class RouterComponent implements IComponent {\n events: Record<string, any> = {};\n private factory: RouterFactory | null = null;\n\n /**\n * Initialize router and load routes\n * \n * This method handles the complete router initialization:\n * 1. Create router instance(s) for configured protocol(s)\n * 2. Bind router to app.router\n * 3. Load controller routes into router\n */\n @OnEvent(AppEvent.loadRouter)\n async initRouter(app: KoattyApplication): Promise<void> {\n const routerOpts = app.config(undefined, 'router') || {};\n const serveOpts = app.config(undefined, 'server') ?? { protocol: \"http\" };\n const protocol = serveOpts.protocol ?? \"http\";\n const protocols = Helper.isArray(protocol) ? protocol : [protocol];\n\n Logger.Log('Koatty', '', `Creating routers for protocols: ${protocols.join(', ')}`);\n\n // Step 1: Create and bind router instance(s)\n if (protocols.length > 1) {\n const routers: Record<string, any> = {};\n const successfulProtocols: string[] = [];\n \n for (const proto of protocols) {\n try {\n const protoRouterOpts = { protocol: proto, ...routerOpts };\n // Get protocol-specific ext configuration\n if (routerOpts.ext && routerOpts.ext[proto]) {\n protoRouterOpts.ext = routerOpts.ext[proto];\n } else if (serveOpts.ext && serveOpts.ext[proto]) {\n // Fallback: check ServeComponent ext config\n protoRouterOpts.ext = serveOpts.ext[proto];\n }\n \n const { router, factory } = NewRouter(app, protoRouterOpts);\n routers[proto] = router;\n this.factory = factory;\n successfulProtocols.push(proto);\n } catch (error: any) {\n // Log warning and skip this protocol instead of crashing\n Logger.Warn(\n `Router for protocol '${proto}' skipped: ${error.message}\\n` +\n ` → To enable ${proto}, configure 'ext.${proto}' in config/router.ts`\n );\n }\n }\n \n if (successfulProtocols.length === 0) {\n throw new Error(\n `No routers could be initialized. Configured protocols: [${protocols.join(', ')}]\\n` +\n ` → Check protocol-specific configuration in config/router.ts`\n );\n }\n \n Helper.define(app, \"router\", routers);\n Logger.Log('Koatty', '', `✓ Routers initialized: ${successfulProtocols.join(', ')}`);\n } else {\n const singleProto = protocols[0];\n const { router, factory } = NewRouter(app, { protocol: singleProto, ...routerOpts });\n Helper.define(app, \"router\", router);\n this.factory = factory;\n Logger.Log('Koatty', '', '✓ Router initialized');\n }\n\n // Step 2: Register payload middleware BEFORE loading routes\n // This ensures body parsing runs before route matching in the middleware chain,\n // so controller handlers can access parsed request body directly.\n app.use(payload(app.config('payload', 'router')));\n Logger.Log('Koatty', '', '✓ Payload middleware registered');\n\n // Step 3: Load controller routes\n await this.loadRoutes(app);\n }\n\n /**\n * Load controller routes into router\n * \n * @param app - Koatty application instance\n */\n private async loadRoutes(app: KoattyApplication): Promise<void> {\n const router = app.router;\n // getMetaData returns wrapped array for private keys (keys starting with \"_\")\n // so we need to unwrap with [0]\n const controllers = app.getMetaData('_controllers')[0] || [];\n \n if (controllers.length === 0) {\n Logger.Warn('No controllers found!');\n return;\n }\n\n Logger.Log('Koatty', '', `Loading routes for ${controllers.length} controllers`);\n\n if (Helper.isObject(router) && !Helper.isFunction((router as any).LoadRouter)) {\n // Multi-protocol routers (router is an object with protocol keys)\n const routers = router as Record<string, any>;\n Logger.Log('Koatty', '', `Multi-protocol routing: ${Object.keys(routers).length} protocols (${Object.keys(routers).join(', ')})`);\n \n for (const proto in routers) {\n if (routers[proto] && Helper.isFunction(routers[proto].LoadRouter)) {\n Logger.Log('Koatty', '', `Loading routes for protocol: ${proto}`);\n await routers[proto].LoadRouter(app, controllers);\n }\n }\n } else if (Helper.isFunction((router as any).LoadRouter)) {\n // Single protocol router\n Logger.Log('Koatty', '', 'Loading routes for single protocol');\n await (router as any).LoadRouter(app, controllers);\n } else {\n Logger.Warn('No valid router found!');\n }\n\n Logger.Log('Koatty', '', '✓ Routes loaded');\n }\n\n /**\n * Cleanup router resources on app stop\n *\n * NOTE: Original app.once(\"appStop\", ...) listener in router.ts\n * is now unified to be handled by @OnEvent(AppEvent.appStop) decorator\n */\n @OnEvent(AppEvent.appStop)\n async cleanup(_app: KoattyApplication): Promise<void> {\n Logger.Log('Koatty', '', 'RouterComponent: Cleaning up router resources...');\n\n if (this.factory) {\n await this.factory.shutdownAll();\n }\n\n Logger.Log('Koatty', '', '✓ Router resources cleaned up');\n }\n\n}\n"]}
|