{"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.mjs","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"]}