{"version":3,"sources":["../src/utils/helper.ts","../src/utils/logger.ts","../src/utils/timer-manager.ts","../src/utils/ring_buffer.ts","../src/pools/pool.ts","../src/server/base.ts","../src/utils/terminus-manager.ts","../src/utils/terminus.ts","../src/utils/cert-loader.ts","../src/config/pool.ts","../src/config/config.ts","../src/pools/http.ts","../src/pools/http2.ts","../src/pools/ws.ts","../src/pools/grpc.ts","../src/pools/factory.ts","../src/server/grpc.ts","../src/middleware/healthCheck.ts","../src/server/http.ts","../src/server/http2.ts","../src/pools/http3.ts","../src/utils/http3/qpack.ts","../src/utils/http3/frames.ts","../src/adapters/http3-matrixai.ts","../src/server/http3.ts","../src/pools/https.ts","../src/server/https.ts","../src/server/ws.ts","../src/utils/validator.ts","../src/server/serve.ts","../src/pools/pool-metrics-integration.ts","../src/ServeComponent.ts","../src/middleware/rateLimit.ts"],"names":["deepEqual","obj1","obj2","visited","WeakSet","has","add","isArray1","Array","isArray","isArray2","keys1","Object","keys","keys2","length","result","every","key","delete","generateShortId","randomUUID","replace","substring","bytes","randomBytes","toString","generateTraceId","generateServerId","protocol","StructuredLogger","instance","globalContext","getInstance","setGlobalContext","context","getGlobalContext","clearGlobalContext","formatMessage","message","data","mergedContext","parts","moduleUpper","module","toUpperCase","protocolUpper","push","connectionId","requestId","traceId","finalMessage","join","contextKeys","additionalData","entries","filter","includes","reduce","acc","value","JSON","stringify","debug","formattedMessage","Logger","Debug","info","Info","warn","Warn","error","errorData","Error","name","stack","child","childLogger","startPerformanceMeasurement","label","startTime","performance","now","memoryUsage","process","endPerformanceMeasurement","metrics","endTime","duration","endMemoryUsage","memoryDelta","rss","heapTotal","heapUsed","external","toFixed","measureAsync","operation","measureSync","createLogger","logger","TimerFrequency","TimerManager","timers","Map","timerIdCounter","optimizerConfig","taskQueues","consolidatedTimers","performanceMetrics","totalTasks","executedTasks","averageExecutionTime","lastOptimization","Date","config","enableConsolidation","enableAdaptiveFrequency","maxTimersPerFrequency","loadThreshold","values","forEach","frequency","set","supportedFrequencies","f","addTimer","callback","interval","addOptimizedTimer","priority","determinePriority","extractProtocol","task","taskId","Math","random","substr","optimizedTask","id","lastExecuted","executionCount","selectOptimalFrequency","taskQueue","get","optimizeTimers","createPhysicalTimer","timerId","wrappedCallback","String","timer","setInterval","unref","timerInfo","createdAt","clearTimer","timerIdOrName","_frequency","tasks","taskIndex","findIndex","clearInterval","clearAllTimers","logicalTimerCount","physicalTimerCount","size","logicalTimers","physicalTimers","clear","clearedLogicalTimers","clearedPhysicalTimers","getActiveTimerCount","getTimerNames","names","map","getTimerInfo","getTimerStats","uptime","totalTimers","hasTimer","some","protocolMatch","match","toLowerCase","undefined","frequencies","freq","clearConsolidatedTimers","createConsolidatedTimer","timerName","executeTaskBatch","executedCount","sortedTasks","sort","a","b","priorityOrder","high","medium","low","taskStartTime","shouldExecuteTask","taskExecutionTime","updateAverageExecutionTime","taskName","intervalRatio","timeSinceLastExecution","executionTime","alpha","getOptimizationStats","tasksByFrequency","tasksByPriority","consolidation","activeTimers","fromEntries","createOptimizedInstance","demonstrateOptimization","traditionalIntervals","optimizedFrequencies","reduction","before","timerCount","intervals","after","estimatedReduction","destroy","activeConsolidatedTimers","RingBuffer","buffer","head","tail","count","capacity","item","toArray","index","i","toSortedArray","compareFn","isEmpty","isFull","actualIndex","peek","peekLast","lastIndex","getPercentile","percentile","sorted","floor","min","getAverage","sum","Number","predicate","initialValue","accumulator","DynamicRingBuffer","currentCapacity","initialCapacity","maxCapacity","minCapacity","autoResize","resizeThreshold","shrinkThreshold","resizeFactor","lastResizeTime","resizeCooldown","resizeCount","options","max","shouldResizeUp","resizeUp","shouldResizeDown","resizeDown","timeSinceLastResize","newCapacity","oldCapacity","itemCount","newBuffer","initialSize","maxSize","minSize","utilization","resizeUpManual","factor","oldFactor","resizeDownManual","getStats","ConnectionPoolStatus","ConnectionPoolEvent","ConnectionPoolManager","eventListeners","eventListenerErrors","connections","connectionMetadata","waitingQueue","currentHealth","latencyBuffer","errorWindow","lastMetricsUpdate","healthCheckInterval","cleanupInterval","validateAndNormalizeConfig","initializeMetrics","initializeHealth","startPeriodicTasks","activeConnections","totalConnections","connectionsPerSecond","averageLatency","errorRate","poolConfig","health","throughput","latency","p50","p95","p99","cpuUsage","status","utilizationRatio","maxConnections","rejectedConnections","averageResponseTime","lastUpdated","normalized","connectionTimeout","keepAliveTimeout","requestTimeout","headersTimeout","requestConnection","timeout","canAcceptConnection","emitEvent","currentConnections","getActiveConnectionCount","connection","success","waitTime","availableConnection","getAvailableConnection","newConnection","createNewConnection","addConnection","metadata","Promise","resolve","reject","timeoutHandle","setTimeout","splice","queueItem","clearTimeout","timestamp","priorityWeight","normal","newPriority","insertIndex","existingPriority","recordConnectionEvent","releaseConnection","findConnectionId","removeConnection","markConnectionAvailable","processWaitingQueue","generateConnectionId","validateConnection","lastUsed","available","reason","cleanupConnection","closeAllConnections","closePromises","catch","race","all","_","createProtocolConnection","updateHealthStatus","Infinity","oldStatus","newStatus","getHealth","getMetrics","updatePerformanceMetrics","getConfig","updateConfig","newConfig","oldConfig","updatedConfig","assign","on","event","listener","Set","off","listeners","conn","waitingRequest","shift","timeDiff","calculateErrorRate","cleanupExpiredConnections","connectionsToRemove","listenersToRemove","errorCount","totalErrors","_metadata","recordLatency","warmup","warmupConfig","enabled","initialConnections","retryCount","created","failed","errors","targetCount","concurrencyLimit","batches","ceil","batch","batchSize","batchPromises","createWarmupConnection","finalConnectionCount","type","lastError","attempt","connectionResult","maxAttempts","pow","getConnection","registerConnection","setupProtocolSpecificHandlers","BaseServer","server","listenCallback","configVersion","serverId","shutdownTimeout","drainDelay","connectionPool","timerManager","isShuttingDown","app","ext","actualModule","_underlyingProtocol","hostname","port","initializeServer","initializeConnectionPool","createProtocolServer","configureServerOptions","setupConnectionPoolEventListeners","setupPeriodicCleanup","performProtocolSpecificInitialization","mergedConfig","changedKeys","detectConfigurationChanges","extractRelevantConfig","analysis","analyzeConfigChanges","requiresRestart","handleRestartRequiredChanges","canApplyRuntime","handleRuntimeChanges","gracefulShutdown","completedSteps","failedSteps","executeWithTimeout","stopAcceptingNewConnections","stepTimeout","step","waitTimeout","waitForConnectionCompletion","forceCloseRemainingConnections","stopMonitoringAndCleanup","totalTime","fn","stepName","then","POOL_LIMIT_REACHED","HEALTH_STATUS_CHANGED","CONNECTION_ERROR","CONNECTION_TIMEOUT","CONNECTION_REMOVED","shutdownResult","Start","onRuntimeConfigChange","finalStats","getConnectionStats","poolMetrics","getConnectionPoolHealth","getConnectionPoolMetrics","Stop","err","forceShutdown","forcedShutdown","asyncEvent","eventName","func","Helper","isFunction","removeAllListeners","triggerListeners","target","TerminusManager","signalsRegistered","exitOnShutdown","registeredServerCount","signalHandlers","setExitOnShutdown","registerServer","_server","setupSignalHandlers","signals","signal","handler","shutdownAll","Fatal","exit","timeoutPromise","resetInstance","removeListener","getServerCount","CreateTerminus","_options","sanitizeCertPath","certPath","segments","split","isCertificateContent","input","pemMarkers","marker","loadCertificate","keyOrPath","sanitizedPath","existsSync","content","readFileSync","path","PoolConfigHelper","createHttpConfig","createHttpsConfig","createWebSocketConfig","protocolSpecific","pingInterval","pongTimeout","heartbeatInterval","createHttp2Config","maxSessionMemory","maxHeaderListSize","keepAliveTime","createHttp3Config","maxIdleTimeout","maxUdpPayloadSize","initialMaxStreamsBidi","initialMaxStreamsUni","createGrpcConfig","callTimeout","maxReceiveMessageLength","maxSendMessageLength","createBaseConfig","validateConfig","valid","mergeConfigs","base","override","createDefaultConfig","getProtocolSpecificKeys","ConfigHelper","configureSSLForProtocol","protocolType","secureProtocols","ssl","keyFile","cert","crtFile","keyPath","crtPath","fs","migrateSSLFromExt","trace","defaultPoolConfig","sslConfig","http2","channelOptions","http3","quic","wsOptions","HttpConnectionPoolManager","keepAliveAgent","Socket","destroyed","readable","writable","isConnectionHealthy","isHealthy","idleTimeout","isIdle","addHttpConnection","remoteAddress","remotePort","localAddress","localPort","encrypted","TLSSocket","requestCount","bytesSent","bytesReceived","handleRequestComplete","maxRequests","stats","availableConnections","totalRequests","totalBytesSent","totalBytesReceived","httpsConnections","_connection","httpConnections","averageRequestsPerConnection","setKeepAliveTimeout","getConnectionDetails","details","httpMetadata","age","idle","Http2ConnectionPoolManager","activeStreams","startHttp2MonitoringTasks","session","closed","state","effectiveLocalWindowSize","sessionId","findHttp2SessionId","streams","stream","close","http2Constants","NGHTTP2_CANCEL","http2Metadata","isGoingAway","maxConcurrentStreams","isSessionHealthy","pingTimeout","lastPingTime","lastPingAck","addHttp2Session","socket","settings","localSettings","totalStreams","initialWindowSize","streamErrors","setupSessionEventHandlers","errorCode","lastStreamID","opaqueData","headers","handleNewStream","_payload","startSessionPing","_headers","streamId","totalStreamErrors","pingTimer","ping","_duration","pingAllSessions","performHealthCheck","unhealthySessions","_sessionId","activeSessions","availableSessions","totalActiveStreams","goingAwaySessions","_session","averageStreamsPerSession","getSessionDetails","gracefulCloseSession","goaway","Buffer","from","checkInterval","WebSocketConnectionPoolManager","startHeartbeat","readyState","WebSocket","OPEN","CONNECTING","terminate","url","protocols","once","isAlive","lastPongTime","isOpen","pong","addWebSocketConnection","request","userAgent","pingAllConnections","cleanupDeadConnections","cleanupStaleConnections","staleTimeout","wsMetadata","healthyConnections","findWebSocketConnectionId","GrpcConnectionPoolManager","callMetrics","totalUnarycalls","totalStreamingCalls","averageCallDuration","peer","cancelled","cleanupError","findGrpcConnectionId","maxIdleTime","addGrpcConnection","callMetadata","createConnectionId","deadline","callCount","streamCount","setupConnectionEventHandlers","getTime","handleCallComplete","lastErrorTime","updateCallMetrics","isUnaryCall","handleStreamResponse","dataSize","isBuffer","cleanupExpiredGrpcConnections","typedMetadata","baseStats","totalCalls","grpcSpecific","getGrpcMetrics","ConnectionPoolFactory","instances","registered","stableStringify","obj","sortedKeys","k","register","implementation","create","Implementation","getOrCreate","protocolPrefix","toDestroy","startsWith","destroyAll","getAllMetrics","getRegisteredProtocols","isProtocolRegistered","getInstanceCount","clearInstanceCache","GrpcServer","opts","Server","sslEnabled","criticalKeys","restartReason","hasSSLConfigChanged","hasChannelOptionsChanged","applyConfigChanges","grpcConfig","oldLimit","newLimit","tryShutdown","note","elapsed","remainingConnections","forcedConnections","performProtocolHealthChecks","checks","HealthStatus","HEALTHY","poolHealth","DEGRADED","OVERLOADED","certFile","caFile","ca","clientCertRequired","collectProtocolMetrics","configuration","oldSSL","newSSL","oldPool","newPool","createSSLCredentials","hasSSLConfig","ServerCredentials","createInsecure","rootCerts","keyCertPairs","caContent","hasKey","hasCert","keyContent","certContent","privateKey","certChain","private_key","cert_chain","checkClientCertificate","createSsl","finalCallback","credentials","bindAddress","bindAsync","errorTraceId","emit","runtimeErrorTraceId","urlProtocol","serverUrl","address","actualPort","connectionPoolEnabled","startConnectionMonitoring","RegisterService","impl","serviceName","service","methods","wrappedImplementation","methodName","_handler","call","methodTraceId","getPeer","callbackCalled","timeoutId","response","code","errorMessage","grpcError","hasResponse","responseInfo","responseType","responseKeys","timeoutMs","grpcMiddlewareHandler","addService","getStatus","getNativeServer","HealthCheckMiddleware","readiness","detailed","memoryThresholdMB","middleware","req","res","next","handleHealthCheck","handleReadinessCheck","getUptime","toISOString","memory","cpu","sendJsonResponse","checkMemoryHealth","allChecksPass","check","heapUsedMB","statusCode","writeHead","end","createHealthCheckMiddleware","HttpServer","healthMiddleware","createServer","getHeaders","headersSent","configureConnectionPoolSettings","setupConnectionTracking","hasConnectionPoolChanged","httpConfig","listening","errorHandler","listen","underlyingProtocol","startConnectionPoolMonitoring","getHttpConnectionStats","Http2Server","http2Options","createHTTP2Options","createSecureServer","setupSessionHandling","sslMode","mode","allowHTTP1","http2Config","sslOptions","createSSLOptions","extConfig","createManualSSLOptions","createMutualTLSOptions","createAutoSSLOptions","caPath","passphrase","ciphers","honorCipherOrder","secureProtocol","manualOptions","requestCert","rejectUnauthorized","hasHTTP2ConfigChanged","http2Settings","oldHttp2","newHttp2","remainingSessions","forcedSessions","getHttp2Stats","getConnectionsStatus","current","Http3ConnectionPoolManager","startHttp3MonitoringTasks","findHttp3SessionId","http3Metadata","isClosing","rtt","addHttp3Session","packetsLost","congestionWindow","streamMetadata","direction","bidirectional","updateSessionStats","closingSessions","totalPacketsLost","avgRtt","averageRtt","packetLossRate","STATIC_TABLE","HUFFMAN_CODES","huffmanTree","buildHuffmanTree","nodes","symbol","left","right","sym","len","idx","bitPos","bit","nextIdx","huffmanDecode","tree","nodeIdx","byteIdx","byte","childIdx","cur","maxSteps","QPACKEncoder","dynamicTable","maxTableCapacity","tableCapacity","encode","encodedHeaders","lowerName","staticIndex","findInStaticTable","encodeIndexed","staticNameIndex","findNameInStaticTable","encodeLiteralWithNameRef","encodeLiteralWithLiteralName","concat","_isDynamic","prefix","encodeInteger","nameIndex","indexBytes","valueBytes","encodeString","prefixByte","nameBytes","prefixBits","maxPrefix","str","useHuffman","strBuffer","lengthPrefix","lengthBytes","QPACKDecoder","decode","encoded","offset","firstByte","bytesRead","decodeInteger","entry","getTableEntry","headerValue","decodeString","nameEntry","m","totalBytesRead","stringBuffer","slice","decodedBuffer","dynamicIndex","Http3FrameParser","parse","frames","typeResult","decodeVarint","frameType","typeBytesRead","lengthResult","frameLength","lengthBytesRead","payload","frame","parseFrame","remaining","parseDataFrame","parseHeadersFrame","parseSettingsFrame","parseGoAwayFrame","idResult","idBytesRead","valueResult","valueBytesRead","streamIdResult","BigInt","Http3FrameSerializer","serializeDataFrame","encodeVarint","serializeHeadersFrame","serializeSettingsFrame","settingsBuffers","serializeGoAwayFrame","streamIdBuffer","Http3MessageHandler","extractRequest","qpackDecoder","headersFrame","dataFrames","decodedHeaders","method","body","createResponse","qpackEncoder","responseHeaders","v","matrixaiQuic","QUICServer","moduleLoadPromise","moduleLoaded","loadMatrixaiQuic","Http3ServerAdapter","EventEmitter","quicServer","qpackMaxTableCapacity","library","isAvailable","cryptoKeyBuffer","alloc","crypto","getRandomValues","cryptoKey","byteOffset","byteLength","serverCrypto","ops","sign","hmac","createHmac","update","digest","verify","sig","expected","equals","verifyPeer","maxConcurrentBidiStreams","maxConcurrentUniStreams","setupConnectionHandlers","start","host","addEventListener","detail","connId","streamEvent","handleStream","chunks","reader","getReader","done","read","releaseLock","requestData","extractedRequest","createHttpRequest","createHttp3Response","sendErrorResponse","httpVersion","httpVersionMajor","httpVersionMinor","rawBody","complete","_request","self","statusMessage","finished","_dataChunks","setHeader","getHeader","write","chunk","encoding","nextTick","sendHttp3Response","frameBuffers","writer","getWriter","frameBuffer","Uint8Array","bodyLength","framesCount","stop","family","isListening","getHttp3Version","version","VERSION","Http3Server","http3Config","resolveFilePath","initialMaxData","initialMaxStreamDataBidiLocal","initialMaxStreamDataBidiRemote","initialMaxStreamDataUni","qpackBlockedStreams","setupHttp3Handlers","setupStreamHandling","alpnProtocols","hasQUICConfigChanged","hasHTTP3ConfigChanged","quicSettings","http3Settings","oldQuic","newQuic","oldHttp3","newHttp3","http3Version","startCallback","transport","getHttp3Stats","HttpsConnectionPoolManager","securityMetrics","totalHandshakes","successfulHandshakes","failedHandshakes","averageHandshakeTime","startSecurityMonitoring","findHttpsConnectionId","authorized","addHttpsConnection","handshakeStart","handshakeDuration","updateSecurityMetrics","cipher","getCipher","serverName","servername","certificate","getPeerCertificate","securityScore","calculateSecurityScore","score","getProtocol","valid_to","expiry","daysToExpiry","total","active","unauthorized","averageSecurityScore","totalSecurityScore","_id","security","getSecurityMetrics","connectionSecurityScores","HttpsServer","responseTime","recordRequest","setupConnectionHandling","handshakeTimeout","sessionTimeout","SNICallback","sessionIdContext","ticketKeys","ALPNProtocols","tlsSocket","_success","_responseTime","httpsConfig","mutualTLS","WsServer","httpServer","upgradeHandler","clientErrorHandler","createHttpServer","ensureUpgradeHandlersAreBound","noServer","WebSocketServer","setupUpgradeHandling","isSecure","opt","httpsCreateServer","handleUpgrade","ws","onConnection","setupWebSocketEventHandlers","origin","dataType","pseudoReq","_socket","websocket","wsData","wsConnectionId","pseudoRes","responseData","sendData","send","wsMiddlewareHandler","sendError","_code","_reason","wsConfig","getWebSocketConnectionStats","connectionStatus","ConfigValidator","validate","validateHostname","validatePort","validateProtocol","validateSSLConfig","validateGrpcConfig","validateConnectionPoolConfig","field","ipRegex","domainRegex","isLocalhost","test","part","isInteger","getuid","commonPorts","_protocol","protoFile","formatErrors","messages","msg","validator","SingleProtocolServer","serverInstance","initializeServerInstance","hasServerInstance","routerExt","schemaFile","graphql","grpc","createServerInstance","hasRegisterService","getHealthStatus","utilizationRate","overallStatus","pool","healthCheckMiddleware","ctx","serverMap","wss","https","KoattyHttpsServer","http","KoattyHttpServer","ServerConstructor","actualProtocol","_actualProtocol","NewServe","parsePort","envPort","parsed","parseInt","env","IP","PORT","APP_PORT","registerConnectionPoolMetrics","setConnectionPoolMetricsCallback","unregisterConnectionPoolMetrics","ServeComponent","events","initServer","serveOpts","Log","servers","basePort","ports","portMap","assignedPort","toNumber","existingProtocol","newPort","proto","protoServerOpts","define","singleProto","singleServerOpts","stopServer","s","loadServe","appStop","scope","description","requires","defaultOptions","windowMs","keyGenerator","skipSuccessfulRequests","createRateLimitMiddleware","store","cleanupTimer","resetTime","resetTimeSeconds"],"mappings":"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","file":"index.mjs","sourcesContent":["\n/*\n * @Description: \n * @Usage: \n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2024-11-07 11:08:26\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { randomBytes, randomUUID } from \"crypto\";\n\n/**\n * Performs a deep equality comparison between two objects.\n * @param obj1 - The first object to compare\n * @param obj2 - The second object to compare\n * @param visited - Set to track visited objects for circular reference detection\n * @returns {boolean} True if objects are deeply equal, false otherwise\n */\nexport function deepEqual(obj1: unknown, obj2: unknown, visited = new WeakSet()): boolean {\n  if (obj1 === obj2) return true;\n  if (obj1 == null || obj2 == null) return false;\n  if (typeof obj1 !== typeof obj2) return false;\n\n  if (typeof obj1 === 'object') {\n    // Handle circular references\n    if (visited.has(obj1)) return true;\n    visited.add(obj1);\n\n    // Check if both are arrays or both are objects\n    const isArray1 = Array.isArray(obj1);\n    const isArray2 = Array.isArray(obj2);\n    if (isArray1 !== isArray2) return false;\n\n    const keys1 = Object.keys(obj1);\n    const keys2 = Object.keys(obj2);\n    if (keys1.length !== keys2.length) return false;\n\n    const result = keys1.every(key => deepEqual((obj1 as Record<string, unknown>)[key], (obj2 as Record<string, unknown>)[key], visited));\n    visited.delete(obj1);\n    return result;\n  }\n\n  return false;\n}\n\n/**\n * Execute operation with timeout\n */\nexport function executeWithTimeout<T>(\n  operation: () => Promise<T> | T,\n  timeout: number,\n  operationName: string\n): Promise<T> {\n  return new Promise<T>((resolve, reject) => {\n    const timeoutId = setTimeout(() => {\n      reject(new Error(`${operationName} timed out after ${timeout}ms`));\n    }, timeout);\n\n    Promise.resolve(operation())\n      .then((result) => {\n        clearTimeout(timeoutId);\n        resolve(result);\n      })\n      .catch((error) => {\n        clearTimeout(timeoutId);\n        reject(error);\n      });\n  });\n}\n\n/**\n * Generate short unique ID from UUID v4\n * Uses Node.js crypto module for cryptographically strong randomness\n * Removes hyphens and takes first 12 characters for brevity\n */\nfunction generateShortId(): string {\n  // Use crypto.randomUUID() for simple UUID generation\n  // Available in Node.js 14.17+ and modern browsers\n  try {\n    return randomUUID().replace(/-/g, '').substring(0, 12);\n  } catch {\n    // Fallback: use randomBytes to generate UUID v4\n    const bytes = randomBytes(16);\n    \n    // Set version (4) and variant bits according to RFC 4122\n    bytes[6] = (bytes[6] & 0x0f) | 0x40; // Version 4\n    bytes[8] = (bytes[8] & 0x3f) | 0x80; // Variant 10\n    \n    // Convert to hex string\n    return bytes.toString('hex').substring(0, 12);\n  }\n}\n\n/**\n * Generate unique trace ID\n * Format: trace_<uuid>\n * @returns Unique trace identifier\n */\nexport function generateTraceId(): string {\n  return `trace_${generateShortId()}`;\n}\n\n/**\n * Generate unique connection ID\n * Format: conn_<uuid>\n * @returns Unique connection identifier\n */\nexport function generateConnectionId(): string {\n  return `conn_${generateShortId()}`;\n}\n\n/**\n * Generate unique request ID\n * Format: req_<uuid>\n * @returns Unique request identifier\n */\nexport function generateRequestId(): string {\n  return `req_${generateShortId()}`;\n}\n\n/**\n * Generate unique server ID\n * Format: <protocol>_server_<uuid>\n * @param protocol - The server protocol (e.g., 'http', 'grpc', 'ws')\n * @returns Unique server identifier\n */\nexport function generateServerId(protocol: string): string {\n  return `${protocol}_server_${generateShortId()}`;\n}","/*\n * @Description: Structured logging utilities based on koatty_logger\n * @Usage: \n * @Author: richen\n * @Date: 2025-01-27 12:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { performance } from \"perf_hooks\";\n\n// Re-export ID generators from helper for backward compatibility\nexport { generateTraceId, generateConnectionId, generateRequestId } from \"./helper\";\n\n/**\n * Log context interface\n */\nexport interface LogContext {\n  module?: string;          // 模块名 (如: HTTP, WebSocket, gRPC)\n  protocol?: string;        // 协议类型\n  serverId?: string;        // 服务器实例ID\n  connectionId?: string;    // 连接ID\n  requestId?: string;       // 请求ID\n  userId?: string;          // 用户ID\n  sessionId?: string;       // 会话ID\n  traceId?: string;         // 追踪ID\n  action?: string;          // 操作类型\n  [key: string]: unknown;       // 其他自定义字段\n}\n\n/**\n * Performance metrics interface\n */\nexport interface PerformanceMetrics {\n  startTime: number;\n  endTime?: number;\n  duration?: number;\n  memoryUsage?: NodeJS.MemoryUsage;\n  [key: string]: unknown;\n}\n\n/**\n * Structured logger class based on koatty_logger\n * koatty_logger 2.4.0+ 已内置批量日志处理、采样、级别过滤等优化功能\n */\nexport class StructuredLogger {\n  private static instance: StructuredLogger;\n  private globalContext: LogContext = {};\n\n  private constructor() {\n    // koatty_logger 2.4.0+ 已内置优化，无需额外包装\n  }\n\n  static getInstance(): StructuredLogger {\n    if (!StructuredLogger.instance) {\n      StructuredLogger.instance = new StructuredLogger();\n    }\n    return StructuredLogger.instance;\n  }\n\n  /**\n   * Set global context for all logs\n   * @param context Global context to merge with all log entries\n   */\n  setGlobalContext(context: LogContext): void {\n    this.globalContext = { ...this.globalContext, ...context };\n  }\n\n  /**\n   * Get current global context\n   */\n  getGlobalContext(): LogContext {\n    return { ...this.globalContext };\n  }\n\n  /**\n   * Clear global context\n   */\n  clearGlobalContext(): void {\n    this.globalContext = {};\n  }\n\n  /**\n   * Format log message with context\n   * @param message Log message\n   * @param context Additional context\n   * @param data Additional data to log\n   * @returns Formatted message string\n   */\n  private formatMessage(message: string, context?: LogContext, data?: unknown): string {\n    const mergedContext = context ? { ...this.globalContext, ...context } : this.globalContext;\n    const parts: string[] = [];\n    \n    // 如果 module 和 protocol 相同（忽略大小写），只输出一个标签\n    // 避免重复如 [HTTP] [HTTP]\n    const moduleUpper = mergedContext.module?.toUpperCase();\n    const protocolUpper = mergedContext.protocol?.toUpperCase();\n    \n    if (moduleUpper && protocolUpper && moduleUpper === protocolUpper) {\n      // module 和 protocol 相同，只输出 protocol 标签\n      parts.push(`[${protocolUpper}]`);\n    } else {\n      // module 和 protocol 不同或其中一个为空，按原逻辑输出\n      // 跳过 'KOATTYSERVER' 标签，使其不显示\n      if (mergedContext.module && moduleUpper !== 'KOATTYSERVER') {\n        parts.push(`[${moduleUpper}]`);\n      }\n      \n      if (mergedContext.protocol) {\n        parts.push(`[${protocolUpper}]`);\n      }\n    }\n    \n    if (mergedContext.connectionId) {\n      parts.push(`[conn:${mergedContext.connectionId}]`);\n    }\n    \n    if (mergedContext.requestId) {\n      parts.push(`[req:${mergedContext.requestId}]`);\n    }\n    \n    if (mergedContext.traceId) {\n      parts.push(`[trace:${mergedContext.traceId}]`);\n    }\n    \n    let finalMessage = parts.length > 0 ? `${parts.join(' ')} ${message}` : message;\n    \n    if (data) {\n      const contextKeys = Object.keys(mergedContext);\n      const additionalData = Object.entries(data)\n        .filter(([key]) => !contextKeys.includes(key))\n        .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {});\n      \n      if (Object.keys(additionalData).length > 0) {\n        finalMessage += ` | Data: ${JSON.stringify(additionalData)}`;\n      }\n    }\n    \n    return finalMessage;\n  }\n\n  /**\n   * Log debug message\n   * @param message Log message\n   * @param context Additional context\n   * @param data Additional data\n   */\n  debug(message: string, context?: LogContext, data?: unknown): void {\n    const formattedMessage = this.formatMessage(message, context, data);\n    Logger.Debug(formattedMessage);\n  }\n\n  /**\n   * Log info message\n   * @param message Log message\n   * @param context Additional context\n   * @param data Additional data\n   */\n  info(message: string, context?: LogContext, data?: unknown): void {\n    const formattedMessage = this.formatMessage(message, context, data);\n    Logger.Info(formattedMessage);\n  }\n\n  /**\n   * Log warning message\n   * @param message Log message\n   * @param context Additional context\n   * @param data Additional data\n   */\n  warn(message: string, context?: LogContext, data?: unknown): void {\n    const formattedMessage = this.formatMessage(message, context, data);\n    Logger.Warn(formattedMessage);\n  }\n\n  /**\n   * Log error message\n   * @param message Log message\n   * @param context Additional context\n   * @param error Error object or additional data\n   */\n  error(message: string, context?: LogContext, error?: Error | unknown): void {\n    let errorData: unknown = error;\n    if (error instanceof Error) {\n      errorData = {\n        name: error.name,\n        message: error.message,\n        stack: error.stack\n      };\n    }\n    \n    const formattedMessage = this.formatMessage(message, context, errorData);\n    Logger.Error(formattedMessage);\n  }\n\n  /**\n   * Create a child logger with merged context\n   * @param context Context to merge\n   * @returns New logger instance with merged context\n   */\n  child(context: LogContext): StructuredLogger {\n    const childLogger = new StructuredLogger();\n    childLogger.setGlobalContext({ ...this.globalContext, ...context });\n    return childLogger;\n  }\n\n  /**\n   * Start performance measurement\n   * @param label Performance measurement label\n   * @returns Performance metrics object\n   */\n  startPerformanceMeasurement(label: string): PerformanceMetrics {\n    const startTime = performance.now();\n    const memoryUsage = process.memoryUsage();\n    \n    return {\n      startTime,\n      memoryUsage,\n      label\n    };\n  }\n\n  /**\n   * End performance measurement and log result\n   * @param metrics Performance metrics from startPerformanceMeasurement\n   * @param context Additional context\n   */\n  endPerformanceMeasurement(metrics: PerformanceMetrics, context?: LogContext): void {\n    const endTime = performance.now();\n    const duration = endTime - metrics.startTime;\n    const endMemoryUsage = process.memoryUsage();\n    \n    const memoryDelta = {\n      rss: endMemoryUsage.rss - (metrics.memoryUsage?.rss || 0),\n      heapTotal: endMemoryUsage.heapTotal - (metrics.memoryUsage?.heapTotal || 0),\n      heapUsed: endMemoryUsage.heapUsed - (metrics.memoryUsage?.heapUsed || 0),\n      external: endMemoryUsage.external - (metrics.memoryUsage?.external || 0)\n    };\n    \n    this.debug(\n      `Performance: ${metrics.label || 'Operation'} completed`,\n      context,\n      {\n        duration: `${duration.toFixed(2)}ms`,\n        memoryDelta: {\n          rss: `${(memoryDelta.rss / 1024 / 1024).toFixed(2)}MB`,\n          heapUsed: `${(memoryDelta.heapUsed / 1024 / 1024).toFixed(2)}MB`\n        }\n      }\n    );\n  }\n\n  /**\n   * Measure and log performance of async operation\n   * @param label Performance measurement label\n   * @param operation Async operation to measure\n   * @param context Additional context\n   * @returns Result of the operation\n   */\n  async measureAsync<T>(\n    label: string,\n    operation: () => Promise<T>,\n    context?: LogContext\n  ): Promise<T> {\n    const metrics = this.startPerformanceMeasurement(label);\n    try {\n      const result = await operation();\n      this.endPerformanceMeasurement(metrics, context);\n      return result;\n    } catch (error) {\n      this.endPerformanceMeasurement(metrics, context);\n      throw error;\n    }\n  }\n\n  /**\n   * Measure and log performance of sync operation\n   * @param label Performance measurement label\n   * @param operation Sync operation to measure\n   * @param context Additional context\n   * @returns Result of the operation\n   */\n  measureSync<T>(\n    label: string,\n    operation: () => T,\n    context?: LogContext\n  ): T {\n    const metrics = this.startPerformanceMeasurement(label);\n    try {\n      const result = operation();\n      this.endPerformanceMeasurement(metrics, context);\n      return result;\n    } catch (error) {\n      this.endPerformanceMeasurement(metrics, context);\n      throw error;\n    }\n  }\n}\n\n/**\n * Create a new structured logger instance\n * @param context Initial context\n * @returns New logger instance\n */\nexport function createLogger(context?: LogContext): StructuredLogger {\n  const logger = StructuredLogger.getInstance();\n  if (context) {\n    return logger.child(context);\n  }\n  return logger;\n}\n\n// Export singleton instance\nexport const structuredLogger = StructuredLogger.getInstance();\n\n// Export convenience functions\nexport const debug = (message: string, context?: LogContext, data?: unknown) => \n  structuredLogger.debug(message, context, data);\n\nexport const info = (message: string, context?: LogContext, data?: unknown) => \n  structuredLogger.info(message, context, data);\n\nexport const warn = (message: string, context?: LogContext, data?: unknown) => \n  structuredLogger.warn(message, context, data);\n\nexport const error = (message: string, context?: LogContext, error?: Error | unknown) => \n  structuredLogger.error(message, context, error);\n\nexport const setGlobalContext = (context: LogContext) => \n  structuredLogger.setGlobalContext(context);\n\nexport const clearGlobalContext = () => \n  structuredLogger.clearGlobalContext();\n\nexport const measureAsync = <T>(\n  label: string,\n  operation: () => Promise<T>,\n  context?: LogContext\n) => structuredLogger.measureAsync(label, operation, context);\n\nexport const measureSync = <T>(\n  label: string,\n  operation: () => T,\n  context?: LogContext\n) => structuredLogger.measureSync(label, operation, context);\n","/*\n * @Description: 统一定时器管理器\n * @Usage: 解决定时器资源泄漏问题，统一管理所有定时器\n * @Author: richen\n * @Date: 2024-11-27 20:30:00\n * @LastEditTime: 2024-11-27 20:30:00\n */\n\nimport { createLogger } from \"./logger\";\n\n/**\n * 定时器信息接口\n */\nexport interface TimerInfo {\n  id: string;\n  name: string;\n  interval: number;\n  callback: () => void;\n  timer: NodeJS.Timeout;\n  createdAt: number;\n  lastExecuted?: number;\n  priority?: 'high' | 'medium' | 'low';\n  protocol?: string;\n}\n\n/**\n * 定时器任务接口 - Phase 3 优化\n */\nexport interface TimerTask {\n  id: string;\n  name: string;\n  callback: () => void;\n  interval: number;\n  priority: 'high' | 'medium' | 'low';\n  protocol?: string;\n  lastExecuted?: number;\n  executionCount?: number;\n}\n\n/**\n * 定时器频率层次 - Phase 3 优化\n */\nexport enum TimerFrequency {\n  HIGH = 5000,    // 5秒 - 关键健康检查\n  MEDIUM = 30000, // 30秒 - 连接清理、ping检查\n  LOW = 60000     // 60秒 - 深度健康检查、统计更新\n}\n\n/**\n * 定时器优化配置\n */\nexport interface TimerOptimizerConfig {\n  enableConsolidation: boolean;     // 启用定时器合并\n  enableAdaptiveFrequency: boolean; // 启用自适应频率调整\n  maxTimersPerFrequency: number;    // 每个频率最大定时器数\n  loadThreshold: number;            // 负载阈值 (0-1)\n}\n\n/**\n * 统一定时器管理器\n * 解决定时器资源泄漏和难以追踪的问题\n * Phase 3: 添加定时器优化功能\n */\nexport class TimerManager {\n  private timers: Map<string, TimerInfo> = new Map();\n  private timerIdCounter = 0;\n  private readonly logger = createLogger({ module: 'timer_manager' });\n  \n  // Phase 3 优化功能\n  private readonly optimizerConfig: TimerOptimizerConfig;\n  private taskQueues: Map<TimerFrequency, TimerTask[]> = new Map();\n  private consolidatedTimers: Map<TimerFrequency, string> = new Map();\n  private performanceMetrics = {\n    totalTasks: 0,\n    executedTasks: 0,\n    averageExecutionTime: 0,\n    lastOptimization: Date.now()\n  };\n\n  constructor(config: Partial<TimerOptimizerConfig> = {}) {\n    this.optimizerConfig = {\n      enableConsolidation: true,  // 默认启用优化模式\n      enableAdaptiveFrequency: true,\n      maxTimersPerFrequency: 10,\n      loadThreshold: 0.7,\n      ...config\n    };\n\n    // 初始化任务队列\n    Object.values(TimerFrequency).forEach(frequency => {\n      if (typeof frequency === 'number') {\n        this.taskQueues.set(frequency, []);\n      }\n    });\n\n    this.logger.debug('Timer manager initialized with optimization', {}, {\n      config: this.optimizerConfig,\n      supportedFrequencies: Object.values(TimerFrequency).filter(f => typeof f === 'number')\n    });\n  }\n  \n  /**\n   * 添加定时器 (传统方式)\n   * @param name 定时器名称\n   * @param callback 回调函数\n   * @param interval 间隔时间(毫秒)\n   * @returns 定时器ID\n   */\n  /**\n   * 添加定时器 - 统一使用优化模式\n   * @param name 定时器名称\n   * @param callback 回调函数\n   * @param interval 间隔时间(毫秒)\n   * @returns 定时器ID\n   */\n  addTimer(name: string, callback: () => void, interval: number): string {\n    return this.addOptimizedTimer({\n      name,\n      callback,\n      interval,\n      priority: this.determinePriority(interval),\n      protocol: this.extractProtocol(name)\n    });\n  }\n\n  /**\n   * 添加优化定时器 - Phase 3\n   * @param task 定时器任务\n   * @returns 任务ID\n   */\n  addOptimizedTimer(task: Omit<TimerTask, 'id' | 'lastExecuted' | 'executionCount'>): string {\n    const taskId = `${task.name}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n    const optimizedTask: TimerTask = {\n      ...task,\n      id: taskId,\n      lastExecuted: 0,\n      executionCount: 0\n    };\n\n    // 根据间隔选择最佳频率\n    const frequency = this.selectOptimalFrequency(task.interval);\n    const taskQueue = this.taskQueues.get(frequency);\n\n    if (taskQueue) {\n      taskQueue.push(optimizedTask);\n      this.performanceMetrics.totalTasks++;\n\n      // this.logger.debug('Optimized task added', {}, {\n      //   taskId,\n      //   name: task.name,\n      //   originalInterval: task.interval,\n      //   optimizedFrequency: frequency,\n      //   queueSize: taskQueue.length\n      // });\n\n      // 重新优化定时器\n      this.optimizeTimers();\n    }\n\n    return taskId;\n  }\n\n  /**\n   * 创建物理定时器 - 用于合并定时器的底层实现\n   */\n  private createPhysicalTimer(name: string, callback: () => void, interval: number): string {\n    const timerId = `${name}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n    \n    const wrappedCallback = () => {\n      try {\n        callback();\n      } catch (error) {\n        this.logger.error('Timer callback error', { \n          name, \n          timerId, \n          error: error instanceof Error ? error.message : String(error) \n        });\n      }\n    };\n\n    const timer = setInterval(wrappedCallback, interval);\n    // 使用 unref() 确保定时器不会阻止进程退出\n    // 在测试环境中，fake timers 可能没有 unref 方法，需要安全检查\n    if (typeof timer.unref === 'function') {\n      timer.unref();\n    }\n    \n    const timerInfo: TimerInfo = {\n      id: timerId,\n      name,\n      interval,\n      callback: wrappedCallback,\n      timer,\n      createdAt: Date.now(),\n      lastExecuted: Date.now()\n    };\n\n    this.timers.set(timerId, timerInfo);\n    \n    // this.logger.debug('Physical timer created', { \n    //   interval, \n    //   name, \n    //   totalTimers: this.timers.size \n    // });\n    \n    return timerId;\n  }\n\n  /**\n   * 清理指定定时器 - 支持逻辑定时器清理\n   * @param timerIdOrName 定时器ID或名称\n   * @returns 是否成功清理\n   */\n  clearTimer(timerIdOrName: string): boolean {\n    // 首先尝试从任务队列中移除（通过ID或名称）\n    for (const [_frequency, tasks] of this.taskQueues) {\n      const taskIndex = tasks.findIndex(task => \n        task.id === timerIdOrName || task.name === timerIdOrName\n      );\n      if (taskIndex !== -1) {\n        // const task = tasks[taskIndex];\n        // tasks.splice(taskIndex, 1);\n        this.performanceMetrics.totalTasks--;\n        \n        // this.logger.debug(`Logical timer '${timerIdOrName}' cleared`, {}, {\n        //   name: task.name,\n        //   id: task.id,\n        //   _frequency,\n        //   remainingTasks: tasks.length\n        // });\n        \n        // 重新优化定时器\n        this.optimizeTimers();\n        return true;\n      }\n    }\n    \n    // 如果不是逻辑定时器，尝试清理物理定时器\n    const timerInfo = this.timers.get(timerIdOrName);\n    if (timerInfo) {\n      clearInterval(timerInfo.timer);\n      this.timers.delete(timerIdOrName);\n      \n      // this.logger.debug(`Physical timer '${timerIdOrName}' cleared`, {}, {\n      //   name: timerInfo.name,\n      //   uptime: Date.now() - timerInfo.createdAt,\n      //   remainingTimers: this.timers.size\n      // });\n      \n      return true;\n    }\n    \n    this.logger.warn(`Timer '${timerIdOrName}' not found for clearing`);\n    return false;\n  }\n\n  /**\n   * 清理所有定时器 - 支持逻辑和物理定时器清理\n   */\n  clearAllTimers(): void {\n    const logicalTimerCount = this.performanceMetrics.totalTasks;\n    const physicalTimerCount = this.timers.size;\n    \n    this.logger.debug(`Clearing all timers`, {}, { \n      logicalTimers: logicalTimerCount,\n      physicalTimers: physicalTimerCount \n    });\n\n    // 清理逻辑定时器（任务队列）\n    this.taskQueues.clear();\n    this.performanceMetrics.totalTasks = 0;\n    this.performanceMetrics.executedTasks = 0;\n\n    // 重新初始化任务队列\n    Object.values(TimerFrequency).forEach(frequency => {\n      if (typeof frequency === 'number') {\n        this.taskQueues.set(frequency, []);\n      }\n    });\n\n    // 清理物理定时器\n    for (const [timerId, timerInfo] of this.timers) {\n      try {\n        clearInterval(timerInfo.timer);\n        // this.logger.debug(`Physical timer '${timerId}' cleared in batch`, {}, {\n        //   name: timerInfo.name,\n        //   uptime: Date.now() - timerInfo.createdAt\n        // });\n      } catch (error) {\n        this.logger.error(`Error clearing timer '${timerId}':`, {}, error);\n      }\n    }\n\n    this.timers.clear();\n    this.consolidatedTimers.clear();\n    \n    this.logger.debug(`All timers cleared successfully`, {}, {\n      clearedLogicalTimers: logicalTimerCount,\n      clearedPhysicalTimers: physicalTimerCount\n    });\n  }\n\n  /**\n   * 获取活跃定时器数量 - 返回逻辑定时器数量\n   */\n  getActiveTimerCount(): number {\n    // 在优化模式下，返回任务数量而不是物理定时器数量\n    return this.performanceMetrics.totalTasks;\n  }\n\n  /**\n   * 获取所有定时器名称 - 返回逻辑定时器名称\n   */\n  getTimerNames(): string[] {\n    const names: string[] = [];\n    for (const tasks of this.taskQueues.values()) {\n      names.push(...tasks.map(task => task.name));\n    }\n    return names;\n  }\n\n  /**\n   * 获取定时器详细信息\n   */\n  getTimerInfo(timerId: string): TimerInfo | undefined {\n    return this.timers.get(timerId);\n  }\n\n  /**\n   * 获取所有定时器统计信息 - 返回逻辑定时器统计\n   */\n  getTimerStats(): {\n    totalTimers: number;\n    timers: Array<{\n      id: string;\n      name: string;\n      interval: number;\n      uptime: number;\n      lastExecuted?: number;\n      priority: string;\n      executionCount: number;\n    }>;\n  } {\n    const now = Date.now();\n    const timers: Array<{\n      id: string;\n      name: string;\n      interval: number;\n      uptime: number;\n      lastExecuted?: number;\n      priority: string;\n      executionCount: number;\n    }> = [];\n    \n    // 收集所有逻辑定时器信息\n    for (const tasks of this.taskQueues.values()) {\n      for (const task of tasks) {\n        timers.push({\n          id: task.id,\n          name: task.name,\n          interval: task.interval,\n          uptime: now - (task.lastExecuted || now),\n          lastExecuted: task.lastExecuted,\n          priority: task.priority,\n          executionCount: task.executionCount || 0\n        });\n      }\n    }\n    \n    return {\n      totalTimers: this.performanceMetrics.totalTasks,\n      timers\n    };\n  }\n\n  /**\n   * 检查是否存在指定定时器 - 支持逻辑和物理定时器\n   */\n  hasTimer(timerId: string): boolean {\n    // 首先检查逻辑定时器\n    for (const tasks of this.taskQueues.values()) {\n      if (tasks.some(task => task.id === timerId)) {\n        return true;\n      }\n    }\n    \n    // 然后检查物理定时器\n    return this.timers.has(timerId);\n  }\n\n  /**\n   * 确定定时器优先级 - Phase 3 优化\n   */\n  private determinePriority(interval: number): 'high' | 'medium' | 'low' {\n    if (interval <= 5000) return 'high';\n    if (interval <= 30000) return 'medium';\n    return 'low';\n  }\n\n  /**\n   * 从定时器名称提取协议 - Phase 3 优化\n   */\n  private extractProtocol(name: string): string | undefined {\n    const protocolMatch = name.match(/^(http|https|http2|grpc|websocket|ws)/i);\n    return protocolMatch ? protocolMatch[1].toLowerCase() : undefined;\n  }\n\n  /**\n   * 选择最佳频率 - Phase 3 优化\n   */\n  private selectOptimalFrequency(interval: number): TimerFrequency {\n    const frequencies = [TimerFrequency.HIGH, TimerFrequency.MEDIUM, TimerFrequency.LOW];\n    \n    // 选择最接近且不小于原间隔的频率\n    for (const freq of frequencies) {\n      if (interval <= freq) {\n        return freq;\n      }\n    }\n\n    // 如果间隔太大，使用最低频率\n    return TimerFrequency.LOW;\n  }\n\n  /**\n   * 优化定时器 - Phase 3 核心优化逻辑\n   */\n  private optimizeTimers(): void {\n    // const startTime = Date.now();\n\n    // 清理现有的合并定时器\n    this.clearConsolidatedTimers();\n\n    // 为每个频率创建合并定时器\n    for (const [frequency, tasks] of this.taskQueues) {\n      if (tasks.length > 0) {\n        this.createConsolidatedTimer(frequency, tasks);\n      }\n    }\n\n    // const optimizationTime = Date.now() - startTime;\n    this.performanceMetrics.lastOptimization = Date.now();\n\n    // this.logger.debug('Timer optimization completed', {}, {\n    //   optimizationTime,\n    //   totalTasks: this.performanceMetrics.totalTasks,\n    //   activeFrequencies: this.consolidatedTimers.size,\n    //   consolidatedTimers: Array.from(this.consolidatedTimers.keys())\n    // });\n  }\n\n  /**\n   * 创建合并定时器 - Phase 3 优化\n   */\n  private createConsolidatedTimer(frequency: TimerFrequency, tasks: TimerTask[]): void {\n    const timerName = `consolidated_${frequency}ms`;\n    \n    const timerId = this.createPhysicalTimer(timerName, () => {\n      this.executeTaskBatch(frequency, tasks);\n    }, frequency);\n\n    this.consolidatedTimers.set(frequency, timerId);\n\n    // this.logger.debug('Consolidated timer created', {}, {\n    //   frequency,\n    //   taskCount: tasks.length,\n    //   timerId,\n    //   tasks: tasks.map(t => ({ name: t.name, priority: t.priority }))\n    // });\n  }\n\n  /**\n   * 执行任务批次 - Phase 3 优化\n   */\n  private executeTaskBatch(frequency: TimerFrequency, tasks: TimerTask[]): void {\n    // const batchStartTime = Date.now();\n    let executedCount = 0;\n\n    // 按优先级排序执行\n    const sortedTasks = tasks.sort((a, b) => {\n      const priorityOrder = { high: 3, medium: 2, low: 1 };\n      return priorityOrder[b.priority] - priorityOrder[a.priority];\n    });\n\n    for (const task of sortedTasks) {\n      try {\n        const taskStartTime = Date.now();\n        \n        // 检查是否需要执行（基于自适应频率）\n        if (this.shouldExecuteTask(task, frequency)) {\n          task.callback();\n          task.lastExecuted = Date.now();\n          task.executionCount = (task.executionCount || 0) + 1;\n          executedCount++;\n\n          const taskExecutionTime = Date.now() - taskStartTime;\n          \n          // 更新平均执行时间\n          this.updateAverageExecutionTime(taskExecutionTime);\n        }\n      } catch (error) {\n        this.logger.error('Task execution error', {}, {\n          taskId: task.id,\n          taskName: task.name,\n          error: error instanceof Error ? error.message : String(error)\n        });\n      }\n    }\n\n    // const batchExecutionTime = Date.now() - batchStartTime;\n    this.performanceMetrics.executedTasks += executedCount;\n\n    // 记录批次执行统计（仅在有执行任务时）\n    // if (executedCount > 0) {\n    //   this.logger.debug('Task batch executed', {}, {\n    //     frequency,\n    //     totalTasks: tasks.length,\n    //     executedTasks: executedCount,\n    //     batchExecutionTime,\n    //     averageTaskTime: executedCount > 0 ? batchExecutionTime / executedCount : 0\n    //   });\n    // }\n  }\n\n  /**\n   * 判断是否应该执行任务（自适应频率）- Phase 3 优化\n   */\n  private shouldExecuteTask(task: TimerTask, frequency: TimerFrequency): boolean {\n    if (!this.optimizerConfig.enableAdaptiveFrequency) {\n      return true;\n    }\n\n    // 高优先级任务总是执行\n    if (task.priority === 'high') {\n      return true;\n    }\n\n    // 基于原始间隔和当前频率计算执行概率\n    const intervalRatio = task.interval / frequency;\n    \n    // 如果原始间隔小于等于当前频率，总是执行\n    if (intervalRatio <= 1) {\n      return true;\n    }\n\n    // 基于间隔比例和上次执行时间决定是否执行\n    const timeSinceLastExecution = Date.now() - (task.lastExecuted || 0);\n    return timeSinceLastExecution >= task.interval;\n  }\n\n  /**\n   * 更新平均执行时间 - Phase 3 优化\n   */\n  private updateAverageExecutionTime(executionTime: number): void {\n    const alpha = 0.1; // 指数移动平均的平滑因子\n    this.performanceMetrics.averageExecutionTime = \n      this.performanceMetrics.averageExecutionTime * (1 - alpha) + executionTime * alpha;\n  }\n\n  /**\n   * 清理合并定时器 - Phase 3 优化\n   */\n  private clearConsolidatedTimers(): void {\n    for (const timerId of this.consolidatedTimers.values()) {\n      this.clearTimer(timerId);\n    }\n    this.consolidatedTimers.clear();\n  }\n\n  /**\n   * 获取优化统计信息 - Phase 3 优化\n   */\n  getOptimizationStats() {\n    const tasksByFrequency = new Map<TimerFrequency, number>();\n    const tasksByPriority = { high: 0, medium: 0, low: 0 };\n\n    for (const [frequency, tasks] of this.taskQueues) {\n      tasksByFrequency.set(frequency, tasks.length);\n      \n      for (const task of tasks) {\n        tasksByPriority[task.priority]++;\n      }\n    }\n\n    return {\n      performance: this.performanceMetrics,\n      consolidation: {\n        activeTimers: this.consolidatedTimers.size,\n        totalTasks: this.performanceMetrics.totalTasks,\n        tasksByFrequency: Object.fromEntries(tasksByFrequency),\n        tasksByPriority\n      },\n      config: this.optimizerConfig\n    };\n  }\n\n  /**\n   * 演示Phase 3优化功能 - 创建优化版本的TimerManager实例\n   */\n  static createOptimizedInstance(): TimerManager {\n    return new TimerManager({\n      enableConsolidation: true,\n      enableAdaptiveFrequency: true,\n      maxTimersPerFrequency: 10,\n      loadThreshold: 0.7\n    });\n  }\n\n  /**\n   * 演示定时器优化效果\n   */\n  demonstrateOptimization(): {\n    before: { timerCount: number; intervals: number[] };\n    after: { consolidatedTimers: number; frequencies: number[]; estimatedReduction: string };\n  } {\n    // 模拟传统方式的定时器使用\n    const traditionalIntervals = [5000, 5000, 30000, 30000, 30000, 60000, 60000];\n    \n    // 优化后的频率\n    const optimizedFrequencies = [TimerFrequency.HIGH, TimerFrequency.MEDIUM, TimerFrequency.LOW];\n    \n    const reduction = ((traditionalIntervals.length - optimizedFrequencies.length) / traditionalIntervals.length * 100).toFixed(1);\n    \n    return {\n      before: {\n        timerCount: traditionalIntervals.length,\n        intervals: traditionalIntervals\n      },\n      after: {\n        consolidatedTimers: optimizedFrequencies.length,\n        frequencies: optimizedFrequencies,\n        estimatedReduction: `${reduction}% timer reduction`\n      }\n    };\n  }\n\n  /**\n   * 安全销毁管理器\n   */\n  destroy(): void {\n    this.logger.debug('TimerManager destroying', {}, {\n      activeTimers: this.timers.size,\n      totalTasks: this.performanceMetrics.totalTasks,\n      executedTasks: this.performanceMetrics.executedTasks,\n      activeConsolidatedTimers: this.consolidatedTimers.size\n    });\n\n    this.clearConsolidatedTimers();\n    this.taskQueues.clear();\n    this.clearAllTimers();\n    \n    this.logger.debug('TimerManager destroyed successfully');\n  }\n}\n\n/**\n * 全局定时器管理器实例\n * 可用于跨模块的定时器管理\n * 默认启用优化功能\n */\nexport const globalTimerManager = new TimerManager({\n  enableConsolidation: true,  // 默认启用优化模式\n  enableAdaptiveFrequency: true,\n  maxTimersPerFrequency: 10,\n  loadThreshold: 0.7\n}); ","/* \n * @Description: Ring buffer for efficient fixed-size circular data storage\n * @Usage: 用于高效的固定大小循环数据存储，避免频繁的数组操作\n * @Author: richen\n * @Date: 2025-10-12\n * @License: BSD (3-Clause)\n */\n\nimport { createLogger } from \"./logger\";\n\n/**\n * Ring Buffer (Circular Buffer)\n * 环形缓冲区 - 固定大小的循环队列，覆盖最旧的数据\n * \n * Features:\n * - O(1) write operations (no array shifts or slices)\n * - O(1) amortized read operations\n * - Fixed memory footprint\n * - Automatic overwrite of oldest data when full\n */\nexport class RingBuffer<T = number> {\n  private buffer: T[];\n  private head: number = 0;  // Write position\n  private tail: number = 0;  // Read position (oldest item)\n  private count: number = 0; // Number of items in buffer\n  private readonly capacity: number;\n\n  /**\n   * Create a ring buffer with fixed capacity\n   * @param capacity Maximum number of items to store\n   */\n  constructor(capacity: number) {\n    if (capacity <= 0) {\n      throw new Error('Ring buffer capacity must be greater than 0');\n    }\n    \n    this.capacity = capacity;\n    this.buffer = new Array<T>(capacity);\n  }\n\n  /**\n   * Add an item to the buffer\n   * If buffer is full, overwrites the oldest item\n   * @param item Item to add\n   */\n  push(item: T): void {\n    this.buffer[this.head] = item;\n    this.head = (this.head + 1) % this.capacity;\n    \n    if (this.count < this.capacity) {\n      this.count++;\n    } else {\n      // Buffer is full, move tail to overwrite oldest item\n      this.tail = (this.tail + 1) % this.capacity;\n    }\n  }\n\n  /**\n   * Get all items in insertion order (oldest to newest)\n   * @returns Array of items\n   */\n  toArray(): T[] {\n    if (this.count === 0) {\n      return [];\n    }\n    \n    const result: T[] = new Array(this.count);\n    let index = this.tail;\n    \n    for (let i = 0; i < this.count; i++) {\n      result[i] = this.buffer[index];\n      index = (index + 1) % this.capacity;\n    }\n    \n    return result;\n  }\n\n  /**\n   * Get a sorted copy of the buffer contents\n   * @param compareFn Optional comparison function\n   * @returns Sorted array\n   */\n  toSortedArray(compareFn?: (a: T, b: T) => number): T[] {\n    return this.toArray().sort(compareFn);\n  }\n\n  /**\n   * Clear all items from the buffer\n   */\n  clear(): void {\n    this.head = 0;\n    this.tail = 0;\n    this.count = 0;\n  }\n\n  /**\n   * Get the number of items currently in the buffer\n   * @returns Current item count\n   */\n  get length(): number {\n    return this.count;\n  }\n\n  /**\n   * Get the maximum capacity of the buffer\n   * @returns Buffer capacity\n   */\n  get size(): number {\n    return this.capacity;\n  }\n\n  /**\n   * Check if buffer is empty\n   * @returns True if empty\n   */\n  isEmpty(): boolean {\n    return this.count === 0;\n  }\n\n  /**\n   * Check if buffer is full\n   * @returns True if full\n   */\n  isFull(): boolean {\n    return this.count === this.capacity;\n  }\n\n  /**\n   * Get an item at a specific index (0 = oldest, length-1 = newest)\n   * @param index Index to retrieve\n   * @returns Item at index or undefined if out of range\n   */\n  get(index: number): T | undefined {\n    if (index < 0 || index >= this.count) {\n      return undefined;\n    }\n    \n    const actualIndex = (this.tail + index) % this.capacity;\n    return this.buffer[actualIndex];\n  }\n\n  /**\n   * Get the oldest item without removing it\n   * @returns Oldest item or undefined if buffer is empty\n   */\n  peek(): T | undefined {\n    if (this.count === 0) {\n      return undefined;\n    }\n    return this.buffer[this.tail];\n  }\n\n  /**\n   * Get the newest item\n   * @returns Newest item or undefined if buffer is empty\n   */\n  peekLast(): T | undefined {\n    if (this.count === 0) {\n      return undefined;\n    }\n    const lastIndex = (this.head - 1 + this.capacity) % this.capacity;\n    return this.buffer[lastIndex];\n  }\n\n  /**\n   * Calculate percentile from buffer contents (e.g., 0.5 for median, 0.95 for P95)\n   * @param percentile Percentile value between 0 and 1\n   * @returns Percentile value or undefined if buffer is empty\n   */\n  getPercentile(percentile: number): T | undefined {\n    if (this.count === 0 || percentile < 0 || percentile > 1) {\n      return undefined;\n    }\n    \n    // For number types, we can calculate percentile directly\n    const sorted = this.toSortedArray((a: unknown, b: unknown) => (a as number) - (b as number));\n    const index = Math.floor(sorted.length * percentile);\n    return sorted[Math.min(index, sorted.length - 1)];\n  }\n\n  /**\n   * Get average of numeric buffer contents\n   * @returns Average value or undefined if buffer is empty\n   */\n  getAverage(): number | undefined {\n    if (this.count === 0) {\n      return undefined;\n    }\n    \n    let sum = 0;\n    for (let i = 0; i < this.count; i++) {\n      const value = this.get(i) as unknown;\n      sum += Number(value) || 0;\n    }\n    \n    return sum / this.count;\n  }\n\n  /**\n   * Iterate over buffer contents (oldest to newest)\n   * @param callback Function to call for each item\n   */\n  forEach(callback: (item: T, index: number) => void): void {\n    for (let i = 0; i < this.count; i++) {\n      const item = this.get(i);\n      if (item !== undefined) {\n        callback(item, i);\n      }\n    }\n  }\n\n  /**\n   * Map buffer contents to a new array\n   * @param callback Function to transform each item\n   * @returns New array of transformed items\n   */\n  map<U>(callback: (item: T, index: number) => U): U[] {\n    const result: U[] = new Array(this.count);\n    for (let i = 0; i < this.count; i++) {\n      const item = this.get(i);\n      if (item !== undefined) {\n        result[i] = callback(item, i);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Filter buffer contents\n   * @param predicate Function to test each item\n   * @returns New array of items that pass the test\n   */\n  filter(predicate: (item: T, index: number) => boolean): T[] {\n    const result: T[] = [];\n    for (let i = 0; i < this.count; i++) {\n      const item = this.get(i);\n      if (item !== undefined && predicate(item, i)) {\n        result.push(item);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Reduce buffer contents to a single value\n   * @param callback Reducer function\n   * @param initialValue Initial value for the accumulator\n   * @returns Reduced value\n   */\n  reduce<U>(callback: (accumulator: U, item: T, index: number) => U, initialValue: U): U {\n    let accumulator = initialValue;\n    for (let i = 0; i < this.count; i++) {\n      const item = this.get(i);\n      if (item !== undefined) {\n        accumulator = callback(accumulator, item, i);\n      }\n    }\n    return accumulator;\n  }\n}\n\n/**\n * Dynamic Ring Buffer (Auto-resizing Circular Buffer)\n * 动态环形缓冲区 - 支持自动扩容和缩容\n *\n * Features:\n * - O(1) write operations (no array shifts or slices)\n * - O(1) amortized read operations\n * - Dynamic capacity adjustment based on usage\n * - Memory-efficient with upper and lower bounds\n * - Automatic overwrite of oldest data when full\n *\n * Use cases:\n * - High-frequency metrics collection\n * - Adaptive performance monitoring\n * - Memory-constrained environments\n */\nexport class DynamicRingBuffer<T = number> {\n  private buffer: T[];\n  private head: number = 0;  // Write position\n  private tail: number = 0;  // Read position (oldest item)\n  private count: number = 0; // Number of items in buffer\n\n  // Capacity management\n  private currentCapacity: number;\n  private initialCapacity: number;\n  private maxCapacity: number;\n  private minCapacity: number;\n\n  // Auto-resize configuration\n  private autoResize: boolean;\n  private resizeThreshold: number;    // Threshold to trigger resize (0-1)\n  private shrinkThreshold: number;    // Threshold to trigger shrink (0-1)\n  private resizeFactor: number;      // Factor to grow/shrink by\n\n  // Resize tracking\n  private lastResizeTime: number = 0;\n  private resizeCooldown: number;     // Minimum time between resizes (ms)\n  private resizeCount: number = 0;    // Total resize operations\n  private logger = createLogger({ module: 'DynamicRingBuffer' });\n\n  /**\n   * Create a dynamic ring buffer with auto-resize capability\n   * @param initialCapacity Starting capacity\n   * @param options Configuration options\n   */\n  constructor(\n    initialCapacity: number,\n    options: {\n      maxCapacity?: number;\n      minCapacity?: number;\n      autoResize?: boolean;\n      resizeThreshold?: number;\n      shrinkThreshold?: number;\n      resizeFactor?: number;\n      resizeCooldown?: number;\n    } = {}\n  ) {\n    if (initialCapacity <= 0) {\n      throw new Error('Initial capacity must be greater than 0');\n    }\n\n    this.initialCapacity = initialCapacity;\n    this.currentCapacity = initialCapacity;\n    this.maxCapacity = options.maxCapacity || Math.max(initialCapacity * 10, 10000);\n    this.minCapacity = options.minCapacity || Math.max(Math.floor(initialCapacity / 2), 10);\n    this.autoResize = options.autoResize ?? true;\n    this.resizeThreshold = options.resizeThreshold ?? 0.85;\n    this.shrinkThreshold = options.shrinkThreshold ?? 0.3;\n    this.resizeFactor = options.resizeFactor ?? 2;\n    this.resizeCooldown = options.resizeCooldown ?? 5000;\n\n    this.buffer = new Array<T>(this.currentCapacity);\n  }\n\n  /**\n   * Add an item to buffer with auto-resize\n   * If buffer is full, triggers resize or overwrites oldest item\n   * @param item Item to add\n   */\n  push(item: T): void {\n    this.buffer[this.head] = item;\n    this.head = (this.head + 1) % this.currentCapacity;\n\n    if (this.count < this.currentCapacity) {\n      this.count++;\n    } else {\n      // Buffer is full\n      if (this.autoResize && this.shouldResizeUp()) {\n        this.resizeUp();\n      } else {\n        // Move tail to overwrite oldest item\n        this.tail = (this.tail + 1) % this.currentCapacity;\n      }\n    }\n\n    // Check for shrink opportunity\n    if (this.autoResize && this.shouldResizeDown()) {\n      this.resizeDown();\n    }\n  }\n\n  /**\n   * Check if buffer should expand\n   */\n  private shouldResizeUp(): boolean {\n    const now = Date.now();\n    const timeSinceLastResize = now - this.lastResizeTime;\n\n    // Resize if at threshold and cooldown passed\n    return (\n      this.count / this.currentCapacity >= this.resizeThreshold &&\n      this.currentCapacity < this.maxCapacity &&\n      timeSinceLastResize >= this.resizeCooldown\n    );\n  }\n\n  /**\n   * Check if buffer should shrink\n   */\n  private shouldResizeDown(): boolean {\n    const now = Date.now();\n    const timeSinceLastResize = now - this.lastResizeTime;\n\n    // Shrink if below threshold and cooldown passed\n    return (\n      this.count / this.currentCapacity <= this.shrinkThreshold &&\n      this.currentCapacity > this.minCapacity &&\n      timeSinceLastResize >= this.resizeCooldown\n    );\n  }\n\n  /**\n   * Expand buffer capacity\n   */\n  private resizeUp(): void {\n    const newCapacity = Math.min(\n      Math.floor(this.currentCapacity * this.resizeFactor),\n      this.maxCapacity\n    );\n\n    this.logger.info('Expanding ring buffer', {\n      oldCapacity: this.currentCapacity,\n      newCapacity,\n      itemCount: this.count\n    });\n\n    const newBuffer = new Array<T>(newCapacity);\n\n    // Copy items in order (oldest to newest)\n    for (let i = 0; i < this.count; i++) {\n      newBuffer[i] = this.get(i)!;\n    }\n\n    this.buffer = newBuffer;\n    this.currentCapacity = newCapacity;\n    this.head = this.count;\n    this.tail = 0;\n    this.lastResizeTime = Date.now();\n    this.resizeCount++;\n  }\n\n  /**\n   * Shrink buffer capacity\n   */\n  private resizeDown(): void {\n    const newCapacity = Math.max(\n      Math.floor(this.currentCapacity / this.resizeFactor),\n      this.minCapacity\n    );\n\n    this.logger.info('Shrinking ring buffer', {\n      oldCapacity: this.currentCapacity,\n      newCapacity,\n      itemCount: this.count\n    });\n\n    const newBuffer = new Array<T>(newCapacity);\n\n    // Copy items in order (oldest to newest)\n    for (let i = 0; i < this.count; i++) {\n      newBuffer[i] = this.get(i)!;\n    }\n\n    this.buffer = newBuffer;\n    this.currentCapacity = newCapacity;\n    this.head = this.count;\n    this.tail = 0;\n    this.lastResizeTime = Date.now();\n    this.resizeCount++;\n  }\n\n  /**\n   * Get all items in insertion order (oldest to newest)\n   * @returns Array of items\n   */\n  toArray(): T[] {\n    if (this.count === 0) {\n      return [];\n    }\n\n    const result: T[] = new Array(this.count);\n    let index = this.tail;\n\n    for (let i = 0; i < this.count; i++) {\n      result[i] = this.buffer[index];\n      index = (index + 1) % this.currentCapacity;\n    }\n\n    return result;\n  }\n\n  /**\n   * Get a sorted copy of buffer contents\n   * @param compareFn Optional comparison function\n   * @returns Sorted array\n   */\n  toSortedArray(compareFn?: (a: T, b: T) => number): T[] {\n    return this.toArray().sort(compareFn);\n  }\n\n  /**\n   * Clear all items from buffer\n   */\n  clear(): void {\n    this.head = 0;\n    this.tail = 0;\n    this.count = 0;\n    // Reset to initial capacity\n    if (this.autoResize && this.currentCapacity !== this.initialCapacity) {\n      this.currentCapacity = this.initialCapacity;\n      this.buffer = new Array<T>(this.currentCapacity);\n    }\n  }\n\n  /**\n   * Get number of items currently in buffer\n   * @returns Current item count\n   */\n  get length(): number {\n    return this.count;\n  }\n\n  /**\n   * Get current capacity of buffer\n   * @returns Current capacity\n   */\n  get size(): number {\n    return this.currentCapacity;\n  }\n\n  /**\n   * Get initial capacity\n   * @returns Initial capacity\n   */\n  get initialSize(): number {\n    return this.initialCapacity;\n  }\n\n  /**\n   * Get maximum capacity\n   * @returns Maximum capacity\n   */\n  get maxSize(): number {\n    return this.maxCapacity;\n  }\n\n  /**\n   * Get minimum capacity\n   * @returns Minimum capacity\n   */\n  get minSize(): number {\n    return this.minCapacity;\n  }\n\n  /**\n   * Check if buffer is empty\n   * @returns True if empty\n   */\n  isEmpty(): boolean {\n    return this.count === 0;\n  }\n\n  /**\n   * Check if buffer is full\n   * @returns True if full\n   */\n  isFull(): boolean {\n    return this.count === this.currentCapacity;\n  }\n\n  /**\n   * Get utilization ratio (0-1)\n   * @returns Utilization ratio\n   */\n  get utilization(): number {\n    return this.count / this.currentCapacity;\n  }\n\n  /**\n   * Get an item at a specific index (0 = oldest, length-1 = newest)\n   * @param index Index to retrieve\n   * @returns Item at index or undefined if out of range\n   */\n  get(index: number): T | undefined {\n    if (index < 0 || index >= this.count) {\n      return undefined;\n    }\n\n    const actualIndex = (this.tail + index) % this.currentCapacity;\n    return this.buffer[actualIndex];\n  }\n\n  /**\n   * Get oldest item without removing it\n   * @returns Oldest item or undefined if buffer is empty\n   */\n  peek(): T | undefined {\n    if (this.count === 0) {\n      return undefined;\n    }\n    return this.buffer[this.tail];\n  }\n\n  /**\n   * Get newest item\n   * @returns Newest item or undefined if buffer is empty\n   */\n  peekLast(): T | undefined {\n    if (this.count === 0) {\n      return undefined;\n    }\n    const lastIndex = (this.head - 1 + this.currentCapacity) % this.currentCapacity;\n    return this.buffer[lastIndex];\n  }\n\n  /**\n   * Calculate percentile from buffer contents (e.g., 0.5 for median, 0.95 for P95)\n   * @param percentile Percentile value between 0 and 1\n   * @returns Percentile value or undefined if buffer is empty\n   */\n  getPercentile(percentile: number): T | undefined {\n    if (this.count === 0 || percentile < 0 || percentile > 1) {\n      return undefined;\n    }\n\n    // For number types, we can calculate percentile directly\n    const sorted = this.toSortedArray((a: unknown, b: unknown) => (a as number) - (b as number));\n    const index = Math.floor(sorted.length * percentile);\n    return sorted[Math.min(index, sorted.length - 1)];\n  }\n\n  /**\n   * Get average of numeric buffer contents\n   * @returns Average value or undefined if buffer is empty\n   */\n  getAverage(): number | undefined {\n    if (this.count === 0) {\n      return undefined;\n    }\n\n    let sum = 0;\n    for (let i = 0; i < this.count; i++) {\n      const value = this.get(i) as unknown;\n      sum += Number(value) || 0;\n    }\n\n    return sum / this.count;\n  }\n\n  /**\n   * Iterate over buffer contents (oldest to newest)\n   * @param callback Function to call for each item\n   */\n  forEach(callback: (item: T, index: number) => void): void {\n    for (let i = 0; i < this.count; i++) {\n      const item = this.get(i);\n      if (item !== undefined) {\n        callback(item, i);\n      }\n    }\n  }\n\n  /**\n   * Map buffer contents to a new array\n   * @param callback Function to transform each item\n   * @returns New array of transformed items\n   */\n  map<U>(callback: (item: T, index: number) => U): U[] {\n    const result: U[] = new Array(this.count);\n    for (let i = 0; i < this.count; i++) {\n      const item = this.get(i);\n      if (item !== undefined) {\n        result[i] = callback(item, i);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Filter buffer contents\n   * @param predicate Function to test each item\n   * @returns New array of items that pass test\n   */\n  filter(predicate: (item: T, index: number) => boolean): T[] {\n    const result: T[] = [];\n    for (let i = 0; i < this.count; i++) {\n      const item = this.get(i);\n      if (item !== undefined && predicate(item, i)) {\n        result.push(item);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Reduce buffer contents to a single value\n   * @param callback Reducer function\n   * @param initialValue Initial value for accumulator\n   * @returns Reduced value\n   */\n  reduce<U>(callback: (accumulator: U, item: T, index: number) => U, initialValue: U): U {\n    let accumulator = initialValue;\n    for (let i = 0; i < this.count; i++) {\n      const item = this.get(i);\n      if (item !== undefined) {\n        accumulator = callback(accumulator, item, i);\n      }\n    }\n    return accumulator;\n  }\n\n  /**\n   * Manually trigger resize up\n   * @param factor Optional resize factor override\n   */\n  resizeUpManual(factor?: number): void {\n    const oldFactor = this.resizeFactor;\n    if (factor !== undefined) {\n      this.resizeFactor = factor;\n    }\n    if (this.shouldResizeUp()) {\n      this.resizeUp();\n    }\n    this.resizeFactor = oldFactor;\n  }\n\n  /**\n   * Manually trigger resize down\n   * @param factor Optional resize factor override\n   */\n  resizeDownManual(factor?: number): void {\n    const oldFactor = this.resizeFactor;\n    if (factor !== undefined) {\n      this.resizeFactor = factor;\n    }\n    if (this.shouldResizeDown()) {\n      this.resizeDown();\n    }\n    this.resizeFactor = oldFactor;\n  }\n\n  /**\n   * Get resize statistics\n   */\n  getStats() {\n    return {\n      resizeCount: this.resizeCount,\n      lastResizeTime: this.lastResizeTime,\n      currentCapacity: this.currentCapacity,\n      utilization: this.utilization,\n      resizeThreshold: this.resizeThreshold,\n      shrinkThreshold: this.shrinkThreshold\n    };\n  }\n\n}\n","/*\n * @Description: 统一连接池管理接口\n * @Usage: 为各协议提供统一的连接池管理接口\n * @Author: richen\n * @Date: 2024-11-27 20:30:00\n * @LastEditTime: 2024-11-27 20:30:00\n */\n\nimport { createLogger, generateTraceId } from \"../utils/logger\";\nimport { ConnectionPoolConfig } from \"../config/pool\";\nimport { RingBuffer } from \"../utils/ring_buffer\";\n\n/**\n * 连接统计信息接口\n */\nexport interface ConnectionStats {\n  activeConnections: number;        // 当前活跃连接数\n  totalConnections: number;         // 总连接数\n  connectionsPerSecond: number;     // 每秒连接数\n  averageLatency: number;           // 平均延迟(ms)\n  errorRate: number;                // 错误率 (0-1)\n}\n\n/**\n * 连接池状态枚举\n */\nexport enum ConnectionPoolStatus {\n  HEALTHY = 'healthy',\n  DEGRADED = 'degraded',\n  OVERLOADED = 'overloaded',\n  UNAVAILABLE = 'unavailable'\n}\n\n/**\n * 连接池健康状态\n */\nexport interface ConnectionPoolHealth {\n  status: ConnectionPoolStatus;\n  utilizationRatio: number;         // 利用率 (0-1)\n  activeConnections: number;        // 活跃连接数\n  maxConnections: number;           // 最大连接数\n  rejectedConnections: number;      // 被拒绝的连接数\n  averageResponseTime: number;      // 平均响应时间\n  errorRate: number;                // 错误率\n  message: string;                  // 状态描述\n  lastUpdated: number;              // 最后更新时间\n}\n\n/**\n * 连接池指标\n */\nexport interface ConnectionPoolMetrics extends ConnectionStats {\n  protocol: string;\n  poolConfig: ConnectionPoolConfig;\n  health: ConnectionPoolHealth;\n  performance: {\n    throughput: number;             // Throughput (requests/second)\n    latency: {\n      p50: number;\n      p95: number;\n      p99: number;\n    };\n    memoryUsage: number;            // Memory usage (bytes)\n    cpuUsage: number;               // CPU usage (percent)\n  };\n  uptime: number;                   // Uptime (milliseconds)\n}\n\n/**\n * Connection pool event types\n */\nexport enum ConnectionPoolEvent {\n  CONNECTION_ADDED = 'connection_added',\n  CONNECTION_REMOVED = 'connection_removed',\n  CONNECTION_TIMEOUT = 'connection_timeout',\n  CONNECTION_ERROR = 'connection_error',\n  POOL_LIMIT_REACHED = 'pool_limit_reached',\n  HEALTH_STATUS_CHANGED = 'health_status_changed'\n}\n\n/**\n * Event data type mapping for type-safe event handling\n */\nexport interface ConnectionPoolEventMap {\n  [ConnectionPoolEvent.CONNECTION_ADDED]: { connectionId: string };\n  [ConnectionPoolEvent.CONNECTION_REMOVED]: { connectionId: string; reason?: string };\n  [ConnectionPoolEvent.CONNECTION_TIMEOUT]: { connectionId: string; timeout: number };\n  [ConnectionPoolEvent.CONNECTION_ERROR]: { connectionId?: string; error: Error };\n  [ConnectionPoolEvent.POOL_LIMIT_REACHED]: { currentConnections: number; maxConnections?: number };\n  [ConnectionPoolEvent.HEALTH_STATUS_CHANGED]: { oldStatus: ConnectionPoolStatus; newStatus: ConnectionPoolStatus; health: ConnectionPoolHealth };\n}\n\n/**\n * 连接申请选项\n */\nexport interface ConnectionRequestOptions {\n  timeout?: number;                 // 申请超时时间\n  priority?: 'low' | 'normal' | 'high'; // 优先级\n  metadata?: Record<string, any>;   // 元数据\n}\n\n/**\n * 连接申请结果\n */\nexport interface ConnectionRequestResult<T> {\n  connection: T | null;\n  success: boolean;\n  error?: Error;\n  waitTime: number;                 // 等待时间\n  connectionId?: string;            // 连接ID\n}\n\n/**\n * Abstract connection pool manager\n */\nexport abstract class ConnectionPoolManager<T = any> {\n  protected readonly logger = createLogger({ module: 'connection_pool' });\n  protected readonly config: ConnectionPoolConfig;\n  protected readonly protocol: string;\n  protected readonly startTime = Date.now();\n  protected eventListeners = new Map<ConnectionPoolEvent, Set<(data: any) => void>>();\n  private eventListenerErrors = new Map<ConnectionPoolEvent, number>();\n  \n  // 连接池核心数据\n  protected connections = new Map<string, T>();           // 活跃连接\n  protected connectionMetadata = new Map<string, any>();  // 连接元数据\n  protected waitingQueue: Array<{\n    resolve: (result: ConnectionRequestResult<T>) => void;\n    reject: (error: Error) => void;\n    options: ConnectionRequestOptions;\n    timestamp: number;\n  }> = [];\n\n  // 统计和健康状态\n  protected metrics: ConnectionPoolMetrics;\n  protected currentHealth: ConnectionPoolHealth;\n  \n  // 性能监控 - 使用环形缓冲区提高性能\n  private latencyBuffer: RingBuffer<number>;\n  private errorWindow: RingBuffer<boolean>;\n  private lastMetricsUpdate = Date.now();\n\n  // 定时器引用 - 用于清理\n  protected healthCheckInterval?: NodeJS.Timeout;\n  protected cleanupInterval?: NodeJS.Timeout;\n\n  constructor(protocol: string, config: ConnectionPoolConfig = {}) {\n    this.protocol = protocol;\n    this.config = this.validateAndNormalizeConfig(config);\n    \n    this.logger = createLogger({ \n      module: 'connection_pool', \n      protocol: this.protocol \n    });\n\n    // 初始化延迟环形缓冲区 (默认存储1000个样本)\n    this.latencyBuffer = new RingBuffer<number>(1000);\n\n    // 初始化错误率滑动窗口 (默认存储500个样本)\n    this.errorWindow = new RingBuffer<boolean>(500);\n\n    // 初始化指标\n    this.metrics = this.initializeMetrics();\n    this.currentHealth = this.initializeHealth();\n\n    this.logger.info('Connection pool manager initialized', {}, {\n      protocol: this.protocol,\n      config: this.config\n    });\n\n    // 启动定期清理和监控\n    this.startPeriodicTasks();\n  }\n\n  /**\n   * 初始化指标\n   */\n  private initializeMetrics(): ConnectionPoolMetrics {\n    return {\n      protocol: this.protocol,\n      activeConnections: 0,\n      totalConnections: 0,\n      connectionsPerSecond: 0,\n      averageLatency: 0,\n      errorRate: 0,\n      poolConfig: this.config,\n      health: this.currentHealth,\n      performance: {\n        throughput: 0,\n        latency: {\n          p50: 0,\n          p95: 0,\n          p99: 0\n        },\n        memoryUsage: 0,\n        cpuUsage: 0\n      },\n      uptime: 0\n    };\n  }\n\n  /**\n   * 初始化健康状态\n   */\n  private initializeHealth(): ConnectionPoolHealth {\n    return {\n      status: ConnectionPoolStatus.HEALTHY,\n      utilizationRatio: 0,\n      activeConnections: 0,\n      maxConnections: this.config.maxConnections || 1000,\n      rejectedConnections: 0,\n      averageResponseTime: 0,\n      errorRate: 0,\n      message: 'Connection pool is healthy',\n      lastUpdated: Date.now()\n    };\n  }\n\n  /**\n   * Validate and normalize configuration\n   */\n  protected validateAndNormalizeConfig(config: ConnectionPoolConfig): ConnectionPoolConfig {\n    const normalized: ConnectionPoolConfig = {\n      maxConnections: config.maxConnections || 1000,\n      connectionTimeout: config.connectionTimeout || 30000,\n      keepAliveTimeout: config.keepAliveTimeout || 5000,\n      requestTimeout: config.requestTimeout || 30000,\n      headersTimeout: config.headersTimeout || 10000,\n      ...config\n    };\n\n    // Validate configuration\n    if (normalized.maxConnections && normalized.maxConnections <= 0) {\n      throw new Error('maxConnections must be positive');\n    }\n    if (normalized.connectionTimeout && normalized.connectionTimeout <= 0) {\n      throw new Error('connectionTimeout must be positive');\n    }\n\n    return normalized;\n  }\n\n  /**\n   * 申请连接\n   */\n  async requestConnection(options: ConnectionRequestOptions = {}): Promise<ConnectionRequestResult<T>> {\n    const startTime = Date.now();\n    const timeout = options.timeout || this.config.connectionTimeout || 30000;\n    \n    try {\n      // 检查连接池是否可用\n      if (!this.canAcceptConnection()) {\n        this.currentHealth.rejectedConnections++;\n        this.emitEvent(ConnectionPoolEvent.POOL_LIMIT_REACHED, {\n          currentConnections: this.getActiveConnectionCount(),\n          maxConnections: this.config.maxConnections\n        });\n        \n        return {\n          connection: null,\n          success: false,\n          error: new Error('Connection pool limit reached'),\n          waitTime: Date.now() - startTime\n        };\n      }\n\n      // 尝试获取现有可用连接\n      const availableConnection = await this.getAvailableConnection();\n      if (availableConnection) {\n        return {\n          connection: availableConnection.connection,\n          success: true,\n          waitTime: Date.now() - startTime,\n          connectionId: availableConnection.id\n        };\n      }\n\n      // 创建新连接\n      const newConnection = await this.createNewConnection(options);\n      if (newConnection) {\n        await this.addConnection(newConnection.connection, newConnection.metadata);\n        return {\n          connection: newConnection.connection,\n          success: true,\n          waitTime: Date.now() - startTime,\n          connectionId: newConnection.id\n        };\n      }\n\n      // 如果无法立即获取连接，加入等待队列\n      return new Promise((resolve, reject) => {\n        const timeoutHandle = setTimeout(() => {\n          // 从等待队列中移除\n          const index = this.waitingQueue.findIndex(item => item.resolve === resolve);\n          if (index >= 0) {\n            this.waitingQueue.splice(index, 1);\n          }\n          resolve({\n            connection: null,\n            success: false,\n            error: new Error('Connection request timeout'),\n            waitTime: Date.now() - startTime\n          });\n        }, timeout);\n\n        const queueItem = {\n          resolve: (result: ConnectionRequestResult<T>) => {\n            clearTimeout(timeoutHandle);\n            resolve(result);\n          },\n          reject: (error: Error) => {\n            clearTimeout(timeoutHandle);\n            reject(error);\n          },\n          options,\n          timestamp: startTime\n        };\n\n        const priorityWeight = { low: 1, normal: 2, high: 3 };\n        const newPriority = priorityWeight[options.priority || 'normal'];\n\n        let insertIndex = this.waitingQueue.length;\n        for (let i = 0; i < this.waitingQueue.length; i++) {\n          const existingPriority = priorityWeight[this.waitingQueue[i].options.priority || 'normal'];\n          if (newPriority > existingPriority) {\n            insertIndex = i;\n            break;\n          }\n        }\n\n        this.waitingQueue.splice(insertIndex, 0, queueItem);\n      });\n\n    } catch (error) {\n      this.recordConnectionEvent('error', { error });\n      return {\n        connection: null,\n        success: false,\n        error: error as Error,\n        waitTime: Date.now() - startTime\n      };\n    }\n  }\n\n  /**\n   * 释放连接\n   */\n  async releaseConnection(connection: T, options: { destroy?: boolean; error?: Error } = {}): Promise<boolean> {\n    const traceId = generateTraceId();\n    \n    try {\n      // 查找连接ID\n      const connectionId = this.findConnectionId(connection);\n      if (!connectionId) {\n        this.logger.warn('Attempting to release unknown connection', { traceId });\n        return false;\n      }\n\n      if (options.destroy || options.error) {\n        // 销毁连接\n        await this.removeConnection(connection, options.error?.message || 'Explicitly destroyed');\n        this.logger.debug('Connection destroyed', { traceId }, { connectionId });\n      } else {\n        // 标记连接为可用状态，可以被其他请求复用\n        this.markConnectionAvailable(connectionId);\n        this.logger.debug('Connection released and marked available', { traceId }, { connectionId });\n      }\n\n      // 处理等待队列\n      await this.processWaitingQueue();\n      \n      return true;\n    } catch (error) {\n      this.logger.error('Failed to release connection', { traceId }, error);\n      return false;\n    }\n  }\n\n  /**\n   * Add connection to the pool\n   */\n  async addConnection(connection: T, metadata: any = {}): Promise<boolean> {\n    const connectionId = this.generateConnectionId();\n    \n    try {\n      if (!this.validateConnection(connection)) {\n        throw new Error('Invalid connection');\n      }\n\n      this.connections.set(connectionId, connection);\n      this.connectionMetadata.set(connectionId, {\n        ...metadata,\n        id: connectionId,\n        createdAt: Date.now(),\n        lastUsed: Date.now(),\n        available: true\n      });\n\n      this.recordConnectionEvent('added', { connectionId, metadata });\n      this.emitEvent(ConnectionPoolEvent.CONNECTION_ADDED, { connectionId, connection });\n      \n      this.logger.debug('Connection added to pool', {}, { connectionId });\n      return true;\n    } catch (error) {\n      this.logger.error('Failed to add connection to pool', {}, error);\n      return false;\n    }\n  }\n\n  /**\n   * Remove connection from pool\n   */\n  async removeConnection(connection: T, reason?: string): Promise<void> {\n    const connectionId = this.findConnectionId(connection);\n    if (!connectionId) return;\n\n    try {\n      await this.cleanupConnection(connection);\n      this.connections.delete(connectionId);\n      this.connectionMetadata.delete(connectionId);\n\n      this.recordConnectionEvent('removed', { connectionId, reason });\n      this.emitEvent(ConnectionPoolEvent.CONNECTION_REMOVED, { connectionId, reason });\n      \n      this.logger.debug('Connection removed from pool', {}, { connectionId, reason });\n    } catch (error) {\n      this.logger.error('Error removing connection from pool', {}, error);\n    }\n  }\n\n  /**\n   * Get active connection count\n   */\n  getActiveConnectionCount(): number {\n    return this.connections.size;\n  }\n\n  /**\n   * Check if the connection is healthy\n   */\n  abstract isConnectionHealthy(connection: T): boolean;\n\n  /**\n   * Close all connections\n   */\n  async closeAllConnections(timeout: number = 5000): Promise<void> {\n    const traceId = generateTraceId();\n    this.logger.info('Closing all connections', { traceId }, { \n      activeConnections: this.connections.size \n    });\n\n    const closePromises: Promise<void>[] = [];\n    \n    for (const [connectionId, connection] of this.connections) {\n      closePromises.push(\n        this.removeConnection(connection, 'Pool shutdown').catch(error => {\n          this.logger.error('Error closing connection', { traceId }, { connectionId, error });\n        })\n      );\n    }\n\n    try {\n      await Promise.race([\n        Promise.all(closePromises),\n        new Promise((_, reject) => \n          setTimeout(() => reject(new Error('Close timeout')), timeout)\n        )\n      ]);\n    } catch (error) {\n      this.logger.warn('Some connections failed to close gracefully', { traceId }, error);\n    }\n\n    this.connections.clear();\n    this.connectionMetadata.clear();\n    this.logger.info('All connections closed', { traceId });\n  }\n\n  /**\n   * Protocol-specific connection validation\n   */\n  protected abstract validateConnection(connection: T): boolean;\n\n  /**\n   * Protocol-specific connection cleanup\n   */\n  protected abstract cleanupConnection(connection: T): Promise<void>;\n\n  /**\n   * 获取可用连接\n   */\n  protected abstract getAvailableConnection(): Promise<{ connection: T; id: string } | null>;\n\n  /**\n   * 创建新连接\n   */\n  protected async createNewConnection(options: ConnectionRequestOptions): Promise<{ connection: T; id: string; metadata?: any } | null> {\n    const result = await this.createProtocolConnection(options);\n    if (result) {\n      return {\n        connection: result.connection,\n        id: this.generateConnectionId(),\n        metadata: result.metadata\n      };\n    }\n    return null;\n  }\n\n  /**\n   * Check if new connections can be accepted\n   */\n  canAcceptConnection(): boolean {\n    const maxConnections = this.config.maxConnections;\n    if (!maxConnections) return true;\n    \n    const currentConnections = this.getActiveConnectionCount();\n    return currentConnections < maxConnections;\n  }\n\n  /**\n   * Update connection pool health status\n   */\n  updateHealthStatus(): void {\n    const activeConnections = this.getActiveConnectionCount();\n    const maxConnections = this.config.maxConnections || Infinity;\n    const utilizationRatio = maxConnections === Infinity ? 0 : activeConnections / maxConnections;\n    \n    let status = ConnectionPoolStatus.HEALTHY;\n    let message = 'Connection pool is healthy';\n\n    if (utilizationRatio > 0.95) {\n      status = ConnectionPoolStatus.OVERLOADED;\n      message = 'Connection pool is overloaded';\n    } else if (utilizationRatio > 0.8) {\n      status = ConnectionPoolStatus.DEGRADED;\n      message = 'Connection pool is under high load';\n    }\n\n    const oldStatus = this.currentHealth.status;\n    this.currentHealth = {\n      ...this.currentHealth,\n      status,\n      utilizationRatio,\n      activeConnections,\n      maxConnections: maxConnections === Infinity ? 0 : maxConnections,\n      message,\n      lastUpdated: Date.now()\n    };\n\n    // 更新指标\n    this.metrics.health = this.currentHealth;\n\n    // 如果状态改变，触发事件\n    if (oldStatus !== status) {\n      this.emitEvent(ConnectionPoolEvent.HEALTH_STATUS_CHANGED, {\n        oldStatus,\n        newStatus: status,\n        health: this.currentHealth\n      });\n    }\n  }\n\n  /**\n   * Get connection pool health status\n   */\n  getHealth(): ConnectionPoolHealth {\n    this.updateHealthStatus();\n    return { ...this.currentHealth };\n  }\n\n  /**\n   * Get connection pool metrics\n   */\n  getMetrics(): ConnectionPoolMetrics {\n    const uptime = Date.now() - this.startTime;\n    \n    // Update performance metrics\n    this.updatePerformanceMetrics();\n    \n    return {\n      ...this.metrics,\n      uptime,\n      health: this.getHealth(),\n      activeConnections: this.getActiveConnectionCount()\n    };\n  }\n\n  /**\n   * Get connection pool configuration\n   */\n  getConfig(): Readonly<ConnectionPoolConfig> {\n    return { ...this.config };\n  }\n\n  /**\n   * Update connection pool configuration\n   */\n  async updateConfig(newConfig: Partial<ConnectionPoolConfig>): Promise<boolean> {\n    const traceId = generateTraceId();\n    \n    try {\n      this.logger.info('Updating connection pool configuration', { traceId }, {\n        oldConfig: this.config,\n        newConfig\n      });\n\n      const updatedConfig = this.validateAndNormalizeConfig({\n        ...this.config,\n        ...newConfig\n      });\n\n      // Apply new configuration\n      Object.assign(this.config, updatedConfig);\n      \n      // Update configuration in metrics\n      this.metrics.poolConfig = this.config;\n\n      this.logger.info('Connection pool configuration updated successfully', { traceId });\n      return true;\n    } catch (error) {\n      this.logger.error('Failed to update connection pool configuration', { traceId }, error);\n      return false;\n    }\n  }\n\n  /**\n   * Add event listener\n   */\n  on<E extends ConnectionPoolEvent>(event: E, listener: (data: ConnectionPoolEventMap[E]) => void): void {\n    if (!this.eventListeners.has(event)) {\n      this.eventListeners.set(event, new Set());\n    }\n    this.eventListeners.get(event)!.add(listener as (data: any) => void);\n  }\n\n  /**\n   * Remove event listener\n   */\n  off<E extends ConnectionPoolEvent>(event: E, listener: (data: ConnectionPoolEventMap[E]) => void): void {\n    const listeners = this.eventListeners.get(event);\n    if (listeners) {\n      listeners.delete(listener as (data: any) => void);\n    }\n  }\n\n  /**\n   * 辅助方法\n   */\n  protected generateConnectionId(): string {\n    return `${this.protocol}_${Date.now()}_${Math.random().toString(36).substr(2, 8)}`;\n  }\n\n  protected findConnectionId(connection: T): string | null {\n    for (const [id, conn] of this.connections) {\n      if (conn === connection) return id;\n    }\n    return null;\n  }\n\n  private markConnectionAvailable(connectionId: string): void {\n    const metadata = this.connectionMetadata.get(connectionId);\n    if (metadata) {\n      metadata.available = true;\n      metadata.lastUsed = Date.now();\n    }\n  }\n\n  private async processWaitingQueue(): Promise<void> {\n    while (this.waitingQueue.length > 0 && this.canAcceptConnection()) {\n      const waitingRequest = this.waitingQueue.shift();\n      if (!waitingRequest) break;\n\n      try {\n        const result = await this.requestConnection(waitingRequest.options);\n        waitingRequest.resolve(result);\n      } catch (error) {\n        waitingRequest.reject(error as Error);\n      }\n    }\n  }\n\n  private updatePerformanceMetrics(): void {\n    const now = Date.now();\n    const timeDiff = (now - this.lastMetricsUpdate) / 1000;\n    \n    if (timeDiff > 0) {\n      this.metrics.connectionsPerSecond = this.metrics.totalConnections / ((now - this.startTime) / 1000);\n      this.metrics.performance.throughput = this.metrics.totalConnections / timeDiff;\n    }\n\n    // 计算延迟百分位数 - 使用环形缓冲区的高效方法\n    if (this.latencyBuffer.length > 0) {\n      // 使用环形缓冲区的内置方法计算百分位数\n      this.metrics.performance.latency.p50 = this.latencyBuffer.getPercentile(0.5) || 0;\n      this.metrics.performance.latency.p95 = this.latencyBuffer.getPercentile(0.95) || 0;\n      this.metrics.performance.latency.p99 = this.latencyBuffer.getPercentile(0.99) || 0;\n      \n      this.metrics.averageLatency = this.latencyBuffer.getAverage() || 0;\n      \n      // 环形缓冲区自动管理大小，无需手动清理\n    }\n\n    this.metrics.errorRate = this.calculateErrorRate();\n\n    this.lastMetricsUpdate = now;\n  }\n\n  private startPeriodicTasks(): void {\n    this.healthCheckInterval = setInterval(() => {\n      this.updateHealthStatus();\n    }, 5000);\n    this.healthCheckInterval.unref();\n\n    this.cleanupInterval = setInterval(() => {\n      this.cleanupExpiredConnections();\n    }, 30000);\n    this.cleanupInterval.unref();\n  }\n\n  private cleanupExpiredConnections(): void {\n    const now = Date.now();\n    const timeout = this.config.connectionTimeout || 30000;\n    const connectionsToRemove: Array<{ id: string; connection: T }> = [];\n\n    for (const [id, metadata] of this.connectionMetadata) {\n      if (metadata.available && (now - metadata.lastUsed) > timeout) {\n        const connection = this.connections.get(id);\n        if (connection) {\n          connectionsToRemove.push({ id, connection });\n        }\n      }\n    }\n\n    // 异步清理过期连接\n    connectionsToRemove.forEach(({ connection }) => {\n      this.removeConnection(connection, 'Connection expired').catch(error => {\n        this.logger.error('Error cleaning up expired connection', {}, error);\n      });\n    });\n\n    if (connectionsToRemove.length > 0) {\n      this.logger.debug('Cleaned up expired connections', {}, { \n        count: connectionsToRemove.length \n      });\n    }\n  }\n\n  /**\n   * Trigger event with enhanced error handling\n   */\n  protected emitEvent(event: ConnectionPoolEvent, data: any): void {\n    const listeners = this.eventListeners.get(event);\n    if (!listeners || listeners.size === 0) {\n      return;\n    }\n\n    const listenersToRemove: ((data: any) => void)[] = [];\n\n    listeners.forEach(listener => {\n      try {\n        listener(data);\n        // Reset error count on success\n        if (this.eventListenerErrors.has(event)) {\n          this.eventListenerErrors.set(event, 0);\n        }\n      } catch (error) {\n        // Record error count\n        const errorCount = (this.eventListenerErrors.get(event) || 0) + 1;\n        this.eventListenerErrors.set(event, errorCount);\n        \n        this.logger.error('Error in connection pool event listener', {}, {\n          event: event,\n          errorCount,\n          error: error instanceof Error ? error.message : String(error),\n          stack: error instanceof Error ? error.stack : undefined,\n          protocol: this.protocol\n        });\n        \n        // If listener fails repeatedly, mark for removal\n        if (errorCount > 10) {\n          this.logger.warn('Removing faulty event listener due to repeated failures', {}, {\n            event: event,\n            totalErrors: errorCount,\n            protocol: this.protocol\n          });\n          listenersToRemove.push(listener);\n          this.eventListenerErrors.delete(event);\n        }\n      }\n    });\n\n    // Remove faulty listeners\n    listenersToRemove.forEach(listener => listeners.delete(listener));\n  }\n\n  /**\n   * Record connection event for statistics\n   */\n  protected recordConnectionEvent(event: 'added' | 'removed' | 'error', _metadata?: any): void {\n    const timestamp = Date.now();\n    \n    switch (event) {\n      case 'added':\n        this.metrics.totalConnections++;\n        this.metrics.activeConnections = this.getActiveConnectionCount();\n        this.errorWindow.push(false);\n        break;\n      case 'removed':\n        this.metrics.activeConnections = this.getActiveConnectionCount();\n        break;\n      case 'error':\n        this.errorWindow.push(true);\n        break;\n    }\n\n    // Calculate connections per second\n    const timeDiff = (timestamp - this.startTime) / 1000;\n    if (timeDiff > 0) {\n      this.metrics.connectionsPerSecond = this.metrics.totalConnections / timeDiff;\n    }\n  }\n\n  private calculateErrorRate(): number {\n    if (this.errorWindow.length === 0) {\n      return 0;\n    }\n    let errorCount = 0;\n    for (let i = 0; i < this.errorWindow.length; i++) {\n      const value = this.errorWindow.get(i);\n      if (value === true) {\n        errorCount++;\n      }\n    }\n    return errorCount / this.errorWindow.length;\n  }\n\n  /**\n   * Record request latency\n   */\n  protected recordLatency(latency: number): void {\n    this.latencyBuffer.push(latency);\n  }\n\n  /**\n   * Destroy connection pool manager\n   */\n  async destroy(): Promise<void> {\n    const traceId = generateTraceId();\n    \n    this.logger.info('Destroying connection pool manager', { traceId });\n    \n    // 清理定时器\n    if (this.healthCheckInterval) {\n      clearInterval(this.healthCheckInterval);\n      this.healthCheckInterval = undefined;\n    }\n    if (this.cleanupInterval) {\n      clearInterval(this.cleanupInterval);\n      this.cleanupInterval = undefined;\n    }\n    \n    try {\n      // 清理等待队列\n      this.waitingQueue.forEach(item => {\n        item.resolve({\n          connection: null,\n          success: false,\n          error: new Error('Connection pool is being destroyed'),\n          waitTime: Date.now() - item.timestamp\n        });\n      });\n      this.waitingQueue = [];\n\n      await this.closeAllConnections(5000);\n      this.eventListeners.clear();\n      \n      this.logger.info('Connection pool manager destroyed successfully', { traceId });\n    } catch (error) {\n      this.logger.error('Error destroying connection pool manager', { traceId }, error);\n      throw error;\n    }\n  }\n\n  /**\n   * Warm up connection pool with initial connections\n   * Creates connections before they are needed to reduce latency\n   * @param count Number of connections to warm up (default: from config)\n   * @param options Warmup options\n   * @returns Warmup result\n   */\n  async warmup(count?: number, options: {\n    timeout?: number;\n    retryCount?: number;\n  } = {}): Promise<{\n    success: boolean;\n    created: number;\n    failed: number;\n    duration: number;\n    errors: Error[];\n  }> {\n    const traceId = generateTraceId();\n    const startTime = Date.now();\n    \n    // Get warmup configuration\n    const warmupConfig = this.config.warmup || {\n      enabled: false,\n      initialConnections: 5,\n      timeout: 5000,\n      retryCount: 3\n    };\n    \n    if (!warmupConfig.enabled && !count) {\n      this.logger.debug('Warmup is disabled, skipping', { traceId });\n      return {\n        success: true,\n        created: 0,\n        failed: 0,\n        duration: 0,\n        errors: []\n      };\n    }\n    \n    const targetCount = count || warmupConfig.initialConnections || 5;\n    const timeout = options.timeout || warmupConfig.timeout || 5000;\n    const retryCount = options.retryCount || warmupConfig.retryCount || 3;\n    \n    this.logger.info('Starting connection pool warmup', { traceId }, {\n      protocol: this.protocol,\n      targetCount,\n      timeout,\n      retryCount,\n      currentConnections: this.getActiveConnectionCount()\n    });\n    \n    const created: string[] = [];\n    const errors: Error[] = [];\n    let failed = 0;\n    \n    // Create connections concurrently with limit\n    const concurrencyLimit = Math.min(targetCount, 10);\n    const batches = Math.ceil(targetCount / concurrencyLimit);\n    \n    for (let batch = 0; batch < batches; batch++) {\n      const batchSize = Math.min(concurrencyLimit, targetCount - batch * concurrencyLimit);\n      const batchPromises: Promise<void>[] = [];\n      \n      for (let i = 0; i < batchSize; i++) {\n        batchPromises.push(this.createWarmupConnection(timeout, retryCount, created, errors));\n      }\n      \n      await Promise.all(batchPromises);\n    }\n    \n    failed = errors.length;\n    const duration = Date.now() - startTime;\n    const success = failed === 0;\n    \n    this.logger.info('Connection pool warmup completed', { traceId }, {\n      protocol: this.protocol,\n      created: created.length,\n      failed,\n      duration,\n      success,\n      finalConnectionCount: this.getActiveConnectionCount()\n    });\n    \n    // Emit warmup event\n    this.emitEvent(ConnectionPoolEvent.CONNECTION_ADDED, {\n      type: 'warmup',\n      created: created.length,\n      failed,\n      duration\n    });\n    \n    return {\n      success,\n      created: created.length,\n      failed,\n      duration,\n      errors\n    };\n  }\n\n  /**\n   * Create a single warmup connection with retry logic\n   */\n  private async createWarmupConnection(\n    timeout: number,\n    retryCount: number,\n    created: string[],\n    errors: Error[]\n  ): Promise<void> {\n    // Check if we've reached max connections\n    if (!this.canAcceptConnection()) {\n      errors.push(new Error('Connection pool limit reached'));\n      return;\n    }\n\n    let lastError: Error | undefined;\n\n    for (let attempt = 0; attempt <= retryCount; attempt++) {\n      try {\n        const connectionResult = await Promise.race([\n          this.createNewConnection({ priority: 'low' }),\n          new Promise<null>((_, reject) =>\n            setTimeout(() => reject(new Error('Warmup connection timeout')), timeout)\n          )\n        ]);\n\n        if (connectionResult) {\n          await this.addConnection(connectionResult.connection, {\n            ...connectionResult.metadata,\n            warmup: true,\n            createdAt: Date.now()\n          });\n\n          if (connectionResult.id) {\n            created.push(connectionResult.id);\n          }\n          return;\n        }\n      } catch (error) {\n        lastError = error as Error;\n\n        // Log retry attempts\n        if (attempt < retryCount) {\n          this.logger.debug('Warmup connection failed, retrying', {}, {\n            attempt: attempt + 1,\n            maxAttempts: retryCount + 1,\n            error: lastError.message\n          });\n\n          // Exponential backoff\n          await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 100));\n        }\n      }\n    }\n\n    if (lastError) {\n      errors.push(lastError);\n    }\n  }\n\n  /**\n   * 统一的连接获取接口 - 对外提供统一API\n   */\n  async getConnection(options: ConnectionRequestOptions = {}): Promise<ConnectionRequestResult<T>> {\n    return this.requestConnection(options);\n  }\n\n  /**\n   * 统一的连接添加接口 - 协议无关的连接注册\n   * 各协议通过此方法注册新连接到池中\n   */\n  async registerConnection(connection: T, metadata: any = {}): Promise<boolean> {\n    if (!this.canAcceptConnection()) {\n      return false;\n    }\n\n    const success = await this.addConnection(connection, metadata);\n    if (success) {\n      // 设置协议特定的连接处理\n      await this.setupProtocolSpecificHandlers(connection);\n    }\n    \n    return success;\n  }\n\n  /**\n   * 协议特定的连接处理器设置 - 子类实现\n   */\n  protected abstract setupProtocolSpecificHandlers(connection: T): Promise<void>;\n\n  /**\n   * 协议特定的连接创建逻辑 - 子类实现\n   */\n  protected abstract createProtocolConnection(options: ConnectionRequestOptions): Promise<{ connection: T; metadata?: any } | null>;\n} ","/* \n * @Description: Base server class with template method pattern for protocol servers\n * @Usage: 模板方法模式的基类，定义服务器生命周期的公共逻辑\n * @Author: richen\n * @Date: 2025-04-08 10:45:00\n * @LastEditTime: 2024-11-27 23:00:00\n * @License: BSD (3-Clause)\n */\n\nimport { KoattyApplication, KoattyServer, NativeServer } from \"koatty_core\";\nimport { createLogger, generateTraceId } from \"../utils/logger\";\nimport { deepEqual, generateServerId } from \"../utils/helper\";\nimport { TimerManager } from \"../utils/timer-manager\";\nimport {\n  ConnectionPoolStatus as HealthStatus,\n  ConnectionPoolManager,\n  ConnectionPoolEvent\n} from \"../pools/pool\";\nimport type { ConnectionStats } from \"../pools/pool\";\nimport { ListeningOptions } from \"../config/config\";\n// 优雅关闭相关类型定义\nexport interface GracefulShutdownOptions {\n  timeout?: number;        // 总超时时间\n  drainDelay?: number;     // 排空延迟\n  stepTimeout?: number;    // 单步超时\n}\n\nexport interface ShutdownResult {\n  status: 'completed' | 'failed' | 'forced';\n  totalTime: number;\n  completedSteps: string[];\n  failedSteps: Array<{\n    step: string;\n    error: string;\n    timestamp: number;\n  }>;\n}\n\n/**\n * Configuration change detection result\n */\nexport interface ConfigChangeAnalysis {\n  requiresRestart: boolean;\n  changedKeys: string[];\n  restartReason?: string;\n  canApplyRuntime?: boolean;\n}\n\n/**\n * Base server class with template method pattern\n * 模板方法模式：定义算法骨架，子类实现具体步骤\n * @template T - Options type extending ListeningOptions\n * @template S - Server instance type (defaults to any for backward compatibility)\n */\nexport abstract class BaseServer<T extends ListeningOptions = ListeningOptions, S = any>\n  implements KoattyServer {\n  options: T;\n  protected server!: S;\n  readonly protocol: string;\n  status: number;\n  listenCallback?: () => void;\n  \n  // Server start time for uptime calculation\n  protected startTime: number = 0;\n\n  // 公共状态管理\n  protected configVersion = 0;\n  protected logger = createLogger({ module: 'base' });\n  protected serverId: string;\n  protected shutdownTimeout = 30000;\n  protected drainDelay = 5000;\n  protected connectionPool?: ConnectionPoolManager<any>;\n  protected timerManager: TimerManager;\n  private isShuttingDown = false;\n\n  constructor(protected app: KoattyApplication, options: T) {\n    // 深拷贝 options，确保 ext 对象也被正确复制\n    this.options = {\n      ...options,\n      ext: options.ext ? { ...options.ext } : undefined\n    };\n    this.protocol = options.protocol;\n    this.status = 0;\n    this.serverId = generateServerId(options.protocol);\n\n    // 初始化定时器管理器\n    this.timerManager = new TimerManager();\n\n    // 设置日志上下文\n    // 对于 GraphQL，使用底层协议作为 module，保持 protocol 为 graphql\n    const actualModule = (options.ext?._underlyingProtocol as string | undefined) ?? options.protocol;\n    this.logger = createLogger({\n      module: actualModule,\n      protocol: options.protocol,\n      serverId: this.serverId\n    });\n\n    this.logger.debug(`${options.protocol} server constructed`, {}, {\n      protocol: options.protocol,\n      hostname: options.hostname,\n      port: options.port,\n      serverId: this.serverId\n    });\n  }\n\n  /**\n   * 模板方法：服务器初始化流程\n   * 定义了所有协议服务器的通用初始化步骤\n   */\n  protected initializeServer(): void {\n    this.logger.info('Initializing server', {}, {\n      protocol: this.protocol,\n      serverId: this.serverId\n    });\n\n    try {\n      // Step 1: 初始化连接池（各协议自定义）\n      this.initializeConnectionPool();\n\n      // Step 2: 创建协议特定的服务器实例（各协议自定义）\n      this.createProtocolServer();\n\n      // Step 3: 配置服务器选项（各协议自定义）\n      this.configureServerOptions();\n\n      // Step 4: 设置连接池事件监听（公共逻辑）\n      this.setupConnectionPoolEventListeners();\n\n      // Step 5: 设置定期清理任务（公共逻辑）\n      this.setupPeriodicCleanup();\n\n      // Step 6: 协议特定的额外初始化（各协议自定义）\n      this.performProtocolSpecificInitialization();\n\n      this.logger.debug('Server initialized successfully');\n\n    } catch (error) {\n      this.logger.error('Server initialization failed', {}, error);\n      throw error;\n    }\n  }\n\n  /**\n   * 模板方法：配置热更新流程\n   */\n  async updateConfig(newConfig: Partial<T>): Promise<boolean> {\n    const traceId = generateTraceId();\n    const oldConfig = { ...this.options };\n    const mergedConfig = { ...this.options, ...newConfig };\n\n    // Step 1: 检测变更的配置项（公共逻辑）\n    const changedKeys = this.detectConfigurationChanges(oldConfig, newConfig);\n\n    if (changedKeys.length === 0) {\n      this.logger.debug('No configuration changes detected', { traceId });\n      return false;\n    }\n\n    this.logger.info('Configuration update initiated', { traceId }, {\n      changedKeys: changedKeys.map(String),\n      oldConfig: this.extractRelevantConfig(oldConfig),\n      newConfig: this.extractRelevantConfig(mergedConfig)\n    });\n\n    // Step 2: 分析配置变更影响（各协议自定义）\n    const analysis = this.analyzeConfigChanges(changedKeys, oldConfig, mergedConfig);\n\n    this.logger.info('Configuration change analysis completed', { traceId }, analysis);\n\n    try {\n      if (analysis.requiresRestart) {\n        // Step 3a: 需要重启的关键配置变更\n        return await this.handleRestartRequiredChanges(mergedConfig, traceId);\n      } else if (analysis.canApplyRuntime) {\n        // Step 3b: 可以运行时应用的配置变更\n        return await this.handleRuntimeChanges(analysis, newConfig, mergedConfig, traceId);\n      }\n\n      return true;\n\n    } catch (error) {\n      this.logger.error('Configuration update failed', { traceId }, error);\n      return false;\n    }\n  }\n\n  /**\n   * 模板方法：优雅关闭流程\n   * 简化实现，直接执行关闭步骤\n   */\n  async gracefulShutdown(options: GracefulShutdownOptions = {}): Promise<ShutdownResult> {\n    if (this.isShuttingDown) {\n      this.logger.warn('Graceful shutdown already in progress');\n      throw new Error('Graceful shutdown already in progress');\n    }\n\n    this.isShuttingDown = true;\n    const traceId = generateTraceId();\n    const startTime = Date.now();\n    const completedSteps: string[] = [];\n    const failedSteps: Array<{ step: string; error: string; timestamp: number }> = [];\n\n    this.logger.info('Starting graceful shutdown', { traceId });\n\n    try {\n      // 步骤 1: 停止接受新连接\n      try {\n        await this.executeWithTimeout(\n          () => this.stopAcceptingNewConnections(traceId),\n          options.stepTimeout || 5000,\n          'stop_accepting_connections'\n        );\n        completedSteps.push('stop_accepting_connections');\n        this.logger.debug('Stopped accepting new connections', { traceId });\n      } catch (error) {\n        failedSteps.push({\n          step: 'stop_accepting_connections',\n          error: error instanceof Error ? error.message : String(error),\n          timestamp: Date.now()\n        });\n        this.logger.error('Failed to stop accepting connections', { traceId }, error);\n      }\n\n      // 步骤 2: 等待现有连接完成\n      try {\n        const waitTimeout = options.stepTimeout || 15000;\n        await this.executeWithTimeout(\n          () => this.waitForConnectionCompletion(waitTimeout, traceId),\n          waitTimeout + 1000,\n          'wait_connections_completion'\n        );\n        completedSteps.push('wait_connections_completion');\n        this.logger.debug('Waited for connections completion', { traceId });\n      } catch (error) {\n        failedSteps.push({\n          step: 'wait_connections_completion',\n          error: error instanceof Error ? error.message : String(error),\n          timestamp: Date.now()\n        });\n        this.logger.error('Failed to wait for connections', { traceId }, error);\n      }\n\n      // 步骤 3: 强制关闭剩余连接\n      try {\n        await this.executeWithTimeout(\n          () => this.forceCloseRemainingConnections(traceId),\n          options.stepTimeout || 5000,\n          'force_close_connections'\n        );\n        completedSteps.push('force_close_connections');\n        this.logger.debug('Force closed remaining connections', { traceId });\n      } catch (error) {\n        failedSteps.push({\n          step: 'force_close_connections',\n          error: error instanceof Error ? error.message : String(error),\n          timestamp: Date.now()\n        });\n        this.logger.error('Failed to force close connections', { traceId }, error);\n      }\n\n      // 步骤 4: 停止监控和清理\n      try {\n        await this.executeWithTimeout(\n          async () => { this.stopMonitoringAndCleanup(traceId); },\n          3000,\n          'stop_monitoring_cleanup'\n        );\n        completedSteps.push('stop_monitoring_cleanup');\n        this.logger.debug('Stopped monitoring and cleanup', { traceId });\n      } catch (error) {\n        failedSteps.push({\n          step: 'stop_monitoring_cleanup',\n          error: error instanceof Error ? error.message : String(error),\n          timestamp: Date.now()\n        });\n        this.logger.error('Failed to stop monitoring', { traceId }, error);\n      }\n\n      const totalTime = Date.now() - startTime;\n      const status = failedSteps.length > 0 ? 'failed' : 'completed';\n\n      this.logger.info('Graceful shutdown completed', { traceId }, {\n        status,\n        totalTime,\n        completedSteps: completedSteps.length,\n        failedSteps: failedSteps.length\n      });\n\n      return {\n        status: status as 'completed' | 'failed',\n        totalTime,\n        completedSteps,\n        failedSteps\n      };\n\n    } catch (error) {\n      const totalTime = Date.now() - startTime;\n      this.logger.error('Graceful shutdown error', { traceId }, error);\n      \n      return {\n        status: 'failed',\n        totalTime,\n        completedSteps,\n        failedSteps: [...failedSteps, {\n          step: 'global',\n          error: error instanceof Error ? error.message : String(error),\n          timestamp: Date.now()\n        }]\n      };\n    } finally {\n      this.isShuttingDown = false;\n    }\n  }\n\n  /**\n   * 执行带超时的异步操作\n   */\n  private async executeWithTimeout<T>(\n    fn: () => Promise<T>,\n    timeout: number,\n    stepName: string\n  ): Promise<T> {\n    return new Promise<T>((resolve, reject) => {\n      const timer = setTimeout(() => {\n        reject(new Error(`Step '${stepName}' timed out after ${timeout}ms`));\n      }, timeout);\n\n      fn()\n        .then(result => {\n          clearTimeout(timer);\n          resolve(result);\n        })\n        .catch(error => {\n          clearTimeout(timer);\n          reject(error);\n        });\n    });\n  }\n\n  /**\n   * 检测配置变更\n   */\n  protected detectConfigurationChanges(oldConfig: T, newConfig: Partial<T>): (keyof T)[] {\n    return Object.keys(newConfig).filter(key =>\n      !deepEqual(oldConfig[key as keyof T], newConfig[key as keyof T])\n    ) as (keyof T)[];\n  }\n\n  /**\n   * 设置连接池事件监听（公共逻辑）\n   */\n  protected setupConnectionPoolEventListeners(): void {\n    if (!this.connectionPool) return;\n\n    this.connectionPool.on(ConnectionPoolEvent.POOL_LIMIT_REACHED, (data: any) => {\n      this.logger.warn(`${this.protocol.toUpperCase()} connection pool limit reached`, {}, data);\n    });\n\n    this.connectionPool.on(ConnectionPoolEvent.HEALTH_STATUS_CHANGED, (data: any) => {\n      this.logger.info(`${this.protocol.toUpperCase()} connection pool health status changed`, {}, data);\n    });\n\n    this.connectionPool.on(ConnectionPoolEvent.CONNECTION_ERROR, (data: any) => {\n      this.logger.warn(`${this.protocol.toUpperCase()} connection pool error`, {}, {\n        error: data.error?.message,\n        connectionId: data.connectionId\n      });\n    });\n\n    this.connectionPool.on(ConnectionPoolEvent.CONNECTION_TIMEOUT, (data: any) => {\n      this.logger.warn(`${this.protocol.toUpperCase()} connection timeout`, {}, data);\n    });\n\n    this.connectionPool.on(ConnectionPoolEvent.CONNECTION_REMOVED, (data: any) => {\n      this.logger.debug(`${this.protocol.toUpperCase()} connection removed from pool`, {}, {\n        connectionId: data.connectionId,\n        reason: data.reason\n      });\n    });\n  }\n\n  /**\n   * 设置定期清理（公共逻辑）\n   */\n  protected setupPeriodicCleanup(): void {\n    if (!this.connectionPool) return;\n\n    this.timerManager.addTimer('base_cleanup', () => {\n      const metrics = this.connectionPool!.getMetrics();\n      if (metrics.activeConnections === 0 && metrics.totalConnections > 0) {\n        this.logger.debug(`No active ${this.protocol.toUpperCase()} connections in pool`);\n      }\n    }, 30000); // 每30秒检查一次\n  }\n\n  /**\n   * 处理需要重启的配置变更\n   */\n  protected async handleRestartRequiredChanges(mergedConfig: T, traceId: string): Promise<boolean> {\n    this.logger.info('Performing graceful restart due to critical configuration changes', { traceId });\n\n    // 执行优雅关闭\n    const shutdownResult = await this.gracefulShutdown({\n      timeout: this.shutdownTimeout,\n      drainDelay: this.drainDelay\n    });\n\n    // 检查关闭是否成功\n    if (shutdownResult.status === 'failed' || shutdownResult.status === 'forced') {\n      this.logger.warn('Graceful shutdown was not clean during restart', { traceId }, {\n        status: shutdownResult.status,\n        failedSteps: shutdownResult.failedSteps.map(f => f.step)\n      });\n    }\n\n    // 应用新配置\n    this.options = mergedConfig;\n    this.configVersion++;\n\n    // 重新启动服务器\n    this.Start();\n\n    this.logger.info('Graceful restart completed successfully', { traceId }, {\n      configVersion: this.configVersion\n    });\n\n    return true;\n  }\n\n  /**\n   * 处理运行时配置变更\n   */\n  protected async handleRuntimeChanges(\n    analysis: ConfigChangeAnalysis,\n    newConfig: Partial<T>,\n    mergedConfig: T,\n    traceId: string\n  ): Promise<boolean> {\n    this.options = mergedConfig;\n    this.configVersion++;\n\n    this.onRuntimeConfigChange(analysis, newConfig, traceId);\n\n    this.logger.info('Runtime configuration changes applied successfully', { traceId }, {\n      configVersion: this.configVersion\n    });\n\n    return true;\n  }\n\n  /**\n   * 停止监控和清理（公共逻辑）\n   */\n  protected stopMonitoringAndCleanup(traceId: string): void {\n    this.logger.info('Step 5: Stopping monitoring and cleanup', { traceId });\n\n    // 清理定期任务\n    this.timerManager.destroy();\n\n    // 记录最终连接统计\n    if (this.connectionPool) {\n      const finalStats = this.connectionPool.getMetrics();\n      this.logger.info('Final connection statistics', { traceId }, finalStats);\n    }\n\n    this.logger.debug('Monitoring stopped and cleanup completed', { traceId });\n  }\n\n  /**\n   * 获取活跃连接数（公共逻辑）\n   */\n  protected getActiveConnectionCount(): number {\n    return this.connectionPool ? this.connectionPool.getActiveConnectionCount() : 0;\n  }\n\n  /**\n   * 获取连接统计信息（公共接口）\n   */\n  getConnectionStats(): ConnectionStats {\n    if (!this.connectionPool) {\n      return {\n        activeConnections: 0,\n        totalConnections: 0,\n        connectionsPerSecond: 0,\n        averageLatency: 0,\n        errorRate: 0\n      };\n    }\n\n    const poolMetrics = this.connectionPool.getMetrics();\n    return {\n      activeConnections: poolMetrics.activeConnections,\n      totalConnections: poolMetrics.totalConnections,\n      connectionsPerSecond: poolMetrics.connectionsPerSecond,\n      averageLatency: poolMetrics.averageLatency,\n      errorRate: poolMetrics.errorRate\n    };\n  }\n\n  /**\n   * 获取连接池健康状态（公共接口）\n   */\n  getConnectionPoolHealth() {\n    return this.connectionPool ? this.connectionPool.getHealth() : null;\n  }\n\n  /**\n   * 获取连接池指标（公共接口）\n   */\n  getConnectionPoolMetrics() {\n    return this.connectionPool ? this.connectionPool.getMetrics() : null;\n  }\n\n  // ============= 需要子类实现的抽象方法（模板方法的钩子） =============\n\n  /**\n   * 初始化连接池（各协议自定义）\n   */\n  protected abstract initializeConnectionPool(): void;\n\n  /**\n   * 创建协议特定的服务器实例（各协议自定义）\n   */\n  protected abstract createProtocolServer(): void;\n\n  /**\n   * 配置服务器选项（各协议自定义）\n   */\n  protected abstract configureServerOptions(): void;\n\n  /**\n   * 协议特定的额外初始化（各协议自定义，可选实现）\n   */\n  protected performProtocolSpecificInitialization(): void {\n    // 默认空实现，子类可以选择性重写\n  }\n\n  /**\n   * 分析配置变更影响（各协议自定义）\n   */\n  protected abstract analyzeConfigChanges(\n    changedKeys: (keyof T)[],\n    oldConfig: T,\n    newConfig: T\n  ): ConfigChangeAnalysis;\n\n  /**\n   * 运行时配置变更处理（各协议自定义）\n   */\n  protected abstract onRuntimeConfigChange(\n    analysis: ConfigChangeAnalysis,\n    newConfig: Partial<T>,\n    traceId: string\n  ): void;\n\n  /**\n   * 提取相关配置用于日志（各协议自定义）\n   */\n  protected abstract extractRelevantConfig(config: T): any;\n\n  /**\n   * 停止接受新连接（各协议自定义）\n   */\n  protected abstract stopAcceptingNewConnections(traceId: string): Promise<void>;\n\n  /**\n   * 等待现有连接完成（各协议自定义）\n   */\n  protected abstract waitForConnectionCompletion(timeout: number, traceId: string): Promise<void>;\n\n  /**\n   * 强制关闭剩余连接（各协议自定义）\n   */\n  protected abstract forceCloseRemainingConnections(traceId: string): Promise<void>;\n\n  /**\n   * 强制关闭（各协议自定义）\n   */\n  protected abstract forceShutdown(traceId: string): void;\n\n  // ============= 原有的抽象方法保持不变 =============\n\n  /**\n   * 启动服务器\n   */\n  abstract Start(listenCallback?: () => void): any;\n\n  /**\n   * 获取服务器状态\n   */\n  abstract getStatus(): number;\n\n  /**\n   * 获取原生服务器实例\n   */\n  abstract getNativeServer(): NativeServer;\n\n  /**\n   * 销毁服务器（抽象方法，各协议实现）\n   * 内部应该调用 gracefulShutdown 进行优雅关闭\n   */\n  abstract destroy(): Promise<void>;\n\n  /**\n   * 停止服务器（向后兼容）\n   */\n  Stop(callback?: (err?: Error) => void): void {\n    const traceId = generateTraceId();\n    this.logger.info('Server stopping', { traceId });\n\n    this.destroy()\n      .then(() => {\n        this.logger.info('Server stopped', { traceId }, {\n          gracefulShutdown: true,\n          finalConnectionCount: this.getActiveConnectionCount()\n        });\n        if (callback) callback();\n      })\n      .catch((err: Error) => {\n        this.logger.error('Server stop failed', { traceId }, err);\n        this.forceShutdown(traceId);\n\n        this.logger.info('Server stopped', { traceId }, {\n          forcedShutdown: true,\n          finalConnectionCount: this.getActiveConnectionCount()\n        });\n\n        if (callback) callback(err);\n      });\n  }\n}\n\n// 导出健康状态枚举\nexport { HealthStatus };\nexport type { ConnectionStats };\n","/*\n * @Description: Singleton Terminus Manager for multi-server coordination\n * @Usage: Manages graceful shutdown across multiple server instances\n * @Author: richen\n * @Date: 2025-01-14\n * @LastEditTime: 2025-01-14\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport EventEmitter from \"events\";\nimport { KoattyApplication, KoattyServer } from \"koatty_core\";\nimport { Helper } from \"koatty_lib\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\n\n// async event listener - triggers all listeners without removing them\nconst asyncEvent = async (event: EventEmitter, eventName: string) => {\n  for (const func of event.listeners(eventName)) {\n    if (Helper.isFunction(func)) {\n      await func();\n    }\n  }\n  return event.removeAllListeners(eventName);\n};\n\n// Trigger all listeners on a target without modifying listener registrations\nconst triggerListeners = async (target: NodeJS.EventEmitter, eventName: string) => {\n  for (const func of target.listeners(eventName)) {\n    if (typeof func === 'function') {\n      await (func as () => Promise<void>)();\n    }\n  }\n};\n\n/**\n * Singleton Terminus Manager\n * \n * Ensures that signal handlers (SIGTERM, SIGINT, etc.) are only registered once,\n * even when multiple server instances are created. Coordinates graceful shutdown\n * across all registered servers.\n */\nexport class TerminusManager {\n  private static instance: TerminusManager | null = null;\n  private isShuttingDown = false;\n  private app: KoattyApplication | null = null;\n  private signalsRegistered = false;\n  private exitOnShutdown = true;\n  private registeredServerCount = 0;\n  // Stored handler references for explicit removal on reset (prevents handler accumulation in tests)\n  private signalHandlers: Map<NodeJS.Signals, () => void> = new Map();\n\n  private constructor() {}\n\n  /**\n   * Get singleton instance\n   */\n  static getInstance(): TerminusManager {\n    if (!TerminusManager.instance) {\n      TerminusManager.instance = new TerminusManager();\n    }\n    return TerminusManager.instance;\n  }\n\n  setExitOnShutdown(value: boolean): void {\n    this.exitOnShutdown = value;\n  }\n\n  /**\n   * Register a server instance\n   * \n   * @param app - Koatty application instance\n   * @param server - Server instance to register\n   * @param serverId - Unique identifier for the server\n   */\n  registerServer(app: KoattyApplication, _server: KoattyServer, serverId: string): void {\n    this.app = app;\n    this.registeredServerCount++;\n    \n    Logger.Info(`Server registered in TerminusManager: ${serverId}`);\n    \n    // 只在第一次注册时设置信号处理器\n    if (!this.signalsRegistered) {\n      this.setupSignalHandlers();\n      this.signalsRegistered = true;\n    }\n  }\n\n  /**\n   * Setup signal handlers (only once).\n   * Handlers are stored in signalHandlers map for explicit removal on resetInstance().\n   */\n  private setupSignalHandlers(): void {\n    const signals: NodeJS.Signals[] = ['SIGINT', 'SIGTERM', 'SIGQUIT'];\n    \n    signals.forEach(signal => {\n      const handler = () => {\n        this.shutdownAll(signal).catch(err => {\n          Logger.Fatal('Error during shutdown', err);\n          process.exit(1);\n        });\n      };\n      this.signalHandlers.set(signal, handler);\n      process.on(signal, handler);\n    });\n\n    Logger.Info('Global signal handlers registered');\n  }\n\n  /**\n   * Shutdown all registered servers\n   * \n   * Only triggers appStop event. Actual server shutdown is handled by\n   * ServeComponent.stopServer which listens to appStop event.\n   * \n   * @param signal - Signal that triggered the shutdown\n   */\n  private async shutdownAll(signal: string): Promise<void> {\n    if (this.isShuttingDown) {\n      Logger.Warn('Shutdown already in progress, ignoring signal');\n      return;\n    }\n    \n    this.isShuttingDown = true;\n    Logger.Warn(`Received kill signal (${signal}), shutting down all servers...`);\n\n    const shutdownTimeout = 30000;\n\n    try {\n      // 触发应用层清理（ServeComponent.stopServer 会处理实际的服务器关闭）\n      if (this.app) {\n        Logger.Info('Triggering application stop events');\n\n        let timeoutHandle: NodeJS.Timeout | undefined;\n        const timeoutPromise = new Promise<void>((_, reject) => {\n          timeoutHandle = setTimeout(\n            () => reject(new Error(`Shutdown timeout after ${shutdownTimeout}ms`)),\n            shutdownTimeout\n          );\n        });\n\n        try {\n          await Promise.race([\n            asyncEvent(this.app, 'appStop').then(() => triggerListeners(process, 'beforeExit')),\n            timeoutPromise\n          ]);\n        } finally {\n          if (timeoutHandle !== undefined) clearTimeout(timeoutHandle);\n        }\n      }\n\n      Logger.Fatal('Graceful shutdown completed');\n      if (this.exitOnShutdown) {\n        process.exit(0);\n      }\n\n    } catch (error) {\n      Logger.Fatal('Error during shutdown', error);\n      if (this.exitOnShutdown) {\n        process.exit(1);\n      }\n    }\n  }\n\n  /**\n   * Reset instance (for testing purposes).\n   * Explicitly removes all registered signal handlers to prevent handler accumulation.\n   */\n  static resetInstance(): void {\n    if (TerminusManager.instance) {\n      TerminusManager.instance.signalHandlers.forEach((handler, signal) => {\n        process.removeListener(signal, handler);\n      });\n      TerminusManager.instance.signalHandlers.clear();\n      TerminusManager.instance.isShuttingDown = false;\n      TerminusManager.instance.signalsRegistered = false;\n      TerminusManager.instance.registeredServerCount = 0;\n      TerminusManager.instance = null;\n    }\n  }\n\n  /**\n   * Get number of registered servers (for testing)\n   */\n  getServerCount(): number {\n    return this.registeredServerCount;\n  }\n}\n\n","/*\n * @Description: \n * @Usage: \n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2025-01-14\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport EventEmitter from \"events\";\nimport { KoattyApplication, KoattyServer } from \"koatty_core\";\nimport { Helper } from \"koatty_lib\";\nimport { TerminusManager } from \"./terminus-manager\";\n\nexport interface TerminusOptions {\n  timeout: number;\n  signals?: string[];\n  onSignal?: (event: string, app: KoattyApplication, server: KoattyServer, forceTimeout: number) => Promise<any>;\n}\n\n/**\n * Create terminus event\n * \n * Now uses TerminusManager singleton to prevent duplicate signal handler registration\n * when multiple server instances are created.\n *\n * @export\n * @param {KoattyApplication} app\n * @param {(Server | Http2SecureServer)} server\n * @param {TerminusOptions} [options]\n */\nexport function CreateTerminus(app: KoattyApplication, server: KoattyServer, _options?: TerminusOptions): void {\n  // Generate unique server ID\n  const serverId = (server as any).serverId || `server_${Date.now()}_${Math.random().toString(36).substr(2, 6)}`;\n  \n  // Register server with TerminusManager singleton\n  TerminusManager.getInstance().registerServer(app, server, serverId);\n}\ntype processEvent = \"beforeExit\" | \"exit\" | NodeJS.Signals;\n\nexport function BindProcessEvent(event: EventEmitter, originEventName: string, targetEventName: processEvent = \"beforeExit\") {\n  event.listeners(originEventName).forEach(func => {\n    if (Helper.isFunction(func)) {\n      process.addListener(<any>targetEventName, func);\n    }\n  });\n  event.removeAllListeners(originEventName);\n}\n\nexport { TerminusManager } from \"./terminus-manager\";\n","/*\n * @Description: Unified certificate loader utility\n * @Usage: Load SSL/TLS certificates from file paths or direct content\n * @Author: richen\n * @Date: 2025-01-14\n * @LastEditTime: 2025-01-14\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { readFileSync, existsSync } from 'fs';\nimport * as path from 'path';\nimport { createLogger } from './logger';\n\nconst logger = createLogger({ module: 'cert-loader' });\n\n/**\n * 验证并清理证书路径，防止路径遍历攻击\n * \n * @param certPath - 待验证的证书路径\n * @returns 清理后的绝对路径\n * @throws 如果检测到路径遍历或空字节注入\n */\nfunction sanitizeCertPath(certPath: string): string {\n  // 防止空字节注入\n  if (certPath.includes('\\0')) {\n    throw new Error(`Invalid certificate path: null byte injection detected`);\n  }\n\n  // 防止路径遍历：检查路径分段中是否包含 '..'\n  // 使用分段检查而非字符串包含，避免误报（如 'cert..backup' 这样的合法文件名）\n  const segments = certPath.split(/[/\\\\]/);\n  if (segments.includes('..')) {\n    throw new Error(`Invalid certificate path: path traversal detected`);\n  }\n\n  return path.resolve(certPath);\n}\n\n/**\n * 检测字符串是否为证书内容\n * \n * @param input - 待检测的字符串\n * @returns 是否为证书内容\n */\nexport function isCertificateContent(input: string): boolean {\n  if (!input || typeof input !== 'string') {\n    return false;\n  }\n  \n  // 检查是否包含 PEM 格式的标记\n  const pemMarkers = [\n    '-----BEGIN CERTIFICATE-----',\n    '-----BEGIN PRIVATE KEY-----',\n    '-----BEGIN RSA PRIVATE KEY-----',\n    '-----BEGIN EC PRIVATE KEY-----',\n    '-----BEGIN ENCRYPTED PRIVATE KEY-----',\n    '-----BEGIN PUBLIC KEY-----'\n  ];\n  \n  return pemMarkers.some(marker => input.includes(marker));\n}\n\n/**\n * 加载证书\n * \n * 支持两种输入方式:\n * 1. 文件路径: 读取文件内容\n * 2. 证书内容: 直接返回\n * \n * @param keyOrPath - 证书文件路径或证书内容\n * @param type - 证书类型描述 (用于错误信息)\n * @param traceId - 追踪ID (可选)\n * @returns 证书内容字符串\n */\nexport function loadCertificate(keyOrPath: string, type: string, traceId?: string): string {\n  if (!keyOrPath) {\n    throw new Error(`${type} path or content is required`);\n  }\n\n  try {\n    // 判断是否是证书内容\n    if (isCertificateContent(keyOrPath)) {\n      logger.debug(`Using ${type} from direct content`, { traceId });\n      return keyOrPath;\n    }\n    \n    // 验证路径安全性，防止路径遍历攻击\n    const sanitizedPath = sanitizeCertPath(keyOrPath);\n    \n    // 判断是文件路径\n    if (!existsSync(sanitizedPath)) {\n      throw new Error(`${type} file not found: ${sanitizedPath}`);\n    }\n    \n    const content = readFileSync(sanitizedPath, 'utf8');\n    logger.debug(`Loaded ${type} from file`, { traceId, path: sanitizedPath });\n    \n    // 验证加载的内容是否是有效的证书\n    if (!isCertificateContent(content)) {\n      logger.warn(`${type} file content does not appear to be a valid certificate`, {\n        traceId,\n        path: sanitizedPath\n      });\n    }\n    \n    return content;\n    \n  } catch (error) {\n    logger.error(`Failed to load ${type}`, { traceId }, { error });\n    throw new Error(`Failed to load ${type}: ${(error as Error).message}`);\n  }\n}\n\n/**\n * 证书配置接口\n */\nexport interface CertificateConfig {\n  key?: string;\n  cert?: string;\n  ca?: string;\n}\n\n/**\n * 加载后的证书\n */\nexport interface LoadedCertificates {\n  key?: string;\n  cert?: string;\n  ca?: string;\n}\n\n/**\n * 批量加载证书配置\n * \n * @param config - 证书配置\n * @param traceId - 追踪ID (可选)\n * @returns 加载后的证书内容\n */\nexport function loadCertificates(\n  config: CertificateConfig,\n  traceId?: string\n): LoadedCertificates {\n  const loaded: LoadedCertificates = {};\n\n  if (config.key) {\n    loaded.key = loadCertificate(config.key, 'private key', traceId);\n  }\n\n  if (config.cert) {\n    loaded.cert = loadCertificate(config.cert, 'certificate', traceId);\n  }\n\n  if (config.ca) {\n    loaded.ca = loadCertificate(config.ca, 'CA certificate', traceId);\n  }\n\n  return loaded;\n}\n\n","/*\n * @Description: 连接池配置助手\n * @Usage: 提供各协议的连接池配置生成器\n * @Author: richen\n * @Date: 2024-11-27 22:30:00\n * @LastEditTime: 2024-11-27 22:30:00\n */\n\n/**\n * 统一连接池配置接口\n */\nexport interface ConnectionPoolConfig {\n  connectionTimeout?: number;      // 连接超时时间 (毫秒)\n  maxConnections?: number;      // 最大连接数限制\n  maxSessionMemory?: number;    // 最大会话内存\n  maxHeaderListSize?: number;   // 最大头部列表大小\n  keepAliveTimeout?: number;    // Keep-Alive 超时\n  headersTimeout?: number;      // 头部超时\n  requestTimeout?: number;      // 请求超时\n\n  pingInterval?: number;        // Ping间隔时间\n  pongTimeout?: number;         // Pong超时时间\n  heartbeatInterval?: number;   // 心跳间隔时间\n\n  // 协议特定配置\n  protocolSpecific?: {\n    // HTTP/2 特定\n    maxSessionMemory?: number;\n    maxHeaderListSize?: number;\n\n    // HTTP/3 (QUIC) 特定\n    maxIdleTimeout?: number;\n    maxUdpPayloadSize?: number;\n    initialMaxStreamsBidi?: number;\n    initialMaxStreamsUni?: number;\n\n    // gRPC 特定\n    maxReceiveMessageLength?: number;\n    maxSendMessageLength?: number;\n    keepAliveTime?: number;\n\n    // WebSocket 特定\n    pingInterval?: number;\n    pongTimeout?: number;\n    heartbeatInterval?: number;\n  };\n\n  // 连接预热配置\n  warmup?: {\n    enabled?: boolean;           // 是否启用预热\n    initialConnections?: number;  // 预热连接数\n    timeout?: number;             // 预热超时时间 (毫秒)\n    retryCount?: number;          // 失败重试次数\n  };\n}\n\n/**\n * 连接池配置助手类\n */\nexport class PoolConfigHelper {\n  /**\n   * 创建HTTP连接池配置\n   */\n  static createHttpConfig(options: {\n    maxConnections?: number;\n    keepAliveTimeout?: number;\n    headersTimeout?: number;\n    requestTimeout?: number;\n    connectionTimeout?: number;\n    warmup?: {\n      enabled?: boolean;\n      initialConnections?: number;\n      timeout?: number;\n      retryCount?: number;\n    };\n  } = {}): ConnectionPoolConfig {\n    return {\n      maxConnections: options.maxConnections || 1000,\n      connectionTimeout: options.connectionTimeout || 30000,\n      keepAliveTimeout: options.keepAliveTimeout || 5000,\n      requestTimeout: options.requestTimeout || 30000,\n      headersTimeout: options.headersTimeout || 10000,\n      warmup: options.warmup || {\n        enabled: true,\n        initialConnections: 5,\n        timeout: 5000,\n        retryCount: 3\n      }\n    };\n  }\n\n  /**\n   * 创建HTTPS连接池配置\n   */\n  static createHttpsConfig(options: {\n    maxConnections?: number;\n    keepAliveTimeout?: number;\n    headersTimeout?: number;\n    requestTimeout?: number;\n    connectionTimeout?: number;\n  } = {}): ConnectionPoolConfig {\n    return {\n      maxConnections: options.maxConnections || 1000,\n      connectionTimeout: options.connectionTimeout || 30000,\n      keepAliveTimeout: options.keepAliveTimeout || 5000,\n      requestTimeout: options.requestTimeout || 30000,\n      headersTimeout: options.headersTimeout || 10000\n    };\n  }\n\n  /**\n   * 创建WebSocket连接池配置\n   */\n  static createWebSocketConfig(options: {\n    maxConnections?: number;\n    pingInterval?: number;\n    pongTimeout?: number;\n    heartbeatInterval?: number;\n    connectionTimeout?: number;\n    warmup?: {\n      enabled?: boolean;\n      initialConnections?: number;\n      timeout?: number;\n      retryCount?: number;\n    };\n  } = {}): ConnectionPoolConfig {\n    return {\n      maxConnections: options.maxConnections || 1000,\n      connectionTimeout: options.connectionTimeout || 30000,\n      protocolSpecific: {\n        pingInterval: options.pingInterval || 30000,\n        pongTimeout: options.pongTimeout || 5000,\n        heartbeatInterval: options.heartbeatInterval || 60000\n      },\n      warmup: options.warmup || {\n        enabled: false,\n        initialConnections: 3,\n        timeout: 10000,\n        retryCount: 3\n      }\n    };\n  }\n\n  /**\n   * 创建HTTP/2连接池配置\n   */\n  static createHttp2Config(options: {\n    maxConnections?: number;\n    maxSessionMemory?: number;\n    maxHeaderListSize?: number;\n    keepAliveTime?: number;\n    connectionTimeout?: number;\n  } = {}): ConnectionPoolConfig {\n    return {\n      maxConnections: options.maxConnections || 1000,\n      connectionTimeout: options.connectionTimeout || 30000,\n      protocolSpecific: {\n        maxSessionMemory: options.maxSessionMemory || 10 * 1024 * 1024, // 10MB\n        maxHeaderListSize: options.maxHeaderListSize || 8192,\n        keepAliveTime: options.keepAliveTime || 30000\n      }\n    };\n  }\n\n  /**\n   * 创建HTTP/3连接池配置\n   */\n  static createHttp3Config(options: {\n    maxConnections?: number;\n    maxIdleTimeout?: number;\n    maxUdpPayloadSize?: number;\n    initialMaxStreamsBidi?: number;\n    initialMaxStreamsUni?: number;\n    connectionTimeout?: number;\n    keepAliveTimeout?: number;\n    requestTimeout?: number;\n    headersTimeout?: number;\n  } = {}): ConnectionPoolConfig {\n    return {\n      maxConnections: options.maxConnections || 1000,\n      connectionTimeout: options.connectionTimeout || 30000,\n      keepAliveTimeout: options.keepAliveTimeout,\n      requestTimeout: options.requestTimeout,\n      headersTimeout: options.headersTimeout,\n      protocolSpecific: {\n        maxIdleTimeout: options.maxIdleTimeout || 30000,\n        maxUdpPayloadSize: options.maxUdpPayloadSize || 65527,\n        initialMaxStreamsBidi: options.initialMaxStreamsBidi || 100,\n        initialMaxStreamsUni: options.initialMaxStreamsUni || 100\n      }\n    };\n  }\n\n  /**\n   * 创建gRPC连接池配置\n   */\n  static createGrpcConfig(options: {\n    maxConnections?: number;\n    maxReceiveMessageLength?: number;\n    maxSendMessageLength?: number;\n    keepAliveTime?: number;\n    connectionTimeout?: number;\n    callTimeout?: number;\n  } = {}): ConnectionPoolConfig {\n    return {\n      maxConnections: options.maxConnections || 1000,\n      connectionTimeout: options.connectionTimeout || 30000,\n      requestTimeout: options.callTimeout || 30000,\n      protocolSpecific: {\n        maxReceiveMessageLength: options.maxReceiveMessageLength || 4 * 1024 * 1024, // 4MB\n        maxSendMessageLength: options.maxSendMessageLength || 4 * 1024 * 1024, // 4MB\n        keepAliveTime: options.keepAliveTime || 30000\n      }\n    };\n  }\n\n  /**\n   * 创建基础配置（通用）\n   */\n  static createBaseConfig(options: {\n    maxConnections?: number;\n    connectionTimeout?: number;\n    requestTimeout?: number;\n    keepAliveTimeout?: number;\n  } = {}): ConnectionPoolConfig {\n    return {\n      maxConnections: options.maxConnections || 1000,\n      connectionTimeout: options.connectionTimeout || 30000,\n      requestTimeout: options.requestTimeout || 30000,\n      keepAliveTimeout: options.keepAliveTimeout || 5000\n    };\n  }\n\n  /**\n   * 验证配置参数\n   */\n  static validateConfig(config: ConnectionPoolConfig): { valid: boolean; errors: string[] } {\n    const errors: string[] = [];\n\n    if (config.maxConnections !== undefined && config.maxConnections <= 0) {\n      errors.push('maxConnections must be positive');\n    }\n\n    if (config.connectionTimeout !== undefined && config.connectionTimeout <= 0) {\n      errors.push('connectionTimeout must be positive');\n    }\n\n    if (config.requestTimeout !== undefined && config.requestTimeout <= 0) {\n      errors.push('requestTimeout must be positive');\n    }\n\n    if (config.keepAliveTimeout !== undefined && config.keepAliveTimeout <= 0) {\n      errors.push('keepAliveTimeout must be positive');\n    }\n\n    if (config.headersTimeout !== undefined && config.headersTimeout <= 0) {\n      errors.push('headersTimeout must be positive');\n    }\n\n    return {\n      valid: errors.length === 0,\n      errors\n    };\n  }\n\n  /**\n   * 合并配置\n   */\n  static mergeConfigs(base: ConnectionPoolConfig, override: Partial<ConnectionPoolConfig>): ConnectionPoolConfig {\n    return {\n      ...base,\n      ...override,\n      protocolSpecific: {\n        ...base.protocolSpecific,\n        ...override.protocolSpecific\n      }\n    };\n  }\n\n  /**\n   * 根据协议名称创建默认配置\n   */\n  static createDefaultConfig(protocol: string): ConnectionPoolConfig {\n    switch (protocol.toLowerCase()) {\n      case 'http':\n        return this.createHttpConfig();\n      case 'https':\n        return this.createHttpsConfig();\n      case 'websocket':\n      case 'ws':\n      case 'wss':\n        return this.createWebSocketConfig();\n      case 'http2':\n        return this.createHttp2Config();\n      case 'http3':\n        return this.createHttp3Config();\n      case 'grpc':\n        return this.createGrpcConfig();\n      default:\n        return this.createBaseConfig();\n    }\n  }\n\n  /**\n   * 获取协议特定的配置键\n   */\n  static getProtocolSpecificKeys(protocol: string): string[] {\n    switch (protocol.toLowerCase()) {\n      case 'http':\n      case 'https':\n        return ['keepAliveTimeout', 'headersTimeout', 'requestTimeout'];\n      case 'websocket':\n      case 'ws':\n      case 'wss':\n        return ['pingInterval', 'pongTimeout', 'heartbeatInterval'];\n      case 'http2':\n        return ['maxSessionMemory', 'maxHeaderListSize', 'keepAliveTime'];\n      case 'grpc':\n        return ['maxReceiveMessageLength', 'maxSendMessageLength', 'keepAliveTime'];\n      default:\n        return [];\n    }\n  }\n} ","/*\n * @Description: configuration\n * @Usage: configuration\n * @Author: richen\n * @Date: 2024-11-27 21:30:00\n * @LastEditTime: 2024-11-27 21:30:00\n */\nimport * as WS from 'ws';\nimport { ChannelOptions } from \"@grpc/grpc-js\";\nimport { ConnectionPoolConfig, PoolConfigHelper } from \"./pool\";\nimport { createLogger } from '../utils/logger';\nimport fs from 'fs';\nimport { HealthCheckConfig } from '../middleware/healthCheck';\n\n// KoattyProtocol\nexport type KoattyProtocol = 'http' | \"https\" | 'http2' | 'http3' | 'grpc' | 'ws' | 'wss';\n\n/**\n * 基础SSL配置\n */\nexport interface BaseSSLConfig {\n  enabled?: boolean;\n  key?: string;                             // Private key path\n  cert?: string;                            // Certificate path\n  ca?: string;                              // CA certificate path\n  passphrase?: string;                      // Private key passphrase\n  ciphers?: string;                         // Allowed cipher suites\n  honorCipherOrder?: boolean;               // Honor cipher order\n  secureProtocol?: string;                  // SSL/TLS protocol version\n}\n\n/**\n * gRPC和WebSocket使用的简单SSL配置\n */\nexport interface SSLConfig extends BaseSSLConfig {\n  clientCertRequired?: boolean;\n  [key: string]: unknown;\n}\n\n/**\n * HTTPS使用的高级SSL配置\n */\nexport interface SSL1Config extends BaseSSLConfig {\n  mode: 'auto' | 'manual' | 'mutual_tls';  // SSL mode\n  requestCert?: boolean;                    // Request client certificate\n  rejectUnauthorized?: boolean;             // Reject unauthorized connections\n  // 扩展配置选项\n  handshakeTimeout?: number;                // TLS handshake timeout\n  sessionTimeout?: number;                  // TLS session timeout\n  SNICallback?: (servername: string, cb: (err: Error | null, ctx?: any) => void) => void;  // SNI callback\n  sessionIdContext?: string;                // Session ID context\n  ticketKeys?: Buffer;                      // TLS session ticket keys\n  ALPNProtocols?: string[];                 // ALPN protocols\n  [key: string]: unknown;\n}\n\n/**\n * HTTP/2使用的SSL配置（支持HTTP/1.1降级）\n */\nexport interface SSL2Config extends SSL1Config {\n  allowHTTP1?: boolean;                     // Allow HTTP/1.1 fallback\n  [key: string]: unknown;\n}\n\n/**\n * HTTP/3使用的SSL配置（基于QUIC，必须使用TLS 1.3）\n */\nexport interface SSL3Config extends BaseSSLConfig {\n  mode: 'auto' | 'manual' | 'mutual_tls';  // SSL mode\n  requestCert?: boolean;                    // Request client certificate\n  rejectUnauthorized?: boolean;             // Reject unauthorized connections\n  // QUIC特定配置\n  alpnProtocols?: string[];                 // ALPN protocols (default: ['h3'])\n  maxIdleTimeout?: number;                  // Max idle timeout in milliseconds\n  initialMaxStreamsBidi?: number;           // Initial max bidirectional streams\n  initialMaxStreamsUni?: number;            // Initial max unidirectional streams\n  [key: string]: unknown;\n}\n\n/**\n * listening options\n *\n * @interface ListeningOptions\n */\nexport interface ListeningOptions {\n  hostname: string;\n  port: number;\n  protocol: string;\n  trace?: boolean; // Full stack debug & trace, default: false\n  ssl?: { [key: string]: unknown; } & BaseSSLConfig;  // SSL配置 (推荐)\n  ext?: {    \n    protoFile?: string;\n    schemaFile?: string;\n    [key: string]: unknown;  // 扩展配置字段（包括内部使用的 _underlyingProtocol、_actualProtocol 等）\n  };\n  connectionPool?: ConnectionPoolConfig;\n  [key: string]: unknown;  // satisfies KoattyServer.options: Record<string, unknown>\n}\n\n/**\n * Base Server Options\n *\n * @export\n * @interface BaseServerOptions\n */\nexport interface BaseServerOptions {\n  hostname: string;\n  port: number;\n  protocol: string;\n  trace?: boolean; // Full stack debug & trace, default: false\n  connectionPool?: ConnectionPoolConfig;\n  health?: HealthCheckConfig;\n  ext?: {\n    [key: string]: unknown;  // 扩展配置字段（包括内部使用的 _underlyingProtocol、_actualProtocol 等）\n  };\n  [key: string]: unknown;  // satisfies KoattyServer.options: Record<string, unknown>\n}\n\n/**\n * HTTP Server Options extending base options\n */\nexport interface HttpServerOptions extends BaseServerOptions {\n  connectionPool?: ConnectionPoolConfig;\n}\n\n/**\n * Enhanced HTTPS Server Options\n */\nexport interface HttpsServerOptions extends BaseServerOptions {\n  ssl?: SSL1Config;\n  connectionPool?: ConnectionPoolConfig;\n}\n\n/**\n * Enhanced HTTP/2 Server Options\n */\nexport interface Http2ServerOptions extends BaseServerOptions {\n  ssl?: SSL2Config;\n  http2?: {\n    maxHeaderListSize?: number;\n    maxSessionMemory?: number;\n    settings?: {\n      headerTableSize?: number;\n      enablePush?: boolean;\n      maxConcurrentStreams?: number;\n      initialWindowSize?: number;\n      maxFrameSize?: number;\n      maxHeaderListSize?: number;\n    };\n  };\n  connectionPool?: ConnectionPoolConfig;\n}\n\n/**\n * HTTP/3 Server Options (QUIC-based)\n */\nexport interface Http3ServerOptions extends BaseServerOptions {\n  ssl?: SSL3Config;  // HTTP/3应该使用TLS（可选以支持配置灵活性）\n  http3?: {\n    maxHeaderListSize?: number;\n    maxFieldSectionSize?: number;\n    qpackMaxTableCapacity?: number;\n    qpackBlockedStreams?: number;\n    settings?: {\n      maxHeaderListSize?: number;\n      qpackMaxTableCapacity?: number;\n      qpackBlockedStreams?: number;\n    };\n  };\n  quic?: {\n    maxIdleTimeout?: number;\n    maxUdpPayloadSize?: number;\n    initialMaxData?: number;\n    initialMaxStreamDataBidiLocal?: number;\n    initialMaxStreamDataBidiRemote?: number;\n    initialMaxStreamDataUni?: number;\n    initialMaxStreamsBidi?: number;\n    initialMaxStreamsUni?: number;\n    ackDelayExponent?: number;\n    maxAckDelay?: number;\n    disableActiveMigration?: boolean;\n  };\n  connectionPool?: ConnectionPoolConfig;\n}\n\n/**\n * WebSocket Server Options extending base options\n */\nexport interface WebSocketServerOptions extends BaseServerOptions {\n  wsOptions?: WS.ServerOptions;\n  ssl?: SSLConfig;\n  connectionPool?: ConnectionPoolConfig;\n}\n\n/**\n * gRPC Server Options with enhanced configuration\n */\nexport interface GrpcServerOptions extends BaseServerOptions {\n  channelOptions?: ChannelOptions;\n  ssl?: SSLConfig;\n  connectionPool?: ConnectionPoolConfig;\n}\n\nexport class ConfigHelper {\n  private static logger = createLogger({ module: 'config' });\n\n  static configureSSLForProtocol(protocolType: string,\n   options: ListeningOptions, traceId?: string): void {\n    const secureProtocols = new Set([\"https\", \"http2\", \"http3\", \"wss\", \"graphql\"]);\n    if (!secureProtocols.has(protocolType)) {\n      return;\n    }\n    try {\n      // 确保 ssl 配置存在\n      if (!options.ssl) {\n        options.ssl = {};\n      }\n      \n      // 从 ext 配置中读取证书路径(如果存在)\n      if (options.ext) {\n        if (!options.ssl.key && (options.ext as any).keyFile) {\n          options.ssl.key = (options.ext as any).keyFile;\n        }\n        if (!options.ssl.cert && (options.ext as any).crtFile) {\n          options.ssl.cert = (options.ext as any).crtFile;\n        }\n      }\n      \n      const keyPath = options.ssl.key || \"\";\n      const crtPath = options.ssl.cert || \"\";\n\n      // 初始化为禁用\n      options.ssl.enabled = false;\n      \n      if (!keyPath || !crtPath || (!fs.existsSync(keyPath) || !fs.existsSync(crtPath))) {\n        options.ssl.enabled = false;\n        if (protocolType !== \"graphql\") {\n          const error = new Error(`SSL certificate files not configured for ${protocolType} protocol`);\n          this.logger.error('SSL configuration missing', {\n            traceId,\n            protocol: protocolType\n          }, error);\n          throw error;\n        }\n      } else {\n        options.ssl.enabled = true;\n      }\n      \n      this.logger.info('SSL certificates loaded successfully', {\n        traceId,\n        protocol: protocolType\n      });\n    } catch (error) {\n      this.logger.error('Failed to load SSL certificates', {\n        traceId,\n        protocol: protocolType\n      }, error);\n      throw error; // Re-throw to prevent server startup with invalid SSL config\n    }\n  }\n\n  private static migrateSSLFromExt(options: any): void {\n    if (!options.ext) return;\n    if (options.ext.ssl && !options.ssl) {\n      this.logger.warn('options.ext.ssl is deprecated, please use options.ssl instead');\n      options.ssl = options.ext.ssl;\n    } else if (options.ext.ssl && options.ssl) {\n      this.logger.warn('Both options.ssl and options.ext.ssl are set, using options.ssl');\n    }\n  }\n\n  static createHttpConfig(options: ListeningOptions = {\n    hostname: 'localhost',\n    port: 3000,\n    protocol: 'http',\n    trace: false,\n    ext: {},\n    connectionPool: {}\n  }): HttpServerOptions {\n    if (!options.ext) {\n      options.ext = {};\n    }\n    \n    // 使用 PoolConfigHelper 创建默认连接池配置\n    const defaultPoolConfig = PoolConfigHelper.createHttpConfig();\n    const poolConfig = PoolConfigHelper.mergeConfigs(defaultPoolConfig, options.connectionPool || {});\n    \n    // Preserve all original options including custom fields like _underlyingProtocol\n    return {\n      ...options,  // Preserve all incoming fields\n      connectionPool: poolConfig,\n      hostname: options.hostname || 'localhost',\n      port: options.port || 3000,\n      protocol: options.protocol || 'http',\n      trace: options.trace || false\n    } as HttpServerOptions;\n  }\n\n  static createHttpsConfig(options: Partial<HttpsServerOptions> = {\n    hostname: 'localhost',\n    port: 443,\n    protocol: 'https',\n    trace: false,\n    ext: {},\n    connectionPool: {}\n  } as unknown as HttpsServerOptions): HttpsServerOptions {\n    if (!options.ext) {\n      options.ext = {};\n    }\n    \n    this.migrateSSLFromExt(options);\n    \n    // 使用 PoolConfigHelper 创建默认连接池配置\n    const defaultPoolConfig = PoolConfigHelper.createHttpsConfig();\n    const poolConfig = PoolConfigHelper.mergeConfigs(defaultPoolConfig, options.connectionPool || {});\n\n    // 只使用 options.ssl\n    const sslConfig: SSL1Config = (options.ssl || {}) as SSL1Config;\n    \n    // Preserve all original options including custom fields\n    const config = {\n      ...options,  // Preserve all incoming fields\n      connectionPool: poolConfig,\n      ssl: sslConfig,\n      hostname: options.hostname || 'localhost',\n      port: options.port || 443,\n      protocol: options.protocol || 'https',\n      trace: options.trace || false\n    }\n    if (config.port === 80) {\n      config.port = 443;\n    }\n    return config;\n  }\n\n  static createHttp2Config(options: Partial<Http2ServerOptions> = {\n    hostname: 'localhost',\n    port: 443,\n    protocol: 'http2',\n    trace: false,\n    ext: {},\n    connectionPool: {}\n  } as unknown as Http2ServerOptions): Http2ServerOptions {\n    if (!options.ext) {\n      options.ext = {};\n    }\n    \n    this.migrateSSLFromExt(options);\n\n    // 使用 PoolConfigHelper 创建默认连接池配置\n    const defaultPoolConfig = PoolConfigHelper.createHttp2Config();\n    const poolConfig = PoolConfigHelper.mergeConfigs(defaultPoolConfig, options.connectionPool || {});\n\n    // 只使用 options.ssl\n    const sslConfig: SSL2Config = (options.ssl || {}) as SSL2Config;\n\n    // Preserve all original options including custom fields like _underlyingProtocol\n    const config =  {\n      ...options,  // Preserve all incoming fields\n      connectionPool: poolConfig,\n      ssl: sslConfig,\n      http2: options.http2 || options.ext.http2 || {},\n      hostname: options.hostname || 'localhost',\n      port: options.port || 443,\n      protocol: options.protocol || 'http2',\n      trace: options.trace || false\n    }\n    if (config.port === 80) {\n      config.port = 443;\n    }\n    return config;\n  }\n\n  static createGrpcConfig(options: Partial<GrpcServerOptions> = {\n    hostname: 'localhost',\n    port: 50051,\n    protocol: 'grpc',\n    trace: false,\n    ext: {},\n    connectionPool: {}\n  } as unknown as GrpcServerOptions): GrpcServerOptions {\n    if (!options.ext) {\n      options.ext = {};\n    }\n    \n    this.migrateSSLFromExt(options);\n\n    // 使用 PoolConfigHelper 创建默认连接池配置\n    const defaultPoolConfig = PoolConfigHelper.createGrpcConfig();\n    const poolConfig = PoolConfigHelper.mergeConfigs(defaultPoolConfig, options.connectionPool || {});\n\n    // 只使用 options.ssl\n    const sslConfig: SSLConfig = (options.ssl || {}) as SSLConfig;\n\n    // Preserve all original options including custom fields\n    return {\n      ...options,  // Preserve all incoming fields\n      channelOptions: options.channelOptions || {},\n      ssl: sslConfig,\n      connectionPool: poolConfig,\n      hostname: options.hostname || 'localhost',\n      port: options.port || 50051,\n      protocol: options.protocol || 'grpc',\n      trace: options.trace || false,\n    } as GrpcServerOptions;\n  }\n\n  static createHttp3Config(options: Partial<Http3ServerOptions> = {\n    hostname: 'localhost',\n    port: 443,\n    protocol: 'http3',\n    trace: false,\n    ext: {},\n    connectionPool: {}\n  } as unknown as Http3ServerOptions): Http3ServerOptions {\n    if (!options.ext) {\n      options.ext = {};\n    }\n    \n    this.migrateSSLFromExt(options);\n    \n    // 使用 PoolConfigHelper 创建默认连接池配置\n    const defaultPoolConfig = PoolConfigHelper.createHttp3Config();\n    const poolConfig = PoolConfigHelper.mergeConfigs(defaultPoolConfig, options.connectionPool || {});\n\n    // 只使用 options.ssl\n    const sslConfig: SSL3Config = (options.ssl || {}) as SSL3Config;\n\n    // Preserve all original options including custom fields\n    const config =  {\n      ...options,  // Preserve all incoming fields\n      connectionPool: poolConfig,\n      ssl: sslConfig,\n      http3: options.http3 || options.ext.http3 || {},\n      quic: options.quic || options.ext.quic || {},\n      hostname: options.hostname || 'localhost',\n      port: options.port || 443,\n      protocol: options.protocol || 'http3',\n      trace: options.trace || false\n    }\n    if (config.port === 80) {\n      config.port = 443;\n    }\n    return config;\n  }\n\n  static createWebSocketConfig(options: any = {\n    hostname: 'localhost',\n    port: 8080,\n    protocol: 'ws',\n    trace: false,\n    ext: {},\n    connectionPool: {}\n  }): WebSocketServerOptions {\n    if (!options.ext) {\n      options.ext = {};\n    }\n    \n    this.migrateSSLFromExt(options);\n    \n    // 使用 PoolConfigHelper 创建默认连接池配置\n    const defaultPoolConfig = PoolConfigHelper.createWebSocketConfig();\n    const poolConfig = PoolConfigHelper.mergeConfigs(defaultPoolConfig, options.connectionPool || {});\n    \n    // 只使用 options.ssl\n    const sslConfig = options.ssl || {};\n    \n    // Preserve all original options including custom fields\n    return {\n      ...options,  // Preserve all incoming fields\n      wsOptions: options.wsOptions || options.ext.wsOptions || {},\n      ssl: sslConfig,\n      connectionPool: poolConfig,\n      hostname: options.hostname || 'localhost',\n      port: options.port || 8080,\n      protocol: options.protocol || 'ws',\n      trace: options.trace || false\n    } as WebSocketServerOptions;\n  }\n}\n","/*\n * @Description: HTTP连接池管理器\n * @Usage: HTTP/HTTPS协议的连接池实现\n * @Author: richen\n * @Date: 2024-11-27 21:30:00\n * @LastEditTime: 2024-11-27 21:30:00\n */\n\nimport { Socket } from 'net';\nimport { TLSSocket } from 'tls';\nimport { \n  ConnectionPoolManager, \n  ConnectionRequestOptions\n} from './pool';\nimport { ConnectionPoolConfig } from '../config/pool';\n\n/**\n * HTTP连接元数据\n */\ninterface HttpConnectionMetadata {\n  id: string;\n  createdAt: number;\n  lastUsed: number;\n  available: boolean;\n  remoteAddress?: string;\n  remotePort?: number;\n  localAddress?: string;\n  localPort?: number;\n  encrypted: boolean;\n  protocol?: string;\n  requestCount: number;\n  bytesSent: number;\n  bytesReceived: number;\n}\n\n/**\n * HTTP连接池管理器\n */\nexport class HttpConnectionPoolManager extends ConnectionPoolManager<Socket> {\n  private keepAliveAgent?: any;\n\n  constructor(config: ConnectionPoolConfig = {}) {\n    super('http', config);\n  }\n\n  /**\n   * 验证HTTP连接\n   */\n  protected validateConnection(connection: Socket): boolean {\n    return connection instanceof Socket && \n           !connection.destroyed && \n           connection.readable && \n           connection.writable;\n  }\n\n  /**\n   * 清理HTTP连接\n   */\n  protected async cleanupConnection(connection: Socket): Promise<void> {\n    try {\n      if (!connection.destroyed) {\n        connection.destroy();\n      }\n    } catch (error) {\n      this.logger.warn('Error cleaning up HTTP connection', {}, error);\n    }\n  }\n\n  /**\n   * 获取可用连接\n   */\n  protected async getAvailableConnection(): Promise<{ connection: Socket; id: string } | null> {\n    for (const [id, metadata] of this.connectionMetadata) {\n      if (metadata.available && this.isConnectionHealthy(this.connections.get(id)!)) {\n        const connection = this.connections.get(id);\n        if (connection) {\n          // 标记为不可用\n          metadata.available = false;\n          metadata.lastUsed = Date.now();\n          return { connection, id };\n        }\n      }\n    }\n    return null;\n  }\n\n  /**\n   * 创建新连接\n   */\n  protected async createNewConnection(_options: ConnectionRequestOptions): Promise<{ connection: Socket; id: string; metadata?: any } | null> {\n    // HTTP连接通常是被动接受的，这里返回null\n    // 在实际的HTTP服务器实现中，连接会通过server.on('connection')事件添加\n    return null;\n  }\n\n  /**\n   * 检查连接是否健康\n   */\n  isConnectionHealthy(connection: Socket): boolean {\n    if (!connection) return false;\n    \n    const connectionId = this.findConnectionId(connection);\n    if (!connectionId) return false;\n    \n    const metadata = this.connectionMetadata.get(connectionId) as HttpConnectionMetadata;\n    if (!metadata) return false;\n    \n    // 检查连接状态\n    const isHealthy = !connection.destroyed && \n                     connection.readable && \n                     connection.writable;\n    \n    // 检查是否超时\n    const now = Date.now();\n    const idleTimeout = this.config.keepAliveTimeout || 5000;\n    const isIdle = metadata.available && (now - metadata.lastUsed) > idleTimeout;\n    \n    return isHealthy && !isIdle;\n  }\n\n  /**\n   * 添加HTTP连接（由服务器调用）\n   */\n  async addHttpConnection(connection: Socket): Promise<boolean> {\n    const metadata: Partial<HttpConnectionMetadata> = {\n      remoteAddress: connection.remoteAddress,\n      remotePort: connection.remotePort,\n      localAddress: connection.localAddress,\n      localPort: connection.localPort,\n      encrypted: connection instanceof TLSSocket,\n      protocol: connection instanceof TLSSocket ? 'https' : 'http',\n      requestCount: 0,\n      bytesSent: 0,\n      bytesReceived: 0\n    };\n\n    return this.registerConnection(connection, metadata);\n  }\n\n\n  /**\n   * 处理HTTP请求完成\n   */\n  async handleRequestComplete(connection: Socket, bytesSent: number = 0): Promise<void> {\n    const connectionId = this.findConnectionId(connection);\n    if (!connectionId) return;\n\n    const metadata = this.connectionMetadata.get(connectionId) as HttpConnectionMetadata;\n    if (metadata) {\n      metadata.requestCount++;\n      metadata.bytesSent += bytesSent;\n      metadata.lastUsed = Date.now();\n      \n      // 检查是否应该关闭连接\n      const maxRequests = 100; // 可配置\n      if (metadata.requestCount >= maxRequests) {\n        await this.removeConnection(connection, 'Max requests reached');\n        return;\n      }\n      \n      // 标记为可用状态，可以处理下一个请求\n      metadata.available = true;\n    }\n  }\n\n  /**\n   * 获取连接统计信息\n   */\n  getConnectionStats() {\n    const stats = this.getMetrics();\n    const activeConnections = this.getActiveConnectionCount();\n    \n    let availableConnections = 0;\n    let totalRequests = 0;\n    let totalBytesSent = 0;\n    let totalBytesReceived = 0;\n    let httpsConnections = 0;\n    \n    for (const [connectionId, _connection] of this.connections) {\n      const metadata = this.connectionMetadata.get(connectionId) as HttpConnectionMetadata;\n      \n      if (metadata) {\n        if (metadata.available) {\n          availableConnections++;\n        }\n        \n        totalRequests += metadata.requestCount;\n        totalBytesSent += metadata.bytesSent;\n        totalBytesReceived += metadata.bytesReceived;\n        \n        if (metadata.encrypted) {\n          httpsConnections++;\n        }\n      }\n    }\n    \n    return {\n      ...stats,\n      availableConnections,\n      totalRequests,\n      totalBytesSent,\n      totalBytesReceived,\n      httpsConnections,\n      httpConnections: activeConnections - httpsConnections,\n      averageRequestsPerConnection: activeConnections > 0 ? totalRequests / activeConnections : 0,\n      utilizationRatio: this.config.maxConnections ? \n        activeConnections / this.config.maxConnections : 0\n    };\n  }\n\n  /**\n   * 设置Keep-Alive超时\n   */\n  setKeepAliveTimeout(timeout: number): void {\n    this.config.keepAliveTimeout = timeout;\n    \n    // 更新现有连接的超时设置\n    for (const connection of this.connections.values()) {\n      if (connection instanceof Socket) {\n        connection.setTimeout(timeout);\n      }\n    }\n  }\n\n  /**\n   * 获取连接详细信息\n   */\n  getConnectionDetails(): Array<{\n    id: string;\n    remoteAddress: string;\n    protocol: string;\n    requestCount: number;\n    bytesSent: number;\n    bytesReceived: number;\n    age: number;\n    idle: number;\n  }> {\n    const now = Date.now();\n    const details: Array<any> = [];\n    \n    for (const [connectionId, metadata] of this.connectionMetadata) {\n      const httpMetadata = metadata as HttpConnectionMetadata;\n      \n      details.push({\n        id: connectionId,\n        remoteAddress: httpMetadata.remoteAddress || 'unknown',\n        protocol: httpMetadata.protocol || 'unknown',\n        requestCount: httpMetadata.requestCount,\n        bytesSent: httpMetadata.bytesSent,\n        bytesReceived: httpMetadata.bytesReceived,\n        age: now - httpMetadata.createdAt,\n        idle: now - httpMetadata.lastUsed\n      });\n    }\n    \n    return details;\n  }\n\n  /**\n   * 销毁连接池\n   */\n  async destroy(): Promise<void> {\n    // 调用父类销毁方法（会清理所有TimerManager的定时器）\n    await super.destroy();\n  }\n\n  /**\n   * 协议特定的连接处理器设置\n   */\n  protected async setupProtocolSpecificHandlers(connection: Socket): Promise<void> {\n    const connectionId = this.findConnectionId(connection);\n    if (!connectionId) return;\n\n    // 处理连接关闭\n    connection.on('close', () => {\n      this.removeConnection(connection, 'Connection closed').catch(error => {\n        this.logger.error('Error removing closed HTTP connection', {}, error);\n      });\n    });\n\n    // 处理连接错误\n    connection.on('error', (error) => {\n      this.logger.warn('HTTP connection error', {}, { \n        connectionId, \n        error: error.message \n      });\n      this.removeConnection(connection, `Connection error: ${error.message}`).catch(err => {\n        this.logger.error('Error removing errored HTTP connection', {}, err);\n      });\n    });\n\n    // 处理连接超时\n    connection.on('timeout', () => {\n      this.removeConnection(connection, 'Connection timeout').catch(error => {\n        this.logger.error('Error removing timed out HTTP connection', {}, error);\n      });\n    });\n\n    // 监控数据传输（字节统计与活跃时间更新）\n    connection.on('data', (data) => {\n      const metadata = this.connectionMetadata.get(connectionId) as HttpConnectionMetadata;\n      if (metadata) {\n        metadata.bytesReceived += data.length;\n        metadata.lastUsed = Date.now();\n      }\n    });\n\n    // 设置空闲超时\n    const timeout = this.config.connectionTimeout || 30000;\n    connection.setTimeout(timeout);\n  }\n\n  /**\n   * 协议特定的连接创建逻辑\n   */\n  protected async createProtocolConnection(_options: ConnectionRequestOptions): Promise<{ connection: Socket; metadata?: any } | null> {\n    // HTTP连接由客户端发起，服务端不主动创建连接\n    // 连接通过registerConnection方法注册到池中\n    return null;\n  }\n} ","/*\n * @Description: HTTP/2连接池管理器\n * @Usage: HTTP/2协议的连接池实现\n * @Author: richen\n * @Date: 2024-11-27 22:00:00\n * @LastEditTime: 2024-11-27 22:00:00\n */\n\nimport { \n  Http2Session, \n  Http2Stream,\n  constants as http2Constants\n} from 'http2';\nimport { TLSSocket } from 'tls';\nimport { \n  ConnectionPoolManager, \n  ConnectionRequestOptions\n} from './pool';\nimport { ConnectionPoolConfig } from '../config/pool';\n\n/**\n * HTTP/2会话元数据\n */\ninterface Http2SessionMetadata {\n  id: string;\n  createdAt: number;\n  lastUsed: number;\n  available: boolean;\n  remoteAddress?: string;\n  remotePort?: number;\n  localAddress?: string;\n  localPort?: number;\n  encrypted: boolean;\n  protocol: string;\n  activeStreams: number;\n  totalStreams: number;\n  maxConcurrentStreams: number;\n  initialWindowSize: number;\n  streamErrors: number;\n  isGoingAway: boolean;\n  lastPingTime?: number;\n  lastPingAck?: number;\n  settings: Record<string, any>;\n}\n\n/**\n * HTTP/2连接池管理器\n */\nexport class Http2ConnectionPoolManager extends ConnectionPoolManager<Http2Session> {\n  private readonly activeStreams = new Map<string, Set<Http2Stream>>();\n  private pingInterval?: NodeJS.Timeout;\n\n  constructor(config: ConnectionPoolConfig = {}) {\n    super('http2', config);\n\n    // 启动HTTP/2特有的监控任务\n    this.startHttp2MonitoringTasks();\n  }\n\n  /**\n   * 验证HTTP/2会话\n   */\n  protected validateConnection(session: Http2Session): boolean {\n    return session && \n           !session.destroyed && \n           !session.closed &&\n           session.state &&\n           session.state.effectiveLocalWindowSize > 0;\n  }\n\n  /**\n   * 清理HTTP/2会话\n   */\n  protected async cleanupConnection(session: Http2Session): Promise<void> {\n    try {\n      const sessionId = this.findHttp2SessionId(session);\n      if (sessionId) {\n        // 清理活跃流\n        const streams = this.activeStreams.get(sessionId);\n        if (streams) {\n          for (const stream of streams) {\n            try {\n              if (!stream.destroyed) {\n                stream.close(http2Constants.NGHTTP2_CANCEL);\n              }\n            } catch {\n              // Stream close error handled silently\n            }\n          }\n          this.activeStreams.delete(sessionId);\n        }\n      }\n\n      if (!session.destroyed && !session.closed) {\n        session.close();\n      }\n    } catch (error) {\n      this.logger.warn('Error cleaning up HTTP/2 session', {}, error);\n    }\n  }\n\n  /**\n   * 获取可用会话\n   */\n  protected async getAvailableConnection(): Promise<{ connection: Http2Session; id: string } | null> {\n    for (const [id, metadata] of this.connectionMetadata) {\n      const http2Metadata = metadata as Http2SessionMetadata;\n      \n      // 检查会话是否可用且有容量\n      if (http2Metadata.available && \n          !http2Metadata.isGoingAway &&\n          http2Metadata.activeStreams < http2Metadata.maxConcurrentStreams &&\n          this.isConnectionHealthy(this.connections.get(id)!)) {\n        \n        const session = this.connections.get(id);\n        if (session) {\n          // 更新使用时间\n          http2Metadata.lastUsed = Date.now();\n          return { connection: session, id };\n        }\n      }\n    }\n    return null;\n  }\n\n  /**\n   * 创建新连接 - HTTP/2会话通常是被动接受的\n   */\n  protected async createNewConnection(_options: ConnectionRequestOptions): Promise<{ connection: Http2Session; id: string; metadata?: any } | null> {\n    // HTTP/2会话通常是被动接受的，这里返回null\n    // 在实际的HTTP/2服务器实现中，会话会通过server.on('session')事件添加\n    return null;\n  }\n\n  /**\n   * 检查会话是否健康\n   */\n  isConnectionHealthy(session: Http2Session): boolean {\n    if (!session) return false;\n    \n    const sessionId = this.findHttp2SessionId(session);\n    if (!sessionId) return false;\n    \n    const metadata = this.connectionMetadata.get(sessionId) as Http2SessionMetadata;\n    if (!metadata) return false;\n    \n    // 检查会话状态\n    const isSessionHealthy = !session.destroyed && \n                            !session.closed &&\n                            !metadata.isGoingAway &&\n                            session.state &&\n                            session.state.effectiveLocalWindowSize > 0;\n    \n    // 检查ping响应时间\n    const now = Date.now();\n    const pingTimeout = this.config.protocolSpecific?.keepAliveTime || 30000;\n    \n    if (metadata.lastPingTime && !metadata.lastPingAck) {\n      if (now - metadata.lastPingTime > pingTimeout) {\n        return false;\n      }\n    }\n    \n    return isSessionHealthy;\n  }\n\n  /**\n   * 添加HTTP/2会话（由服务器调用）\n   */\n  async addHttp2Session(session: Http2Session): Promise<boolean> {\n    const socket = session.socket as TLSSocket;\n    \n    // 获取会话设置\n    const settings = session.localSettings || {};\n    \n    const metadata: Partial<Http2SessionMetadata> = {\n      remoteAddress: socket?.remoteAddress,\n      remotePort: socket?.remotePort,\n      localAddress: socket?.localAddress,\n      localPort: socket?.localPort,\n      encrypted: socket instanceof TLSSocket,\n      protocol: 'http2',\n      activeStreams: 0,\n      totalStreams: 0,\n      maxConcurrentStreams: settings.maxConcurrentStreams || 100,\n      initialWindowSize: settings.initialWindowSize || 65535,\n      streamErrors: 0,\n      isGoingAway: false,\n      settings: settings\n    };\n\n    const success = await this.addConnection(session, metadata);\n    \n    if (success) {\n      this.setupSessionEventHandlers(session);\n    }\n    \n    return success;\n  }\n\n  /**\n   * 设置会话事件处理器\n   */\n  private setupSessionEventHandlers(session: Http2Session): void {\n    const sessionId = this.findHttp2SessionId(session);\n    if (!sessionId) return;\n\n    // 初始化流集合\n    this.activeStreams.set(sessionId, new Set());\n\n    // 处理会话关闭\n    session.on('close', () => {\n      this.removeConnection(session, 'Session closed').catch(error => {\n        this.logger.error('Error removing closed session', {}, error);\n      });\n    });\n\n    // 处理会话错误\n    session.on('error', (error) => {\n      this.logger.warn('HTTP/2 session error', {}, { \n        sessionId, \n        error: error.message \n      });\n      this.removeConnection(session, `Session error: ${error.message}`).catch(err => {\n        this.logger.error('Error removing errored session', {}, err);\n      });\n    });\n\n    // 处理GOAWAY帧\n    session.on('goaway', (errorCode, lastStreamID, opaqueData) => {\n      const metadata = this.connectionMetadata.get(sessionId) as Http2SessionMetadata;\n      if (metadata) {\n        metadata.isGoingAway = true;\n        metadata.available = false;\n      }\n      \n      this.logger.info('HTTP/2 session received GOAWAY', {}, {\n        sessionId,\n        errorCode,\n        lastStreamID,\n        opaqueData: opaqueData?.toString()\n      });\n      \n      // 延迟关闭会话以允许正在进行的流完成\n      setTimeout(() => {\n        this.removeConnection(session, `GOAWAY received: ${errorCode}`).catch(error => {\n          this.logger.error('Error removing GOAWAY session', {}, error);\n        });\n      }, 5000);\n    });\n\n    // 处理流创建\n    session.on('stream', (stream: Http2Stream, headers) => {\n      this.handleNewStream(sessionId, stream, headers);\n    });\n\n    // 处理ping响应\n    session.on('ping', (_payload: any) => {\n      const metadata = this.connectionMetadata.get(sessionId) as Http2SessionMetadata;\n      if (metadata) {\n        metadata.lastPingAck = Date.now();\n      }\n    });\n\n    // 处理设置更新\n    session.on('localSettings', (settings) => {\n      const metadata = this.connectionMetadata.get(sessionId) as Http2SessionMetadata;\n      if (metadata) {\n        metadata.settings = { ...metadata.settings, ...settings };\n        metadata.maxConcurrentStreams = settings.maxConcurrentStreams || metadata.maxConcurrentStreams;\n        metadata.initialWindowSize = settings.initialWindowSize || metadata.initialWindowSize;\n      }\n    });\n\n    // 设置定期ping\n    this.startSessionPing(session, sessionId);\n  }\n\n  /**\n   * 处理新流\n   */\n  private handleNewStream(sessionId: string, stream: Http2Stream, _headers: any): void {\n    const metadata = this.connectionMetadata.get(sessionId) as Http2SessionMetadata;\n    if (!metadata) return;\n\n    const streams = this.activeStreams.get(sessionId);\n    if (streams) {\n      streams.add(stream);\n      metadata.activeStreams = streams.size;\n      metadata.totalStreams++;\n      metadata.lastUsed = Date.now();\n\n      // HTTP/2 stream created\n\n      // 处理流事件\n      stream.on('close', () => {\n        streams.delete(stream);\n        metadata.activeStreams = streams.size;\n        \n        // HTTP/2 stream closed\n      });\n\n      stream.on('error', (error) => {\n        metadata.streamErrors++;\n        streams.delete(stream);\n        metadata.activeStreams = streams.size;\n        \n        this.logger.warn('HTTP/2 stream error', {}, {\n          sessionId,\n          streamId: stream.id,\n          error: error.message,\n          totalStreamErrors: metadata.streamErrors\n        });\n      });\n\n      // 记录延迟\n      const startTime = Date.now();\n      stream.on('close', () => {\n        const latency = Date.now() - startTime;\n        this.recordLatency(latency);\n      });\n    }\n  }\n\n  /**\n   * 启动会话ping（保留在TimerManager中，因为是动态创建的）\n   */\n  private startSessionPing(session: Http2Session, sessionId: string): void {\n    const pingInterval = this.config.protocolSpecific?.keepAliveTime || 30000;\n    \n    const pingTimer = setInterval(() => {\n      if (session.destroyed || session.closed) {\n        clearInterval(pingTimer);\n        return;\n      }\n\n      try {\n        const metadata = this.connectionMetadata.get(sessionId) as Http2SessionMetadata;\n        if (metadata) {\n          metadata.lastPingTime = Date.now();\n          session.ping((err, _duration, _payload) => {\n            if (!err && metadata) {\n              metadata.lastPingAck = Date.now();\n            }\n          });\n        }\n      } catch {\n        // Ping error handled silently\n      }\n    }, pingInterval);\n  }\n\n  /**\n   * 启动HTTP/2监控任务\n   */\n  private startHttp2MonitoringTasks(): void {\n    // Ping间隔\n    const pingInterval = this.config.protocolSpecific?.keepAliveTime || 30000;\n    this.pingInterval = setInterval(() => {\n      this.pingAllSessions();\n    }, pingInterval);\n\n    // 健康检查间隔\n    this.healthCheckInterval = setInterval(() => {\n      this.performHealthCheck();\n    }, 60000); // 1分钟\n  }\n\n  /**\n   * 向所有会话发送ping\n   */\n  private pingAllSessions(): void {\n    for (const [sessionId, session] of this.connections) {\n      if (!session.destroyed && !session.closed) {\n        try {\n          const metadata = this.connectionMetadata.get(sessionId) as Http2SessionMetadata;\n          if (metadata && !metadata.isGoingAway) {\n            metadata.lastPingTime = Date.now();\n            session.ping((err, _duration, _payload) => {\n              if (!err && metadata) {\n                metadata.lastPingAck = Date.now();\n              }\n            });\n          }\n        } catch {\n          // Session ping failed\n        }\n      }\n    }\n  }\n\n  /**\n   * 执行健康检查\n   */\n  private performHealthCheck(): void {\n    const unhealthySessions: Http2Session[] = [];\n    \n    for (const [_sessionId, session] of this.connections) {\n      if (!this.isConnectionHealthy(session)) {\n        unhealthySessions.push(session);\n      }\n    }\n\n    // 清理不健康的会话\n    unhealthySessions.forEach(session => {\n      this.removeConnection(session, 'Health check failed').catch(error => {\n        this.logger.error('Error removing unhealthy session', {}, error);\n      });\n    });\n\n    // Unhealthy HTTP/2 sessions cleaned up silently (if any)\n  }\n\n  /**\n   * 获取会话统计信息\n   */\n  getConnectionStats() {\n    const stats = this.getMetrics();\n    const activeSessions = this.getActiveConnectionCount();\n    \n    let availableSessions = 0;\n    let totalActiveStreams = 0;\n    let totalStreams = 0;\n    let totalStreamErrors = 0;\n    let goingAwaySessions = 0;\n    \n    for (const [sessionId, _session] of this.connections) {\n      const metadata = this.connectionMetadata.get(sessionId) as Http2SessionMetadata;\n      \n      if (metadata) {\n        if (metadata.available && !metadata.isGoingAway) {\n          availableSessions++;\n        }\n        \n        if (metadata.isGoingAway) {\n          goingAwaySessions++;\n        }\n        \n        totalActiveStreams += metadata.activeStreams;\n        totalStreams += metadata.totalStreams;\n        totalStreamErrors += metadata.streamErrors;\n      }\n    }\n    \n    return {\n      ...stats,\n      availableSessions,\n      goingAwaySessions,\n      totalActiveStreams,\n      totalStreams,\n      totalStreamErrors,\n      averageStreamsPerSession: activeSessions > 0 ? totalActiveStreams / activeSessions : 0,\n      utilizationRatio: this.config.maxConnections ? \n        activeSessions / this.config.maxConnections : 0\n    };\n  }\n\n  /**\n   * 获取会话详细信息\n   */\n  getSessionDetails(): Array<{\n    id: string;\n    remoteAddress: string;\n    protocol: string;\n    activeStreams: number;\n    totalStreams: number;\n    streamErrors: number;\n    maxConcurrentStreams: number;\n    isGoingAway: boolean;\n    age: number;\n    idle: number;\n  }> {\n    const now = Date.now();\n    const details: Array<any> = [];\n    \n    for (const [sessionId, metadata] of this.connectionMetadata) {\n      const http2Metadata = metadata as Http2SessionMetadata;\n      \n      details.push({\n        id: sessionId,\n        remoteAddress: http2Metadata.remoteAddress || 'unknown',\n        protocol: http2Metadata.protocol,\n        activeStreams: http2Metadata.activeStreams,\n        totalStreams: http2Metadata.totalStreams,\n        streamErrors: http2Metadata.streamErrors,\n        maxConcurrentStreams: http2Metadata.maxConcurrentStreams,\n        isGoingAway: http2Metadata.isGoingAway,\n        age: now - http2Metadata.createdAt,\n        idle: now - http2Metadata.lastUsed\n      });\n    }\n    \n    return details;\n  }\n\n  /**\n   * 优雅关闭会话\n   */\n  async gracefulCloseSession(session: Http2Session, timeout: number = 5000): Promise<void> {\n    const sessionId = this.findHttp2SessionId(session);\n    if (!sessionId) return;\n\n    try {\n      // 发送GOAWAY帧\n      session.goaway(0, 0, Buffer.from('Server shutdown'));\n      \n      // 等待活跃流完成\n      const streams = this.activeStreams.get(sessionId);\n      if (streams && streams.size > 0) {\n        await new Promise((resolve) => {\n          const checkInterval = setInterval(() => {\n            if (streams.size === 0) {\n              clearInterval(checkInterval);\n              resolve(void 0);\n            }\n          }, 100);\n\n          // 超时处理\n          setTimeout(() => {\n            clearInterval(checkInterval);\n            resolve(void 0);\n          }, timeout);\n        });\n      }\n\n      // 关闭会话\n      if (!session.destroyed && !session.closed) {\n        session.close();\n      }\n    } catch (error) {\n      this.logger.error('Error during graceful session close', {}, error);\n    }\n  }\n\n  /**\n   * 找到会话ID的辅助方法\n   */\n  private findHttp2SessionId(session: Http2Session): string | null {\n    for (const [id, conn] of this.connections) {\n      if (conn === session) return id;\n    }\n    return null;\n  }\n\n  /**\n   * 销毁连接池\n   */\n  async destroy(): Promise<void> {\n    try {\n      // 清理所有流映射\n      this.activeStreams.clear();\n      \n      // 调用父类的销毁方法（会自动清理定时器）\n      await super.destroy();\n      \n      this.logger.info('HTTP/2 connection pool destroyed');\n    } catch (error) {\n      this.logger.error('Error destroying HTTP/2 connection pool', {}, error);\n      throw error;\n    }\n  }\n\n  // ============= 实现抽象方法 =============\n\n  /**\n   * 设置协议特定的连接处理器\n   */\n  protected async setupProtocolSpecificHandlers(session: Http2Session): Promise<void> {\n    // HTTP/2特定的处理器设置已在addHttp2Session中完成\n    this.setupSessionEventHandlers(session);\n  }\n\n  /**\n   * 协议特定的连接创建逻辑\n   */\n  protected async createProtocolConnection(_options: ConnectionRequestOptions): Promise<{ connection: Http2Session; metadata?: any } | null> {\n    // HTTP/2会话由服务器被动接受，不主动创建\n    return null;\n  }\n} ","/*\n * @Description: WebSocket连接池管理器\n * @Usage: WebSocket协议的连接池实现\n * @Author: richen\n * @Date: 2024-11-27 21:00:00\n * @LastEditTime: 2024-11-27 21:00:00\n */\n\nimport * as WS from 'ws';\nimport { IncomingMessage } from 'http';\nimport { \n  ConnectionPoolManager, \n  ConnectionRequestOptions\n} from './pool';\nimport { ConnectionPoolConfig } from '../config/pool';\n\n/**\n * WebSocket连接元数据\n */\ninterface WebSocketConnectionMetadata {\n  id: string;\n  createdAt: number;\n  lastUsed: number;\n  available: boolean;\n  request?: IncomingMessage;\n  remoteAddress?: string;\n  userAgent?: string;\n  lastPingTime?: number;\n  lastPongTime?: number;\n  isAlive: boolean;\n}\n\n/**\n * WebSocket连接池管理器\n */\nexport class WebSocketConnectionPoolManager extends ConnectionPoolManager<WS.WebSocket> {\n  private heartbeatInterval?: NodeJS.Timeout;\n  private pingInterval?: NodeJS.Timeout;\n\n  constructor(config: ConnectionPoolConfig = {}) {\n    super('websocket', config);\n    \n    // 启动心跳监控\n    this.startHeartbeat();\n  }\n\n  /**\n   * 验证WebSocket连接\n   */\n  protected validateConnection(connection: WS.WebSocket): boolean {\n    return connection && connection.readyState === WS.WebSocket.OPEN;\n  }\n\n  /**\n   * 清理WebSocket连接\n   */\n  protected async cleanupConnection(connection: WS.WebSocket): Promise<void> {\n    try {\n      // 移除所有事件监听器\n      connection.removeAllListeners();\n      \n      // 关闭连接\n      if (connection.readyState === WS.WebSocket.OPEN || \n          connection.readyState === WS.WebSocket.CONNECTING) {\n        connection.terminate();\n      }\n    } catch (error) {\n      this.logger.warn('Error cleaning up WebSocket connection', {}, error);\n    }\n  }\n\n  /**\n   * 获取可用连接\n   */\n  protected async getAvailableConnection(): Promise<{ connection: WS.WebSocket; id: string } | null> {\n    for (const [id, metadata] of this.connectionMetadata) {\n      if (metadata.available && this.isConnectionHealthy(this.connections.get(id)!)) {\n        const connection = this.connections.get(id);\n        if (connection) {\n          // 标记为不可用\n          metadata.available = false;\n          metadata.lastUsed = Date.now();\n          return { connection, id };\n        }\n      }\n    }\n    return null;\n  }\n\n  /**\n   * 创建新连接 - 支持主动创建WebSocket连接（用于客户端模式或测试）\n   */\n  protected async createNewConnection(options: ConnectionRequestOptions): Promise<{ connection: WS.WebSocket; id: string; metadata?: any } | null> {\n    try {\n      // 获取连接URL，优先使用options中的metadata.url\n      const url = options.metadata?.url || 'ws://localhost:3000';\n      \n      // 获取协议和选项\n      const protocols = options.metadata?.protocols;\n      const wsOptions: any = {\n        headers: options.metadata?.headers\n      };\n\n      // 从配置中获取额外的选项（如SSL配置）\n      if (options.metadata) {\n        // 复制所有非特殊字段的metadata到wsOptions\n        Object.keys(options.metadata).forEach(key => {\n          if (!['url', 'protocols', 'headers'].includes(key)) {\n            wsOptions[key] = options.metadata![key];\n          }\n        });\n      }\n\n      // 创建WebSocket连接\n      const connection = new WS.WebSocket(url, protocols, wsOptions);\n      const connectionId = this.generateConnectionId();\n\n      // 等待连接建立\n      await new Promise<void>((resolve, reject) => {\n        const timeout = setTimeout(() => {\n          reject(new Error('WebSocket connection timeout'));\n        }, this.config.connectionTimeout || 30000);\n\n        connection.once('open', () => {\n          clearTimeout(timeout);\n          resolve();\n        });\n\n        connection.once('error', (error) => {\n          clearTimeout(timeout);\n          reject(error);\n        });\n      });\n\n      const metadata: WebSocketConnectionMetadata = {\n        id: connectionId,\n        createdAt: Date.now(),\n        lastUsed: Date.now(),\n        available: false, // 新创建的连接标记为不可用，等待被使用\n        isAlive: true,\n        lastPingTime: undefined,\n        lastPongTime: undefined\n      };\n\n      return { connection, id: connectionId, metadata };\n    } catch (error) {\n      this.logger.error('Failed to create WebSocket connection', {}, error);\n      return null;\n    }\n  }\n\n  /**\n   * 检查连接是否健康\n   */\n  isConnectionHealthy(connection: WS.WebSocket): boolean {\n    if (!connection) return false;\n    \n    const isOpen = connection.readyState === WS.WebSocket.OPEN;\n    const connectionId = this.findConnectionId(connection);\n    \n    if (!connectionId) {\n      // 如果连接还没有被添加到池中，只检查基本状态\n      return isOpen;\n    }\n    \n    const metadata = this.connectionMetadata.get(connectionId) as WebSocketConnectionMetadata;\n    if (!metadata) {\n      // 如果没有元数据，只检查基本状态\n      return isOpen;\n    }\n    \n    // 检查是否活跃（最近的ping/pong）\n    const now = Date.now();\n    const pingTimeout = this.config.protocolSpecific?.pongTimeout || 30000;\n    \n    if (metadata.lastPingTime && !metadata.lastPongTime) {\n      // 有ping但没有pong，检查超时\n      if (now - metadata.lastPingTime > pingTimeout) {\n        return false;\n      }\n    }\n    \n    return isOpen && metadata.isAlive;\n  }\n\n  /**\n   * 协议特定的连接处理器设置\n   */\n  protected async setupProtocolSpecificHandlers(connection: WS.WebSocket): Promise<void> {\n    const connectionId = this.findConnectionId(connection);\n    if (!connectionId) return;\n\n    // 处理连接打开\n    connection.on('open', () => {\n      const metadata = this.connectionMetadata.get(connectionId) as WebSocketConnectionMetadata;\n      if (metadata) {\n        metadata.isAlive = true;\n        metadata.lastUsed = Date.now();\n      }\n    });\n\n    // 处理连接关闭\n    connection.on('close', () => {\n      this.removeConnection(connection, 'Client disconnected').catch(error => {\n        this.logger.error('Error removing closed connection', {}, error);\n      });\n    });\n\n    // 处理连接错误\n    connection.on('error', (error) => {\n      this.logger.warn('WebSocket connection error', {}, { \n        connectionId, \n        error: error.message \n      });\n      this.removeConnection(connection, `Connection error: ${error.message}`).catch(err => {\n        this.logger.error('Error removing errored connection', {}, err);\n      });\n    });\n\n    // 处理ping（服务端响应客户端的ping）\n    connection.on('ping', (data) => {\n      try {\n        connection.pong(data);\n      } catch {\n        // Pong send failed\n      }\n    });\n\n    // 处理pong响应\n    connection.on('pong', () => {\n      const metadata = this.connectionMetadata.get(connectionId) as WebSocketConnectionMetadata;\n      if (metadata) {\n        metadata.isAlive = true;\n        metadata.lastPongTime = Date.now();\n      }\n    });\n\n    // 处理消息\n    connection.on('message', () => {\n      const metadata = this.connectionMetadata.get(connectionId) as WebSocketConnectionMetadata;\n      if (metadata) {\n        metadata.lastUsed = Date.now();\n        metadata.isAlive = true;\n      }\n    });\n  }\n\n  /**\n   * 协议特定的连接创建逻辑\n   */\n  protected async createProtocolConnection(_options: ConnectionRequestOptions): Promise<{ connection: WS.WebSocket; metadata?: any } | null> {\n    // WebSocket连接由客户端发起，服务端不主动创建连接\n    // 连接通过registerConnection方法注册到池中\n    return null;\n  }\n\n  /**\n   * 添加WebSocket连接（对外接口，使用统一的registerConnection）\n   */\n  async addWebSocketConnection(\n    connection: WS.WebSocket, \n    request?: IncomingMessage\n  ): Promise<boolean> {\n    const metadata: Partial<WebSocketConnectionMetadata> = {\n      request,\n      remoteAddress: request?.socket?.remoteAddress,\n      userAgent: request?.headers['user-agent'],\n      isAlive: true,\n      lastPingTime: undefined,\n      lastPongTime: undefined\n    };\n\n    return this.registerConnection(connection, metadata);\n  }\n\n  /**\n   * 启动心跳监控\n   */\n  private startHeartbeat(): void {\n    const pingInterval = this.config.protocolSpecific?.pingInterval || 30000;\n    const heartbeatInterval = this.config.protocolSpecific?.heartbeatInterval || 60000;\n\n    // Ping interval\n    this.pingInterval = setInterval(() => {\n      this.pingAllConnections();\n    }, pingInterval);\n\n    // Heartbeat check interval\n    this.heartbeatInterval = setInterval(() => {\n      this.cleanupDeadConnections();\n    }, heartbeatInterval);\n  }\n\n  /**\n   * 向所有连接发送ping\n   */\n  private pingAllConnections(): void {\n    for (const [connectionId, connection] of this.connections) {\n      if (connection.readyState === WS.WebSocket.OPEN) {\n        try {\n          connection.ping();\n          const metadata = this.connectionMetadata.get(connectionId) as WebSocketConnectionMetadata;\n          if (metadata) {\n            metadata.lastPingTime = Date.now();\n            metadata.isAlive = false; // 将在pong时设为true\n          }\n        } catch {\n          // Ping failed\n        }\n      }\n    }\n  }\n\n  /**\n   * 清理死连接\n   */\n  private cleanupDeadConnections(): void {\n    const connectionsToRemove: WS.WebSocket[] = [];\n    \n    for (const [connectionId, connection] of this.connections) {\n      const metadata = this.connectionMetadata.get(connectionId) as WebSocketConnectionMetadata;\n      \n      if (!metadata || !this.isConnectionHealthy(connection)) {\n        connectionsToRemove.push(connection);\n      }\n    }\n\n    // 异步清理\n    connectionsToRemove.forEach(connection => {\n      this.removeConnection(connection, 'Dead connection cleanup').catch(error => {\n        this.logger.error('Error cleaning up dead connection', {}, error);\n      });\n    });\n\n    // Dead WebSocket connections cleaned up silently (if any)\n  }\n\n  /**\n   * 清理过期连接\n   */\n  cleanupStaleConnections(): number {\n    const now = Date.now();\n    const staleTimeout = this.config.connectionTimeout || 300000; // 5分钟\n    const connectionsToRemove: WS.WebSocket[] = [];\n\n    for (const [connectionId, metadata] of this.connectionMetadata) {\n      const wsMetadata = metadata as WebSocketConnectionMetadata;\n      \n      // 检查连接是否过期\n      if (wsMetadata.available && (now - wsMetadata.lastUsed) > staleTimeout) {\n        const connection = this.connections.get(connectionId);\n        if (connection) {\n          connectionsToRemove.push(connection);\n        }\n      }\n    }\n\n    // 异步清理\n    connectionsToRemove.forEach(connection => {\n      this.removeConnection(connection, 'Stale connection cleanup').catch(error => {\n        this.logger.error('Error cleaning up stale connection', {}, error);\n      });\n    });\n\n    return connectionsToRemove.length;\n  }\n\n  /**\n   * 获取连接统计信息\n   */\n  getConnectionStats() {\n    const stats = this.getMetrics();\n    const activeConnections = this.getActiveConnectionCount();\n    \n    let availableConnections = 0;\n    let healthyConnections = 0;\n    \n    for (const [connectionId, connection] of this.connections) {\n      const metadata = this.connectionMetadata.get(connectionId) as WebSocketConnectionMetadata;\n      \n      if (metadata?.available) {\n        availableConnections++;\n      }\n      \n      if (this.isConnectionHealthy(connection)) {\n        healthyConnections++;\n      }\n    }\n    \n    return {\n      ...stats,\n      availableConnections,\n      healthyConnections,\n      utilizationRatio: this.config.maxConnections ? \n        activeConnections / this.config.maxConnections : 0\n    };\n  }\n\n  /**\n   * 找到连接ID的辅助方法\n   */\n  private findWebSocketConnectionId(connection: WS.WebSocket): string | null {\n    for (const [id, conn] of this.connections) {\n      if (conn === connection) return id;\n    }\n    return null;\n  }\n\n  /**\n   * 销毁连接池\n   */\n  /**\n   * 重写添加连接方法，确保WebSocket连接正确设置\n   */\n  async addConnection(connection: WS.WebSocket, metadata: any = {}): Promise<boolean> {\n    const success = await super.addConnection(connection, metadata);\n    if (success) {\n      // 设置协议特定的事件处理器\n      await this.setupProtocolSpecificHandlers(connection);\n    }\n    return success;\n  }\n\n  async destroy(): Promise<void> {\n    // 调用父类销毁方法（会清理所有TimerManager的定时器）\n    await super.destroy();\n  }\n} ","/*\n * @Description: gRPC连接池管理器\n * @Usage: gRPC协议的连接池实现\n * @Author: richen\n * @Date: 2024-11-27 22:30:00\n * @LastEditTime: 2024-11-27 23:30:00\n */\n\nimport {\n  ConnectionPoolManager,\n  ConnectionRequestOptions\n} from './pool';\nimport { ConnectionPoolConfig } from '../config/pool';\n\n/**\n * gRPC连接元数据\n */\ninterface GrpcConnectionMetadata {\n  id: string;\n  createdAt: number;\n  lastUsed: number;\n  available: boolean;\n  peer: string;\n  callCount: number;\n  errorCount: number;\n  streamCount: number;\n  activeStreams: number;\n  totalBytesReceived: number;\n  totalBytesSent: number;\n  lastErrorTime?: number;\n  metadata?: Record<string, any>;\n}\n\n/**\n * 简化的gRPC连接接口\n */\ninterface GrpcConnection {\n  id: string;\n  peer: string;\n  metadata: any;\n  cancelled: boolean;\n  deadline?: Date;\n  [key: string]: any;\n}\n\n/**\n * gRPC连接池管理器\n */\nexport class GrpcConnectionPoolManager extends ConnectionPoolManager<GrpcConnection> {\n  private callMetrics = {\n    totalUnarycalls: 0,\n    totalStreamingCalls: 0,\n    totalErrors: 0,\n    averageCallDuration: 0,\n    activeStreams: 0\n  };\n\n  constructor(config: ConnectionPoolConfig = {}) {\n    super('grpc', config);\n  }\n\n  /**\n   * 验证gRPC连接\n   */\n  protected validateConnection(connection: GrpcConnection): boolean {\n    return connection &&\n      typeof connection.peer === 'string' &&\n      !connection.cancelled;\n  }\n\n  /**\n   * 清理gRPC连接\n   */\n  protected async cleanupConnection(connection: GrpcConnection): Promise<void> {\n    try {\n      // 标记连接为已取消\n      connection.cancelled = true;\n    } catch (cleanupError) {\n      this.logger.warn('Error cleaning up gRPC connection', {}, cleanupError);\n    }\n  }\n\n  /**\n   * 获取可用连接\n   */\n  protected async getAvailableConnection(): Promise<{ connection: GrpcConnection; id: string } | null> {\n    for (const [id, metadata] of this.connectionMetadata) {\n      if (metadata.available && this.isConnectionHealthy(this.connections.get(id)!)) {\n        const connection = this.connections.get(id);\n        if (connection) {\n          metadata.available = false;\n          metadata.lastUsed = Date.now();\n          return { connection, id };\n        }\n      }\n    }\n    return null;\n  }\n\n  /**\n   * 检查连接是否健康\n   */\n  isConnectionHealthy(connection: GrpcConnection): boolean {\n    if (!connection) return false;\n\n    const connectionId = this.findGrpcConnectionId(connection);\n    if (!connectionId) return false;\n\n    const metadata = this.connectionMetadata.get(connectionId) as GrpcConnectionMetadata;\n    if (!metadata) return false;\n\n    // 检查连接状态\n    const isHealthy = !connection.cancelled;\n\n    // 检查是否超时\n    const now = Date.now();\n    const maxIdleTime = this.config.connectionTimeout || 300000; // 5分钟\n    const isIdle = metadata.available && (now - metadata.lastUsed) > maxIdleTime;\n\n    return isHealthy && !isIdle;\n  }\n\n  /**\n   * 添加gRPC连接（由服务器调用）\n   */\n  async addGrpcConnection(peer: string, callMetadata?: any): Promise<boolean> {\n    const connection: GrpcConnection = {\n      id: this.createConnectionId(),\n      peer,\n      metadata: callMetadata || {},\n      cancelled: false,\n      deadline: undefined\n    };\n\n    const metadata: Partial<GrpcConnectionMetadata> = {\n      peer,\n      callCount: 0,\n      errorCount: 0,\n      streamCount: 0,\n      activeStreams: 0,\n      totalBytesReceived: 0,\n      totalBytesSent: 0,\n      metadata: callMetadata\n    };\n\n    const success = await this.addConnection(connection, metadata);\n\n    if (success) {\n      this.setupConnectionEventHandlers(connection);\n    }\n\n    return success;\n  }\n\n  /**\n   * 设置连接事件处理器\n   */\n  private setupConnectionEventHandlers(connection: GrpcConnection): void {\n    const connectionId = this.findGrpcConnectionId(connection);\n    if (!connectionId) return;\n\n    // 简化的事件处理，避免复杂的gRPC类型\n    // gRPC connection event handlers configured\n\n    // 设置超时（如果有deadline）\n    if (connection.deadline) {\n      const timeout = connection.deadline.getTime() - Date.now();\n      if (timeout > 0) {\n        setTimeout(() => {\n          if (!connection.cancelled) {\n            this.removeConnection(connection, 'Deadline exceeded').catch(error => {\n              this.logger.error('Error removing timed out gRPC connection', {}, error);\n            });\n          }\n        }, timeout);\n      }\n    }\n  }\n\n  /**\n   * 处理gRPC调用完成\n   */\n  async handleCallComplete(connection: GrpcConnection, success: boolean): Promise<void> {\n    const connectionId = this.findGrpcConnectionId(connection);\n    if (!connectionId) return;\n\n    const metadata = this.connectionMetadata.get(connectionId) as GrpcConnectionMetadata;\n    if (metadata) {\n      metadata.callCount++;\n      metadata.lastUsed = Date.now();\n\n      if (!success) {\n        metadata.errorCount++;\n        metadata.lastErrorTime = Date.now();\n        this.callMetrics.totalErrors++;\n      }\n\n      // 更新调用类型统计\n      this.updateCallMetrics(connection);\n\n      // 标记为可用\n      metadata.available = true;\n    }\n\n    // 对于一次性调用，完成后移除连接\n    if (this.isUnaryCall(connection)) {\n      await this.removeConnection(connection, 'Unary call completed');\n    }\n  }\n\n  /**\n   * 更新调用指标\n   */\n  private updateCallMetrics(connection: GrpcConnection): void {\n    if (this.isUnaryCall(connection)) {\n      this.callMetrics.totalUnarycalls++;\n    } else {\n      this.callMetrics.totalStreamingCalls++;\n    }\n  }\n\n  /**\n   * 判断是否为一元调用\n   */\n  private isUnaryCall(_connection: GrpcConnection): boolean {\n    // 简化实现，可以根据metadata判断\n    return true; // 默认认为是一元调用\n  }\n\n  /**\n   * 处理流响应发送\n   */\n  async handleStreamResponse(connection: GrpcConnection, data: any): Promise<void> {\n    const connectionId = this.findGrpcConnectionId(connection);\n    if (!connectionId) return;\n\n    const metadata = this.connectionMetadata.get(connectionId) as GrpcConnectionMetadata;\n    if (metadata) {\n      const dataSize = Buffer.isBuffer(data) ? data.length : JSON.stringify(data).length;\n      metadata.totalBytesSent += dataSize;\n      metadata.lastUsed = Date.now();\n    }\n  }\n\n  /**\n   * 清理过期连接\n   */\n  private cleanupExpiredGrpcConnections(): void {\n    const now = Date.now();\n    const maxIdleTime = this.config.connectionTimeout || 300000; // 默认5分钟\n    const connectionsToRemove: Array<{ id: string; connection: GrpcConnection }> = [];\n\n    for (const [id, metadata] of this.connectionMetadata) {\n      const typedMetadata = metadata as GrpcConnectionMetadata;\n      if (typedMetadata.available &&\n        (now - typedMetadata.lastUsed) > maxIdleTime) {\n        const connection = this.connections.get(id);\n        if (connection) {\n          connectionsToRemove.push({ id, connection });\n        }\n      }\n    }\n\n    // 异步清理过期连接\n    connectionsToRemove.forEach(({ connection }) => {\n      this.removeConnection(connection, 'Connection idle timeout').catch(error => {\n        this.logger.error('Error cleaning up idle gRPC connection', {}, error);\n      });\n    });\n\n    // Idle gRPC connections cleaned up silently (if any)\n  }\n\n  /**\n   * 获取连接统计信息\n   */\n  getConnectionStats() {\n    const baseStats = this.getMetrics();\n\n    let totalCalls = 0;\n    let totalErrors = 0;\n    let totalStreams = 0;\n    let activeStreams = 0;\n    let totalBytesReceived = 0;\n    let totalBytesSent = 0;\n\n    for (const [connectionId, _connection] of this.connections) {\n      const metadata = this.connectionMetadata.get(connectionId) as GrpcConnectionMetadata;\n\n      if (metadata) {\n        totalCalls += metadata.callCount;\n        totalErrors += metadata.errorCount;\n        totalStreams += metadata.streamCount;\n        activeStreams += metadata.activeStreams;\n        totalBytesReceived += metadata.totalBytesReceived;\n        totalBytesSent += metadata.totalBytesSent;\n      }\n    }\n\n    return {\n      ...baseStats,\n      grpcSpecific: {\n        totalCalls,\n        totalErrors,\n        totalStreams,\n        activeStreams,\n        totalBytesReceived,\n        totalBytesSent,\n        errorRate: totalCalls > 0 ? totalErrors / totalCalls : 0,\n        callMetrics: this.callMetrics\n      }\n    };\n  }\n\n  /**\n   * 获取gRPC特定指标\n   */\n  getGrpcMetrics() {\n    return {\n      ...this.callMetrics,\n      connections: Array.from(this.connectionMetadata.values())\n        .map((metadata: any) => ({\n          id: metadata.id,\n          peer: metadata.peer,\n          callCount: metadata.callCount,\n          errorCount: metadata.errorCount,\n          streamCount: metadata.streamCount,\n          activeStreams: metadata.activeStreams,\n          totalBytesReceived: metadata.totalBytesReceived,\n          totalBytesSent: metadata.totalBytesSent,\n          age: Date.now() - metadata.createdAt,\n          idle: Date.now() - metadata.lastUsed\n        }))\n    };\n  }\n\n  /**\n   * 找到连接ID的辅助方法\n   */\n  private findGrpcConnectionId(connection: GrpcConnection): string | null {\n    for (const [id, conn] of this.connections) {\n      if (conn === connection) return id;\n    }\n    return null;\n  }\n\n  /**\n   * 创建连接ID\n   */\n  private createConnectionId(): string {\n    return `grpc_${Date.now()}_${Math.random().toString(36).substr(2, 8)}`;\n  }\n\n  /**\n   * 销毁连接池\n   */\n  async destroy(): Promise<void> {\n    await super.destroy();\n    this.logger.info('gRPC connection pool destroyed');\n  }\n\n  // ============= 实现抽象方法 =============\n\n  /**\n   * 协议特定的连接处理器设置\n   */\n  protected async setupProtocolSpecificHandlers(connection: GrpcConnection): Promise<void> {\n    // gRPC特定的处理器设置已在addGrpcConnection中完成\n    this.setupConnectionEventHandlers(connection);\n  }\n\n  /**\n   * 协议特定的连接创建逻辑\n   */\n  protected async createProtocolConnection(_options: ConnectionRequestOptions): Promise<{ connection: GrpcConnection; metadata?: any } | null> {\n    // gRPC连接由服务器被动接受，不主动创建\n    return null;\n  }\n} ","/*\n * @Description: 连接池工厂\n * @Usage: 根据协议自动创建对应的连接池实现\n * @Author: richen\n * @Date: 2024-11-27 22:30:00\n * @LastEditTime: 2024-11-27 22:30:00\n */\n\nimport { ConnectionPoolManager } from './pool';\nimport type { ConnectionPoolMetrics } from './pool';\n\n/**\n * 连接池工厂 - 根据协议自动创建对应的连接池实现\n */\nexport class ConnectionPoolFactory {\n  private static instances = new Map<string, ConnectionPoolManager>();\n  private static registered = new Map<string, new (config: ConnectionPoolConfig) => ConnectionPoolManager>();\n\n  /**\n   * 稳定序列化对象，确保相同内容不同键顺序产生相同字符串\n   */\n  private static stableStringify(obj: any): string {\n    if (obj === null || typeof obj !== 'object') return JSON.stringify(obj);\n    if (Array.isArray(obj)) return JSON.stringify(obj.map(i => this.stableStringify(i)));\n    const sortedKeys = Object.keys(obj).sort();\n    return '{' + sortedKeys.map(k => `${JSON.stringify(k)}:${this.stableStringify(obj[k])}`).join(',') + '}';\n  }\n\n  /**\n   * 注册协议的连接池实现\n   */\n  static register<T extends ConnectionPoolManager>(\n    protocol: string, \n    implementation: new (config: ConnectionPoolConfig) => T\n  ): void {\n    this.registered.set(protocol.toLowerCase(), implementation);\n  }\n\n  /**\n   * 根据协议创建连接池实例\n   */\n  static create(protocol: string, config: ConnectionPoolConfig = {}): ConnectionPoolManager {\n    const key = `${protocol.toLowerCase()}_${this.stableStringify(config)}`;\n    \n    // 如果已存在实例，直接返回\n    if (this.instances.has(key)) {\n      return this.instances.get(key)!;\n    }\n\n    // 获取对应的实现类\n    const Implementation = this.registered.get(protocol.toLowerCase());\n    if (!Implementation) {\n      throw new Error(`No connection pool implementation registered for protocol: ${protocol}`);\n    }\n\n    // 创建新实例\n    const instance = new Implementation(config);\n    this.instances.set(key, instance);\n    \n    return instance;\n  }\n\n  /**\n   * 获取或创建连接池实例\n   */\n  static getOrCreate(protocol: string, config: ConnectionPoolConfig = {}): ConnectionPoolManager {\n    return this.create(protocol, config);\n  }\n\n  /**\n   * 销毁指定协议的连接池\n   */\n  static async destroy(protocol: string): Promise<void> {\n    const protocolPrefix = `${protocol.toLowerCase()}_`;\n    const toDestroy = Array.from(this.instances.entries())\n      .filter(([key]) => key.startsWith(protocolPrefix))\n      .map(([key, instance]) => ({ key, instance }));\n\n    await Promise.all(\n      toDestroy.map(async ({ key, instance }) => {\n        await instance.destroy();\n        this.instances.delete(key);\n      })\n    );\n  }\n\n  /**\n   * 销毁所有连接池实例\n   */\n  static async destroyAll(): Promise<void> {\n    const instances = Array.from(this.instances.values());\n    this.instances.clear();\n    \n    await Promise.all(instances.map(instance => instance.destroy()));\n  }\n\n  /**\n   * 获取所有连接池的统计信息\n   */\n  static getAllMetrics(): Record<string, ConnectionPoolMetrics> {\n    const metrics: Record<string, ConnectionPoolMetrics> = {};\n    \n    this.instances.forEach((instance, key) => {\n      metrics[key] = instance.getMetrics();\n    });\n    \n    return metrics;\n  }\n\n  /**\n   * 获取已注册的协议列表\n   */\n  static getRegisteredProtocols(): string[] {\n    return Array.from(this.registered.keys());\n  }\n\n  /**\n   * 检查协议是否已注册\n   */\n  static isProtocolRegistered(protocol: string): boolean {\n    return this.registered.has(protocol.toLowerCase());\n  }\n\n  /**\n   * 获取指定协议的实例数量\n   */\n  static getInstanceCount(protocol?: string): number {\n    if (!protocol) {\n      return this.instances.size;\n    }\n    \n    const protocolPrefix = `${protocol.toLowerCase()}_`;\n    return Array.from(this.instances.keys())\n      .filter(key => key.startsWith(protocolPrefix))\n      .length;\n  }\n\n  /**\n   * 清除所有实例缓存（不销毁，只是清除引用）\n   */\n  static clearInstanceCache(): void {\n    this.instances.clear();\n  }\n} \n\n// 导出基础类型和接口\nexport {\n  ConnectionPoolManager,\n  ConnectionPoolEvent,\n  ConnectionPoolStatus,\n} from './pool';\n\nexport type {\n  ConnectionPoolHealth,\n  ConnectionPoolMetrics,\n  ConnectionRequestOptions,\n  ConnectionRequestResult,\n  ConnectionStats\n} from './pool';\n\n// 导出具体实现\nexport { HttpConnectionPoolManager } from './http';\nexport { Http2ConnectionPoolManager } from './http2';\nexport { WebSocketConnectionPoolManager } from './ws';\nexport { GrpcConnectionPoolManager } from './grpc';\n\n// 自动注册所有连接池实现\nimport { HttpConnectionPoolManager } from './http';\nimport { Http2ConnectionPoolManager } from './http2';\nimport { WebSocketConnectionPoolManager } from './ws';\nimport { GrpcConnectionPoolManager } from './grpc';\nimport { ConnectionPoolConfig } from '../config/pool';\n\n// 注册各协议的连接池实现\nConnectionPoolFactory.register('http', HttpConnectionPoolManager);\nConnectionPoolFactory.register('https', HttpConnectionPoolManager); // HTTPS使用HTTP连接池\nConnectionPoolFactory.register('http2', Http2ConnectionPoolManager);\nConnectionPoolFactory.register('websocket', WebSocketConnectionPoolManager);\nConnectionPoolFactory.register('ws', WebSocketConnectionPoolManager);\nConnectionPoolFactory.register('wss', WebSocketConnectionPoolManager);\nConnectionPoolFactory.register('grpc', GrpcConnectionPoolManager);\n\n/**\n * 便捷的连接池创建方法\n */\nexport function createConnectionPool(protocol: string, config?: any) {\n  return ConnectionPoolFactory.getOrCreate(protocol, config);\n}\n\n/**\n * 获取所有已注册的协议\n */\nexport function getRegisteredProtocols(): string[] {\n  return ConnectionPoolFactory.getRegisteredProtocols();\n}\n\n/**\n * 获取所有连接池的统计信息\n */\nexport function getAllPoolMetrics(): Record<string, any> {\n  return ConnectionPoolFactory.getAllMetrics();\n}\n\n/**\n * 销毁指定协议的所有连接池\n */\nexport async function destroyProtocolPools(protocol: string): Promise<void> {\n  await ConnectionPoolFactory.destroy(protocol);\n}\n\n/**\n * 销毁所有连接池\n */\nexport async function destroyAllPools(): Promise<void> {\n  await ConnectionPoolFactory.destroyAll();\n} ","/*\n * @Description: gRPC Server implementation using template method pattern\n * @Usage: \n * @Author: richen\n * @Date: 2021-11-09 17:03:50\n * @LastEditTime: 2025-01-14\n * \n * Note: gRPC's graceful shutdown uses tryShutdown() which:\n * 1. Stops accepting new connections immediately\n * 2. Waits for all active RPCs to complete\n * 3. Cannot be interrupted once started\n * \n * This means the graceful shutdown process is mostly handled by gRPC itself.\n */\nimport {\n  ChannelOptions, Server, ServerCredentials,\n  ServiceDefinition, UntypedHandleCall\n} from \"@grpc/grpc-js\";\nimport { KoattyApplication, NativeServer } from \"koatty_core\";\nimport { BaseServer } from \"./base\";\nimport type { ConfigChangeAnalysis, ConnectionStats } from \"./base\";\nimport { generateTraceId } from \"../utils/logger\";\nimport { CreateTerminus } from \"../utils/terminus\";\nimport { loadCertificate } from \"../utils/cert-loader\";\nimport { HealthStatus } from \"./base\";\nimport { ConfigHelper, GrpcServerOptions, ListeningOptions } from \"../config/config\";\nimport { GrpcConnectionPoolManager } from \"../pools/factory\";\n\n/**\n * ServiceImplementation\n *\n * @interface ServiceImplementation\n */\ninterface ServiceImplementation {\n  service: ServiceDefinition;\n  implementation: Implementation;\n}\n\n/**\n * Implementation\n *\n * @interface Implementation\n */\ninterface Implementation {\n  [methodName: string]: UntypedHandleCall;\n}\n\nexport class GrpcServer extends BaseServer<GrpcServerOptions, Server> {\n  protected connectionPool: GrpcConnectionPoolManager;\n  options: GrpcServerOptions;\n\n  constructor(app: KoattyApplication, options: GrpcServerOptions) {\n    super(app, options);\n    this.options = ConfigHelper.createGrpcConfig(options);\n    this.initializeServer();\n    CreateTerminus(app, this);\n  }\n\n\n  /**\n   * 初始化gRPC连接池\n   */\n  protected initializeConnectionPool(): void {\n    this.connectionPool = new GrpcConnectionPoolManager(this.options.connectionPool);\n  }\n\n  /**\n   * 创建gRPC服务器实例\n   */\n  protected createProtocolServer(): void {\n    const opts = this.options as GrpcServerOptions;\n    \n    // Enhanced channel options with connection pooling\n    const channelOptions: ChannelOptions = {\n      ...opts.channelOptions,\n      // Connection pool configuration\n      'grpc.keepalive_time_ms': opts.connectionPool?.protocolSpecific?.keepAliveTime || 30000,\n      'grpc.keepalive_timeout_ms': opts.connectionPool?.keepAliveTimeout || 5000,\n      'grpc.keepalive_permit_without_calls': 1,\n      'grpc.max_receive_message_length': opts.connectionPool?.protocolSpecific?.maxReceiveMessageLength || 4 * 1024 * 1024,\n      'grpc.max_send_message_length': opts.connectionPool?.protocolSpecific?.maxSendMessageLength || 4 * 1024 * 1024,\n      'grpc.max_connection_idle_ms': 300000, // 5 minutes\n      'grpc.max_connection_age_ms': 3600000, // 1 hour\n      'grpc.max_connection_age_grace_ms': 30000, // 30 seconds\n    };\n    \n    this.server = new Server(channelOptions);\n  }\n\n  /**\n   * 配置gRPC服务器选项\n   */\n  protected configureServerOptions(): void {\n    // gRPC服务器配置在createProtocolServer中完成\n  }\n\n  /**\n   * gRPC特定的额外初始化\n   */\n  protected performProtocolSpecificInitialization(): void {\n    this.logger.debug('gRPC server initialization completed', {}, {\n      hostname: this.options.hostname,\n      port: this.options.port,\n      protocol: this.options.protocol,\n      serverId: this.serverId,\n      sslEnabled: this.options.ssl?.enabled || false,\n      maxConnections: this.options.connectionPool?.maxConnections\n    });\n  }\n\n  // ============= 实现 BaseServer 抽象方法 =============\n\n  protected analyzeConfigChanges(\n    changedKeys: (keyof GrpcServerOptions)[],\n    oldConfig: GrpcServerOptions,\n    newConfig: GrpcServerOptions\n  ): ConfigChangeAnalysis {\n    // Critical changes that require restart\n    const criticalKeys: (keyof GrpcServerOptions)[] = ['hostname', 'port', 'protocol'];\n    \n    if (changedKeys.some(key => criticalKeys.includes(key))) {\n      return {\n        requiresRestart: true,\n        changedKeys: changedKeys as string[],\n        restartReason: 'Critical network configuration changed',\n        canApplyRuntime: false\n      };\n    }\n\n    // SSL configuration changes\n    if (this.hasSSLConfigChanged(oldConfig, newConfig)) {\n      return {\n        requiresRestart: true,\n        changedKeys: changedKeys as string[],\n        restartReason: 'SSL/TLS configuration changed',\n        canApplyRuntime: false\n      };\n    }\n\n    // Channel options changes (affects gRPC server creation)\n    if (this.hasChannelOptionsChanged(oldConfig, newConfig)) {\n      return {\n        requiresRestart: true,\n        changedKeys: changedKeys as string[],\n        restartReason: 'Connection pool configuration changed',\n        canApplyRuntime: false\n      };\n    }\n\n    return {\n      requiresRestart: false,\n      changedKeys: changedKeys as string[],\n      canApplyRuntime: true\n    };\n  }\n\n  protected applyConfigChanges(\n    changedKeys: (keyof GrpcServerOptions)[],\n    newConfig: Partial<GrpcServerOptions>\n  ): void {\n    // This is now handled by the base class's restart logic\n    this.options = { ...this.options, ...newConfig };\n  }\n\n  protected onRuntimeConfigChange(\n    analysis: ConfigChangeAnalysis,\n    newConfig: Partial<ListeningOptions>,\n    traceId: string\n  ): void {\n    // Handle gRPC-specific runtime changes\n    const grpcConfig = newConfig as Partial<GrpcServerOptions>;\n    if (grpcConfig.connectionPool?.maxConnections) {\n      this.logger.info('Updating connection pool limits', { traceId }, {\n        oldLimit: 'current',\n        newLimit: grpcConfig.connectionPool.maxConnections\n      });\n      // Note: This would require additional implementation to actually enforce limits\n    }\n\n    // Runtime configuration changes applied\n  }\n\n  protected extractRelevantConfig(config: GrpcServerOptions) {\n    return {\n      hostname: config.hostname,\n      port: config.port,\n      protocol: config.protocol,\n      sslEnabled: config.ssl?.enabled || false,\n      connectionPool: config.connectionPool ? {\n        maxConnections: config.connectionPool.maxConnections,\n        keepAliveTime: config.connectionPool.protocolSpecific?.keepAliveTime,\n        keepAliveTimeout: config.connectionPool.keepAliveTimeout\n      } : null\n    };\n  }\n\n  protected async stopAcceptingNewConnections(traceId: string): Promise<void> {\n    this.logger.info('Step 1: Initiating gRPC graceful shutdown', { traceId });\n    \n    // gRPC 使用 tryShutdown 实现优雅关闭\n    // tryShutdown 会:\n    // 1. 停止接受新连接\n    // 2. 等待现有 RPC 调用完成\n    // 注意: 这会在这一步就等待所有连接完成,所以后续步骤会很快\n    await new Promise<void>((resolve, reject) => {\n      this.server.tryShutdown((err) => {\n        if (err) {\n          this.logger.error('gRPC tryShutdown failed', { traceId }, err);\n          reject(err);\n        } else {\n          this.logger.info('gRPC tryShutdown completed', { traceId });\n          resolve();\n        }\n      });\n    });\n    \n    this.logger.debug('gRPC server graceful shutdown initiated', { traceId });\n  }\n\n  protected async waitForConnectionCompletion(timeout: number, traceId: string): Promise<void> {\n    this.logger.info('Step 3: Checking for remaining connections', { traceId }, {\n      activeConnections: this.connectionPool.getActiveConnectionCount(),\n      timeout: timeout,\n      note: 'tryShutdown should have already waited for connections'\n    });\n\n    const startTime = Date.now();\n    \n    while (this.connectionPool.getActiveConnectionCount() > 0) {\n      const elapsed = Date.now() - startTime;\n      \n      if (elapsed >= timeout) {\n        this.logger.warn('Connection completion timeout reached (unexpected)', { traceId }, {\n          remainingConnections: this.connectionPool.getActiveConnectionCount(),\n          elapsed: elapsed\n        });\n        break;\n      }\n      \n      // Log progress every 5 seconds\n      if (elapsed % 5000 < 100) {\n        this.logger.debug('Waiting for connections to complete', { traceId }, {\n          remainingConnections: this.connectionPool.getActiveConnectionCount(),\n          elapsed: elapsed\n        });\n      }\n      \n      await new Promise(resolve => setTimeout(resolve, 100));\n    }\n    \n    this.logger.debug('Connection completion wait finished', { traceId }, {\n      remainingConnections: this.connectionPool.getActiveConnectionCount()\n    });\n  }\n\n  protected async forceCloseRemainingConnections(traceId: string): Promise<void> {\n    const remainingConnections = this.connectionPool.getActiveConnectionCount();\n    \n    if (remainingConnections > 0) {\n      this.logger.info('Step 4: Force closing remaining connections', { traceId }, {\n        remainingConnections\n      });\n      \n      // Use connection pool to close all connections\n      await this.connectionPool.closeAllConnections(5000);\n      \n      this.logger.warn('Forced closure of remaining connections', { traceId }, {\n        forcedConnections: remainingConnections\n      });\n    } else {\n      this.logger.debug('Step 4: No remaining connections to close', { traceId });\n    }\n  }\n\n  protected stopMonitoringAndCleanup(traceId: string): void {\n    this.logger.info('Step 5: Stopping monitoring and cleanup', { traceId });\n    \n    // Stop all timers using TimerManager\n    this.timerManager.destroy();\n    \n    // Log final connection statistics\n    const finalStats = this.connectionPool.getMetrics();\n    this.logger.info('Final connection statistics', { traceId }, finalStats);\n    \n    this.logger.debug('Monitoring stopped and cleanup completed', { traceId });\n  }\n\n  protected forceShutdown(traceId: string): void {\n    this.logger.warn('Force shutdown initiated', { traceId });\n    this.server.forceShutdown();\n    this.stopMonitoringAndCleanup(traceId);\n  }\n\n  protected getActiveConnectionCount(): number {\n    return this.connectionPool.getActiveConnectionCount();\n  }\n\n  // ============= 实现健康检查和指标收集 =============\n\n  protected async performProtocolHealthChecks(): Promise<Record<string, any>> {\n    const checks: Record<string, any> = {};\n    \n    // gRPC server specific health checks\n    checks.server = {\n      status: HealthStatus.HEALTHY,\n      message: 'gRPC server is running',\n      details: {\n        serverId: this.serverId,\n        protocol: this.options.protocol\n      }\n    };\n\n    // Connection pool health check\n    const poolHealth = this.connectionPool.getHealth();\n    checks.connectionPool = {\n      status: poolHealth.status === 'healthy' \n        ? HealthStatus.HEALTHY \n        : poolHealth.status === 'degraded' \n          ? HealthStatus.DEGRADED \n          : HealthStatus.OVERLOADED,\n      message: poolHealth.message,\n      details: poolHealth\n    };\n\n    // SSL configuration health check\n    if (this.options.ssl?.enabled) {\n      checks.ssl = {\n        status: HealthStatus.HEALTHY,\n        message: 'SSL/TLS is enabled',\n        details: {\n          keyFile: !!this.options.ssl.key,\n          certFile: !!this.options.ssl.cert,\n          caFile: !!this.options.ssl.ca,\n          clientCertRequired: this.options.ssl.clientCertRequired\n        }\n      };\n    }\n\n    // Channel options health check\n    const channelOptions = this.options.channelOptions;\n    if (channelOptions) {\n      checks.channelOptions = {\n        status: HealthStatus.HEALTHY,\n        message: 'Channel options configured',\n        details: {\n          keepAliveTime: channelOptions['grpc.keepalive_time_ms'],\n          keepAliveTimeout: channelOptions['grpc.keepalive_timeout_ms'],\n          maxReceiveMessageLength: channelOptions['grpc.max_receive_message_length'],\n          maxSendMessageLength: channelOptions['grpc.max_send_message_length']\n        }\n      };\n    }\n    \n    return checks;\n  }\n\n  protected collectProtocolMetrics(): Record<string, any> {\n    const poolMetrics = this.connectionPool.getMetrics();\n    const poolConfig = this.options.connectionPool;\n    \n    return {\n      protocol: 'grpc',\n      server: {\n        serverId: this.serverId,\n        ssl: this.options.ssl?.enabled || false\n      },\n      connectionPool: {\n        enabled: !!poolConfig,\n        ...poolMetrics,\n        configuration: poolConfig\n      },\n      channelOptions: this.options.channelOptions || {}\n    };\n  }\n\n  // ============= gRPC 特有的辅助方法 =============\n\n  private hasSSLConfigChanged(oldConfig: GrpcServerOptions, newConfig: GrpcServerOptions): boolean {\n    const oldSSL = oldConfig.ssl;\n    const newSSL = newConfig.ssl;\n\n    if (!oldSSL && !newSSL) return false;\n    if (!oldSSL || !newSSL) return true;\n\n    return (\n      oldSSL.enabled !== newSSL.enabled ||\n      oldSSL.key !== newSSL.key ||\n      oldSSL.cert !== newSSL.cert ||\n      oldSSL.ca !== newSSL.ca ||\n      oldSSL.clientCertRequired !== newSSL.clientCertRequired\n    );\n  }\n\n  private hasChannelOptionsChanged(oldConfig: GrpcServerOptions, newConfig: GrpcServerOptions): boolean {\n    const oldPool = oldConfig.connectionPool;\n    const newPool = newConfig.connectionPool;\n\n    if (!oldPool && !newPool) return false;\n    if (!oldPool || !newPool) return true;\n\n    return (\n      oldPool.protocolSpecific?.keepAliveTime !== newPool.protocolSpecific?.keepAliveTime ||\n      oldPool.protocolSpecific?.maxReceiveMessageLength !== newPool.protocolSpecific?.maxReceiveMessageLength ||\n      oldPool.protocolSpecific?.maxSendMessageLength !== newPool.protocolSpecific?.maxSendMessageLength\n    );\n  }\n\n  // ============= 原有的 gRPC 功能方法 =============\n\n  /**\n   * Create SSL credentials from configuration\n   * @private\n   */\n  private createSSLCredentials(): ServerCredentials {\n    const traceId = generateTraceId();\n    const opts = this.options as GrpcServerOptions;\n    \n    // 如果没有SSL配置、SSL被显式禁用、或SSL配置为空对象,使用不安全凭证\n    const hasSSLConfig = opts.ssl && (opts.ssl.key || opts.ssl.cert || opts.ssl.ca || opts.ssl.enabled === true);\n    \n    if (!hasSSLConfig) {\n      if (!opts.ssl || Object.keys(opts.ssl).length === 0) {\n        this.logger.info('No SSL configuration provided, using insecure credentials', { traceId });\n      } else {\n        this.logger.warn('SSL explicitly disabled, using insecure credentials', { traceId });\n      }\n      return ServerCredentials.createInsecure();\n    }\n\n    // 如果 SSL 配置存在但未显式禁用,尝试加载证书\n    try {\n      let rootCerts: Buffer | null = null;\n      const keyCertPairs: Array<{ private_key: Buffer; cert_chain: Buffer }> = [];\n\n      // Load CA certificate if provided\n      if (opts.ssl?.ca) {\n        const caContent = loadCertificate(opts.ssl.ca, 'CA certificate', traceId);\n        rootCerts = Buffer.from(caContent, 'utf8');\n        this.logger.info('CA certificate loaded successfully', { traceId });\n      }\n\n      // Load server key and certificate\n      const keyPath = opts.ssl?.key;\n      const certPath = opts.ssl?.cert;\n\n      if (!keyPath || !certPath) {\n        const error = new Error('SSL enabled but key or cert file path not provided');\n        this.logger.error('SSL configuration incomplete', { traceId }, {\n          hasKey: !!keyPath,\n          hasCert: !!certPath\n        });\n        throw error;\n      }\n\n      const keyContent = loadCertificate(keyPath, 'private key', traceId);\n      const certContent = loadCertificate(certPath, 'certificate', traceId);\n\n      const privateKey = Buffer.from(keyContent, 'utf8');\n      const certChain = Buffer.from(certContent, 'utf8');\n\n      keyCertPairs.push({\n        private_key: privateKey,\n        cert_chain: certChain\n      });\n\n      this.logger.info('SSL certificates loaded successfully', { traceId }, {\n        clientCertRequired: opts.ssl.clientCertRequired || false\n      });\n\n      const checkClientCertificate = opts.ssl.clientCertRequired ? true : false;\n\n      return ServerCredentials.createSsl(\n        rootCerts,\n        keyCertPairs,\n        checkClientCertificate\n      );\n\n    } catch (error) {\n      // 不再降级到不安全模式,直接抛出错误\n      this.logger.error('Failed to create SSL credentials', { traceId }, error);\n      throw new Error(\n        `SSL credentials creation failed: ${(error as Error).message}. ` +\n        `To use insecure mode, explicitly set ssl.enabled = false`\n      );\n    }\n  }\n\n  /**\n   * Start Server with enhanced connection management\n   */\n  Start(listenCallback?: () => void): NativeServer {\n    // Simple startup log - no traceId needed\n    this.logger.info('Server starting', {}, {\n      hostname: this.options.hostname,\n      port: this.options.port,\n      protocol: this.options.protocol\n    });\n\n    const finalCallback = listenCallback || this.listenCallback;\n    const credentials = this.createSSLCredentials();\n    \n    const bindAddress = `${this.options.hostname}:${this.options.port}`;\n    \n    this.server.bindAsync(bindAddress, credentials, (err, port) => {\n      if (err) {\n        // Error logs keep traceId for troubleshooting\n        const errorTraceId = generateTraceId();\n        this.logger.error('Server startup error', { traceId: errorTraceId }, err);\n        // 通过 EventEmitter error 事件传递错误，使调用方可通过 server.on('error', ...) 捕获\n        this.server.emit('error', err);\n        return;\n      }\n      \n      // 添加运行时错误监听器（gRPC服务器启动成功后）\n      // gRPC Server 内部继承自 EventEmitter，使用类型断言\n      if (typeof (this.server as any).on === 'function') {\n        (this.server as any).on('error', (error: Error) => {\n          // Error logs keep traceId for troubleshooting\n          const runtimeErrorTraceId = generateTraceId();\n          this.logger.error('Server runtime error', { traceId: runtimeErrorTraceId }, error);\n          // Don't exit on runtime errors\n        });\n      }\n      \n      // Record start time\n      this.startTime = Date.now();\n      \n      const protocolUpper = this.options.protocol.toUpperCase();\n      const urlProtocol = this.options.protocol.toLowerCase();\n      const serverUrl = `${urlProtocol}://${this.options.hostname || '127.0.0.1'}:${port}/`;\n      \n      // 输出 Koatty 格式的启动日志 - no traceId needed for simple status log\n      this.logger.info(`Server: ${protocolUpper} running at ${serverUrl}`, {});\n      \n      // Simple completion log - no traceId needed\n      this.logger.info('Server started', {}, {\n        address: bindAddress,\n        actualPort: port,\n        hostname: this.options.hostname,\n        port: this.options.port,\n        protocol: this.options.protocol,\n        sslEnabled: (this.options as GrpcServerOptions).ssl?.enabled || false,\n        connectionPoolEnabled: true\n      });\n      \n      // Start connection monitoring\n      this.startConnectionMonitoring();\n      \n      if (finalCallback) {\n        finalCallback();\n      }\n    });\n\n    return this.server;\n  }\n\n  /**\n   * Start connection monitoring and statistics collection\n   * @private\n   */\n  private startConnectionMonitoring() {\n    // Connection pool monitoring enabled (statistics collected silently)\n    this.timerManager.addTimer('grpc_connection_monitoring', () => {\n      this.connectionPool.getMetrics(); // Collect stats but don't log\n    }, 30000); // Every 30 seconds\n  }\n\n  /**\n   * Register Service with enhanced logging and monitoring\n   */\n  RegisterService(impl: ServiceImplementation) {\n    const traceId = generateTraceId();\n    this.logger.debug('Registering gRPC service', { traceId }, {\n      serviceName: impl.service.serviceName || 'Unknown',\n      methods: Object.keys(impl.implementation)\n    });\n    \n    // Wrap implementation methods for monitoring\n    const wrappedImplementation: Implementation = {};\n    \n    for (const [methodName, _handler] of Object.entries(impl.implementation)) {\n      wrappedImplementation[methodName] = async (call: any, callback: any) => {\n        \n        const connectionId = `grpc_${Date.now()}_${Math.random().toString(36).substr(2, 6)}`;\n        const methodTraceId = generateTraceId();\n        const startTime = Date.now();\n\n        // Add connection to manager using the new API\n        const peer = call.getPeer ? call.getPeer() : 'unknown';\n        const callMetadata = {\n          connectionId,\n          serviceName: impl.service.serviceName,\n          methodName,\n          peer\n        };\n        \n        this.connectionPool.addGrpcConnection(peer, callMetadata).catch((error: any) => {\n          this.logger.error('Failed to add gRPC connection to pool', {}, error);\n        });\n\n        // Log method call start\n        this.logger.debug('gRPC method call started', { traceId: methodTraceId, connectionId }, {\n          serviceName: impl.service.serviceName,\n          methodName,\n          peer\n        });\n\n        // Wrap callback for monitoring with duplicate call protection\n        let callbackCalled = false;\n        let timeoutId: NodeJS.Timeout | null = null;\n\n        const wrappedCallback = (err: any, response: any) => {\n          if (callbackCalled) {\n            this.logger.warn('Callback called multiple times (ignored)', { \n              traceId: methodTraceId, \n              connectionId \n            }, {\n              serviceName: impl.service.serviceName,\n              methodName\n            });\n            return;\n          }\n          callbackCalled = true;\n\n          // Clear timeout if exists\n          if (timeoutId) {\n            clearTimeout(timeoutId);\n            timeoutId = null;\n          }\n\n          const duration = Date.now() - startTime;\n\n          if (err) {\n            this.logger.error('gRPC method error', { traceId: methodTraceId, connectionId }, {\n              serviceName: impl.service.serviceName,\n              methodName,\n              duration,\n              errorCode: err.code,\n              errorMessage: err.message || String(err),\n              error: err\n            });\n            \n            // Ensure error follows gRPC format\n            const grpcError = typeof err === 'object' && err !== null && 'code' in err \n              ? err \n              : {\n                  code: 13, // INTERNAL\n                  message: err instanceof Error ? err.message : String(err),\n                  details: err\n                };\n            \n            if (callback) callback(grpcError, null);\n          } else {\n            // Validate response\n            const hasResponse = response !== undefined && response !== null;\n            const responseInfo: any = {\n              serviceName: impl.service.serviceName,\n              methodName,\n              duration,\n              hasResponse,\n              responseType: typeof response\n            };\n\n            if (hasResponse && typeof response === 'object') {\n              responseInfo.responseKeys = Object.keys(response);\n            }\n\n            this.logger.debug('gRPC method success', { traceId: methodTraceId, connectionId }, responseInfo);\n            \n            // Note: Connection cleanup is handled automatically by the pool\n            \n            if (callback) callback(null, response);\n          }\n        };\n\n        // Set timeout to detect callback not being called\n        const timeoutMs = this.options.connectionPool?.requestTimeout || 30000;\n        \n        timeoutId = setTimeout(() => {\n          if (!callbackCalled) {\n            callbackCalled = true;\n            const duration = Date.now() - startTime;\n            \n            this.logger.error('gRPC method timeout - callback not called', {\n              traceId: methodTraceId,\n              connectionId\n            }, {\n              serviceName: impl.service.serviceName,\n              methodName,\n              duration,\n              timeout: timeoutMs\n            });\n            \n            // Return timeout error\n            if (callback) {\n              callback({\n                code: 4, // DEADLINE_EXCEEDED\n                message: `Method execution timeout after ${timeoutMs}ms`\n              }, null);\n            }\n          }\n        }, timeoutMs);\n\n        // Get the grpc middleware handler from app.callback\n        // This creates context and executes middleware chain (including gRPC router middleware)\n        // app.callback returns a function: (req, res) => {...}\n        // For gRPC: req = call, res = wrappedCallback\n        const grpcMiddlewareHandler = this.app.callback(\"grpc\");\n        \n        // Execute the middleware handler\n        try {\n          // Execute middleware chain\n          // The gRPC router middleware will:\n          // 1. Check ctx.protocol === 'grpc'\n          // 2. Find matching controller based on ctx.rpc (call object)\n          // 3. Execute controller method\n          // 4. Set result to ctx.body\n          // 5. wrappedCallback will be called automatically with ctx.body\n          await grpcMiddlewareHandler(call, wrappedCallback);\n        } catch (error) {\n          // Clear timeout on immediate error\n          if (timeoutId) {\n            clearTimeout(timeoutId);\n            timeoutId = null;\n          }\n\n          const duration = Date.now() - startTime;\n          \n          this.logger.error('gRPC method handler error (exception)', { \n            traceId: methodTraceId, \n            connectionId \n          }, {\n            serviceName: impl.service.serviceName,\n            methodName,\n            duration,\n            error\n          });\n          \n          // Note: Connection error handling is managed by the pool\n          \n          // Ensure callback is called with proper gRPC error format\n          if (!callbackCalled) {\n            callbackCalled = true;\n            const grpcError = {\n              code: 13, // INTERNAL\n              message: error instanceof Error ? error.message : 'Internal server error',\n              details: error\n            };\n            if (callback) callback(grpcError, null);\n          }\n        }\n      };\n    }\n    \n    this.server.addService(impl.service, wrappedImplementation);\n    \n    this.logger.debug('gRPC service registered successfully', { traceId }, {\n      serviceName: impl.service.serviceName || 'Unknown'\n    });\n  }\n\n  /**\n   * Get connection statistics\n   */\n  getConnectionStats(): ConnectionStats {\n    const poolMetrics = this.connectionPool.getMetrics();\n    return {\n      activeConnections: poolMetrics.activeConnections,\n      totalConnections: poolMetrics.totalConnections,\n      connectionsPerSecond: poolMetrics.connectionsPerSecond,\n      averageLatency: poolMetrics.averageLatency,\n      errorRate: poolMetrics.errorRate\n    };\n  }\n\n  /**\n   * Get connection pool health\n   */\n  getConnectionPoolHealth() {\n    return this.connectionPool.getHealth();\n  }\n\n  /**\n   * Get connection pool metrics\n   */\n  getConnectionPoolMetrics() {\n    return this.connectionPool.getMetrics();\n  }\n\n  /**\n   * Get status\n   */\n  getStatus(): number {\n    return this.status;\n  }\n\n  /**\n   * Get native server\n   */\n  getNativeServer(): NativeServer {\n    return this.server;\n  }\n\n  // ============= gRPC特定的私有方法 =============\n\n  /**\n   * 销毁服务器\n   */\n  async destroy(): Promise<void> {\n    const traceId = generateTraceId();\n    this.logger.info('Destroying gRPC server', { traceId });\n\n    try {\n      await this.gracefulShutdown();\n      this.logger.info('gRPC server destroyed successfully', { traceId });\n    } catch (error) {\n      this.logger.error('Error destroying gRPC server', { traceId }, error);\n      throw error;\n    }\n  }\n}\n","/*\n * @Description: Health Check Middleware\n * @Usage: Built-in health check endpoint for monitoring\n * @Author: richen\n * @Date: 2026-04-02 00:00:00\n * @LastEditTime: 2026-04-02 00:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { IncomingMessage, ServerResponse } from 'http';\n\nexport interface HealthCheckConfig {\n  enabled?: boolean;\n  path?: string;\n  readiness?: string;\n  detailed?: boolean;\n  memoryThresholdMB?: number;\n}\n\nexport interface HealthCheckResponse {\n  status: 'ok' | 'error';\n  uptime: number;\n  timestamp: string;\n  details?: {\n    memory?: NodeJS.MemoryUsage;\n    cpu?: NodeJS.CpuUsage;\n  };\n}\n\nexport interface ReadinessResponse {\n  status: 'ready' | 'not_ready';\n  checks?: Record<string, boolean>;\n  timestamp: string;\n}\nexport class HealthCheckMiddleware {\n  private config: Required<HealthCheckConfig>;\n  private startTime: number;\n\n  constructor(config: HealthCheckConfig = {}) {\n    this.config = {\n      enabled: config.enabled ?? true,\n      path: config.path ?? '/health',\n      readiness: config.readiness ?? '/ready',\n      detailed: config.detailed ?? false,\n      memoryThresholdMB: config.memoryThresholdMB ?? 500,\n    };\n    this.startTime = Date.now();\n  }\n\n  middleware() {\n    return async (req: IncomingMessage, res: ServerResponse, next: () => Promise<void>) => {\n      if (!this.config.enabled) {\n        return next();\n      }\n      const url = req.url?.split('?')[0];\n      if (url === this.config.path) {\n        return this.handleHealthCheck(req, res);\n      }\n      if (url === this.config.readiness) {\n        return this.handleReadinessCheck(req, res);\n      }\n      return next();\n    };\n  }\n  private handleHealthCheck(req: any, res: any): void {\n    const response: HealthCheckResponse = {\n      status: 'ok',\n      uptime: this.getUptime(),\n      timestamp: new Date().toISOString(),\n    };\n    if (this.config.detailed) {\n      response.details = {\n        memory: process.memoryUsage(),\n        cpu: process.cpuUsage(),\n      };\n    }\n    this.sendJsonResponse(res, 200, response);\n  }\n  private handleReadinessCheck(req: any, res: any): void {\n    const checks: Record<string, boolean> = {\n      uptime: this.getUptime() > 0,\n      memory: this.checkMemoryHealth(),\n    };\n    const allChecksPass = Object.values(checks).every(check => check === true);\n    const response: ReadinessResponse = {\n      status: allChecksPass ? 'ready' : 'not_ready',\n      checks: this.config.detailed ? checks : undefined,\n      timestamp: new Date().toISOString(),\n    };\n    this.sendJsonResponse(res, allChecksPass ? 200 : 503, response);\n  }\n  private getUptime(): number {\n    return (Date.now() - this.startTime) / 1000;\n  }\n  private checkMemoryHealth(): boolean {\n    const memoryUsage = process.memoryUsage();\n    const heapUsedMB = memoryUsage.heapUsed / 1024 / 1024;\n    return heapUsedMB < this.config.memoryThresholdMB;\n  }\n  private sendJsonResponse(res: any, statusCode: number, data: any): void {\n    res.writeHead(statusCode, {\n      'Content-Type': 'application/json',\n      'Cache-Control': 'no-store',\n    });\n    res.end(JSON.stringify(data, null, 2));\n  }\n}\nexport function createHealthCheckMiddleware(config?: HealthCheckConfig) {\n  const middleware = new HealthCheckMiddleware(config);\n  return middleware.middleware();\n}\n","/*\n * @Description: HTTP Server implementation using template method pattern\n * @Usage: HTTP协议服务器实现\n * @Author: richen\n * @Date: 2021-06-28 15:06:13\n * @LastEditTime: 2024-11-27 23:00:00\n */\nimport { createServer, Server } from \"http\";\nimport { KoattyApplication, NativeServer } from \"koatty_core\";\nimport { generateTraceId } from \"../utils/logger\";\nimport { CreateTerminus } from \"../utils/terminus\";\nimport { BaseServer, ConfigChangeAnalysis } from \"./base\";\nimport { HttpConnectionPoolManager } from \"../pools/http\";\nimport { ConfigHelper, HttpServerOptions, ListeningOptions } from \"../config/config\";\nimport { createHealthCheckMiddleware } from \"../middleware/healthCheck\";\n\n\n/**\n * HTTP Server implementation using template method pattern\n * 继承BaseServer，只实现HTTP特定的逻辑\n */\nexport class HttpServer extends BaseServer<HttpServerOptions, Server> {\n  protected connectionPool: HttpConnectionPoolManager;\n\n  constructor(app: KoattyApplication, options: HttpServerOptions) {\n    super(app, options);\n    this.options = ConfigHelper.createHttpConfig(options);\n    this.initializeServer();\n    CreateTerminus(app, this);\n  }\n\n  /**\n   * 初始化HTTP连接池\n   */\n  protected initializeConnectionPool(): void {\n    this.connectionPool = new HttpConnectionPoolManager(this.options.connectionPool);\n\n    // Connection pool initialized with configuration\n  }\n\n  /**\n   * 创建HTTP服务器实例\n   */\n  protected createProtocolServer(): void {\n    const healthMiddleware = createHealthCheckMiddleware(this.options.health);\n    \n    this.server = createServer(async (req, res) => {\n      try {\n        res.on('finish', () => {\n          if (req.socket) {\n            this.connectionPool.handleRequestComplete(\n              req.socket,\n              res.getHeaders()['content-length'] as number || 0\n            ).catch(() => {\n              // Request completion error handled silently\n            });\n          }\n        });\n        await healthMiddleware(req, res, async () => {\n          this.app.callback()(req, res);\n        });\n      } catch (error) {\n        this.logger.error('Request handling error', {}, error);\n        if (!res.headersSent) {\n          res.writeHead(500, { 'Content-Type': 'application/json' });\n          res.end(JSON.stringify({ error: 'Internal Server Error' }));\n        }\n      }\n    });\n\n    // HTTP server instance created\n  }\n\n  /**\n   * 配置HTTP服务器选项\n   */\n  protected configureServerOptions(): void {\n    this.configureConnectionPoolSettings();\n    this.setupConnectionTracking();\n  }\n\n  /**\n   * HTTP特定的额外初始化\n   */\n  protected performProtocolSpecificInitialization(): void {\n    this.logger.info('HTTP server initialization completed', {}, {\n      hostname: this.options.hostname,\n      port: this.options.port,\n      protocol: this.options.protocol,\n      serverId: this.serverId\n    });\n  }\n\n  // ============= HTTP特定的私有方法 =============\n\n  /**\n   * 配置连接池设置\n   */\n  private configureConnectionPoolSettings(): void {\n    const poolConfig = this.options.connectionPool;\n\n    if (!poolConfig) {\n      // Using default connection pool configuration\n      return;\n    }\n\n    // 应用Keep-Alive超时\n    if (poolConfig.keepAliveTimeout !== undefined) {\n      this.server.keepAliveTimeout = poolConfig.keepAliveTimeout;\n    }\n\n    // 应用请求头超时\n    if (poolConfig.headersTimeout !== undefined) {\n      this.server.headersTimeout = poolConfig.headersTimeout;\n    }\n\n    // 应用请求超时\n    if (poolConfig.requestTimeout !== undefined) {\n      this.server.requestTimeout = poolConfig.requestTimeout;\n    }\n\n    this.logger.info('HTTP connection pool configured successfully', {}, {\n      maxConnections: poolConfig.maxConnections || 'unlimited',\n      keepAliveTimeout: poolConfig.keepAliveTimeout || this.server.keepAliveTimeout,\n      headersTimeout: poolConfig.headersTimeout || this.server.headersTimeout,\n      requestTimeout: poolConfig.requestTimeout || this.server.requestTimeout\n    });\n  }\n\n  /**\n   * 设置连接跟踪\n   */\n  private setupConnectionTracking(): void {\n    // 增强的连接跟踪，集成连接池管理\n    this.server.on('connection', (socket) => {\n      // 使用连接池管理连接\n      this.connectionPool.addHttpConnection(socket).catch(error => {\n        this.logger.error('Failed to add connection to pool', {}, error);\n        socket.destroy();\n      });\n    });\n  }\n\n  // ============= 实现配置管理抽象方法 =============\n\n  protected analyzeConfigChanges(\n    changedKeys: (keyof HttpServerOptions)[],\n    oldConfig: HttpServerOptions,\n    newConfig: HttpServerOptions\n  ): ConfigChangeAnalysis {\n    // 关键配置变更需要重启\n    const criticalKeys: (keyof ListeningOptions)[] = ['hostname', 'port', 'protocol'];\n\n    if (changedKeys.some(key => criticalKeys.includes(key as keyof ListeningOptions))) {\n      return {\n        requiresRestart: true,\n        changedKeys: changedKeys as string[],\n        restartReason: 'Critical network configuration changed',\n        canApplyRuntime: false\n      };\n    }\n\n    // 连接池配置变更\n    if (this.hasConnectionPoolChanged(oldConfig, newConfig)) {\n      return {\n        requiresRestart: true,\n        changedKeys: changedKeys as string[],\n        restartReason: 'Connection pool configuration changed',\n        canApplyRuntime: false\n      };\n    }\n\n    return {\n      requiresRestart: false,\n      changedKeys: changedKeys as string[],\n      canApplyRuntime: true\n    };\n  }\n\n  protected onRuntimeConfigChange(\n    analysis: ConfigChangeAnalysis,\n    newConfig: Partial<HttpServerOptions>,\n    traceId: string\n  ): void {\n    // 处理HTTP特定的运行时配置变更\n    const httpConfig = newConfig as Partial<HttpServerOptions>;\n\n    // 更新连接池限制（如果支持）\n    if (httpConfig.connectionPool?.maxConnections) {\n      this.logger.info('Updating connection pool limits', { traceId }, {\n        oldLimit: 'current',\n        newLimit: httpConfig.connectionPool.maxConnections\n      });\n      // 注意：这需要额外的实现来实际执行限制\n    }\n\n    // Runtime configuration changes applied\n  }\n\n  protected extractRelevantConfig(config: HttpServerOptions) {\n    return {\n      hostname: config.hostname,\n      port: config.port,\n      protocol: config.protocol,\n      connectionPool: config.connectionPool ? {\n        maxConnections: config.connectionPool.maxConnections,\n        keepAliveTimeout: config.connectionPool.keepAliveTimeout,\n        headersTimeout: config.connectionPool.headersTimeout,\n        requestTimeout: config.connectionPool.requestTimeout\n      } : null\n    };\n  }\n\n  /**\n   * 检查连接池配置是否变更\n   */\n  private hasConnectionPoolChanged(oldConfig: HttpServerOptions, newConfig: HttpServerOptions): boolean {\n    const oldPool = oldConfig.connectionPool;\n    const newPool = newConfig.connectionPool;\n\n    if (!oldPool && !newPool) return false;\n    if (!oldPool || !newPool) return true;\n\n    return (\n      oldPool.maxConnections !== newPool.maxConnections ||\n      oldPool.keepAliveTimeout !== newPool.keepAliveTimeout ||\n      oldPool.headersTimeout !== newPool.headersTimeout ||\n      oldPool.requestTimeout !== newPool.requestTimeout\n    );\n  }\n\n  // ============= 实现优雅关闭抽象方法 =============\n\n  protected async stopAcceptingNewConnections(traceId: string): Promise<void> {\n    this.logger.info('Step 1: Stopping acceptance of new HTTP connections', { traceId });\n\n    // HTTP服务器停止监听新连接\n    if (this.server.listening) {\n      await new Promise<void>((resolve, reject) => {\n        this.server.close((err) => {\n          if (err) reject(err);\n          else resolve();\n        });\n      });\n    }\n\n    this.logger.debug('New HTTP connection acceptance stopped', { traceId });\n  }\n\n  protected async waitForConnectionCompletion(timeout: number, traceId: string): Promise<void> {\n    this.logger.info('Step 3: Waiting for existing HTTP connections to complete', { traceId }, {\n      activeConnections: this.getActiveConnectionCount(),\n      timeout: timeout\n    });\n\n    const startTime = Date.now();\n\n    while (this.getActiveConnectionCount() > 0) {\n      const elapsed = Date.now() - startTime;\n\n      if (elapsed >= timeout) {\n        this.logger.warn('HTTP connection completion timeout reached', { traceId }, {\n          remainingConnections: this.getActiveConnectionCount(),\n          elapsed: elapsed\n        });\n        break;\n      }\n\n      await new Promise(resolve => setTimeout(resolve, 100));\n    }\n\n    // Connection completion wait finished\n  }\n\n  protected async forceCloseRemainingConnections(traceId: string): Promise<void> {\n    const remainingConnections = this.getActiveConnectionCount();\n\n    if (remainingConnections > 0) {\n      this.logger.info('Step 4: Force closing remaining HTTP connections', { traceId }, {\n        remainingConnections\n      });\n\n      // 使用连接池强制关闭所有连接\n      await this.connectionPool.closeAllConnections(5000);\n\n      this.logger.warn('Forced closure of remaining HTTP connections', { traceId }, {\n        forcedConnections: remainingConnections\n      });\n    } else {\n      this.logger.debug('Step 4: No remaining HTTP connections to close', { traceId });\n    }\n  }\n\n  protected forceShutdown(traceId: string): void {\n    this.logger.warn('Force HTTP server shutdown initiated', { traceId });\n\n    // 强制关闭HTTP服务器\n    this.server.close();\n\n    // 停止监控和清理\n    this.stopMonitoringAndCleanup(traceId);\n  }\n\n  // ============= 实现KoattyServer接口 =============\n\n  Start(listenCallback?: () => void): NativeServer {\n    this.startTime = Date.now();\n    \n    this.logger.info('Server starting', {}, {\n      hostname: this.options.hostname,\n      port: this.options.port,\n      protocol: this.options.protocol\n    });\n\n    const finalCallback = listenCallback || this.listenCallback;\n\n    // 添加错误事件监听器，必须在 listen 之前注册\n    const errorHandler = (error: Error) => {\n      // Error logs keep traceId for troubleshooting\n      const errorTraceId = generateTraceId();\n      this.logger.error('Server startup error', { traceId: errorTraceId }, error);\n      // 通过 EventEmitter error 事件传递错误，使调用方可通过 server.on('error', ...) 捕获\n      this.server.emit('error', error);\n    };\n\n    // 检查server是否支持once方法（避免测试中的mock对象问题）\n    if (typeof this.server.once === 'function') {\n      this.server.once('error', errorHandler);\n    }\n\n    this.server.listen(this.options.port, this.options.hostname, () => {\n      // 启动成功，移除启动阶段的错误处理器\n      if (typeof this.server.removeListener === 'function') {\n        this.server.removeListener('error', errorHandler);\n      }\n      \n      // 添加运行时错误处理器\n      if (typeof this.server.on === 'function') {\n        this.server.on('error', (error: Error) => {\n          // Error logs keep traceId for troubleshooting\n          const runtimeErrorTraceId = generateTraceId();\n          this.logger.error('Server runtime error', { traceId: runtimeErrorTraceId }, error);\n          // 运行时错误不退出进程\n        });\n      }\n\n      // Record start time\n      this.startTime = Date.now();\n\n      const protocolUpper = this.options.protocol.toUpperCase();\n      const underlyingProtocol = this.options.ext?._underlyingProtocol;\n      // For URL, always use the underlying protocol (http/https), not graphql\n      const urlProtocol = (underlyingProtocol as string | undefined)?.toLowerCase() ?? this.options.protocol.toLowerCase();\n\n      const serverUrl = `${urlProtocol}://${this.options.hostname || '127.0.0.1'}:${this.options.port}/`;\n\n      // 输出 Koatty 格式的启动日志 - no traceId needed for simple status log\n      this.logger.info(`Server: ${protocolUpper} running at ${serverUrl}`, {});\n\n      // Simple completion log - no traceId needed\n      this.logger.info('Server started', {}, {\n        address: `${this.options.hostname}:${this.options.port}`,\n        hostname: this.options.hostname,\n        port: this.options.port,\n        protocol: this.options.protocol,\n        connectionPoolEnabled: !!this.connectionPool,\n        serverId: this.serverId\n      });\n\n      // 启动连接池监控\n      this.startConnectionPoolMonitoring();\n\n      if (finalCallback) {\n        finalCallback();\n      }\n    });\n\n    return this.server;\n  }\n\n  getStatus(): number {\n    return this.status;\n  }\n\n  getNativeServer(): NativeServer {\n    return this.server;\n  }\n\n  // ============= HTTP特定的方法 =============\n\n  /**\n   * 启动连接池监控\n   */\n  private startConnectionPoolMonitoring(): void {\n    // Connection pool monitoring enabled (statistics collected silently)\n    this.timerManager.addTimer('http_connection_monitoring', () => {\n      this.getConnectionStats(); // Collect stats but don't log\n    }, 30000); // 每30秒\n  }\n\n  /**\n   * 获取HTTP连接统计信息\n   */\n  getHttpConnectionStats() {\n    return this.connectionPool ? this.connectionPool.getConnectionStats() : null;\n  }\n\n  /**\n   * 销毁服务器\n   */\n  async destroy(): Promise<void> {\n    const traceId = generateTraceId();\n    this.logger.info('Destroying HTTP server', { traceId });\n\n    try {\n      await this.gracefulShutdown();\n      this.logger.info('HTTP server destroyed successfully', { traceId });\n    } catch (error) {\n      this.logger.error('Error destroying HTTP server', { traceId }, error);\n      throw error;\n    }\n  }\n}\n","/*\n * @Description: HTTP/2 Server implementation using template method pattern\n * @Usage: HTTP/2协议服务器实现\n * @Author: richen\n * @Date: 2021-06-28 15:06:13\n * @LastEditTime: 2024-11-27 23:30:00\n */\nimport { createSecureServer, Http2SecureServer, SecureServerOptions } from \"http2\";\nimport { KoattyApplication, NativeServer } from \"koatty_core\";\nimport { BaseServer, ConfigChangeAnalysis } from \"./base\";\nimport { generateTraceId } from \"../utils/logger\";\nimport { CreateTerminus } from \"../utils/terminus\";\nimport { loadCertificate } from \"../utils/cert-loader\";\nimport { Http2ConnectionPoolManager } from \"../pools/http2\";\nimport { ConfigHelper, Http2ServerOptions, ListeningOptions, SSL2Config } from \"../config/config\";\nimport { createHealthCheckMiddleware } from \"../middleware/healthCheck\";\n\n/**\n * HTTP/2 Server implementation using template method pattern\n * 继承BaseServer，只实现HTTP/2特定的逻辑\n */\nexport class Http2Server extends BaseServer<Http2ServerOptions, Http2SecureServer> {\n  protected connectionPool!: Http2ConnectionPoolManager;\n\n  constructor(app: KoattyApplication, options: Http2ServerOptions) {\n    super(app, options);\n    this.options = ConfigHelper.createHttp2Config(options);\n    this.initializeServer();\n    CreateTerminus(app, this);\n  }\n\n  /**\n   * 初始化HTTP/2连接池\n   */\n  protected initializeConnectionPool(): void {\n    this.connectionPool = new Http2ConnectionPoolManager(this.options.connectionPool);\n    \n    // HTTP/2 connection pool initialized with configuration\n  }\n\n  /**\n   * 创建HTTP/2服务器实例\n   */\n  protected createProtocolServer(): void {\n    const http2Options = this.createHTTP2Options();\n    const healthMiddleware = createHealthCheckMiddleware(this.options.health);\n    \n    this.server = createSecureServer(http2Options, async (req, res) => {\n      try {\n        await healthMiddleware(req, res, async () => {\n          this.app.callback()(req, res);\n          \n          // 请求指标由连接池自动处理\n        });\n      } catch (error) {\n        this.logger.error('Request handling error', {}, error);\n        if (!res.headersSent) {\n          res.writeHead(500, { 'Content-Type': 'application/json' });\n          res.end(JSON.stringify({ error: 'Internal Server Error' }));\n        }\n      }\n    });\n    \n    // HTTP/2 server instance created\n  }\n\n  /**\n   * 配置HTTP/2服务器选项\n   */\n  protected configureServerOptions(): void {\n    this.setupSessionHandling();\n  }\n\n  /**\n   * HTTP/2特定的额外初始化\n   */\n  protected performProtocolSpecificInitialization(): void {\n    this.logger.info('HTTP/2 server initialization completed', {}, {\n      hostname: this.options.hostname,\n      port: this.options.port,\n      protocol: this.options.protocol,\n      serverId: this.serverId,\n      sslMode: this.options.ssl?.mode || 'auto',\n      allowHTTP1: this.options.ssl?.allowHTTP1 !== false,\n      maxConnections: this.options.connectionPool?.maxConnections\n    });\n  }\n\n  /**\n   * 创建HTTP/2选项\n   */\n  private createHTTP2Options(): SecureServerOptions {\n    const sslConfig = this.options.ssl;\n    const http2Config = this.options.http2;\n\n    let sslOptions: SecureServerOptions = {};\n    \n    if (sslConfig) {\n      sslOptions = this.createSSLOptions(sslConfig, {});\n    }\n\n    // HTTP/2 specific options\n    const http2Options: SecureServerOptions = {\n      ...sslOptions,\n      allowHTTP1: sslConfig?.allowHTTP1 !== false, // 默认允许HTTP/1.1回退\n    };\n\n    // 添加HTTP/2设置\n    if (http2Config?.settings) {\n      http2Options.settings = http2Config.settings;\n    }\n\n    return http2Options;\n  }\n\n  /**\n   * 创建SSL选项\n   */\n  private createSSLOptions(sslConfig: SSL2Config, extConfig: any): SecureServerOptions {\n    switch (sslConfig.mode) {\n      case 'manual':\n        return this.createManualSSLOptions(sslConfig, extConfig);\n      case 'mutual_tls':\n        return this.createMutualTLSOptions(sslConfig, extConfig);\n      case 'auto':\n      default:\n        return this.createAutoSSLOptions(sslConfig, extConfig);\n    }\n  }\n\n  /**\n   * 自动SSL配置\n   */\n  private createAutoSSLOptions(sslConfig: SSL2Config, extConfig: any): SecureServerOptions {\n    const keyPath = sslConfig.key || extConfig?.key;\n    const certPath = sslConfig.cert || extConfig?.cert;\n    \n    if (!keyPath || !certPath) {\n      throw new Error('SSL key and cert are required for HTTP/2');\n    }\n    \n    return {\n      key: loadCertificate(keyPath, 'private key'),\n      cert: loadCertificate(certPath, 'certificate')\n    };\n  }\n\n  /**\n   * 手动SSL配置\n   */\n  private createManualSSLOptions(sslConfig: SSL2Config, extConfig: any): SecureServerOptions {\n    const keyPath = sslConfig.key || extConfig?.key;\n    const certPath = sslConfig.cert || extConfig?.cert;\n    const caPath = sslConfig.ca || extConfig?.ca;\n    \n    if (!keyPath || !certPath) {\n      throw new Error('SSL key and cert are required for manual SSL mode');\n    }\n    \n    const options: SecureServerOptions = {\n      key: loadCertificate(keyPath, 'private key'),\n      cert: loadCertificate(certPath, 'certificate'),\n      passphrase: sslConfig.passphrase,\n      ciphers: sslConfig.ciphers,\n      honorCipherOrder: sslConfig.honorCipherOrder,\n      secureProtocol: sslConfig.secureProtocol\n    };\n    \n    if (caPath) {\n      options.ca = loadCertificate(caPath, 'CA certificate');\n    }\n    \n    return options;\n  }\n\n  /**\n   * 双向TLS配置\n   */\n  private createMutualTLSOptions(sslConfig: SSL2Config, extConfig: any): SecureServerOptions {\n    const manualOptions = this.createManualSSLOptions(sslConfig, extConfig);\n    \n    return {\n      ...manualOptions,\n      requestCert: sslConfig.requestCert !== false,\n      rejectUnauthorized: sslConfig.rejectUnauthorized !== false\n    };\n  }\n\n  /**\n   * 设置会话处理\n   */\n  private setupSessionHandling(): void {\n    // HTTP/2 session management through connection pool\n    this.server.on('session', (session) => {\n      this.connectionPool.addHttp2Session(session).catch((error: Error) => {\n        this.logger.error('Failed to add HTTP/2 session to pool', {}, error);\n        try {\n          session.close();\n        } catch {\n          // Session close error handled silently\n        }\n      });\n    });\n\n    this.server.on('sessionError', (error: Error, session: any) => {\n      this.logger.warn('HTTP/2 session error', {}, {\n        error: error.message,\n        sessionId: session.id\n      });\n    });\n  }\n\n  protected analyzeConfigChanges(\n    changedKeys: (keyof Http2ServerOptions)[],\n    oldConfig: Http2ServerOptions,\n    newConfig: Http2ServerOptions\n  ): ConfigChangeAnalysis {\n    // 关键配置变更需要重启\n    const criticalKeys: (keyof ListeningOptions)[] = ['hostname', 'port', 'protocol'];\n    \n    if (changedKeys.some(key => criticalKeys.includes(key as keyof ListeningOptions))) {\n      return {\n        requiresRestart: true,\n        changedKeys: changedKeys as string[],\n        restartReason: 'Critical network configuration changed',\n        canApplyRuntime: false\n      };\n    }\n\n    // SSL配置变更\n    if (this.hasSSLConfigChanged(oldConfig, newConfig)) {\n      return {\n        requiresRestart: true,\n        changedKeys: changedKeys as string[],\n        restartReason: 'SSL/TLS configuration changed',\n        canApplyRuntime: false\n      };\n    }\n\n    // HTTP/2配置变更\n    if (this.hasHTTP2ConfigChanged(oldConfig, newConfig)) {\n      return {\n        requiresRestart: true,\n        changedKeys: changedKeys as string[],\n        restartReason: 'HTTP/2 protocol configuration changed',\n        canApplyRuntime: false\n      };\n    }\n\n    // 连接池配置变更\n    if (this.hasConnectionPoolChanged(oldConfig, newConfig)) {\n      return {\n        requiresRestart: false,\n        changedKeys: changedKeys as string[],\n        canApplyRuntime: true\n      };\n    }\n\n    return {\n      requiresRestart: false,\n      changedKeys: changedKeys as string[],\n      canApplyRuntime: true\n    };\n  }\n\n  protected onRuntimeConfigChange(\n    analysis: ConfigChangeAnalysis,\n    newConfig: Partial<Http2ServerOptions>,\n    traceId: string\n  ): void {\n    // 处理HTTP/2特定的运行时配置变更\n    const http2Config = newConfig as Partial<Http2ServerOptions>;\n    \n    // 更新连接池配置\n    if (http2Config.connectionPool) {\n      this.logger.info('Updating HTTP/2 connection pool configuration', { traceId }, {\n        oldConfig: this.options.connectionPool,\n        newConfig: http2Config.connectionPool\n      });\n      \n      this.connectionPool.updateConfig(http2Config.connectionPool);\n    }\n\n    this.logger.debug('HTTP/2 runtime configuration changes applied', { traceId });\n  }\n\n  protected extractRelevantConfig(config: Http2ServerOptions) {\n    return {\n      hostname: config.hostname,\n      port: config.port,\n      protocol: config.protocol,\n      sslMode: config.ssl?.mode || 'auto',\n      allowHTTP1: config.ssl?.allowHTTP1 !== false,\n      connectionPool: config.connectionPool ? {\n        maxConnections: config.connectionPool.maxConnections,\n        maxSessionMemory: config.connectionPool.maxSessionMemory,\n        maxHeaderListSize: config.connectionPool.maxHeaderListSize\n      } : null,\n      http2Settings: config.http2?.settings\n    };\n  }\n\n  /**\n   * 检查SSL配置是否变更\n   */\n  private hasSSLConfigChanged(oldConfig: Http2ServerOptions, newConfig: Http2ServerOptions): boolean {\n    const oldSSL = oldConfig.ssl;\n    const newSSL = newConfig.ssl;\n\n    if (!oldSSL && !newSSL) return false;\n    if (!oldSSL || !newSSL) return true;\n\n    return (\n      oldSSL.mode !== newSSL.mode ||\n      oldSSL.key !== newSSL.key ||\n      oldSSL.cert !== newSSL.cert ||\n      oldSSL.ca !== newSSL.ca ||\n      oldSSL.allowHTTP1 !== newSSL.allowHTTP1\n    );\n  }\n\n  /**\n   * 检查HTTP/2配置是否变更\n   */\n  private hasHTTP2ConfigChanged(oldConfig: Http2ServerOptions, newConfig: Http2ServerOptions): boolean {\n    const oldHttp2 = oldConfig.http2;\n    const newHttp2 = newConfig.http2;\n\n    if (!oldHttp2 && !newHttp2) return false;\n    if (!oldHttp2 || !newHttp2) return true;\n\n    return (\n      oldHttp2.maxHeaderListSize !== newHttp2.maxHeaderListSize ||\n      oldHttp2.maxSessionMemory !== newHttp2.maxSessionMemory ||\n      JSON.stringify(oldHttp2.settings) !== JSON.stringify(newHttp2.settings)\n    );\n  }\n\n  /**\n   * 检查连接池配置是否变更\n   */\n  private hasConnectionPoolChanged(oldConfig: Http2ServerOptions, newConfig: Http2ServerOptions): boolean {\n    const oldPool = oldConfig.connectionPool;\n    const newPool = newConfig.connectionPool;\n\n    if (!oldPool && !newPool) return false;\n    if (!oldPool || !newPool) return true;\n\n    return (\n      oldPool.maxConnections !== newPool.maxConnections ||\n      oldPool.maxSessionMemory !== newPool.maxSessionMemory ||\n      oldPool.maxHeaderListSize !== newPool.maxHeaderListSize ||\n      oldPool.keepAliveTimeout !== newPool.keepAliveTimeout\n    );\n  }\n\n  // ============= 实现优雅关闭抽象方法 =============\n\n  protected async stopAcceptingNewConnections(traceId: string): Promise<void> {\n    this.logger.info('Step 1: Stopping acceptance of new HTTP/2 connections', { traceId });\n    \n    // 停止HTTP/2服务器监听\n    if (this.server.listening) {\n      await new Promise<void>((resolve, reject) => {\n        this.server.close((err) => {\n          if (err) reject(err);\n          else resolve();\n        });\n      });\n    }\n    \n    this.logger.debug('New HTTP/2 connection acceptance stopped', { traceId });\n  }\n\n  protected async waitForConnectionCompletion(timeout: number, traceId: string): Promise<void> {\n    this.logger.info('Step 3: Waiting for existing HTTP/2 sessions to complete', { traceId }, {\n      activeSessions: this.getActiveConnectionCount(),\n      timeout: timeout\n    });\n\n    const startTime = Date.now();\n    \n    while (this.getActiveConnectionCount() > 0) {\n      const elapsed = Date.now() - startTime;\n      \n      if (elapsed >= timeout) {\n        this.logger.warn('HTTP/2 session completion timeout reached', { traceId }, {\n          remainingSessions: this.getActiveConnectionCount(),\n          elapsed: elapsed\n        });\n        break;\n      }\n      \n      // 每5秒记录一次进度\n      if (elapsed % 5000 < 100) {\n        this.logger.debug('Waiting for HTTP/2 sessions to complete', { traceId }, {\n          remainingSessions: this.getActiveConnectionCount(),\n          elapsed: elapsed\n        });\n      }\n      \n      await new Promise(resolve => setTimeout(resolve, 100));\n    }\n    \n    this.logger.debug('HTTP/2 session completion wait finished', { traceId }, {\n      remainingSessions: this.getActiveConnectionCount()\n    });\n  }\n\n  protected async forceCloseRemainingConnections(traceId: string): Promise<void> {\n    const remainingConnections = this.getActiveConnectionCount();\n    \n    if (remainingConnections > 0) {\n      this.logger.info('Step 4: Force closing remaining HTTP/2 sessions', { traceId }, {\n        remainingSessions: remainingConnections\n      });\n      \n      // 使用连接池强制关闭所有会话\n      await this.connectionPool.closeAllConnections(5000);\n      \n      this.logger.warn('Forced closure of remaining HTTP/2 sessions', { traceId }, {\n        forcedSessions: remainingConnections\n      });\n    } else {\n      this.logger.debug('Step 4: No remaining HTTP/2 sessions to close', { traceId });\n    }\n  }\n\n  protected forceShutdown(traceId: string): void {\n    this.logger.warn('Force HTTP/2 server shutdown initiated', { traceId });\n    \n    // 强制关闭HTTP/2服务器\n    this.server.close();\n    \n    // 停止监控和清理\n    this.stopMonitoringAndCleanup(traceId);\n  }\n\n  /**\n   * 重写停止监控和清理方法以处理HTTP/2特定的监控间隔\n   */\n  protected stopMonitoringAndCleanup(traceId: string): void {\n    this.logger.info('Step 5: Stopping monitoring and cleanup', { traceId });\n\n    // 调用父类的清理方法（会清理所有TimerManager的定时器）\n    super.stopMonitoringAndCleanup(traceId);\n  }\n\n  // ============= 实现KoattyServer接口 =============\n\n  Start(listenCallback?: () => void): NativeServer {\n    // Simple startup log - no traceId needed\n    this.logger.info('Server starting', {}, {\n      hostname: this.options.hostname,\n      port: this.options.port,\n      protocol: this.options.protocol\n    });\n\n    // 添加错误事件监听器，必须在 listen 之前注册\n    const errorHandler = (error: Error) => {\n      // Error logs keep traceId for troubleshooting\n      const errorTraceId = generateTraceId();\n      this.logger.error('Server startup error', { traceId: errorTraceId }, error);\n      // 通过 EventEmitter error 事件传递错误，使调用方可通过 server.on('error', ...) 捕获\n      this.server.emit('error', error);\n    };\n\n    // 检查server是否支持once方法（避免测试中的mock对象问题）\n    if (typeof this.server.once === 'function') {\n      this.server.once('error', errorHandler);\n    }\n\n    this.server.listen(this.options.port, this.options.hostname, () => {\n      // 启动成功，移除启动阶段的错误处理器\n      if (typeof this.server.removeListener === 'function') {\n        this.server.removeListener('error', errorHandler);\n      }\n      \n      // 添加运行时错误处理器\n      if (typeof this.server.on === 'function') {\n        this.server.on('error', (error: Error) => {\n          // Error logs keep traceId for troubleshooting\n          const runtimeErrorTraceId = generateTraceId();\n          this.logger.error('Server runtime error', { traceId: runtimeErrorTraceId }, error); \n          // 运行时错误不退出进程\n        });\n      }\n      \n      // Record start time\n      this.startTime = Date.now();\n      \n      const protocolUpper = this.options.protocol.toUpperCase();\n      const underlyingProtocol = this.options.ext?._underlyingProtocol;\n      // For URL, always use the underlying protocol (http2/https), not graphql\n      const urlProtocol = (underlyingProtocol as string | undefined)?.toLowerCase() ?? this.options.protocol.toLowerCase();\n      const serverUrl = `${urlProtocol}://${this.options.hostname || '127.0.0.1'}:${this.options.port}/`;\n      \n      // 输出 Koatty 格式的启动日志 - no traceId needed for simple status log\n      this.logger.info(`Server: ${protocolUpper} running at ${serverUrl}`, {});\n      \n      // Simple completion log - no traceId needed\n      this.logger.info('Server started', {}, {\n        address: `${this.options.hostname}:${this.options.port}`,\n        hostname: this.options.hostname,\n        port: this.options.port,\n        protocol: this.options.protocol,\n        connectionPoolEnabled: !!this.connectionPool,\n        serverId: this.serverId,\n        sslMode: this.options.ssl?.mode || 'auto',\n        allowHTTP1: this.options.ssl?.allowHTTP1 !== false\n      });\n      \n      // 启动连接池监控\n      this.startConnectionPoolMonitoring();\n      \n      if (listenCallback) {\n        listenCallback();\n      }\n    });\n\n    return this.server;\n  }\n\n  getStatus(): number {\n    return this.status;\n  }\n\n  getNativeServer(): NativeServer {\n    return this.server;\n  }\n\n  // ============= HTTP/2特定的方法 =============\n\n  /**\n   * 启动连接池监控\n   */\n  private startConnectionPoolMonitoring(): void {\n    // Connection pool monitoring enabled (statistics collected silently)\n    this.timerManager.addTimer('http2_connection_monitoring', () => {\n      this.getConnectionStats(); // Collect stats but don't log\n    }, 30000); // 每30秒\n  }\n\n  /**\n   * 获取HTTP/2统计信息\n   */\n  getHttp2Stats() {\n    return this.connectionPool ? this.connectionPool.getConnectionStats() : null;\n  }\n\n  /**\n   * 获取当前连接状态\n   */\n  getConnectionsStatus(): { current: number; max: number } {\n    const poolConfig = this.connectionPool?.getConfig();\n    return {\n      current: this.getActiveConnectionCount(),\n      max: poolConfig?.maxConnections || 0\n    };\n  }\n\n  /**\n   * 销毁服务器\n   */\n  async destroy(): Promise<void> {\n    const traceId = generateTraceId();\n    this.logger.info('Destroying HTTP/2 server', { traceId });\n\n    try {\n      await this.gracefulShutdown();\n      this.logger.info('HTTP/2 server destroyed successfully', { traceId });\n    } catch (error) {\n      this.logger.error('Error destroying HTTP/2 server', { traceId }, error);\n      throw error;\n    }\n  }\n}\n","/*\n * @Description: HTTP/3连接池管理器\n * @Usage: HTTP/3协议的连接池实现（基于QUIC）\n * @Author: richen\n * @Date: 2025-01-12 10:00:00\n * @LastEditTime: 2025-01-12 10:00:00\n */\n\n/**\n * HTTP/3 连接池实现说明：\n * \n * HTTP/3 基于 QUIC 协议，运行在 UDP 之上。\n * Node.js 原生尚未完全支持 HTTP/3，需要使用第三方库。\n * \n * 可选的实现方案：\n * 1. @node-rs/quic - 基于 Rust 的高性能 QUIC 实现\n * 2. quiche-native - Cloudflare quiche 的 Node.js 绑定\n * 3. webtransport - Web Transport API 实现\n * \n * 本实现提供了架构框架，具体的 QUIC 库集成需要根据实际选择的库进行适配。\n */\n\nimport { \n  ConnectionPoolManager, \n  ConnectionRequestOptions\n} from './pool';\nimport { ConnectionPoolConfig } from '../config/pool';\n\n/**\n * HTTP/3 会话元数据\n * QUIC 连接支持多路复用，类似 HTTP/2\n */\ninterface Http3SessionMetadata {\n  id: string;\n  createdAt: number;\n  lastUsed: number;\n  available: boolean;\n  remoteAddress?: string;\n  remotePort?: number;\n  localAddress?: string;\n  localPort?: number;\n  encrypted: boolean;  // HTTP/3 总是加密的\n  protocol: string;    // 'http3'\n  activeStreams: number;\n  totalStreams: number;\n  maxConcurrentStreams: number;\n  streamErrors: number;\n  isClosing: boolean;\n  lastPingTime?: number;\n  lastPingAck?: number;\n  // QUIC 特定属性\n  connectionId?: string;\n  bytesSent: number;\n  bytesReceived: number;\n  packetsLost: number;\n  rtt: number;  // Round-trip time\n  congestionWindow: number;\n}\n\n/**\n * HTTP/3 流元数据\n */\ninterface Http3StreamMetadata {\n  id: number;\n  sessionId: string;\n  createdAt: number;\n  direction: 'bidirectional' | 'unidirectional';\n  state: 'open' | 'halfClosed' | 'closed';\n}\n\n/**\n * HTTP/3 连接（Session）接口\n * \n * 注意：这是一个抽象接口，实际实现取决于使用的 QUIC 库\n * 例如：@node-rs/quic 的 Connection 对象\n */\nexport interface Http3Session {\n  destroyed: boolean;\n  closed: boolean;\n  localAddress?: string;\n  localPort?: number;\n  remoteAddress?: string;\n  remotePort?: number;\n  \n  // QUIC 连接方法\n  close(code?: number, reason?: string): void;\n  ping?(callback: (err: Error | null, duration: number) => void): void;\n  getStats?(): {\n    bytesSent: number;\n    bytesReceived: number;\n    packetsLost: number;\n    rtt: number;\n  };\n  \n  // 事件监听\n  on(event: 'close', listener: () => void): this;\n  on(event: 'error', listener: (error: Error) => void): this;\n  on(event: 'stream', listener: (stream: any) => void): this;\n  on(event: string, listener: (...args: any[]) => void): this;\n  \n  once(event: 'close', listener: () => void): this;\n  once(event: 'error', listener: (error: Error) => void): this;\n  once(event: string, listener: (...args: any[]) => void): this;\n}\n\n/**\n * HTTP/3连接池管理器\n */\nexport class Http3ConnectionPoolManager extends ConnectionPoolManager<Http3Session> {\n  private readonly activeStreams = new Map<string, Set<Http3StreamMetadata>>();\n  private pingInterval?: NodeJS.Timeout;\n\n  constructor(config: ConnectionPoolConfig = {}) {\n    super('http3', config);\n\n    // 启动HTTP/3特有的监控任务\n    this.startHttp3MonitoringTasks();\n  }\n\n  /**\n   * 验证HTTP/3会话\n   */\n  protected validateConnection(session: Http3Session): boolean {\n    return session && \n           !session.destroyed && \n           !session.closed;\n  }\n\n  /**\n   * 清理HTTP/3会话\n   */\n  protected async cleanupConnection(session: Http3Session): Promise<void> {\n    try {\n      const sessionId = this.findHttp3SessionId(session);\n      if (sessionId) {\n        // 清理活跃流\n        const streams = this.activeStreams.get(sessionId);\n        if (streams) {\n          // 关闭所有流（具体实现取决于 QUIC 库）\n          streams.clear();\n          this.activeStreams.delete(sessionId);\n        }\n      }\n\n      if (!session.destroyed && !session.closed) {\n        session.close(0, 'Normal closure');\n      }\n    } catch (error) {\n      this.logger.warn('Error cleaning up HTTP/3 session', {}, error);\n    }\n  }\n\n  /**\n   * 获取可用会话\n   */\n  protected async getAvailableConnection(): Promise<{ connection: Http3Session; id: string } | null> {\n    for (const [id, metadata] of this.connectionMetadata) {\n      const http3Metadata = metadata as Http3SessionMetadata;\n      \n      // 检查会话是否可用且有容量\n      if (http3Metadata.available && \n          !http3Metadata.isClosing &&\n          http3Metadata.activeStreams < http3Metadata.maxConcurrentStreams &&\n          this.isConnectionHealthy(this.connections.get(id)!)) {\n        \n        const session = this.connections.get(id);\n        if (session) {\n          // 更新使用时间\n          http3Metadata.lastUsed = Date.now();\n          return { connection: session, id };\n        }\n      }\n    }\n    return null;\n  }\n\n  /**\n   * 创建新连接 - HTTP/3会话通常是被动接受的\n   */\n  protected async createNewConnection(_options: ConnectionRequestOptions): Promise<{ connection: Http3Session; id: string; metadata?: any } | null> {\n    // HTTP/3会话通常是被动接受的，这里返回null\n    // 在实际的HTTP/3服务器实现中，会话会通过server.on('session')事件添加\n    return null;\n  }\n\n  /**\n   * 检查会话是否健康\n   */\n  isConnectionHealthy(session: Http3Session): boolean {\n    if (!session) return false;\n    \n    const sessionId = this.findHttp3SessionId(session);\n    if (!sessionId) return false;\n    \n    const metadata = this.connectionMetadata.get(sessionId) as Http3SessionMetadata;\n    if (!metadata) return false;\n    \n    // 检查会话状态\n    const isSessionHealthy = !session.destroyed && \n                            !session.closed &&\n                            !metadata.isClosing;\n    \n    // 检查ping响应时间（如果支持）\n    const now = Date.now();\n    const pingTimeout = this.config.protocolSpecific?.maxIdleTimeout || 30000;\n    \n    if (metadata.lastPingTime && !metadata.lastPingAck) {\n      if (now - metadata.lastPingTime > pingTimeout) {\n        return false;\n      }\n    }\n    \n    // 检查 RTT 是否异常\n    if (metadata.rtt > 5000) { // 5秒 RTT 视为不健康\n      return false;\n    }\n    \n    return isSessionHealthy;\n  }\n\n  /**\n   * 添加HTTP/3会话（由服务器调用）\n   */\n  async addHttp3Session(session: Http3Session): Promise<boolean> {\n    const metadata: Partial<Http3SessionMetadata> = {\n      remoteAddress: session.remoteAddress,\n      remotePort: session.remotePort,\n      localAddress: session.localAddress,\n      localPort: session.localPort,\n      encrypted: true,  // HTTP/3 总是加密的\n      protocol: 'http3',\n      activeStreams: 0,\n      totalStreams: 0,\n      maxConcurrentStreams: this.config.protocolSpecific?.initialMaxStreamsBidi || 100,\n      streamErrors: 0,\n      isClosing: false,\n      bytesSent: 0,\n      bytesReceived: 0,\n      packetsLost: 0,\n      rtt: 0,\n      congestionWindow: 0\n    };\n\n    const success = await this.addConnection(session, metadata);\n    \n    if (success) {\n      this.setupSessionEventHandlers(session);\n    }\n    \n    return success;\n  }\n\n  /**\n   * 设置会话事件处理器\n   */\n  private setupSessionEventHandlers(session: Http3Session): void {\n    const sessionId = this.findHttp3SessionId(session);\n    if (!sessionId) return;\n\n    // 初始化流集合\n    this.activeStreams.set(sessionId, new Set());\n\n    // 处理会话关闭\n    session.on('close', () => {\n      this.removeConnection(session, 'Session closed').catch(error => {\n        this.logger.error('Error removing closed session', {}, error);\n      });\n    });\n\n    // 处理会话错误\n    session.on('error', (error) => {\n      this.logger.warn('HTTP/3 session error', {}, { \n        sessionId, \n        error: error.message \n      });\n      this.removeConnection(session, `Session error: ${error.message}`).catch(err => {\n        this.logger.error('Error removing errored session', {}, err);\n      });\n    });\n\n    // 处理流创建（如果 QUIC 库支持此事件）\n    if (typeof session.on === 'function') {\n      session.on('stream', (stream: any) => {\n        this.handleNewStream(sessionId, stream);\n      });\n    }\n\n    // 设置定期ping（如果支持）\n    this.startSessionPing(session, sessionId);\n  }\n\n  /**\n   * 处理新流\n   */\n  private handleNewStream(sessionId: string, stream: any): void {\n    const metadata = this.connectionMetadata.get(sessionId) as Http3SessionMetadata;\n    if (!metadata) return;\n\n    const streams = this.activeStreams.get(sessionId);\n    if (streams) {\n      const streamMetadata: Http3StreamMetadata = {\n        id: stream.id || Date.now(),\n        sessionId,\n        createdAt: Date.now(),\n        direction: stream.bidirectional ? 'bidirectional' : 'unidirectional',\n        state: 'open'\n      };\n      \n      streams.add(streamMetadata);\n      metadata.activeStreams = streams.size;\n      metadata.totalStreams++;\n      metadata.lastUsed = Date.now();\n\n      // 处理流事件\n      if (stream.on) {\n        stream.on('close', () => {\n          streams.delete(streamMetadata);\n          metadata.activeStreams = streams.size;\n        });\n\n        stream.on('error', (error: Error) => {\n          metadata.streamErrors++;\n          streams.delete(streamMetadata);\n          metadata.activeStreams = streams.size;\n          \n          this.logger.warn('HTTP/3 stream error', {}, {\n            sessionId,\n            streamId: streamMetadata.id,\n            error: error.message,\n            totalStreamErrors: metadata.streamErrors\n          });\n        });\n      }\n\n      // 记录延迟\n      const startTime = Date.now();\n      if (stream.on) {\n        stream.on('close', () => {\n          const latency = Date.now() - startTime;\n          this.recordLatency(latency);\n        });\n      }\n    }\n  }\n\n  /**\n   * 启动会话ping\n   */\n  private startSessionPing(session: Http3Session, sessionId: string): void {\n    const pingInterval = this.config.protocolSpecific?.maxIdleTimeout || 30000;\n    \n    const pingTimer = setInterval(() => {\n      if (session.destroyed || session.closed) {\n        clearInterval(pingTimer);\n        return;\n      }\n\n      try {\n        const metadata = this.connectionMetadata.get(sessionId) as Http3SessionMetadata;\n        if (metadata && session.ping) {\n          metadata.lastPingTime = Date.now();\n          session.ping((err, duration) => {\n            if (!err && metadata) {\n              metadata.lastPingAck = Date.now();\n              metadata.rtt = duration;\n            }\n          });\n        }\n      } catch {\n        // Ping error handled silently\n      }\n    }, pingInterval);\n  }\n\n  /**\n   * 启动HTTP/3监控任务\n   */\n  private startHttp3MonitoringTasks(): void {\n    // Ping间隔\n    const pingInterval = this.config.protocolSpecific?.maxIdleTimeout || 30000;\n    this.pingInterval = setInterval(() => {\n      this.pingAllSessions();\n    }, pingInterval);\n\n    // 健康检查间隔\n    this.healthCheckInterval = setInterval(() => {\n      this.performHealthCheck();\n    }, 60000); // 1分钟\n  }\n\n  /**\n   * 向所有会话发送ping\n   */\n  private pingAllSessions(): void {\n    for (const [sessionId, session] of this.connections) {\n      if (!session.destroyed && !session.closed) {\n        try {\n          const metadata = this.connectionMetadata.get(sessionId) as Http3SessionMetadata;\n          if (metadata && !metadata.isClosing && session.ping) {\n            metadata.lastPingTime = Date.now();\n            session.ping((err, duration) => {\n              if (!err && metadata) {\n                metadata.lastPingAck = Date.now();\n                metadata.rtt = duration;\n              }\n            });\n          }\n        } catch {\n          // Session ping failed\n        }\n      }\n    }\n  }\n\n  /**\n   * 执行健康检查\n   */\n  private performHealthCheck(): void {\n    const unhealthySessions: Http3Session[] = [];\n    \n    for (const [_sessionId, session] of this.connections) {\n      if (!this.isConnectionHealthy(session)) {\n        unhealthySessions.push(session);\n      }\n    }\n\n    // 清理不健康的会话\n    unhealthySessions.forEach(session => {\n      this.removeConnection(session, 'Health check failed').catch(error => {\n        this.logger.error('Error removing unhealthy session', {}, error);\n      });\n    });\n  }\n\n  /**\n   * 更新会话统计信息（从 QUIC 库获取）\n   */\n  updateSessionStats(session: Http3Session, sessionId: string): void {\n    const metadata = this.connectionMetadata.get(sessionId) as Http3SessionMetadata;\n    if (!metadata || !session.getStats) return;\n\n    try {\n      const stats = session.getStats();\n      metadata.bytesSent = stats.bytesSent;\n      metadata.bytesReceived = stats.bytesReceived;\n      metadata.packetsLost = stats.packetsLost;\n      metadata.rtt = stats.rtt;\n    } catch (error) {\n      this.logger.warn('Failed to update session stats', {}, error);\n    }\n  }\n\n  /**\n   * 获取会话统计信息\n   */\n  getConnectionStats() {\n    const stats = this.getMetrics();\n    const activeSessions = this.getActiveConnectionCount();\n    \n    let availableSessions = 0;\n    let totalActiveStreams = 0;\n    let totalStreams = 0;\n    let totalStreamErrors = 0;\n    let closingSessions = 0;\n    let totalBytesSent = 0;\n    let totalBytesReceived = 0;\n    let totalPacketsLost = 0;\n    let avgRtt = 0;\n    \n    for (const [sessionId, _session] of this.connections) {\n      const metadata = this.connectionMetadata.get(sessionId) as Http3SessionMetadata;\n      \n      if (metadata) {\n        if (metadata.available && !metadata.isClosing) {\n          availableSessions++;\n        }\n        \n        if (metadata.isClosing) {\n          closingSessions++;\n        }\n        \n        totalActiveStreams += metadata.activeStreams;\n        totalStreams += metadata.totalStreams;\n        totalStreamErrors += metadata.streamErrors;\n        totalBytesSent += metadata.bytesSent;\n        totalBytesReceived += metadata.bytesReceived;\n        totalPacketsLost += metadata.packetsLost;\n        avgRtt += metadata.rtt;\n      }\n    }\n    \n    avgRtt = activeSessions > 0 ? avgRtt / activeSessions : 0;\n    \n    return {\n      ...stats,\n      availableSessions,\n      closingSessions,\n      totalActiveStreams,\n      totalStreams,\n      totalStreamErrors,\n      totalBytesSent,\n      totalBytesReceived,\n      totalPacketsLost,\n      averageRtt: avgRtt,\n      averageStreamsPerSession: activeSessions > 0 ? totalActiveStreams / activeSessions : 0,\n      utilizationRatio: this.config.maxConnections ? \n        activeSessions / this.config.maxConnections : 0,\n      packetLossRate: totalBytesSent > 0 ? totalPacketsLost / (totalBytesSent / 1200) : 0  // 假设平均包大小1200字节\n    };\n  }\n\n  /**\n   * 获取会话详细信息\n   */\n  getSessionDetails(): Array<{\n    id: string;\n    remoteAddress: string;\n    protocol: string;\n    activeStreams: number;\n    totalStreams: number;\n    streamErrors: number;\n    maxConcurrentStreams: number;\n    isClosing: boolean;\n    bytesSent: number;\n    bytesReceived: number;\n    packetsLost: number;\n    rtt: number;\n    age: number;\n    idle: number;\n  }> {\n    const now = Date.now();\n    const details: Array<any> = [];\n    \n    for (const [sessionId, metadata] of this.connectionMetadata) {\n      const http3Metadata = metadata as Http3SessionMetadata;\n      \n      details.push({\n        id: sessionId,\n        remoteAddress: http3Metadata.remoteAddress || 'unknown',\n        protocol: http3Metadata.protocol,\n        activeStreams: http3Metadata.activeStreams,\n        totalStreams: http3Metadata.totalStreams,\n        streamErrors: http3Metadata.streamErrors,\n        maxConcurrentStreams: http3Metadata.maxConcurrentStreams,\n        isClosing: http3Metadata.isClosing,\n        bytesSent: http3Metadata.bytesSent,\n        bytesReceived: http3Metadata.bytesReceived,\n        packetsLost: http3Metadata.packetsLost,\n        rtt: http3Metadata.rtt,\n        age: now - http3Metadata.createdAt,\n        idle: now - http3Metadata.lastUsed\n      });\n    }\n    \n    return details;\n  }\n\n  /**\n   * 优雅关闭会话\n   */\n  async gracefulCloseSession(session: Http3Session, timeout: number = 5000): Promise<void> {\n    const sessionId = this.findHttp3SessionId(session);\n    if (!sessionId) return;\n\n    try {\n      // 标记会话正在关闭\n      const metadata = this.connectionMetadata.get(sessionId) as Http3SessionMetadata;\n      if (metadata) {\n        metadata.isClosing = true;\n        metadata.available = false;\n      }\n      \n      // 等待活跃流完成\n      const streams = this.activeStreams.get(sessionId);\n      if (streams && streams.size > 0) {\n        await new Promise((resolve) => {\n          const checkInterval = setInterval(() => {\n            if (streams.size === 0) {\n              clearInterval(checkInterval);\n              resolve(void 0);\n            }\n          }, 100);\n\n          // 超时处理\n          setTimeout(() => {\n            clearInterval(checkInterval);\n            resolve(void 0);\n          }, timeout);\n        });\n      }\n\n      // 关闭会话\n      if (!session.destroyed && !session.closed) {\n        session.close(0, 'Graceful shutdown');\n      }\n    } catch (error) {\n      this.logger.error('Error during graceful session close', {}, error);\n    }\n  }\n\n  /**\n   * 找到会话ID的辅助方法\n   */\n  private findHttp3SessionId(session: Http3Session): string | null {\n    for (const [id, conn] of this.connections) {\n      if (conn === session) return id;\n    }\n    return null;\n  }\n\n  /**\n   * 销毁连接池\n   */\n  async destroy(): Promise<void> {\n    try {\n      // 清理所有流映射\n      this.activeStreams.clear();\n      \n      // 清理定时器\n      if (this.pingInterval) {\n        clearInterval(this.pingInterval);\n      }\n      if (this.healthCheckInterval) {\n        clearInterval(this.healthCheckInterval);\n      }\n      \n      // 调用父类的销毁方法（会自动清理定时器）\n      await super.destroy();\n      \n      this.logger.info('HTTP/3 connection pool destroyed');\n    } catch (error) {\n      this.logger.error('Error destroying HTTP/3 connection pool', {}, error);\n      throw error;\n    }\n  }\n\n  // ============= 实现抽象方法 =============\n\n  /**\n   * 设置协议特定的连接处理器\n   */\n  protected async setupProtocolSpecificHandlers(session: Http3Session): Promise<void> {\n    // HTTP/3特定的处理器设置已在addHttp3Session中完成\n    this.setupSessionEventHandlers(session);\n  }\n\n  /**\n   * 协议特定的连接创建逻辑\n   */\n  protected async createProtocolConnection(_options: ConnectionRequestOptions): Promise<{ connection: Http3Session; metadata?: any } | null> {\n    // HTTP/3会话由服务器被动接受，不主动创建\n    return null;\n  }\n}\n\n","/*\n * @Description: QPACK (QPACK: Field Compression for HTTP/3) implementation\n * @Usage: RFC 9204 - QPACK 头部压缩实现\n * @Author: richen\n * @Date: 2025-01-12 18:00:00\n * @LastEditTime: 2025-01-12 18:00:00\n */\n\nimport { createLogger } from '../../utils/logger';\n\nconst logger = createLogger({ module: 'qpack' });\n\n/**\n * QPACK 静态表 (RFC 9204 Appendix A)\n * 包含常用的 HTTP 头部字段\n */\nconst STATIC_TABLE: Array<[string, string]> = [\n  [':authority', ''],\n  [':path', '/'],\n  ['age', '0'],\n  ['content-disposition', ''],\n  ['content-length', '0'],\n  ['cookie', ''],\n  ['date', ''],\n  ['etag', ''],\n  ['if-modified-since', ''],\n  ['if-none-match', ''],\n  ['last-modified', ''],\n  ['link', ''],\n  ['location', ''],\n  ['referer', ''],\n  ['set-cookie', ''],\n  [':method', 'CONNECT'],\n  [':method', 'DELETE'],\n  [':method', 'GET'],\n  [':method', 'HEAD'],\n  [':method', 'OPTIONS'],\n  [':method', 'POST'],\n  [':method', 'PUT'],\n  [':scheme', 'http'],\n  [':scheme', 'https'],\n  [':status', '103'],\n  [':status', '200'],\n  [':status', '304'],\n  [':status', '404'],\n  [':status', '503'],\n  ['accept', '*/*'],\n  ['accept', 'application/dns-message'],\n  ['accept-encoding', 'gzip, deflate, br'],\n  ['accept-ranges', 'bytes'],\n  ['access-control-allow-headers', 'cache-control'],\n  ['access-control-allow-headers', 'content-type'],\n  ['access-control-allow-origin', '*'],\n  ['cache-control', 'max-age=0'],\n  ['cache-control', 'max-age=2592000'],\n  ['cache-control', 'max-age=604800'],\n  ['cache-control', 'no-cache'],\n  ['cache-control', 'no-store'],\n  ['cache-control', 'public, max-age=31536000'],\n  ['content-encoding', 'br'],\n  ['content-encoding', 'gzip'],\n  ['content-type', 'application/dns-message'],\n  ['content-type', 'application/javascript'],\n  ['content-type', 'application/json'],\n  ['content-type', 'application/x-www-form-urlencoded'],\n  ['content-type', 'image/gif'],\n  ['content-type', 'image/jpeg'],\n  ['content-type', 'image/png'],\n  ['content-type', 'text/css'],\n  ['content-type', 'text/html; charset=utf-8'],\n  ['content-type', 'text/plain'],\n  ['content-type', 'text/plain;charset=utf-8'],\n  ['range', 'bytes=0-'],\n  ['strict-transport-security', 'max-age=31536000'],\n  ['strict-transport-security', 'max-age=31536000; includesubdomains'],\n  ['strict-transport-security', 'max-age=31536000; includesubdomains; preload'],\n  ['vary', 'accept-encoding'],\n  ['vary', 'origin'],\n  ['x-content-type-options', 'nosniff'],\n  ['x-xss-protection', '1; mode=block'],\n  [':status', '100'],\n  [':status', '204'],\n  [':status', '206'],\n  [':status', '302'],\n  [':status', '400'],\n  [':status', '403'],\n  [':status', '421'],\n  [':status', '425'],\n  [':status', '500'],\n  ['accept-language', ''],\n  ['access-control-allow-credentials', 'FALSE'],\n  ['access-control-allow-credentials', 'TRUE'],\n  ['access-control-allow-headers', '*'],\n  ['access-control-allow-methods', 'get'],\n  ['access-control-allow-methods', 'get, post, options'],\n  ['access-control-allow-methods', 'options'],\n  ['access-control-expose-headers', 'content-length'],\n  ['access-control-request-headers', 'content-type'],\n  ['access-control-request-method', 'get'],\n  ['access-control-request-method', 'post'],\n  ['alt-svc', 'clear'],\n  ['authorization', ''],\n  ['content-security-policy', \"script-src 'none'; object-src 'none'; base-uri 'none'\"],\n  ['early-data', '1'],\n  ['expect-ct', ''],\n  ['forwarded', ''],\n  ['if-range', ''],\n  ['origin', ''],\n  ['purpose', 'prefetch'],\n  ['server', ''],\n  ['timing-allow-origin', '*'],\n  ['upgrade-insecure-requests', '1'],\n  ['user-agent', ''],\n  ['x-forwarded-for', ''],\n  ['x-frame-options', 'deny'],\n  ['x-frame-options', 'sameorigin'],\n];\n\nconst HUFFMAN_CODES: [number, number][] = [\n  [0x1ff8, 13], [0x7fffd8, 23], [0xfffffe2, 28], [0xfffffe3, 28],\n  [0xfffffe4, 28], [0xfffffe5, 28], [0xfffffe6, 28], [0xfffffe7, 28],\n  [0xfffffe8, 28], [0xffffea, 24], [0x3ffffffc, 30], [0xfffffe9, 28],\n  [0xfffffea, 28], [0x3ffffffd, 30], [0xfffffeb, 28], [0xfffffec, 28],\n  [0xfffffed, 28], [0xfffffee, 28], [0xfffffef, 28], [0xffffff0, 28],\n  [0xffffff1, 28], [0xffffff2, 28], [0x3ffffffe, 30], [0xffffff3, 28],\n  [0xffffff4, 28], [0xffffff5, 28], [0xffffff6, 28], [0xffffff7, 28],\n  [0xffffff8, 28], [0xffffff9, 28], [0xffffffa, 28], [0xffffffb, 28],\n  [0x14, 6], [0x3f8, 10], [0x3f9, 10], [0xffa, 12],\n  [0x1ff9, 13], [0x15, 6], [0xf8, 8], [0x7fa, 11],\n  [0x3fa, 10], [0x3fb, 10], [0xf9, 8], [0x7fb, 11],\n  [0xfa, 8], [0x16, 6], [0x17, 6], [0x18, 6],\n  [0x0, 5], [0x1, 5], [0x2, 5], [0x19, 6],\n  [0x1a, 6], [0x1b, 6], [0x1c, 6], [0x1d, 6],\n  [0x1e, 6], [0x1f, 6], [0x5c, 7], [0xfb, 8],\n  [0x7ffc, 15], [0x20, 6], [0xffb, 12], [0x3fc, 10],\n  [0x1ffa, 13], [0x21, 6], [0x5d, 7], [0x5e, 7],\n  [0x5f, 7], [0x60, 7], [0x61, 7], [0x62, 7],\n  [0x63, 7], [0x64, 7], [0x65, 7], [0x66, 7],\n  [0x67, 7], [0x68, 7], [0x69, 7], [0x6a, 7],\n  [0x6b, 7], [0x6c, 7], [0x6d, 7], [0x6e, 7],\n  [0x6f, 7], [0x70, 7], [0x71, 7], [0x72, 7],\n  [0xfc, 8], [0x73, 7], [0xfd, 8], [0x1ffb, 13],\n  [0x7fff0, 19], [0x1ffc, 13], [0x3ffc, 14], [0x22, 6],\n  [0x7ffd, 15], [0x3, 5], [0x23, 6], [0x4, 5],\n  [0x24, 6], [0x5, 5], [0x25, 6], [0x26, 6],\n  [0x27, 6], [0x6, 5], [0x74, 7], [0x75, 7],\n  [0x28, 6], [0x29, 6], [0x2a, 6], [0x7, 5],\n  [0x2b, 6], [0x76, 7], [0x2c, 6], [0x8, 5],\n  [0x9, 5], [0x2d, 6], [0x77, 7], [0x78, 7],\n  [0x79, 7], [0x7a, 7], [0x7b, 7], [0x7ffe, 15],\n  [0x7fc, 11], [0x3ffd, 14], [0x1ffd, 13], [0xffffffc, 28],\n  [0xfffe6, 20], [0x3fffd2, 22], [0xfffe7, 20], [0xfffe8, 20],\n  [0x3fffd3, 22], [0x3fffd4, 22], [0x3fffd5, 22], [0x7fffd9, 23],\n  [0x3fffd6, 22], [0x7fffda, 23], [0x7fffdb, 23], [0x7fffdc, 23],\n  [0x7fffdd, 23], [0x7fffde, 23], [0xffffeb, 24], [0x7fffdf, 23],\n  [0xffffec, 24], [0xffffed, 24], [0x3fffd7, 22], [0x7fffe0, 23],\n  [0xffffee, 24], [0x7fffe1, 23], [0x7fffe2, 23], [0x7fffe3, 23],\n  [0x7fffe4, 23], [0x1fffdc, 21], [0x3fffd8, 22], [0x7fffe5, 23],\n  [0x3fffd9, 22], [0x7fffe6, 23], [0x7fffe7, 23], [0xffffef, 24],\n  [0x3fffda, 22], [0x1fffdd, 21], [0xfffe9, 20], [0x3fffdb, 22],\n  [0x3fffdc, 22], [0x7fffe8, 23], [0x7fffe9, 23], [0x1fffde, 21],\n  [0x7fffea, 23], [0x3fffdd, 22], [0x3fffde, 22], [0xfffff0, 24],\n  [0x1fffdf, 21], [0x3fffdf, 22], [0x7fffeb, 23], [0x7fffec, 23],\n  [0x1fffe0, 21], [0x1fffe1, 21], [0x3fffe0, 22], [0x1fffe2, 21],\n  [0x7fffed, 23], [0x3fffe1, 22], [0x7fffee, 23], [0x7fffef, 23],\n  [0xfffea, 20], [0x3fffe2, 22], [0x3fffe3, 22], [0x3fffe4, 22],\n  [0x7ffff0, 23], [0x3fffe5, 22], [0x3fffe6, 22], [0x7ffff1, 23],\n  [0x3ffffe0, 26], [0x3ffffe1, 26], [0xfffeb, 20], [0x7fff1, 19],\n  [0x3fffe7, 22], [0x7ffff2, 23], [0x3fffe8, 22], [0x1ffffec, 25],\n  [0x3ffffe2, 26], [0x3ffffe3, 26], [0x3ffffe4, 26], [0x7ffffde, 27],\n  [0x7ffffdf, 27], [0x3ffffe5, 26], [0xfffff1, 24], [0x1ffffed, 25],\n  [0x7fff2, 19], [0x1fffe3, 21], [0x3ffffe6, 26], [0x7ffffe0, 27],\n  [0x7ffffe1, 27], [0x3ffffe7, 26], [0x7ffffe2, 27], [0xfffff2, 24],\n  [0x1fffe4, 21], [0x1fffe5, 21], [0x3ffffe8, 26], [0x3ffffe9, 26],\n  [0xffffffd, 28], [0x7ffffe3, 27], [0x7ffffe4, 27], [0x7ffffe5, 27],\n  [0xfffec, 20], [0xfffff3, 24], [0xfffed, 20], [0x1fffe6, 21],\n  [0x3fffe9, 22], [0x1fffe7, 21], [0x1fffe8, 21], [0x7ffff3, 23],\n  [0x3fffea, 22], [0x3fffeb, 22], [0x1ffffee, 25], [0x1ffffef, 25],\n  [0xfffff4, 24], [0xfffff5, 24], [0x3ffffea, 26], [0x7ffff4, 23],\n  [0x3ffffeb, 26], [0x7ffffe6, 27], [0x3ffffec, 26], [0x3ffffed, 26],\n  [0x7ffffe7, 27], [0x7ffffe8, 27], [0x7ffffe9, 27], [0x7ffffea, 27],\n  [0x7ffffeb, 27], [0xfffffffe, 28], [0x7ffffec, 27], [0x7ffffed, 27],\n  [0x7ffffee, 27], [0x7ffffef, 27], [0x7fffff0, 27], [0x3ffffee, 26],\n  [0x3fffffff, 30],\n];\n\ninterface HuffNode {\n  symbol: number;\n  left: number;\n  right: number;\n}\n\nlet huffmanTree: HuffNode[] | null = null;\n\nfunction buildHuffmanTree(): HuffNode[] {\n  const nodes: HuffNode[] = [{ symbol: -1, left: -1, right: -1 }];\n\n  for (let sym = 0; sym < HUFFMAN_CODES.length; sym++) {\n    const [code, len] = HUFFMAN_CODES[sym];\n    let idx = 0;\n\n    for (let bitPos = len - 1; bitPos >= 0; bitPos--) {\n      const bit = (code >> bitPos) & 1;\n      let nextIdx: number;\n\n      if (bit === 0) {\n        if (nodes[idx].left === -1) {\n          nextIdx = nodes.length;\n          nodes.push({ symbol: -1, left: -1, right: -1 });\n          nodes[idx].left = nextIdx;\n        } else {\n          nextIdx = nodes[idx].left;\n        }\n      } else {\n        if (nodes[idx].right === -1) {\n          nextIdx = nodes.length;\n          nodes.push({ symbol: -1, left: -1, right: -1 });\n          nodes[idx].right = nextIdx;\n        } else {\n          nextIdx = nodes[idx].right;\n        }\n      }\n\n      if (bitPos === 0) {\n        nodes[nextIdx].symbol = sym;\n      } else {\n        idx = nextIdx;\n      }\n    }\n  }\n\n  return nodes;\n}\n\nfunction huffmanDecode(data: Buffer): Buffer {\n  if (!huffmanTree) {\n    huffmanTree = buildHuffmanTree();\n  }\n\n  const tree = huffmanTree;\n  const result: number[] = [];\n  let nodeIdx = 0;\n\n  for (let byteIdx = 0; byteIdx < data.length; byteIdx++) {\n    let byte = data[byteIdx];\n    for (let bit = 7; bit >= 0; bit--) {\n      const b = (byte >> bit) & 1;\n      const childIdx = b === 0 ? tree[nodeIdx].left : tree[nodeIdx].right;\n\n      if (childIdx === -1) {\n        throw new Error('QPACK Huffman decode error: invalid code');\n      }\n\n      const child = tree[childIdx];\n      if (child.symbol !== -1) {\n        if (child.symbol === 256) {\n          throw new Error('QPACK Huffman decode error: unexpected EOS');\n        }\n        result.push(child.symbol);\n        nodeIdx = 0;\n      } else {\n        nodeIdx = childIdx;\n      }\n    }\n  }\n\n  if (nodeIdx !== 0) {\n    let cur = nodeIdx;\n    let maxSteps = 30;\n    while (tree[cur].symbol === -1 && maxSteps > 0) {\n      const right = tree[cur].right;\n      if (right === -1) {\n        throw new Error('QPACK Huffman decode error: invalid padding');\n      }\n      cur = right;\n      maxSteps--;\n    }\n    if (tree[cur].symbol !== 256) {\n      throw new Error('QPACK Huffman decode error: padding is not EOS prefix');\n    }\n  }\n\n  return Buffer.from(result);\n}\n\n/**\n * QPACK 编码器\n */\nexport class QPACKEncoder {\n  private dynamicTable: Array<[string, string]> = [];\n  private maxTableCapacity: number;\n  private tableCapacity = 0;\n  \n  constructor(maxTableCapacity = 4096) {\n    this.maxTableCapacity = maxTableCapacity;\n  }\n  \n  /**\n   * 编码 HTTP 头部\n   * @param headers - HTTP 头部数组 [[name, value], ...]\n   * @returns 编码后的字节数组\n   */\n  encode(headers: Array<[string, string]>): Buffer {\n    const encodedHeaders: Buffer[] = [];\n    \n    for (const [name, value] of headers) {\n      const lowerName = name.toLowerCase();\n      \n      // 1. 尝试在静态表中查找完全匹配\n      const staticIndex = this.findInStaticTable(lowerName, value);\n      if (staticIndex !== -1) {\n        // 索引头部字段 (Indexed Field Line)\n        encodedHeaders.push(this.encodeIndexed(staticIndex, false));\n        continue;\n      }\n      \n      // 2. 尝试在静态表中查找名称匹配\n      const staticNameIndex = this.findNameInStaticTable(lowerName);\n      if (staticNameIndex !== -1) {\n        // 带名称引用的字面量 (Literal Field Line With Name Reference)\n        encodedHeaders.push(this.encodeLiteralWithNameRef(staticNameIndex, value, false));\n        continue;\n      }\n      \n      // 3. 字面量头部字段 (Literal Field Line With Literal Name)\n      encodedHeaders.push(this.encodeLiteralWithLiteralName(lowerName, value));\n    }\n    \n    return Buffer.concat(encodedHeaders);\n  }\n  \n  /**\n   * 编码索引头部字段\n   * @param index - 表索引\n   * @param _isDynamic - 是否为动态表索引（预留参数）\n   */\n  private encodeIndexed(index: number, _isDynamic: boolean): Buffer {\n    // 索引头部字段的格式: 1xxxxxxx\n    // 最高位为1表示索引头部字段\n    const prefix = 0x80; // 10000000\n    return this.encodeInteger(index, prefix, 6);\n  }\n  \n  /**\n   * 编码带名称引用的字面量\n   * @param nameIndex - 名称在表中的索引\n   * @param value - 头部值\n   * @param _isDynamic - 是否为动态表索引（预留参数）\n   */\n  private encodeLiteralWithNameRef(nameIndex: number, value: string, _isDynamic: boolean): Buffer {\n    // 带名称引用的字面量格式: 01xxxxxx\n    const prefix = 0x40; // 01000000\n    const indexBytes = this.encodeInteger(nameIndex, prefix, 6);\n    const valueBytes = this.encodeString(value);\n    \n    return Buffer.concat([indexBytes, valueBytes]);\n  }\n  \n  /**\n   * 编码带字面量名称的字面量\n   * @param name - 头部名称\n   * @param value - 头部值\n   */\n  private encodeLiteralWithLiteralName(name: string, value: string): Buffer {\n    // 带字面量名称的字面量格式: 001xxxxx\n    const prefix = 0x20; // 00100000\n    const prefixByte = Buffer.from([prefix]);\n    const nameBytes = this.encodeString(name);\n    const valueBytes = this.encodeString(value);\n    \n    return Buffer.concat([prefixByte, nameBytes, valueBytes]);\n  }\n  \n  /**\n   * 编码整数（可变长度整数编码）\n   * @param value - 要编码的整数\n   * @param prefix - 前缀字节\n   * @param prefixBits - 前缀位数\n   */\n  private encodeInteger(value: number, prefix: number, prefixBits: number): Buffer {\n    const maxPrefix = (1 << prefixBits) - 1;\n    \n    if (value < maxPrefix) {\n      return Buffer.from([prefix | value]);\n    }\n    \n    const bytes: number[] = [prefix | maxPrefix];\n    value -= maxPrefix;\n    \n    while (value >= 128) {\n      bytes.push((value % 128) + 128);\n      value = Math.floor(value / 128);\n    }\n    bytes.push(value);\n    \n    return Buffer.from(bytes);\n  }\n  \n  /**\n   * 编码字符串\n   * @param str - 要编码的字符串\n   * @param useHuffman - 是否使用 Huffman 编码（当前简化实现不使用）\n   */\n  private encodeString(str: string, useHuffman = false): Buffer {\n    const strBuffer = Buffer.from(str, 'utf8');\n    const lengthPrefix = useHuffman ? 0x80 : 0x00; // 最高位表示是否使用 Huffman\n    const lengthBytes = this.encodeInteger(strBuffer.length, lengthPrefix, 7);\n    \n    return Buffer.concat([lengthBytes, strBuffer]);\n  }\n  \n  /**\n   * 在静态表中查找完全匹配的条目\n   */\n  private findInStaticTable(name: string, value: string): number {\n    for (let i = 0; i < STATIC_TABLE.length; i++) {\n      if (STATIC_TABLE[i][0] === name && STATIC_TABLE[i][1] === value) {\n        return i;\n      }\n    }\n    return -1;\n  }\n  \n  /**\n   * 在静态表中查找名称匹配的条目\n   */\n  private findNameInStaticTable(name: string): number {\n    for (let i = 0; i < STATIC_TABLE.length; i++) {\n      if (STATIC_TABLE[i][0] === name) {\n        return i;\n      }\n    }\n    return -1;\n  }\n}\n\n/**\n * QPACK 解码器\n */\nexport class QPACKDecoder {\n  private dynamicTable: Array<[string, string]> = [];\n  private maxTableCapacity: number;\n  \n  constructor(maxTableCapacity = 4096) {\n    this.maxTableCapacity = maxTableCapacity;\n  }\n  \n  /**\n   * 解码 HTTP 头部\n   * @param encoded - 编码的字节数组\n   * @returns 解码后的头部数组 [[name, value], ...]\n   */\n  decode(encoded: Buffer): Array<[string, string]> {\n    const headers: Array<[string, string]> = [];\n    let offset = 0;\n    \n    try {\n      while (offset < encoded.length) {\n        const firstByte = encoded[offset];\n        \n        // 索引头部字段 (1xxxxxxx)\n        if ((firstByte & 0x80) === 0x80) {\n          const { value: index, bytesRead } = this.decodeInteger(encoded, offset, 0x80, 7);\n          offset += bytesRead;\n          \n          const entry = this.getTableEntry(index);\n          if (entry) {\n            headers.push(entry);\n          }\n        }\n        // 带名称引用的字面量 (01xxxxxx)\n        else if ((firstByte & 0xC0) === 0x40) {\n          const { value: nameIndex, bytesRead: indexBytes } = this.decodeInteger(encoded, offset, 0x40, 6);\n          offset += indexBytes;\n          \n          const { value: headerValue, bytesRead: valueBytes } = this.decodeString(encoded, offset);\n          offset += valueBytes;\n          \n          const nameEntry = this.getTableEntry(nameIndex);\n          if (nameEntry) {\n            headers.push([nameEntry[0], headerValue]);\n          }\n        }\n        // 带字面量名称的字面量 (001xxxxx)\n        else if ((firstByte & 0xE0) === 0x20) {\n          offset++; // 跳过前缀字节\n          \n          const { value: name, bytesRead: nameBytes } = this.decodeString(encoded, offset);\n          offset += nameBytes;\n          \n          const { value: value, bytesRead: valueBytes } = this.decodeString(encoded, offset);\n          offset += valueBytes;\n          \n          headers.push([name, value]);\n        }\n        // 其他类型（简化实现，跳过）\n        else {\n          logger.warn('Unknown QPACK field type', {}, { firstByte: firstByte.toString(16) });\n          offset++;\n        }\n      }\n    } catch (error) {\n      logger.error('QPACK decode error', {}, error);\n    }\n    \n    return headers;\n  }\n  \n  /**\n   * 解码整数\n   */\n  private decodeInteger(buffer: Buffer, offset: number, prefix: number, prefixBits: number): { value: number; bytesRead: number } {\n    const maxPrefix = (1 << prefixBits) - 1;\n    let value = buffer[offset] & maxPrefix;\n    let bytesRead = 1;\n    \n    if (value < maxPrefix) {\n      return { value, bytesRead };\n    }\n    \n    let m = 0;\n    let b: number;\n    \n    do {\n      b = buffer[offset + bytesRead];\n      bytesRead++;\n      value += (b & 0x7F) * Math.pow(2, m);\n      m += 7;\n    } while ((b & 0x80) === 0x80 && offset + bytesRead < buffer.length);\n    \n    return { value, bytesRead };\n  }\n  \n  /**\n   * 解码字符串\n   */\n  private decodeString(buffer: Buffer, offset: number): { value: string; bytesRead: number } {\n    const firstByte = buffer[offset];\n    const useHuffman = (firstByte & 0x80) === 0x80;\n    \n    const { value: length, bytesRead: lengthBytes } = this.decodeInteger(buffer, offset, 0x80, 7);\n    const totalBytesRead = lengthBytes + length;\n    \n    const stringBuffer = buffer.slice(offset + lengthBytes, offset + lengthBytes + length);\n    \n    const decodedBuffer = useHuffman ? huffmanDecode(stringBuffer) : stringBuffer;\n    const value = decodedBuffer.toString('utf8');\n    return { value, bytesRead: totalBytesRead };\n  }\n  \n  /**\n   * 从表中获取条目\n   */\n  private getTableEntry(index: number): [string, string] | null {\n    if (index < STATIC_TABLE.length) {\n      return STATIC_TABLE[index];\n    }\n    \n    const dynamicIndex = index - STATIC_TABLE.length;\n    if (dynamicIndex < this.dynamicTable.length) {\n      return this.dynamicTable[dynamicIndex];\n    }\n    \n    return null;\n  }\n}\n\n","/*\n * @Description: HTTP/3 Frame Parser (RFC 9114)\n * @Usage: HTTP/3 帧解析和序列化实现\n * @Author: richen\n * @Date: 2025-01-12 18:00:00\n * @LastEditTime: 2025-01-12 18:00:00\n */\n\nimport { createLogger } from '../../utils/logger';\n\nconst logger = createLogger({ module: 'http3-frames' });\n\n/**\n * HTTP/3 帧类型 (RFC 9114 Section 7.2)\n */\nexport enum Http3FrameType {\n  DATA = 0x00,           // 数据帧\n  HEADERS = 0x01,        // 头部帧\n  CANCEL_PUSH = 0x03,    // 取消推送帧\n  SETTINGS = 0x04,       // 设置帧\n  PUSH_PROMISE = 0x05,   // 推送承诺帧\n  GOAWAY = 0x07,         // GOAWAY 帧\n  MAX_PUSH_ID = 0x0D,    // 最大推送 ID 帧\n}\n\n/**\n * HTTP/3 设置参数 (RFC 9114 Section 7.2.4.1)\n */\nexport enum Http3Settings {\n  QPACK_MAX_TABLE_CAPACITY = 0x01,    // QPACK 最大表容量\n  MAX_FIELD_SECTION_SIZE = 0x06,      // 最大字段段大小\n  QPACK_BLOCKED_STREAMS = 0x07,       // QPACK 阻塞流\n}\n\n/**\n * HTTP/3 帧接口\n */\nexport interface Http3Frame {\n  type: Http3FrameType;\n  length: number;\n  payload: Buffer;\n}\n\n/**\n * HTTP/3 DATA 帧\n */\nexport interface Http3DataFrame extends Http3Frame {\n  type: Http3FrameType.DATA;\n  data: Buffer;\n}\n\n/**\n * HTTP/3 HEADERS 帧\n */\nexport interface Http3HeadersFrame extends Http3Frame {\n  type: Http3FrameType.HEADERS;\n  headers: Buffer; // QPACK 编码的头部\n}\n\n/**\n * HTTP/3 SETTINGS 帧\n */\nexport interface Http3SettingsFrame extends Http3Frame {\n  type: Http3FrameType.SETTINGS;\n  settings: Map<number, number>;\n}\n\n/**\n * HTTP/3 GOAWAY 帧\n */\nexport interface Http3GoAwayFrame extends Http3Frame {\n  type: Http3FrameType.GOAWAY;\n  streamId: bigint;\n}\n\n/**\n * HTTP/3 帧解析器\n */\nexport class Http3FrameParser {\n  \n  /**\n   * 解析 HTTP/3 帧\n   * @param buffer - 包含帧数据的缓冲区\n   * @returns 解析后的帧数组和剩余的缓冲区\n   */\n  static parse(buffer: Buffer): { frames: Http3Frame[]; remaining: Buffer } {\n    const frames: Http3Frame[] = [];\n    let offset = 0;\n    \n    try {\n      while (offset < buffer.length) {\n        // 解析帧类型（可变长度整数）\n        const typeResult = this.decodeVarint(buffer, offset);\n        if (!typeResult) break;\n        \n        const { value: frameType, bytesRead: typeBytesRead } = typeResult;\n        offset += typeBytesRead;\n        \n        // 解析帧长度（可变长度整数）\n        const lengthResult = this.decodeVarint(buffer, offset);\n        if (!lengthResult) break;\n        \n        const { value: frameLength, bytesRead: lengthBytesRead } = lengthResult;\n        offset += lengthBytesRead;\n        \n        // 检查是否有足够的数据\n        if (offset + frameLength > buffer.length) {\n          // 数据不完整，返回已解析的帧和剩余数据\n          offset -= (typeBytesRead + lengthBytesRead);\n          break;\n        }\n        \n        // 提取帧负载\n        const payload = buffer.slice(offset, offset + frameLength);\n        offset += frameLength;\n        \n        // 根据帧类型解析具体内容\n        const frame = this.parseFrame(frameType, frameLength, payload);\n        if (frame) {\n          frames.push(frame);\n        }\n      }\n    } catch (error) {\n      logger.error('HTTP/3 frame parse error', {}, error);\n    }\n    \n    const remaining = buffer.slice(offset);\n    return { frames, remaining };\n  }\n  \n  /**\n   * 解析具体的帧类型\n   */\n  private static parseFrame(type: number, length: number, payload: Buffer): Http3Frame | null {\n    switch (type) {\n      case Http3FrameType.DATA:\n        return this.parseDataFrame(length, payload);\n      \n      case Http3FrameType.HEADERS:\n        return this.parseHeadersFrame(length, payload);\n      \n      case Http3FrameType.SETTINGS:\n        return this.parseSettingsFrame(length, payload);\n      \n      case Http3FrameType.GOAWAY:\n        return this.parseGoAwayFrame(length, payload);\n      \n      default:\n        logger.debug('Unknown HTTP/3 frame type', {}, { type: type.toString(16) });\n        return {\n          type: type as Http3FrameType,\n          length,\n          payload\n        };\n    }\n  }\n  \n  /**\n   * 解析 DATA 帧\n   */\n  private static parseDataFrame(length: number, payload: Buffer): Http3DataFrame {\n    return {\n      type: Http3FrameType.DATA,\n      length,\n      payload,\n      data: payload\n    };\n  }\n  \n  /**\n   * 解析 HEADERS 帧\n   */\n  private static parseHeadersFrame(length: number, payload: Buffer): Http3HeadersFrame {\n    return {\n      type: Http3FrameType.HEADERS,\n      length,\n      payload,\n      headers: payload // QPACK 编码的头部，需要进一步解码\n    };\n  }\n  \n  /**\n   * 解析 SETTINGS 帧\n   */\n  private static parseSettingsFrame(length: number, payload: Buffer): Http3SettingsFrame {\n    const settings = new Map<number, number>();\n    let offset = 0;\n    \n    while (offset < payload.length) {\n      // 解析设置标识符\n      const idResult = this.decodeVarint(payload, offset);\n      if (!idResult) break;\n      \n      const { value: id, bytesRead: idBytesRead } = idResult;\n      offset += idBytesRead;\n      \n      // 解析设置值\n      const valueResult = this.decodeVarint(payload, offset);\n      if (!valueResult) break;\n      \n      const { value, bytesRead: valueBytesRead } = valueResult;\n      offset += valueBytesRead;\n      \n      settings.set(id, value);\n    }\n    \n    return {\n      type: Http3FrameType.SETTINGS,\n      length,\n      payload,\n      settings\n    };\n  }\n  \n  /**\n   * 解析 GOAWAY 帧\n   */\n  private static parseGoAwayFrame(length: number, payload: Buffer): Http3GoAwayFrame {\n    const streamIdResult = this.decodeVarint(payload, 0);\n    const streamId = streamIdResult ? BigInt(streamIdResult.value) : BigInt(0);\n    \n    return {\n      type: Http3FrameType.GOAWAY,\n      length,\n      payload,\n      streamId\n    };\n  }\n  \n  /**\n   * 解码可变长度整数 (RFC 9000 Section 16)\n   */\n  private static decodeVarint(buffer: Buffer, offset: number): { value: number; bytesRead: number } | null {\n    if (offset >= buffer.length) return null;\n    \n    const firstByte = buffer[offset];\n    const prefix = firstByte >> 6; // 前两位表示长度\n    \n    let value: number;\n    let bytesRead: number;\n    \n    switch (prefix) {\n      case 0: // 1 字节\n        value = firstByte & 0x3F;\n        bytesRead = 1;\n        break;\n      \n      case 1: // 2 字节\n        if (offset + 2 > buffer.length) return null;\n        value = ((firstByte & 0x3F) << 8) | buffer[offset + 1];\n        bytesRead = 2;\n        break;\n      \n      case 2: // 4 字节\n        if (offset + 4 > buffer.length) return null;\n        value = ((firstByte & 0x3F) << 24) |\n                (buffer[offset + 1] << 16) |\n                (buffer[offset + 2] << 8) |\n                buffer[offset + 3];\n        bytesRead = 4;\n        break;\n      \n      case 3: // 8 字节\n        if (offset + 8 > buffer.length) return null;\n        // JavaScript 的 number 最大安全整数是 2^53-1，对于大整数可能需要使用 BigInt\n        value = ((firstByte & 0x3F) << 56) |\n                (buffer[offset + 1] << 48) |\n                (buffer[offset + 2] << 40) |\n                (buffer[offset + 3] << 32) |\n                (buffer[offset + 4] << 24) |\n                (buffer[offset + 5] << 16) |\n                (buffer[offset + 6] << 8) |\n                buffer[offset + 7];\n        bytesRead = 8;\n        break;\n      \n      default:\n        return null;\n    }\n    \n    return { value, bytesRead };\n  }\n}\n\n/**\n * HTTP/3 帧序列化器\n */\nexport class Http3FrameSerializer {\n  \n  /**\n   * 序列化 DATA 帧\n   */\n  static serializeDataFrame(data: Buffer): Buffer {\n    const type = this.encodeVarint(Http3FrameType.DATA);\n    const length = this.encodeVarint(data.length);\n    \n    return Buffer.concat([type, length, data]);\n  }\n  \n  /**\n   * 序列化 HEADERS 帧\n   */\n  static serializeHeadersFrame(headers: Buffer): Buffer {\n    const type = this.encodeVarint(Http3FrameType.HEADERS);\n    const length = this.encodeVarint(headers.length);\n    \n    return Buffer.concat([type, length, headers]);\n  }\n  \n  /**\n   * 序列化 SETTINGS 帧\n   */\n  static serializeSettingsFrame(settings: Map<number, number>): Buffer {\n    const settingsBuffers: Buffer[] = [];\n    \n    for (const [id, value] of settings.entries()) {\n      settingsBuffers.push(this.encodeVarint(id));\n      settingsBuffers.push(this.encodeVarint(value));\n    }\n    \n    const payload = Buffer.concat(settingsBuffers);\n    const type = this.encodeVarint(Http3FrameType.SETTINGS);\n    const length = this.encodeVarint(payload.length);\n    \n    return Buffer.concat([type, length, payload]);\n  }\n  \n  /**\n   * 序列化 GOAWAY 帧\n   */\n  static serializeGoAwayFrame(streamId: bigint): Buffer {\n    const type = this.encodeVarint(Http3FrameType.GOAWAY);\n    const streamIdBuffer = this.encodeVarint(Number(streamId));\n    const length = this.encodeVarint(streamIdBuffer.length);\n    \n    return Buffer.concat([type, length, streamIdBuffer]);\n  }\n  \n  /**\n   * 编码可变长度整数 (RFC 9000 Section 16)\n   */\n  static encodeVarint(value: number): Buffer {\n    if (value < 0) {\n      throw new Error('Varint must be non-negative');\n    }\n    \n    // 1 字节 (0-63)\n    if (value < 64) {\n      return Buffer.from([value]);\n    }\n    \n    // 2 字节 (64-16383)\n    if (value < 16384) {\n      return Buffer.from([\n        0x40 | (value >> 8),\n        value & 0xFF\n      ]);\n    }\n    \n    // 4 字节 (16384-1073741823)\n    if (value < 1073741824) {\n      return Buffer.from([\n        0x80 | (value >> 24),\n        (value >> 16) & 0xFF,\n        (value >> 8) & 0xFF,\n        value & 0xFF\n      ]);\n    }\n    \n    // 8 字节\n    return Buffer.from([\n      0xC0 | (value >> 56),\n      (value >> 48) & 0xFF,\n      (value >> 40) & 0xFF,\n      (value >> 32) & 0xFF,\n      (value >> 24) & 0xFF,\n      (value >> 16) & 0xFF,\n      (value >> 8) & 0xFF,\n      value & 0xFF\n    ]);\n  }\n}\n\n/**\n * HTTP/3 请求/响应处理器\n */\nexport class Http3MessageHandler {\n  \n  /**\n   * 从帧中提取 HTTP 请求\n   */\n  static extractRequest(frames: Http3Frame[], qpackDecoder: any): {\n    method: string;\n    url: string;\n    headers: Record<string, string>;\n    body: Buffer;\n  } | null {\n    let headersFrame: Http3HeadersFrame | null = null;\n    const dataFrames: Http3DataFrame[] = [];\n    \n    // 分离 HEADERS 和 DATA 帧\n    for (const frame of frames) {\n      if (frame.type === Http3FrameType.HEADERS && !headersFrame) {\n        headersFrame = frame as Http3HeadersFrame;\n      } else if (frame.type === Http3FrameType.DATA) {\n        dataFrames.push(frame as Http3DataFrame);\n      }\n    }\n    \n    if (!headersFrame) {\n      return null;\n    }\n    \n    // 解码 QPACK 头部\n    const decodedHeaders = qpackDecoder.decode(headersFrame.headers);\n    \n    // 提取伪头部和普通头部\n    let method = 'GET';\n    let url = '/';\n    const headers: Record<string, string> = {};\n    \n    for (const [name, value] of decodedHeaders) {\n      if (name === ':method') {\n        method = value;\n      } else if (name === ':path') {\n        url = value;\n      } else if (name === ':scheme' || name === ':authority') {\n        // 这些伪头部可以用于构建完整的 URL，但这里简化处理\n      } else if (!name.startsWith(':')) {\n        headers[name] = value;\n      }\n    }\n    \n    // 合并所有 DATA 帧的数据\n    const body = Buffer.concat(dataFrames.map(f => f.data));\n    \n    return { method, url, headers, body };\n  }\n  \n  /**\n   * 创建 HTTP 响应帧\n   */\n  static createResponse(\n    statusCode: number,\n    headers: Record<string, string | string[]>,\n    body: Buffer,\n    qpackEncoder: any\n  ): Buffer[] {\n    const frames: Buffer[] = [];\n    \n    // 1. 创建 HEADERS 帧\n    const responseHeaders: Array<[string, string]> = [\n      [':status', statusCode.toString()]\n    ];\n    \n    for (const [name, value] of Object.entries(headers)) {\n      if (Array.isArray(value)) {\n        for (const v of value) {\n          responseHeaders.push([name.toLowerCase(), v]);\n        }\n      } else {\n        responseHeaders.push([name.toLowerCase(), value]);\n      }\n    }\n    \n    const encodedHeaders = qpackEncoder.encode(responseHeaders);\n    frames.push(Http3FrameSerializer.serializeHeadersFrame(encodedHeaders));\n    \n    // 2. 创建 DATA 帧（如果有 body）\n    if (body.length > 0) {\n      frames.push(Http3FrameSerializer.serializeDataFrame(body));\n    }\n    \n    return frames;\n  }\n}\n\n","/*\n * @Description: HTTP/3 adapter using @matrixai/quic\n * @Usage: HTTP/3 协议适配器（基于 @matrixai/quic QUIC 传输层）\n * @Author: richen\n * @Date: 2025-01-12 17:30:00\n * @LastEditTime: 2025-01-12 17:30:00\n */\n\nimport { EventEmitter } from 'events';\nimport { createLogger } from '../utils/logger';\nimport { readFileSync } from 'fs';\nimport { QPACKEncoder, QPACKDecoder } from '../utils/http3/qpack'; \nimport { Http3FrameParser, Http3MessageHandler } from '../utils/http3/frames';\n\n// @matrixai/quic 是纯 ESM 模块，需要使用动态 import() 加载\n// 作为可选依赖，如果未安装则返回 null\nlet matrixaiQuic: any = null;\nlet QUICServer: any = null;\nlet moduleLoadPromise: Promise<boolean> | null = null;\nlet moduleLoaded = false;\nconst logger = createLogger({ module: 'http3-matrixai-adapter' });\n\n/**\n * 异步加载 @matrixai/quic 模块\n * @returns Promise<boolean> 是否加载成功\n */\nasync function loadMatrixaiQuic(): Promise<boolean> {\n  if (moduleLoaded) return QUICServer !== null;\n  if (moduleLoadPromise) return moduleLoadPromise;\n  \n  moduleLoadPromise = (async () => {\n    try {\n      // 使用动态 import() 加载 ESM 模块\n      matrixaiQuic = await import('@matrixai/quic');\n      QUICServer = matrixaiQuic.QUICServer;\n      moduleLoaded = true;\n      logger.debug('@matrixai/quic loaded successfully, HTTP/3 functionality is available');\n      return true;\n    } catch { \n      // @matrixai/quic 未安装或加载失败，HTTP/3 功能将不可用\n      // 这是预期的行为，因为它是可选依赖\n      moduleLoaded = true;\n      logger.warn('@matrixai/quic is not installed or failed to load, HTTP/3 functionality will be disabled');\n      return false;\n    }\n  })();\n  \n  return moduleLoadPromise;\n}\n\n// 立即尝试加载模块（后台加载）\nloadMatrixaiQuic();\n\n/**\n * 同步检查 @matrixai/quic 是否已加载完成且可用\n * 注意：这只在模块加载完成后才准确，建议在使用前先等待 loadMatrixaiQuic()\n * @returns boolean - 如果模块已加载且可用返回 true\n */\nexport function isMatrixaiQuicReady(): boolean {\n  return moduleLoaded && QUICServer !== null;\n}\n\n/**\n * 获取模块加载 Promise，用于等待模块加载完成\n */\nexport function waitForMatrixaiQuic(): Promise<boolean> {\n  return loadMatrixaiQuic();\n}\n\n/**\n * HTTP/3 服务器配置\n */\nexport interface Http3ServerConfig {\n  // TLS 配置\n  certFile: string;\n  keyFile: string;\n  caFile?: string;\n  \n  // 服务器配置\n  hostname: string;\n  port: number;\n  \n  // QUIC 传输参数\n  maxIdleTimeout?: number;\n  maxUdpPayloadSize?: number;\n  initialMaxData?: number;\n  initialMaxStreamDataBidiLocal?: number;\n  initialMaxStreamDataBidiRemote?: number;\n  initialMaxStreamDataUni?: number;\n  initialMaxStreamsBidi?: number;\n  initialMaxStreamsUni?: number;\n  \n  // HTTP/3 设置\n  maxHeaderListSize?: number;\n  qpackMaxTableCapacity?: number;\n  qpackBlockedStreams?: number;\n}\n\n/**\n * HTTP/3 服务器适配器（基于 @matrixai/quic）\n * \n * 注意：@matrixai/quic 提供 QUIC 传输层，我们在此基础上实现 HTTP/3 应用层协议\n */\nexport class Http3ServerAdapter extends EventEmitter {\n  private quicServer: any = null;\n  private listening = false;\n  private connections: Map<string, any> = new Map();\n  private qpackEncoder: QPACKEncoder;\n  private qpackDecoder: QPACKDecoder;\n  \n  constructor(private readonly config: Http3ServerConfig) {\n    super();\n    \n    // 初始化 QPACK 编码器和解码器\n    const maxTableCapacity = config.qpackMaxTableCapacity || 4096;\n    this.qpackEncoder = new QPACKEncoder(maxTableCapacity);\n    this.qpackDecoder = new QPACKDecoder(maxTableCapacity);\n    \n    logger.debug('Initializing HTTP/3 server adapter', {}, {\n      library: '@matrixai/quic',\n      hostname: config.hostname,\n      port: config.port,\n      qpackMaxTableCapacity: maxTableCapacity,\n      note: 'Using MatrixAI QUIC transport with full HTTP/3 frame parsing and QPACK compression'\n    });\n  }\n  \n  /**\n   * 检查 @matrixai/quic 是否可用\n   * @returns Promise<boolean>\n   */\n  static async isAvailable(): Promise<boolean> {\n    return loadMatrixaiQuic();\n  }\n  \n  /**\n   * 启动服务器\n   */\n  async listen(callback?: () => void): Promise<void> {\n    // 等待 @matrixai/quic 模块加载完成\n    const isAvailable = await loadMatrixaiQuic();\n    if (!isAvailable || !QUICServer) {\n      throw new Error(\n        '@matrixai/quic is not installed or failed to load. ' +\n        'HTTP/3 functionality requires @matrixai/quic library. ' +\n        'Install it with: pnpm add @matrixai/quic'\n      );\n    }\n    \n    try {\n      // 准备 TLS 配置\n      const cert = this.loadCertificate(this.config.certFile, 'certificate');\n      const key = this.loadCertificate(this.config.keyFile, 'private key');\n      const ca = this.config.caFile ? this.loadCertificate(this.config.caFile, 'CA certificate') : undefined;\n      \n      // 创建加密密钥（用于 address token 签名）\n      const cryptoKeyBuffer = Buffer.alloc(32);\n      // 在生产环境中应该使用安全的随机密钥\n      crypto.getRandomValues(cryptoKeyBuffer);\n      const cryptoKey: ArrayBuffer = cryptoKeyBuffer.buffer.slice(cryptoKeyBuffer.byteOffset, cryptoKeyBuffer.byteOffset + cryptoKeyBuffer.byteLength) as ArrayBuffer;\n      \n      // 创建服务器加密对象\n      const serverCrypto = {\n        key: cryptoKey,\n        ops: {\n          sign: async (key: ArrayBuffer, data: ArrayBuffer): Promise<ArrayBuffer> => {\n            // 使用 HMAC 签名\n            const crypto = await import('crypto');\n            const hmac = crypto.createHmac('sha256', Buffer.from(key));\n            hmac.update(Buffer.from(data));\n            const digest = hmac.digest();\n            return digest.buffer.slice(digest.byteOffset, digest.byteOffset + digest.byteLength) as ArrayBuffer;\n          },\n          verify: async (key: ArrayBuffer, data: ArrayBuffer, sig: ArrayBuffer): Promise<boolean> => {\n            // 验证 HMAC 签名\n            const crypto = await import('crypto');\n            const hmac = crypto.createHmac('sha256', Buffer.from(key));\n            hmac.update(Buffer.from(data));\n            const expected = hmac.digest();\n            return Buffer.from(sig).equals(expected);\n          }\n        }\n      };\n      \n      // 创建 QUIC 服务器\n      this.quicServer = new QUICServer({\n        crypto: serverCrypto as any,\n        config: {\n          key: key.toString('utf8'),\n          cert: cert.toString('utf8'),\n          ca: ca ? ca.toString('utf8') : undefined,\n          verifyPeer: false, // HTTP/3 服务器通常不验证客户端证书\n          maxIdleTimeout: this.config.maxIdleTimeout || 30000,\n          maxConcurrentBidiStreams: this.config.initialMaxStreamsBidi || 100,\n          maxConcurrentUniStreams: this.config.initialMaxStreamsUni || 100,\n        } as any,\n        logger: logger as any,\n      });\n      \n      // 设置连接处理器\n      this.setupConnectionHandlers();\n      \n      // 启动服务器\n      await this.quicServer.start({\n        host: this.config.hostname,\n        port: this.config.port\n      });\n      \n      this.listening = true;\n      \n      logger.debug('HTTP/3 server listening', {}, {\n        hostname: this.config.hostname,\n        port: this.config.port,\n        protocol: 'HTTP/3 over QUIC',\n        implementation: '@matrixai/quic'\n      });\n      \n      this.emit('listening');\n      \n      if (callback) {\n        callback();\n      }\n      \n    } catch (error) {\n      logger.error('Failed to start HTTP/3 server', {}, error);\n      throw error;\n    }\n  }\n  \n  /**\n   * 设置连接处理器\n   */\n  private setupConnectionHandlers(): void {\n    if (!this.quicServer) return;\n    \n    // 监听新连接\n    this.quicServer.addEventListener('connection', (event: any) => {\n      const connection = event.detail;\n      const connId = connection.connectionId.toString();\n      \n      logger.debug('New QUIC connection', {}, { connectionId: connId });\n      \n      this.connections.set(connId, connection);\n      this.emit('session', connection);\n      \n      // 监听连接上的流\n      connection.addEventListener('stream', (streamEvent: any) => {\n        const stream = streamEvent.detail;\n        this.handleStream(connection, stream);\n      });\n      \n      // 监听连接关闭\n      connection.addEventListener('closed', () => {\n        logger.debug('QUIC connection closed', {}, { connectionId: connId });\n        this.connections.delete(connId);\n      });\n    });\n    \n    // 监听服务器错误\n    this.quicServer.addEventListener('error', (event: any) => {\n      const error = event.detail;\n      logger.error('QUIC server error', {}, error);\n      this.emit('error', error);\n    });\n  }\n  \n  /**\n   * 处理 QUIC 流（HTTP/3 请求）\n   */\n  private async handleStream(connection: any, stream: any): Promise<void> {\n    try {\n      logger.debug('New QUIC stream', {}, {\n        streamId: stream.streamId.toString(),\n        readable: stream.readable,\n        writable: stream.writable\n      });\n      \n      // 读取流数据（HTTP/3 帧）\n      const chunks: Buffer[] = [];\n      const reader = stream.readable.getReader();\n      \n      try {\n        while (true) {\n          const { done, value } = await reader.read();\n          if (done) break;\n          if (value) {\n            chunks.push(Buffer.from(value));\n          }\n        }\n      } finally {\n        reader.releaseLock();\n      }\n      \n      const requestData = Buffer.concat(chunks);\n      \n      // 使用完整的 HTTP/3 帧解析\n      const { frames } = Http3FrameParser.parse(requestData);\n      \n      if (frames.length === 0) {\n        logger.warn('No HTTP/3 frames parsed from stream');\n        return;\n      }\n      \n      // 提取 HTTP 请求\n      const extractedRequest = Http3MessageHandler.extractRequest(frames, this.qpackDecoder);\n      \n      if (!extractedRequest) {\n        logger.warn('Failed to extract HTTP request from frames');\n        return;\n      }\n      \n      // 创建标准的 HTTP 请求/响应对象\n      const request = this.createHttpRequest(extractedRequest, stream);\n      const response = this.createHttp3Response(stream, extractedRequest);\n      \n      // 触发请求事件\n      this.emit('request', request, response);\n      \n    } catch (error) {\n      logger.error('Error handling QUIC stream', {}, error);\n      \n      // 发送错误响应\n      try {\n        await this.sendErrorResponse(stream, 500, 'Internal Server Error');\n      } catch {\n        // 忽略响应发送失败\n      }\n    }\n  }\n  \n  /**\n   * 创建标准 HTTP 请求对象\n   */\n  private createHttpRequest(extractedRequest: any, stream: any): any {\n    const req: any = {\n      method: extractedRequest.method,\n      url: extractedRequest.url,\n      headers: extractedRequest.headers,\n      httpVersion: '3.0',\n      httpVersionMajor: 3,\n      httpVersionMinor: 0,\n      body: extractedRequest.body,\n      rawBody: extractedRequest.body,\n      stream,\n      \n      // 兼容 Node.js IncomingMessage\n      connection: null,\n      socket: null,\n      complete: true,\n      readable: false,\n    };\n    \n    return req;\n  }\n  \n  /**\n   * 创建 HTTP/3 响应对象（使用完整的帧序列化和 QPACK）\n   */\n  private createHttp3Response(stream: any, _request: any): any {\n    // 保存 this 引用以便在回调中使用\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    const self = this;\n    const response: any = {\n      statusCode: 200,\n      statusMessage: 'OK',\n      headers: {},\n      headersSent: false,\n      finished: false,\n      _dataChunks: [] as Buffer[],\n      \n      setHeader: (name: string, value: string | string[]) => {\n        if (response.headersSent) {\n          throw new Error('Cannot set headers after they are sent');\n        }\n        response.headers[name.toLowerCase()] = value;\n      },\n      \n      getHeader: (name: string) => {\n        return response.headers[name.toLowerCase()];\n      },\n      \n      getHeaders: () => {\n        return { ...response.headers };\n      },\n      \n      writeHead: (statusCode: number, statusMessage?: any, headers?: any) => {\n        if (response.headersSent) {\n          return response;\n        }\n        \n        if (typeof statusMessage === 'object') {\n          headers = statusMessage;\n          statusMessage = undefined;\n        }\n        \n        response.statusCode = statusCode;\n        if (statusMessage) response.statusMessage = statusMessage;\n        if (headers) {\n          Object.assign(response.headers, headers);\n        }\n        \n        response.headersSent = true;\n        return response;\n      },\n      \n      write: (chunk: any, encoding?: any, callback?: any) => {\n        if (typeof encoding === 'function') {\n          callback = encoding;\n          encoding = 'utf8';\n        }\n        \n        const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, encoding);\n        response._dataChunks.push(buffer);\n        \n        if (callback) {\n          process.nextTick(callback);\n        }\n        return true;\n      },\n      \n      end: async (chunk?: any, encoding?: any, callback?: any) => {\n        if (typeof chunk === 'function') {\n          callback = chunk;\n          chunk = null;\n          encoding = null;\n        } else if (typeof encoding === 'function') {\n          callback = encoding;\n          encoding = null;\n        }\n        \n        if (response.finished) {\n          if (callback) callback();\n          return response;\n        }\n        \n        // 添加最后的数据块\n        if (chunk) {\n          const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, encoding || 'utf8');\n          response._dataChunks.push(buffer);\n        }\n        \n        // 合并所有数据块\n        const body = Buffer.concat(response._dataChunks);\n        \n        try {\n          // 使用 HTTP/3 帧序列化和 QPACK 编码发送响应\n          await self.sendHttp3Response(stream, response.statusCode, response.headers, body);\n          response.finished = true;\n        } catch (error) {\n          logger.error('Failed to send HTTP/3 response', {}, error);\n        }\n        \n        if (callback) callback();\n        return response;\n      }\n    };\n    \n    return response;\n  }\n  \n  /**\n   * 发送完整的 HTTP/3 响应（使用帧序列化和 QPACK）\n   */\n  private async sendHttp3Response(\n    stream: any,\n    statusCode: number,\n    headers: Record<string, string | string[]>,\n    body: Buffer\n  ): Promise<void> {\n    try {\n      // 使用 HTTP/3 消息处理器创建响应帧\n      const frameBuffers = Http3MessageHandler.createResponse(\n        statusCode,\n        headers,\n        body,\n        this.qpackEncoder\n      );\n      \n      // 写入所有帧到 QUIC 流\n      const writer = stream.writable.getWriter();\n      try {\n        for (const frameBuffer of frameBuffers) {\n          await writer.write(new Uint8Array(frameBuffer));\n        }\n        await writer.close();\n        \n        logger.debug('HTTP/3 response sent', {}, {\n          statusCode,\n          bodyLength: body.length,\n          framesCount: frameBuffers.length\n        });\n      } finally {\n        writer.releaseLock();\n      }\n    } catch (error) {\n      logger.error('Failed to send HTTP/3 response', {}, error);\n      throw error;\n    }\n  }\n  \n  /**\n   * 发送错误响应\n   */\n  private async sendErrorResponse(stream: any, statusCode: number, message: string): Promise<void> {\n    const body = Buffer.from(message, 'utf8');\n    const headers = {\n      'content-type': 'text/plain',\n      'content-length': body.length.toString()\n    };\n    \n    await this.sendHttp3Response(stream, statusCode, headers, body);\n  }\n  \n  /**\n   * 关闭服务器\n   */\n  async close(callback?: (err?: Error) => void): Promise<void> {\n    if (!this.listening || !this.quicServer) {\n      if (callback) callback();\n      return;\n    }\n    \n    try {\n      // 关闭所有连接\n      for (const connection of this.connections.values()) {\n        try {\n          await connection.stop();\n        } catch (error) {\n          logger.warn('Error closing connection', {}, error);\n        }\n      }\n      this.connections.clear();\n      \n      // 停止服务器\n      await this.quicServer.stop();\n      \n      this.listening = false;\n      this.quicServer = null;\n      \n      logger.info('HTTP/3 server closed');\n      \n      if (callback) {\n        callback();\n      }\n      \n    } catch (error) {\n      logger.error('Error closing HTTP/3 server', {}, error);\n      if (callback) {\n        callback(error as Error);\n      }\n    }\n  }\n  \n  /**\n   * 获取服务器地址\n   */\n  address() {\n    return {\n      address: this.config.hostname,\n      port: this.config.port,\n      family: 'IPv4'\n    };\n  }\n  \n  /**\n   * 检查服务器是否正在监听\n   */\n  isListening(): boolean {\n    return this.listening;\n  }\n  \n  /**\n   * 加载证书文件\n   */\n  private loadCertificate(path: string, type: string): Buffer {\n    try {\n      // 如果是证书内容\n      if (path.includes('-----BEGIN')) {\n        return Buffer.from(path, 'utf8');\n      }\n      \n      // 否则是文件路径\n      return readFileSync(path);\n      \n    } catch (error) {\n      logger.error(`Failed to load ${type}`, {}, { path, error });\n      throw new Error(`Failed to load ${type}: ${(error as Error).message}`);\n    }\n  }\n}\n\n/**\n * 获取 HTTP/3 支持信息（同步版本，用于日志显示）\n * 注意：如果模块尚未加载完成，返回默认值\n */\nexport function getHttp3Version(): string {\n  if (moduleLoaded && matrixaiQuic) {\n    // 尝试从已加载的模块获取版本信息\n    try {\n      const version = matrixaiQuic.version || matrixaiQuic.VERSION || 'unknown';\n      return `MatrixAI QUIC ${version}`;\n    } catch {\n      return '@matrixai/quic';\n    }\n  }\n  // 模块未加载完成或不可用\n  return moduleLoaded ? '@matrixai/quic (not installed)' : '@matrixai/quic (loading...)';\n}\n\n/**\n * 检查是否支持 HTTP/3（同步版本）\n * 注意：如果模块尚未加载完成，返回 false\n */\nexport function hasNativeHttp3Support(): boolean {\n  return moduleLoaded && QUICServer !== null;\n}\n\n/**\n * 异步检查是否支持 HTTP/3（等待模块加载完成）\n */\nexport async function hasNativeHttp3SupportAsync(): Promise<boolean> {\n  return loadMatrixaiQuic();\n}\n\n","/*\n * @Description: HTTP/3 Server implementation using template method pattern\n * @Usage: HTTP/3协议服务器实现（基于QUIC）\n * @Author: richen\n * @Date: 2025-01-12 10:30:00\n * @LastEditTime: 2025-01-12 10:30:00\n */\n\n/**\n * HTTP/3 服务器实现说明：\n * \n * HTTP/3 基于 QUIC 协议（RFC 9114），运行在 UDP 之上。\n * \n * 关键特性：\n * 1. 必须使用 TLS 1.3 加密\n * 2. 多路复用无队头阻塞\n * 3. 连接迁移支持\n * 4. 0-RTT 连接建立\n * \n * Node.js 原生尚未完全支持 HTTP/3，需要使用第三方库。\n * 本实现提供了完整的架构框架，具体的 QUIC 库集成说明：\n * \n * 集成步骤：\n * 1. 选择并安装 QUIC/HTTP3 库，例如：\n *    npm install @napi-rs/quic  (推荐，基于Rust)\n *    或 npm install quiche-native\n * \n * 2. 在 createProtocolServer() 方法中初始化 QUIC 服务器\n * 3. 实现请求处理逻辑，适配 Koatty 的 callback 接口\n * 4. 设置会话和流的事件监听\n * \n * 参考文档：\n * - RFC 9114: https://datatracker.ietf.org/doc/html/rfc9114\n * - QUIC Protocol: https://datatracker.ietf.org/doc/html/rfc9000\n */\n\nimport { KoattyApplication, NativeServer } from \"koatty_core\";\nimport { BaseServer, ConfigChangeAnalysis } from \"./base\";\nimport { generateTraceId } from \"../utils/logger\";\nimport { CreateTerminus } from \"../utils/terminus\";\nimport { loadCertificate, isCertificateContent } from \"../utils/cert-loader\";\nimport { Http3ConnectionPoolManager, Http3Session } from \"../pools/http3\";\nimport { ConfigHelper, Http3ServerOptions, ListeningOptions, SSL3Config } from \"../config/config\";\nimport { Http3ServerAdapter, Http3ServerConfig, getHttp3Version } from \"../adapters/http3-matrixai\";\n\n/**\n * HTTP/3 Server implementation using template method pattern\n * 继承BaseServer，只实现HTTP/3特定的逻辑\n */\nexport class Http3Server extends BaseServer<Http3ServerOptions, any> {\n  protected connectionPool!: Http3ConnectionPoolManager;\n\n  constructor(app: KoattyApplication, options: Http3ServerOptions) {\n    super(app, options);\n    this.options = ConfigHelper.createHttp3Config(options);\n    this.initializeServer();\n    CreateTerminus(app, this);\n  }\n\n  /**\n   * 初始化HTTP/3连接池\n   */\n  protected initializeConnectionPool(): void {\n    this.connectionPool = new Http3ConnectionPoolManager(this.options.connectionPool);\n    \n    this.logger.info('HTTP/3 connection pool initialized', {}, {\n      maxConnections: this.options.connectionPool.maxConnections,\n      maxIdleTimeout: this.options.connectionPool.protocolSpecific?.maxIdleTimeout\n    });\n  }\n\n  /**\n   * 创建HTTP/3服务器实例（使用 @matrixai/quic）\n   * 注意：@matrixai/quic 是 ESM 模块，需要异步加载\n   * 实际的可用性检查将在 Http3ServerAdapter.listen() 中进行\n   */\n  protected createProtocolServer(): void {\n    this.logger.warn(\n      'HTTP/3 server is experimental. QPACK Huffman decoding is not implemented, ' +\n      'which may cause header parsing failures with some clients. ' +\n      'Use HTTP/2 for production deployments.'\n    );\n    this.logger.info('Initializing HTTP/3 server', {}, { \n      library: '@matrixai/quic',\n      note: 'Module availability will be checked when server starts'\n    });\n    \n    try {\n      const http3Config: Http3ServerConfig = {\n        hostname: this.options.hostname,\n        port: this.options.port,\n        certFile: this.resolveFilePath(this.options.ssl?.cert || ''),\n        keyFile: this.resolveFilePath(this.options.ssl?.key || ''),\n        caFile: this.options.ssl?.ca ? this.resolveFilePath(this.options.ssl.ca) : undefined,\n        maxIdleTimeout: this.options.quic?.maxIdleTimeout,\n        maxUdpPayloadSize: this.options.quic?.maxUdpPayloadSize,\n        initialMaxData: this.options.quic?.initialMaxData,\n        initialMaxStreamDataBidiLocal: this.options.quic?.initialMaxStreamDataBidiLocal,\n        initialMaxStreamDataBidiRemote: this.options.quic?.initialMaxStreamDataBidiRemote,\n        initialMaxStreamDataUni: this.options.quic?.initialMaxStreamDataUni,\n        initialMaxStreamsBidi: this.options.quic?.initialMaxStreamsBidi,\n        initialMaxStreamsUni: this.options.quic?.initialMaxStreamsUni,\n        maxHeaderListSize: this.options.http3?.maxHeaderListSize,\n        qpackMaxTableCapacity: this.options.http3?.qpackMaxTableCapacity,\n        qpackBlockedStreams: this.options.http3?.qpackBlockedStreams,\n      };\n      \n      this.server = new Http3ServerAdapter(http3Config);\n      \n      // 设置请求处理器\n      this.setupHttp3Handlers();\n      \n      this.logger.info('HTTP/3 server instance created successfully', {}, {\n        implementation: '@matrixai/quic'\n      });\n      \n    } catch (error) {\n      this.logger.error('Failed to create HTTP/3 server', {}, error);\n      throw error;\n    }\n  }\n\n  /**\n   * 设置 HTTP/3 服务器的事件处理器\n   */\n  private setupHttp3Handlers(): void {\n    const server = this.server;\n    \n    // 处理 HTTP/3 请求\n    server.on('request', (req: any, res: any) => {\n      try {\n        // 直接将请求传递给 Koatty 应用处理器\n        // @yoursunny/http3 已经提供了兼容的 req/res 对象\n        this.app.callback()(req, res);\n        \n      } catch (error) {\n        this.logger.error('Error handling HTTP/3 request', {}, error);\n        \n        // 发送错误响应\n        try {\n          res.writeHead(500, { 'content-type': 'text/plain' });\n          res.end('Internal Server Error');\n        } catch {\n          // 忽略响应发送失败\n          this.logger.error('Error sending HTTP/3 response', {}, error);\n        }\n      }\n    });\n    \n    // 处理会话\n    server.on('session', (session: any) => {\n      this.logger.debug('New HTTP/3 session', {}, {\n        remoteAddress: session.remoteAddress,\n        remotePort: session.remotePort\n      });\n      \n      // 添加到连接池\n      this.connectionPool.addHttp3Session(session).catch((error: Error) => {\n        this.logger.error('Failed to add HTTP/3 session to pool', {}, error);\n        try {\n          session.close(1, 'Internal error');\n        } catch {\n          // Session close error handled silently\n          this.logger.error('Error closing HTTP/3 session', {}, error);\n        }\n      });\n    });\n    \n    // 处理错误\n    server.on('error', (error: Error) => {\n      this.logger.error('HTTP/3 server error', {}, error);\n    });\n    \n    // 处理监听事件\n    server.on('listening', () => {\n      this.logger.info('HTTP/3 server listening event fired');\n    });\n  }\n\n  /**\n   * 解析文件路径\n   * HTTP/3 adapter 需要文件路径,如果是证书内容则需要写入临时文件\n   */\n  private resolveFilePath(path: string): string {\n    if (!path) {\n      throw new Error('Certificate file path is required');\n    }\n    \n    // 使用统一的证书内容检测\n    if (isCertificateContent(path)) {\n      // 这是证书内容,直接返回(adapter会处理)\n      return path;\n    }\n    \n    // 否则是文件路径\n    return path;\n  }\n\n  /**\n   * 配置HTTP/3服务器选项\n   */\n  protected configureServerOptions(): void {\n    this.setupSessionHandling();\n    this.setupStreamHandling();\n  }\n\n  /**\n   * HTTP/3特定的额外初始化\n   */\n  protected performProtocolSpecificInitialization(): void {\n    this.logger.info('HTTP/3 server initialization completed', {}, {\n      hostname: this.options.hostname,\n      port: this.options.port,\n      protocol: this.options.protocol,\n      serverId: this.serverId,\n      sslMode: this.options.ssl?.mode || 'auto',\n      alpnProtocols: this.options.ssl?.alpnProtocols || ['h3'],\n      maxIdleTimeout: this.options.quic?.maxIdleTimeout || 30000,\n      maxConnections: this.options.connectionPool?.maxConnections\n    });\n  }\n\n  /**\n   * 创建SSL选项\n   */\n  private createSSLOptions(sslConfig: SSL3Config, extConfig: any): any {\n    switch (sslConfig.mode) {\n      case 'manual':\n        return this.createManualSSLOptions(sslConfig, extConfig);\n      case 'mutual_tls':\n        return this.createMutualTLSOptions(sslConfig, extConfig);\n      case 'auto':\n      default:\n        return this.createAutoSSLOptions(sslConfig, extConfig);\n    }\n  }\n\n  /**\n   * 自动SSL配置\n   */\n  private createAutoSSLOptions(sslConfig: SSL3Config, extConfig: any): any {\n    const keyPath = sslConfig.key || extConfig?.key;\n    const certPath = sslConfig.cert || extConfig?.cert;\n    \n    if (!keyPath || !certPath) {\n      throw new Error('SSL key and cert are required for HTTP/3');\n    }\n    \n    return {\n      key: loadCertificate(keyPath, 'private key'),\n      cert: loadCertificate(certPath, 'certificate')\n    };\n  }\n\n  /**\n   * 手动SSL配置\n   */\n  private createManualSSLOptions(sslConfig: SSL3Config, extConfig: any): any {\n    const keyPath = sslConfig.key || extConfig?.key;\n    const certPath = sslConfig.cert || extConfig?.cert;\n    const caPath = sslConfig.ca || extConfig?.ca;\n    \n    if (!keyPath || !certPath) {\n      throw new Error('SSL key and cert are required for manual SSL mode');\n    }\n    \n    const options: any = {\n      key: loadCertificate(keyPath, 'private key'),\n      cert: loadCertificate(certPath, 'certificate'),\n      passphrase: sslConfig.passphrase,\n      ciphers: sslConfig.ciphers,\n      honorCipherOrder: sslConfig.honorCipherOrder,\n      secureProtocol: sslConfig.secureProtocol\n    };\n    \n    if (caPath) {\n      options.ca = loadCertificate(caPath, 'CA certificate');\n    }\n    \n    return options;\n  }\n\n  /**\n   * 双向TLS配置\n   */\n  private createMutualTLSOptions(sslConfig: SSL3Config, extConfig: any): any {\n    const manualOptions = this.createManualSSLOptions(sslConfig, extConfig);\n    \n    return {\n      ...manualOptions,\n      requestCert: sslConfig.requestCert !== false,\n      rejectUnauthorized: sslConfig.rejectUnauthorized !== false\n    };\n  }\n\n\n  /**\n   * 设置会话处理\n   * \n   * 注意：实际实现取决于使用的 QUIC 库的 API\n   */\n  private setupSessionHandling(): void {\n    // 当有新的 QUIC 连接（会话）建立时\n    this.server.on('session', (session: Http3Session) => {\n      this.connectionPool.addHttp3Session(session).catch((error: Error) => {\n        this.logger.error('Failed to add HTTP/3 session to pool', {}, error);\n        try {\n          session.close(1, 'Internal error');\n        } catch {\n          // Session close error handled silently\n        }\n      });\n    });\n\n    // 处理会话错误\n    this.server.on('sessionError', (error: Error, session: any) => {\n      this.logger.warn('HTTP/3 session error', {}, {\n        error: error.message,\n        sessionId: session.id\n      });\n    });\n  }\n\n  /**\n   * 设置流处理\n   * \n   * 注意：HTTP/3 中每个请求对应一个双向流\n   */\n  private setupStreamHandling(): void {\n    // 处理传入的 HTTP/3 请求\n    // 具体实现取决于使用的 QUIC 库如何暴露 HTTP/3 请求\n    \n    // 示例：假设库提供 'request' 事件\n    this.server.on('request', (req: any, res: any) => {\n      // 将请求传递给 Koatty 应用处理\n      this.app.callback()(req, res);\n      \n      // 请求指标由连接池自动处理\n    });\n  }\n\n  protected analyzeConfigChanges(\n    changedKeys: (keyof Http3ServerOptions)[],\n    oldConfig: Http3ServerOptions,\n    newConfig: Http3ServerOptions\n  ): ConfigChangeAnalysis {\n    // 关键配置变更需要重启\n    const criticalKeys: (keyof ListeningOptions)[] = ['hostname', 'port', 'protocol'];\n    \n    if (changedKeys.some(key => criticalKeys.includes(key as keyof ListeningOptions))) {\n      return {\n        requiresRestart: true,\n        changedKeys: changedKeys as string[],\n        restartReason: 'Critical network configuration changed',\n        canApplyRuntime: false\n      };\n    }\n\n    // SSL配置变更\n    if (this.hasSSLConfigChanged(oldConfig, newConfig)) {\n      return {\n        requiresRestart: true,\n        changedKeys: changedKeys as string[],\n        restartReason: 'SSL/TLS configuration changed',\n        canApplyRuntime: false\n      };\n    }\n\n    // QUIC配置变更\n    if (this.hasQUICConfigChanged(oldConfig, newConfig)) {\n      return {\n        requiresRestart: true,\n        changedKeys: changedKeys as string[],\n        restartReason: 'QUIC protocol configuration changed',\n        canApplyRuntime: false\n      };\n    }\n\n    // HTTP/3配置变更\n    if (this.hasHTTP3ConfigChanged(oldConfig, newConfig)) {\n      return {\n        requiresRestart: true,\n        changedKeys: changedKeys as string[],\n        restartReason: 'HTTP/3 protocol configuration changed',\n        canApplyRuntime: false\n      };\n    }\n\n    // 连接池配置变更\n    if (this.hasConnectionPoolChanged(oldConfig, newConfig)) {\n      return {\n        requiresRestart: false,\n        changedKeys: changedKeys as string[],\n        canApplyRuntime: true\n      };\n    }\n\n    return {\n      requiresRestart: false,\n      changedKeys: changedKeys as string[],\n      canApplyRuntime: true\n    };\n  }\n\n  protected onRuntimeConfigChange(\n    analysis: ConfigChangeAnalysis,\n    newConfig: Partial<Http3ServerOptions>,\n    traceId: string\n  ): void {\n    // 处理HTTP/3特定的运行时配置变更\n    const http3Config = newConfig as Partial<Http3ServerOptions>;\n    \n    // 更新连接池配置\n    if (http3Config.connectionPool) {\n      this.logger.info('Updating HTTP/3 connection pool configuration', { traceId }, {\n        oldConfig: this.options.connectionPool,\n        newConfig: http3Config.connectionPool\n      });\n      \n      this.connectionPool.updateConfig(this.options.connectionPool);\n    }\n\n    this.logger.debug('HTTP/3 runtime configuration changes applied', { traceId });\n  }\n\n  protected extractRelevantConfig(config: Http3ServerOptions) {\n    return {\n      hostname: config.hostname,\n      port: config.port,\n      protocol: config.protocol,\n      sslMode: config.ssl?.mode || 'auto',\n      alpnProtocols: config.ssl?.alpnProtocols || ['h3'],\n      connectionPool: config.connectionPool ? {\n        maxConnections: config.connectionPool.maxConnections,\n        maxIdleTimeout: config.connectionPool.protocolSpecific?.maxIdleTimeout,\n      } : null,\n      quicSettings: config.quic,\n      http3Settings: config.http3\n    };\n  }\n\n  /**\n   * 检查SSL配置是否变更\n   */\n  private hasSSLConfigChanged(oldConfig: Http3ServerOptions, newConfig: Http3ServerOptions): boolean {\n    const oldSSL = oldConfig.ssl;\n    const newSSL = newConfig.ssl;\n\n    if (!oldSSL && !newSSL) return false;\n    if (!oldSSL || !newSSL) return true;\n\n    return (\n      oldSSL.mode !== newSSL.mode ||\n      oldSSL.key !== newSSL.key ||\n      oldSSL.cert !== newSSL.cert ||\n      oldSSL.ca !== newSSL.ca ||\n      JSON.stringify(oldSSL.alpnProtocols) !== JSON.stringify(newSSL.alpnProtocols)\n    );\n  }\n\n  /**\n   * 检查QUIC配置是否变更\n   */\n  private hasQUICConfigChanged(oldConfig: Http3ServerOptions, newConfig: Http3ServerOptions): boolean {\n    const oldQuic = oldConfig.quic;\n    const newQuic = newConfig.quic;\n\n    if (!oldQuic && !newQuic) return false;\n    if (!oldQuic || !newQuic) return true;\n\n    return JSON.stringify(oldQuic) !== JSON.stringify(newQuic);\n  }\n\n  /**\n   * 检查HTTP/3配置是否变更\n   */\n  private hasHTTP3ConfigChanged(oldConfig: Http3ServerOptions, newConfig: Http3ServerOptions): boolean {\n    const oldHttp3 = oldConfig.http3;\n    const newHttp3 = newConfig.http3;\n\n    if (!oldHttp3 && !newHttp3) return false;\n    if (!oldHttp3 || !newHttp3) return true;\n\n    return JSON.stringify(oldHttp3) !== JSON.stringify(newHttp3);\n  }\n\n  /**\n   * 检查连接池配置是否变更\n   */\n  private hasConnectionPoolChanged(oldConfig: Http3ServerOptions, newConfig: Http3ServerOptions): boolean {\n    const oldPool = oldConfig.connectionPool;\n    const newPool = newConfig.connectionPool;\n\n    if (!oldPool && !newPool) return false;\n    if (!oldPool || !newPool) return true;\n\n    return (\n      oldPool.maxConnections !== newPool.maxConnections ||\n      oldPool.keepAliveTimeout !== newPool.keepAliveTimeout\n    );\n  }\n\n  // ============= 实现优雅关闭抽象方法 =============\n\n  protected async stopAcceptingNewConnections(traceId: string): Promise<void> {\n    this.logger.info('Step 1: Stopping acceptance of new HTTP/3 connections', { traceId });\n    \n    // 停止QUIC服务器监听\n    if (this.server.listening) {\n      await new Promise<void>((resolve, reject) => {\n        this.server.close((err: Error) => {\n          if (err) reject(err);\n          else resolve();\n        });\n      });\n    }\n    \n    this.logger.debug('New HTTP/3 connection acceptance stopped', { traceId });\n  }\n\n  protected async waitForConnectionCompletion(timeout: number, traceId: string): Promise<void> {\n    this.logger.info('Step 3: Waiting for existing HTTP/3 sessions to complete', { traceId }, {\n      activeSessions: this.getActiveConnectionCount(),\n      timeout: timeout\n    });\n\n    const startTime = Date.now();\n    \n    while (this.getActiveConnectionCount() > 0) {\n      const elapsed = Date.now() - startTime;\n      \n      if (elapsed >= timeout) {\n        this.logger.warn('HTTP/3 session completion timeout reached', { traceId }, {\n          remainingSessions: this.getActiveConnectionCount(),\n          elapsed: elapsed\n        });\n        break;\n      }\n      \n      // 每5秒记录一次进度\n      if (elapsed % 5000 < 100) {\n        this.logger.debug('Waiting for HTTP/3 sessions to complete', { traceId }, {\n          remainingSessions: this.getActiveConnectionCount(),\n          elapsed: elapsed\n        });\n      }\n      \n      await new Promise(resolve => setTimeout(resolve, 100));\n    }\n    \n    this.logger.debug('HTTP/3 session completion wait finished', { traceId }, {\n      remainingSessions: this.getActiveConnectionCount()\n    });\n  }\n\n  protected async forceCloseRemainingConnections(traceId: string): Promise<void> {\n    const remainingConnections = this.getActiveConnectionCount();\n    \n    if (remainingConnections > 0) {\n      this.logger.info('Step 4: Force closing remaining HTTP/3 sessions', { traceId }, {\n        remainingSessions: remainingConnections\n      });\n      \n      // 使用连接池强制关闭所有会话\n      await this.connectionPool.closeAllConnections(5000);\n      \n      this.logger.warn('Forced closure of remaining HTTP/3 sessions', { traceId }, {\n        forcedSessions: remainingConnections\n      });\n    } else {\n      this.logger.debug('Step 4: No remaining HTTP/3 sessions to close', { traceId });\n    }\n  }\n\n  protected forceShutdown(traceId: string): void {\n    this.logger.warn('Force HTTP/3 server shutdown initiated', { traceId });\n    \n    // 强制关闭HTTP/3服务器\n    this.server.close();\n    \n    // 停止监控和清理\n    this.stopMonitoringAndCleanup(traceId);\n  }\n\n  /**\n   * 重写停止监控和清理方法\n   */\n  protected stopMonitoringAndCleanup(traceId: string): void {\n    this.logger.info('Step 5: Stopping monitoring and cleanup', { traceId });\n\n    // 调用父类的清理方法（会清理所有TimerManager的定时器）\n    super.stopMonitoringAndCleanup(traceId);\n  }\n\n  // ============= 实现KoattyServer接口 =============\n\n  Start(listenCallback?: () => void): NativeServer {\n    // Simple startup log - no traceId needed\n    this.logger.info('HTTP/3 server starting', {}, {\n      hostname: this.options.hostname,\n      port: this.options.port,\n      protocol: this.options.protocol,\n      http3Version: getHttp3Version()\n    });\n\n    const startCallback = () => {\n      // Remove the error handler added for listen errors\n      if (typeof this.server.removeAllListeners === 'function') {\n        this.server.removeAllListeners('error');\n      }\n      if (typeof this.server.on === 'function') {\n        this.server.on('error', (error: Error) => {\n          // Error logs keep traceId for troubleshooting\n          const runtimeErrorTraceId = generateTraceId();\n          this.logger.error('Server runtime error', { traceId: runtimeErrorTraceId }, error);\n          // Don't exit on runtime errors\n        });\n      }\n      \n      // Record start time\n      this.startTime = Date.now();\n      \n      const protocolUpper = this.options.protocol.toUpperCase();\n      const urlProtocol = this.options.protocol.toLowerCase();\n      const serverUrl = `${urlProtocol}://${this.options.hostname || '127.0.0.1'}:${this.options.port}/`;\n      \n      // 输出 Koatty 格式的启动日志 - no traceId needed for simple status log\n      this.logger.info(`Server: ${protocolUpper} running at ${serverUrl}`, {});\n      \n      // Simple completion log - no traceId needed\n      this.logger.info('HTTP/3 server started successfully', {}, {\n        address: `${this.options.hostname}:${this.options.port}`,\n        hostname: this.options.hostname,\n        port: this.options.port,\n        protocol: this.options.protocol,\n        connectionPoolEnabled: !!this.connectionPool,\n        serverId: this.serverId,\n        sslMode: this.options.ssl?.mode || 'auto',\n        alpnProtocols: this.options.ssl?.alpnProtocols || ['h3'],\n        http3Version: getHttp3Version(),\n        transport: 'UDP (QUIC)',\n        implementation: '@matrixai/quic'\n      });\n      \n      // 启动连接池监控\n      this.startConnectionPoolMonitoring();\n      \n      if (listenCallback) {\n        listenCallback();\n      }\n    };\n\n    // Http3ServerAdapter API: listen(callback) - async\n    this.server.listen(startCallback).catch((error: Error) => {\n      // Error logs keep traceId for troubleshooting\n      const errorTraceId = generateTraceId();\n      this.logger.error('Failed to start HTTP/3 server', { traceId: errorTraceId }, error);\n      // 通过 EventEmitter error 事件传递错误，使调用方可通过 server.on('error', ...) 捕获\n      this.server.emit('error', error);\n    });\n\n    return this.server;\n  }\n\n  getStatus(): number {\n    return this.status;\n  }\n\n  getNativeServer(): NativeServer {\n    return this.server;\n  }\n\n  // ============= HTTP/3特定的方法 =============\n\n  /**\n   * 启动连接池监控\n   */\n  private startConnectionPoolMonitoring(): void {\n    this.timerManager.addTimer('http3_connection_monitoring', () => {\n      this.getConnectionStats(); // Collect stats but don't log\n    }, 30000); // 每30秒\n  }\n\n  /**\n   * 获取HTTP/3统计信息\n   */\n  getHttp3Stats() {\n    return this.connectionPool ? this.connectionPool.getConnectionStats() : null;\n  }\n\n  /**\n   * 获取当前连接状态\n   */\n  getConnectionsStatus(): { current: number; max: number } {\n    const poolConfig = this.connectionPool?.getConfig();\n    return {\n      current: this.getActiveConnectionCount(),\n      max: poolConfig?.maxConnections || 0\n    };\n  }\n\n  /**\n   * 销毁服务器\n   */\n  async destroy(): Promise<void> {\n    const traceId = generateTraceId();\n    this.logger.info('Destroying HTTP/3 server', { traceId });\n\n    try {\n      await this.gracefulShutdown();\n      this.logger.info('HTTP/3 server destroyed successfully', { traceId });\n    } catch (error) {\n      this.logger.error('Error destroying HTTP/3 server', { traceId }, error);\n      throw error;\n    }\n  }\n}\n\n","/*\n * @Description: HTTPS连接池管理器\n * @Usage: HTTPS协议的TLS连接池实现\n * @Author: richen\n * @Date: 2024-11-27 23:30:00\n * @LastEditTime: 2024-11-27 23:30:00\n */\n\nimport { \n  ConnectionPoolManager, \n  ConnectionRequestOptions\n} from './pool';\nimport { ConnectionPoolConfig } from '../config/pool';\nimport { TLSSocket } from 'tls';\n\n/**\n * HTTPS连接元数据\n */\ninterface HttpsConnectionMetadata {\n  id: string;\n  createdAt: number;\n  lastUsed: number;\n  available: boolean;\n  remoteAddress?: string;\n  remotePort?: number;\n  localAddress?: string;\n  localPort?: number;\n  protocol: string;\n  cipher?: string;\n  authorized: boolean;\n  serverName?: string;\n  certificate?: any;\n  requestCount: number;\n  bytesSent: number;\n  bytesReceived: number;\n  securityScore: number; // 安全评分 (0-100)\n}\n\n/**\n * HTTPS连接池管理器\n */\nexport class HttpsConnectionPoolManager extends ConnectionPoolManager<TLSSocket> {\n  private securityMetrics = {\n    totalHandshakes: 0,\n    successfulHandshakes: 0,\n    failedHandshakes: 0,\n    averageHandshakeTime: 0\n  };\n\n  constructor(config: ConnectionPoolConfig = {}) {\n    super('https', config);\n\n    // 启动安全监控\n    this.startSecurityMonitoring();\n  }\n\n  /**\n   * 验证HTTPS连接\n   */\n  protected validateConnection(connection: TLSSocket): boolean {\n    return connection instanceof TLSSocket && \n           !connection.destroyed && \n           connection.readable && \n           connection.writable;\n  }\n\n  /**\n   * 清理HTTPS连接\n   */\n  protected async cleanupConnection(connection: TLSSocket): Promise<void> {\n    try {\n      if (!connection.destroyed) {\n        // 优雅关闭TLS连接\n        connection.end();\n        \n        // 如果在合理时间内未关闭，强制销毁\n        setTimeout(() => {\n          if (!connection.destroyed) {\n            connection.destroy();\n          }\n        }, 1000);\n      }\n    } catch (error) {\n      this.logger.warn('Error cleaning up HTTPS connection', {}, error);\n    }\n  }\n\n  /**\n   * 获取可用连接\n   */\n  protected async getAvailableConnection(): Promise<{ connection: TLSSocket; id: string } | null> {\n    for (const [id, metadata] of this.connectionMetadata) {\n      if (metadata.available && this.isConnectionHealthy(this.connections.get(id)!)) {\n        const connection = this.connections.get(id);\n        if (connection) {\n          // 标记为不可用\n          metadata.available = false;\n          metadata.lastUsed = Date.now();\n          return { connection, id };\n        }\n      }\n    }\n    return null;\n  }\n\n  /**\n   * 创建新连接\n   */\n  protected async createNewConnection(_options: ConnectionRequestOptions): Promise<{ connection: TLSSocket; id: string; metadata?: any } | null> {\n    // HTTPS连接通常是被动接受的，这里返回null\n    // 在实际的HTTPS服务器实现中，连接会通过server.on('secureConnection')事件添加\n    return null;\n  }\n\n  /**\n   * 检查连接是否健康\n   */\n  isConnectionHealthy(connection: TLSSocket): boolean {\n    if (!connection) return false;\n    \n    const connectionId = this.findHttpsConnectionId(connection);\n    if (!connectionId) return false;\n    \n    const metadata = this.connectionMetadata.get(connectionId) as HttpsConnectionMetadata;\n    if (!metadata) return false;\n    \n    // 检查连接状态\n    const isHealthy = !connection.destroyed && \n                     connection.readable && \n                     connection.writable &&\n                     connection.authorized; // TLS特有的验证\n    \n    // 检查是否超时\n    const now = Date.now();\n    const idleTimeout = this.config.keepAliveTimeout || 5000;\n    const isIdle = metadata.available && (now - metadata.lastUsed) > idleTimeout;\n    \n    return isHealthy && !isIdle;\n  }\n\n  /**\n   * 添加HTTPS连接（由服务器调用）\n   */\n  async addHttpsConnection(connection: TLSSocket): Promise<boolean> {\n    const handshakeStart = Date.now();\n    \n    try {\n      // 等待TLS握手完成\n      if (!connection.authorized && !connection.destroyed) {\n        await new Promise((resolve, reject) => {\n          const timeout = setTimeout(() => {\n            reject(new Error('TLS handshake timeout'));\n          }, 10000);\n          \n          connection.once('secureConnect', () => {\n            clearTimeout(timeout);\n            resolve(void 0);\n          });\n          \n          connection.once('error', (error) => {\n            clearTimeout(timeout);\n            reject(error);\n          });\n        });\n      }\n      \n      const handshakeDuration = Date.now() - handshakeStart;\n      this.updateSecurityMetrics(true, handshakeDuration, connection);\n      \n      const metadata: Partial<HttpsConnectionMetadata> = {\n        remoteAddress: connection.remoteAddress,\n        remotePort: connection.remotePort,\n        localAddress: connection.localAddress,\n        localPort: connection.localPort,\n        protocol: 'https',\n        cipher: connection.getCipher()?.name,\n        authorized: connection.authorized,\n        serverName: (connection as any).servername,\n        certificate: connection.getPeerCertificate(),\n        requestCount: 0,\n        bytesSent: 0,\n        bytesReceived: 0,\n        securityScore: this.calculateSecurityScore(connection)\n      };\n\n      const success = await this.addConnection(connection, metadata);\n      \n      if (success) {\n        this.setupConnectionEventHandlers(connection);\n      }\n      \n      return success;\n    } catch (error) {\n      this.updateSecurityMetrics(false, Date.now() - handshakeStart);\n      this.logger.error('Failed to add HTTPS connection', {}, error);\n      return false;\n    }\n  }\n\n  /**\n   * 计算连接安全评分\n   */\n  private calculateSecurityScore(connection: TLSSocket): number {\n    let score = 0;\n    \n    // 基础授权检查 (40分)\n    if (connection.authorized) {\n      score += 40;\n    }\n    \n    // 协议版本检查 (20分)\n    const protocol = connection.getProtocol();\n    if (protocol === 'TLSv1.3') {\n      score += 20;\n    } else if (protocol === 'TLSv1.2') {\n      score += 15;\n    } else if (protocol === 'TLSv1.1') {\n      score += 10;\n    }\n    \n    // 加密套件检查 (20分)\n    const cipher = connection.getCipher();\n    if (cipher) {\n      if (cipher.name.includes('AES')) score += 10;\n      if (cipher.name.includes('GCM')) score += 5;\n      if (cipher.name.includes('256')) score += 5;\n    }\n    \n    // 证书检查 (20分)\n    try {\n      const cert = connection.getPeerCertificate();\n      if (cert && cert.valid_to) {\n        const expiry = new Date(cert.valid_to);\n        const now = new Date();\n        const daysToExpiry = Math.floor((expiry.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));\n        \n        if (daysToExpiry > 90) score += 20;\n        else if (daysToExpiry > 30) score += 15;\n        else if (daysToExpiry > 7) score += 10;\n        else score += 5;\n      }\n    } catch (error) {\n      // 证书检查失败\n      this.logger.error('Failed to calculate security score', {}, error);\n    }\n    \n    return Math.min(score, 100);\n  }\n\n  /**\n   * 更新安全指标\n   */\n  private updateSecurityMetrics(success: boolean, handshakeDuration: number, connection?: TLSSocket): void {\n    this.securityMetrics.totalHandshakes++;\n    \n    if (!success) {\n      this.securityMetrics.failedHandshakes++;\n    }\n    \n    if (connection && !connection.authorized) {\n      this.securityMetrics.failedHandshakes++;\n    }\n    \n    // 更新平均握手时间\n    this.securityMetrics.averageHandshakeTime = \n      (this.securityMetrics.averageHandshakeTime * (this.securityMetrics.totalHandshakes - 1) + handshakeDuration) \n      / this.securityMetrics.totalHandshakes;\n  }\n\n  /**\n   * 设置连接事件处理器\n   */\n  private setupConnectionEventHandlers(connection: TLSSocket): void {\n    const connectionId = this.findHttpsConnectionId(connection);\n    if (!connectionId) return;\n\n    // 处理连接关闭\n    connection.on('close', () => {\n      this.removeConnection(connection, 'Connection closed').catch(error => {\n        this.logger.error('Error removing closed HTTPS connection', {}, error);\n      });\n    });\n\n    // 处理连接错误\n    connection.on('error', (error) => {\n      this.logger.warn('HTTPS connection error', {}, { \n        connectionId, \n        error: error.message,\n        authorized: connection.authorized\n      });\n      this.removeConnection(connection, `Connection error: ${error.message}`).catch(err => {\n        this.logger.error('Error removing errored HTTPS connection', {}, err);\n      });\n    });\n\n    // 处理TLS错误\n    connection.on('tlsClientError', (error) => {\n      this.logger.warn('TLS client error', {}, { \n        connectionId, \n        error: error.message \n      });\n      this.securityMetrics.failedHandshakes++;\n    });\n\n    // 处理连接超时\n    connection.on('timeout', () => {\n      // HTTPS connection timeout handled\n      this.removeConnection(connection, 'Connection timeout').catch(error => {\n        this.logger.error('Error removing timed out HTTPS connection', {}, error);\n      });\n    });\n\n    // 监控数据传输\n    connection.on('data', (data) => {\n      const metadata = this.connectionMetadata.get(connectionId) as HttpsConnectionMetadata;\n      if (metadata) {\n        metadata.bytesReceived += data.length;\n        metadata.lastUsed = Date.now();\n      }\n    });\n\n    // 设置超时\n    const timeout = this.config.connectionTimeout || 30000;\n    connection.setTimeout(timeout);\n  }\n\n  /**\n   * 处理HTTPS请求完成\n   */\n  async handleRequestComplete(connection: TLSSocket, bytesSent: number = 0): Promise<void> {\n    const connectionId = this.findHttpsConnectionId(connection);\n    if (!connectionId) return;\n\n    const metadata = this.connectionMetadata.get(connectionId) as HttpsConnectionMetadata;\n    if (metadata) {\n      metadata.requestCount++;\n      metadata.bytesSent += bytesSent;\n      metadata.lastUsed = Date.now();\n      \n      // 标记连接为可用\n      metadata.available = true;\n    }\n\n    // 记录延迟\n    this.recordLatency(Date.now() - metadata.lastUsed);\n  }\n\n  /**\n   * 启动安全监控\n   */\n  private startSecurityMonitoring(): void {\n    // 安全指标监控已启用（静默收集）\n    // 实际的安全指标在每次连接建立时收集\n  }\n\n  /**\n   * 获取连接统计信息\n   */\n  getConnectionStats() {\n    const stats = {\n      total: this.connections.size,\n      active: this.getActiveConnectionCount(),\n      available: 0,\n      authorized: 0,\n      unauthorized: 0,\n      totalRequests: 0,\n      totalBytesSent: 0,\n      totalBytesReceived: 0,\n      averageSecurityScore: 0,\n      protocols: {} as Record<string, number>,\n      ciphers: {} as Record<string, number>\n    };\n\n    let totalSecurityScore = 0;\n\n    for (const [_id, metadata] of this.connectionMetadata) {\n      const typedMetadata = metadata as HttpsConnectionMetadata;\n      \n      if (typedMetadata.available) stats.available++;\n      if (typedMetadata.authorized) stats.authorized++;\n      else stats.unauthorized++;\n      \n      stats.totalRequests += typedMetadata.requestCount;\n      stats.totalBytesSent += typedMetadata.bytesSent;\n      stats.totalBytesReceived += typedMetadata.bytesReceived;\n      totalSecurityScore += typedMetadata.securityScore;\n      \n      // 协议统计\n      const protocol = typedMetadata.protocol || 'unknown';\n      stats.protocols[protocol] = (stats.protocols[protocol] || 0) + 1;\n      \n      // 加密套件统计\n      const cipher = typedMetadata.cipher || 'unknown';\n      stats.ciphers[cipher] = (stats.ciphers[cipher] || 0) + 1;\n    }\n\n    stats.averageSecurityScore = this.connections.size > 0 \n      ? totalSecurityScore / this.connections.size \n      : 0;\n\n    return {\n      ...stats,\n      security: this.securityMetrics\n    };\n  }\n\n  /**\n   * 获取安全指标\n   */\n  getSecurityMetrics() {\n    return {\n      ...this.securityMetrics,\n      connectionSecurityScores: Array.from(this.connectionMetadata.values())\n        .map((metadata: any) => ({\n          id: metadata.id,\n          securityScore: metadata.securityScore,\n          authorized: metadata.authorized,\n          cipher: metadata.cipher,\n          protocol: metadata.protocol\n        }))\n    };\n  }\n\n  /**\n   * 设置Keep-Alive超时\n   */\n  setKeepAliveTimeout(timeout: number): void {\n    this.config.keepAliveTimeout = timeout;\n    // HTTPS keep-alive timeout updated\n  }\n\n  /**\n   * 获取连接详情\n   */\n  getConnectionDetails(): Array<{\n    id: string;\n    remoteAddress: string;\n    protocol: string;\n    cipher: string;\n    authorized: boolean;\n    securityScore: number;\n    requestCount: number;\n    bytesSent: number;\n    bytesReceived: number;\n    age: number;\n    idle: number;\n  }> {\n    const now = Date.now();\n    return Array.from(this.connectionMetadata.entries()).map(([id, metadata]) => {\n      const typedMetadata = metadata as HttpsConnectionMetadata;\n      return {\n        id,\n        remoteAddress: typedMetadata.remoteAddress || 'unknown',\n        protocol: typedMetadata.protocol,\n        cipher: typedMetadata.cipher || 'unknown',\n        authorized: typedMetadata.authorized,\n        securityScore: typedMetadata.securityScore,\n        requestCount: typedMetadata.requestCount,\n        bytesSent: typedMetadata.bytesSent,\n        bytesReceived: typedMetadata.bytesReceived,\n        age: now - typedMetadata.createdAt,\n        idle: now - typedMetadata.lastUsed\n      };\n    });\n  }\n\n  /**\n   * 查找HTTPS连接ID\n   */\n  private findHttpsConnectionId(connection: TLSSocket): string | null {\n    for (const [id, conn] of this.connections) {\n      if (conn === connection) return id;\n    }\n    return null;\n  }\n\n  /**\n   * 销毁连接池\n   */\n  async destroy(): Promise<void> {\n    await super.destroy();\n    this.logger.info('HTTPS connection pool destroyed');\n  }\n\n  // ============= 实现抽象方法 =============\n\n  /**\n   * 设置协议特定的连接处理器\n   */\n  protected async setupProtocolSpecificHandlers(connection: TLSSocket): Promise<void> {\n    // HTTPS特定的处理器设置已在addHttpsConnection中完成\n    this.setupConnectionEventHandlers(connection);\n  }\n\n  /**\n   * 协议特定的连接创建逻辑\n   */\n  protected async createProtocolConnection(_options: ConnectionRequestOptions): Promise<{ connection: TLSSocket; metadata?: any } | null> {\n    // HTTPS连接由服务器被动接受，不主动创建\n    return null;\n  }\n} ","/*\n * @Description: HTTPS Server implementation using template method pattern\n * @Usage: HTTPS协议服务器实现\n * @Author: richen\n * @Date: 2021-11-12 11:48:01\n * @LastEditTime: 2024-11-27 23:30:00\n */\nimport { createServer, Server, ServerOptions } from \"https\";\nimport { TLSSocket } from \"tls\";\nimport { KoattyApplication, NativeServer } from \"koatty_core\";\nimport { BaseServer, ConfigChangeAnalysis } from \"./base\";\nimport { generateTraceId } from \"../utils/logger\";\nimport { CreateTerminus } from \"../utils/terminus\";\nimport { loadCertificate } from \"../utils/cert-loader\";\nimport { HttpsConnectionPoolManager } from \"../pools/https\";\nimport { ConfigHelper, HttpsServerOptions, ListeningOptions, SSL1Config } from \"../config/config\";\nimport { createHealthCheckMiddleware } from \"../middleware/healthCheck\";\n\n/**\n * HTTPS Server implementation using template method pattern\n * 继承BaseServer，只实现HTTPS特定的逻辑\n */\nexport class HttpsServer extends BaseServer<HttpsServerOptions, Server> {\n  protected connectionPool: HttpsConnectionPoolManager;\n\n  constructor(app: KoattyApplication, options: HttpsServerOptions) {\n    super(app, options);\n    this.options = ConfigHelper.createHttpsConfig(options);\n    this.initializeServer();\n    CreateTerminus(app, this);\n  }\n\n  /**\n   * 初始化HTTPS连接池\n   */\n  protected initializeConnectionPool(): void {\n    this.connectionPool = new HttpsConnectionPoolManager(this.options.connectionPool);\n    \n    // HTTPS connection pool initialized with configuration\n  }\n\n  /**\n   * 创建HTTPS服务器实例\n   */\n  protected createProtocolServer(): void {\n    const sslOptions = this.createSSLOptions();\n    const healthMiddleware = createHealthCheckMiddleware(this.options.health);\n    \n    this.server = createServer(sslOptions, async (req, res) => {\n      try {\n        await healthMiddleware(req, res, async () => {\n          const startTime = Date.now();\n          this.app.callback()(req, res);\n          \n          // 记录请求指标\n          res.on('finish', () => {\n            const responseTime = Date.now() - startTime;\n            const success = res.statusCode < 400;\n            this.recordRequest(success, responseTime);\n            \n            // 记录HTTPS连接池请求完成\n            if ((req as any).socket) {\n              this.connectionPool.handleRequestComplete(\n                (req as any).socket as TLSSocket, \n                res.getHeaders()['content-length'] as number || 0\n              ).catch(() => {\n                // HTTPS request completion error handled silently\n              });\n            }\n          });\n        });\n      } catch (error) {\n        this.logger.error('Request handling error', {}, error);\n        if (!res.headersSent) {\n          res.writeHead(500, { 'Content-Type': 'application/json' });\n          res.end(JSON.stringify({ error: 'Internal Server Error' }));\n        }\n      }\n    });\n    \n    // HTTPS server instance created\n  }\n\n  /**\n   * 配置HTTPS服务器选项\n   */\n  protected configureServerOptions(): void {\n    this.setupConnectionHandling();\n  }\n\n  /**\n   * HTTPS特定的额外初始化\n   */\n  protected performProtocolSpecificInitialization(): void {\n    this.logger.info('HTTPS server initialization completed', {}, {\n      hostname: this.options.hostname,\n      port: this.options.port,\n      protocol: this.options.protocol,\n      serverId: this.serverId,\n      sslMode: this.options.ssl?.mode || 'auto',\n      maxConnections: this.options.connectionPool?.maxConnections\n    });\n  }\n\n  /**\n   * 创建SSL选项\n   */\n  private createSSLOptions(): ServerOptions {\n    const sslConfig = this.options.ssl || { mode: 'auto' };\n\n    switch (sslConfig.mode) {\n      case 'manual':\n        return this.createManualSSLOptions(sslConfig);\n      case 'mutual_tls':\n        return this.createMutualTLSOptions(sslConfig);\n      case 'auto':\n      default:\n        return this.createAutoSSLOptions(sslConfig);\n    }\n  }\n\n  /**\n   * 自动SSL配置\n   */\n  private createAutoSSLOptions(sslConfig: SSL1Config): ServerOptions {\n    const keyPath = sslConfig.key;\n    const certPath = sslConfig.cert;\n    \n    if (!keyPath || !certPath) {\n      throw new Error('SSL key and cert are required for HTTPS');\n    }\n    \n    const options: ServerOptions = {\n      key: loadCertificate(keyPath, 'private key'),\n      cert: loadCertificate(certPath, 'certificate')\n    };\n    \n    // 在auto模式下也处理扩展配置选项\n    // 连接超时设置\n    if (sslConfig.handshakeTimeout !== undefined && sslConfig.handshakeTimeout !== null) {\n      options.handshakeTimeout = sslConfig.handshakeTimeout;\n    }\n    if (sslConfig.sessionTimeout !== undefined && sslConfig.sessionTimeout !== null) {\n      options.sessionTimeout = sslConfig.sessionTimeout;\n    }\n    \n    // SNI支持\n    if (sslConfig.SNICallback !== undefined && sslConfig.SNICallback !== null) {\n      options.SNICallback = sslConfig.SNICallback;\n    }\n    \n    // 会话恢复\n    if (sslConfig.sessionIdContext !== undefined && sslConfig.sessionIdContext !== null) {\n      options.sessionIdContext = sslConfig.sessionIdContext;\n    }\n    if (sslConfig.ticketKeys !== undefined && sslConfig.ticketKeys !== null) {\n      options.ticketKeys = sslConfig.ticketKeys;\n    }\n    \n    // HTTP/2 兼容性\n    if (sslConfig.ALPNProtocols !== undefined && sslConfig.ALPNProtocols !== null) {\n      options.ALPNProtocols = sslConfig.ALPNProtocols;\n    }\n    \n    return options;\n  }\n\n  /**\n   * 手动SSL配置\n   */\n  private createManualSSLOptions(sslConfig: SSL1Config): ServerOptions {\n    const keyPath = sslConfig.key;\n    const certPath = sslConfig.cert;\n    const caPath = sslConfig.ca;\n    \n    if (!keyPath || !certPath) {\n      throw new Error('SSL key and cert are required for manual SSL mode');\n    }\n    \n    const options: ServerOptions = {\n      key: loadCertificate(keyPath, 'private key'),\n      cert: loadCertificate(certPath, 'certificate'),\n      passphrase: sslConfig.passphrase,\n      ciphers: sslConfig.ciphers,\n      honorCipherOrder: sslConfig.honorCipherOrder,\n      secureProtocol: sslConfig.secureProtocol\n    };\n    \n    if (caPath) {\n      options.ca = loadCertificate(caPath, 'CA certificate');\n    }\n    \n    // 添加扩展配置选项\n    // 连接超时设置\n    if (sslConfig.handshakeTimeout !== undefined) {\n      options.handshakeTimeout = sslConfig.handshakeTimeout;\n    }\n    if (sslConfig.sessionTimeout !== undefined) {\n      options.sessionTimeout = sslConfig.sessionTimeout;\n    }\n    \n    // SNI支持\n    if (sslConfig.SNICallback) {\n      options.SNICallback = sslConfig.SNICallback;\n    }\n    \n    // 会话恢复\n    if (sslConfig.sessionIdContext) {\n      options.sessionIdContext = sslConfig.sessionIdContext;\n    }\n    if (sslConfig.ticketKeys) {\n      options.ticketKeys = sslConfig.ticketKeys;\n    }\n    \n    // HTTP/2 兼容性\n    if (sslConfig.ALPNProtocols) {\n      options.ALPNProtocols = sslConfig.ALPNProtocols;\n    }\n    \n    return options;\n  }\n\n  /**\n   * 双向TLS配置\n   */\n  private createMutualTLSOptions(sslConfig: SSL1Config): ServerOptions {\n    const manualOptions = this.createManualSSLOptions(sslConfig);\n    \n    return {\n      ...manualOptions,\n      requestCert: sslConfig.requestCert !== false,\n      rejectUnauthorized: sslConfig.rejectUnauthorized !== false\n    };\n  }\n\n  /**\n   * 设置连接处理\n   */\n  private setupConnectionHandling(): void {\n    // Enhanced connection tracking with connection pool management\n    this.server.on('secureConnection', (tlsSocket: TLSSocket) => {\n      // 使用连接池管理连接\n      this.connectionPool.addHttpsConnection(tlsSocket).catch((error: Error) => {\n        this.logger.error('Failed to add HTTPS connection to pool', {}, error);\n        tlsSocket.destroy();\n      });\n\n      this.logger.debug('Secure connection established', {}, {\n        authorized: tlsSocket.authorized,\n        protocol: tlsSocket.getProtocol(),\n        cipher: tlsSocket.getCipher()?.name,\n        remoteAddress: tlsSocket.remoteAddress\n      });\n    });\n\n    this.server.on('tlsClientError', (err: Error, tlsSocket?: TLSSocket) => {\n      this.logger.warn('TLS client error', {}, {\n        error: err.message,\n        remoteAddress: tlsSocket?.remoteAddress\n      });\n    });\n  }\n\n  /**\n   * 记录请求 TODO\n   */\n  private recordRequest(_success: boolean, _responseTime: number): void {\n    // 这里可以记录请求统计信息\n    // 连接池会自动处理连接级别的统计\n  }\n\n\n  // ============= 实现配置管理抽象方法 =============\n\n  protected analyzeConfigChanges(\n    changedKeys: (keyof HttpsServerOptions)[],\n    oldConfig: HttpsServerOptions,\n    newConfig: HttpsServerOptions\n  ): ConfigChangeAnalysis {\n    // 关键配置变更需要重启\n    const criticalKeys: (keyof ListeningOptions)[] = ['hostname', 'port', 'protocol'];\n    \n    if (changedKeys.some(key => criticalKeys.includes(key as keyof ListeningOptions))) {\n      return {\n        requiresRestart: true,\n        changedKeys: changedKeys as string[],\n        restartReason: 'Critical network configuration changed',\n        canApplyRuntime: false\n      };\n    }\n\n    // SSL配置变更\n    if (this.hasSSLConfigChanged(oldConfig, newConfig)) {\n      return {\n        requiresRestart: true,\n        changedKeys: changedKeys as string[],\n        restartReason: 'SSL/TLS configuration changed',\n        canApplyRuntime: false\n      };\n    }\n\n    // 连接池配置变更\n    if (this.hasConnectionPoolChanged(oldConfig, newConfig)) {\n      return {\n        requiresRestart: false,\n        changedKeys: changedKeys as string[],\n        canApplyRuntime: true\n      };\n    }\n\n    return {\n      requiresRestart: false,\n      changedKeys: changedKeys as string[],\n      canApplyRuntime: true\n    };\n  }\n\n  protected onRuntimeConfigChange(\n    analysis: ConfigChangeAnalysis,\n    newConfig: Partial<HttpsServerOptions>,\n    traceId: string\n  ): void {\n    // 处理HTTPS特定的运行时配置变更\n    const httpsConfig = newConfig as Partial<HttpsServerOptions>;\n    \n    // 更新连接池配置\n    if (httpsConfig.connectionPool) {\n      this.logger.info('Updating HTTPS connection pool configuration', { traceId }, {\n        oldConfig: this.options.connectionPool,\n        newConfig: httpsConfig.connectionPool\n      });\n      \n      this.connectionPool.updateConfig(httpsConfig.connectionPool);\n    }\n\n    // Runtime configuration changes applied\n  }\n\n  protected extractRelevantConfig(config: HttpsServerOptions) {\n    return {\n      hostname: config.hostname,\n      port: config.port,\n      protocol: config.protocol,\n      sslMode: config.ssl?.mode || 'auto',\n      connectionPool: config.connectionPool ? {\n        maxConnections: config.connectionPool.maxConnections,\n        keepAliveTimeout: config.connectionPool.keepAliveTimeout,\n        headersTimeout: config.connectionPool.headersTimeout,\n        requestTimeout: config.connectionPool.requestTimeout\n      } : null\n    };\n  }\n\n  /**\n   * 检查SSL配置是否变更\n   */\n  private hasSSLConfigChanged(oldConfig: HttpsServerOptions, newConfig: HttpsServerOptions): boolean {\n    const oldSSL = oldConfig.ssl;\n    const newSSL = newConfig.ssl;\n\n    if (!oldSSL && !newSSL) return false;\n    if (!oldSSL || !newSSL) return true;\n\n    return (\n      oldSSL.mode !== newSSL.mode ||\n      oldSSL.key !== newSSL.key ||\n      oldSSL.cert !== newSSL.cert ||\n      oldSSL.ca !== newSSL.ca ||\n      oldSSL.ciphers !== newSSL.ciphers ||\n      oldSSL.secureProtocol !== newSSL.secureProtocol ||\n      oldSSL.honorCipherOrder !== newSSL.honorCipherOrder ||\n      oldSSL.requestCert !== newSSL.requestCert ||\n      oldSSL.rejectUnauthorized !== newSSL.rejectUnauthorized\n    );\n  }\n\n  /**\n   * 检查连接池配置是否变更\n   */\n  private hasConnectionPoolChanged(oldConfig: HttpsServerOptions, newConfig: HttpsServerOptions): boolean {\n    const oldPool = oldConfig.connectionPool;\n    const newPool = newConfig.connectionPool;\n\n    if (!oldPool && !newPool) return false;\n    if (!oldPool || !newPool) return true;\n\n    return (\n      oldPool.maxConnections !== newPool.maxConnections ||\n      oldPool.keepAliveTimeout !== newPool.keepAliveTimeout ||\n      oldPool.headersTimeout !== newPool.headersTimeout ||\n      oldPool.requestTimeout !== newPool.requestTimeout\n    );\n  }\n\n  // ============= 实现优雅关闭抽象方法 =============\n\n  protected async stopAcceptingNewConnections(traceId: string): Promise<void> {\n    this.logger.info('Step 1: Stopping acceptance of new HTTPS connections', { traceId });\n    \n    // 检查服务器是否真的在监听（对测试环境友好）\n    if (this.server.listening) {\n      // 停止HTTPS服务器监听\n      await new Promise<void>((resolve, reject) => {\n        this.server.close((err) => {\n          if (err) reject(err);\n          else resolve();\n        });\n      });\n    } else {\n      this.logger.debug('HTTPS server is not listening, skip close', { traceId });\n    }\n    \n    this.logger.debug('New HTTPS connection acceptance stopped', { traceId });\n  }\n\n  protected async waitForConnectionCompletion(timeout: number, traceId: string): Promise<void> {\n    this.logger.info('Step 3: Waiting for existing HTTPS connections to complete', { traceId }, {\n      activeConnections: this.getActiveConnectionCount(),\n      timeout: timeout\n    });\n\n    const startTime = Date.now();\n    \n    while (this.getActiveConnectionCount() > 0) {\n      const elapsed = Date.now() - startTime;\n      \n      if (elapsed >= timeout) {\n        this.logger.warn('HTTPS connection completion timeout reached', { traceId }, {\n          remainingConnections: this.getActiveConnectionCount(),\n          elapsed: elapsed\n        });\n        break;\n      }\n      \n      // 每5秒记录一次进度\n      if (elapsed % 5000 < 100) {\n        this.logger.debug('Waiting for HTTPS connections to complete', { traceId }, {\n          remainingConnections: this.getActiveConnectionCount(),\n          elapsed: elapsed\n        });\n      }\n      \n      await new Promise(resolve => setTimeout(resolve, 100));\n    }\n    \n    this.logger.debug('HTTPS connection completion wait finished', { traceId }, {\n      remainingConnections: this.getActiveConnectionCount()\n    });\n  }\n\n  protected async forceCloseRemainingConnections(traceId: string): Promise<void> {\n    const remainingConnections = this.getActiveConnectionCount();\n    \n    if (remainingConnections > 0) {\n      this.logger.info('Step 4: Force closing remaining HTTPS connections', { traceId }, {\n        remainingConnections\n      });\n      \n      // 使用连接池强制关闭所有连接\n      await this.connectionPool.closeAllConnections(5000);\n      \n      this.logger.warn('Forced closure of remaining HTTPS connections', { traceId }, {\n        forcedConnections: remainingConnections\n      });\n    } else {\n      this.logger.debug('Step 4: No remaining HTTPS connections to close', { traceId });\n    }\n  }\n\n  protected forceShutdown(traceId: string): void {\n    this.logger.warn('Force HTTPS server shutdown initiated', { traceId });\n    \n    // 强制关闭HTTPS服务器\n    this.server.close();\n    \n    // 停止监控和清理\n    this.stopMonitoringAndCleanup(traceId);\n  }\n\n  // ============= 实现KoattyServer接口 =============\n\n  Start(listenCallback?: () => void): NativeServer {\n    // Simple startup log - no traceId needed\n    this.logger.info('Server starting', {}, {\n      hostname: this.options.hostname,\n      port: this.options.port,\n      protocol: this.options.protocol\n    });\n\n    // 添加错误事件监听器，必须在 listen 之前注册\n    const errorHandler = (error: Error) => {\n      // Error logs keep traceId for troubleshooting\n      const errorTraceId = generateTraceId();\n      this.logger.error('Server startup error', { traceId: errorTraceId }, error);\n      // 通过 EventEmitter error 事件传递错误，使调用方可通过 server.on('error', ...) 捕获\n      this.server.emit('error', error);\n    };\n\n    // 检查server是否支持once方法（避免测试中的mock对象问题）\n    if (typeof this.server.once === 'function') {\n      this.server.once('error', errorHandler);\n    }\n\n    this.server.listen(this.options.port, this.options.hostname, () => {\n      // 启动成功，移除启动阶段的错误处理器\n      if (typeof this.server.removeListener === 'function') {\n        this.server.removeListener('error', errorHandler);\n      }\n      \n      // 添加运行时错误处理器\n      if (typeof this.server.on === 'function') {\n        this.server.on('error', (error: Error) => {\n          // Error logs keep traceId for troubleshooting\n          const runtimeErrorTraceId = generateTraceId();\n          this.logger.error('Server runtime error', { traceId: runtimeErrorTraceId }, error);\n          // 运行时错误不退出进程\n        });\n      }\n      \n      // Record start time\n      this.startTime = Date.now();\n      \n      const protocolUpper = this.options.protocol.toUpperCase();\n      const urlProtocol = this.options.protocol.toLowerCase();\n      const serverUrl = `${urlProtocol}://${this.options.hostname || '127.0.0.1'}:${this.options.port}/`;\n      \n      // 输出 Koatty 格式的启动日志 - no traceId needed for simple status log\n      this.logger.info(`Server: ${protocolUpper} running at ${serverUrl}`, {});\n      \n      // Simple completion log - no traceId needed\n      this.logger.info('Server started', {}, {\n        address: `${this.options.hostname}:${this.options.port}`,\n        hostname: this.options.hostname,\n        port: this.options.port,\n        protocol: this.options.protocol,\n        connectionPoolEnabled: !!this.connectionPool,\n        serverId: this.serverId,\n        sslMode: this.options.ssl?.mode || 'auto'\n      });\n      \n      // 启动连接池监控\n      this.startConnectionPoolMonitoring();\n      \n      if (listenCallback) {\n        listenCallback();\n      }\n    });\n\n    return this.server;\n  }\n\n  getStatus(): number {\n    return this.status;\n  }\n\n  getNativeServer(): NativeServer {\n    return this.server;\n  }\n\n  // ============= HTTPS特定的方法 =============\n\n  /**\n   * 启动连接池监控\n   */\n  private startConnectionPoolMonitoring(): void {\n    // Connection pool monitoring enabled (statistics collected silently)\n    this.timerManager.addTimer('https_connection_monitoring', () => {\n      this.getConnectionStats(); // Collect stats but don't log\n    }, 30000); // 每30秒\n  }\n\n  /**\n   * 获取安全统计信息\n   */\n  getSecurityMetrics() {\n    return {\n      sslMode: this.options.ssl?.mode || 'auto',\n      ciphers: this.options.ssl?.ciphers,\n      secureProtocol: this.options.ssl?.secureProtocol,\n      mutualTLS: this.options.ssl?.mode === 'mutual_tls'\n    };\n  }\n\n  /**\n   * 获取当前连接状态\n   */\n  getConnectionsStatus(): { current: number; max: number } {\n    const poolConfig = this.connectionPool?.getConfig();\n    return {\n      current: this.getActiveConnectionCount(),\n      max: poolConfig?.maxConnections || 0\n    };\n  }\n\n  /**\n   * 销毁服务器\n   */\n  async destroy(): Promise<void> {\n    const traceId = generateTraceId();\n    this.logger.info('Destroying HTTPS server', { traceId });\n\n    try {\n      await this.gracefulShutdown();\n      this.logger.info('HTTPS server destroyed successfully', { traceId });\n    } catch (error) {\n      this.logger.error('Error destroying HTTPS server', { traceId }, error);\n      throw error;\n    }\n  }\n} ","/*\n * @Description: WebSocket Server implementation using template method pattern\n * @Usage: WebSocket协议服务器实现\n * @Author: richen\n * @Date: 2021-11-12 11:29:16\n * @LastEditTime: 2024-11-27 23:30:00\n */\nimport { Server as HttpServer, IncomingMessage, createServer } from \"http\";\nimport { Server as HttpsServer, createServer as httpsCreateServer, ServerOptions as httpsServerOptions } from \"https\";\nimport { KoattyApplication, NativeServer } from 'koatty_core';\nimport * as WS from 'ws';\nimport { CreateTerminus } from \"../utils/terminus\";\nimport { BaseServer, ConfigChangeAnalysis } from \"./base\";\nimport { generateTraceId } from \"../utils/logger\";\nimport { loadCertificate } from \"../utils/cert-loader\";\nimport { WebSocketConnectionPoolManager } from \"../pools/ws\";\nimport { ConfigHelper, ListeningOptions, WebSocketServerOptions } from \"../config/config\";\n\n\n/**\n * WebSocket Server implementation using template method pattern\n * 继承BaseServer，只实现WebSocket特定的逻辑\n */\nexport class WsServer extends BaseServer<WebSocketServerOptions, WS.WebSocketServer> {\n  protected connectionPool!: WebSocketConnectionPoolManager;\n  \n  readonly httpServer!: HttpServer | HttpsServer;\n  private upgradeHandler?: (request: any, socket: any, head: any) => void;\n  private clientErrorHandler?: (err: any, sock: any) => void;\n  socket: any;\n\n  constructor(app: KoattyApplication, options: WebSocketServerOptions) {\n    super(app, options);\n    this.options = ConfigHelper.createWebSocketConfig(options);\n    this.initializeServer();\n    // 创建或使用现有的HTTP/HTTPS服务器\n    this.httpServer = this.createHttpServer();\n    \n    // 在构造函数末尾确保升级处理器已绑定\n    this.ensureUpgradeHandlersAreBound();\n    \n    CreateTerminus(app, this);\n  }\n\n  /**\n   * 初始化WebSocket连接池\n   */\n  protected initializeConnectionPool(): void {\n    this.connectionPool = new WebSocketConnectionPoolManager(this.options.connectionPool);\n    \n    // WebSocket connection pool initialized with configuration\n  }\n\n  /**\n   * 创建WebSocket服务器实例\n   */\n  protected createProtocolServer(): void {\n    // 配置WebSocket服务器，使用noServer模式手动处理升级\n    this.options.wsOptions = {\n      ...this.options.wsOptions,\n      noServer: true,\n    };\n\n    this.server = new WS.WebSocketServer(this.options.wsOptions);\n    \n    // WebSocket server instance created\n  }\n\n  /**\n   * 配置WebSocket服务器选项\n   */\n  protected configureServerOptions(): void {\n    // 延迟升级处理的设置，因为 httpServer 可能还没有初始化\n    // 将在 Start() 方法中进行最终的绑定\n    this.setupUpgradeHandling();\n    this.setupConnectionHandling();\n  }\n\n  /**\n   * WebSocket特定的额外初始化\n   */\n  protected performProtocolSpecificInitialization(): void {\n    this.logger.info('WebSocket server initialization completed', {}, {\n      hostname: this.options.hostname,\n      port: this.options.port,\n      protocol: this.options.protocol,\n      serverId: this.serverId,\n      isSecure: this.options.protocol === 'wss'\n    });\n  }\n\n  /**\n   * 创建HTTP/HTTPS服务器\n   */\n  private createHttpServer(): HttpServer | HttpsServer {\n    if (this.options.protocol === \"wss\") {\n      const keyPath = this.options.ssl?.key;\n      const certPath = this.options.ssl?.cert;\n      \n      if (!keyPath || !certPath) {\n        throw new Error('SSL key and cert are required for WSS protocol');\n      }\n      \n      const opt: httpsServerOptions = {\n        key: loadCertificate(keyPath, 'private key'),\n        cert: loadCertificate(certPath, 'certificate'),\n      };\n      \n      // Load CA certificate if provided\n      if (this.options.ssl?.ca) {\n        opt.ca = loadCertificate(this.options.ssl.ca, 'CA certificate');\n      }\n      \n      // HTTPS server created for WSS\n      return httpsCreateServer(opt);\n    } else {\n      // HTTP server created for WS\n      return createServer();\n    }\n  }\n\n  /**\n   * 设置WebSocket升级处理\n   */\n  private setupUpgradeHandling(): void {\n    this.upgradeHandler = (request: any, socket: any, head: any) => {\n      this.server.handleUpgrade(request, socket, head, (ws: WS.WebSocket) => {\n        this.server.emit('connection', ws, request);\n      });\n    };\n\n    this.clientErrorHandler = (err: any, socket: any) => {\n      this.logger.error('Client error during upgrade', {}, {\n        error: err.message,\n        remoteAddress: socket.remoteAddress\n      });\n      socket.destroy();\n    };\n\n    // 这里只创建处理器，不立即绑定\n    // 绑定将在 ensureUpgradeHandlersAreBound() 中进行\n  }\n\n  /**\n   * 确保升级处理器已绑定到HTTP服务器\n   */\n  private ensureUpgradeHandlersAreBound(): void {\n    // 确保处理器已创建且 httpServer 已初始化后再绑定事件处理器\n    if (this.httpServer && this.upgradeHandler && this.clientErrorHandler && typeof this.httpServer.on === 'function') {\n      this.httpServer.on('upgrade', this.upgradeHandler);\n      this.httpServer.on('clientError', this.clientErrorHandler);\n      // WebSocket upgrade handlers bound to HTTP server\n    } else {\n      this.logger.warn('HTTP server not available for WebSocket upgrade handling');\n    }\n  }\n\n  /**\n   * 设置WebSocket连接处理\n   */\n  private setupConnectionHandling(): void {\n    this.server.on('connection', (ws: WS.WebSocket, request: IncomingMessage) => {\n      this.onConnection(ws, request).catch(error => {\n        this.logger.error('Error handling WebSocket connection', {}, error);\n        ws.close(1011, 'Server error');\n      });\n    });\n  }\n\n  /**\n   * 处理新的WebSocket连接\n   */\n  private async onConnection(ws: WS.WebSocket, request: IncomingMessage): Promise<void> {\n    const connectionId = generateTraceId();\n    \n    // 先同步设置WebSocket事件处理器，确保测试能立即验证\n    this.setupWebSocketEventHandlers(ws, connectionId);\n\n    try {\n      // 然后使用连接池注册连接（异步）\n      const success = await this.connectionPool.registerConnection(ws, {\n        connectionId,\n        remoteAddress: request.socket.remoteAddress,\n        remotePort: request.socket.remotePort,\n        userAgent: request.headers['user-agent'],\n        origin: request.headers.origin,\n        protocol: request.headers['sec-websocket-protocol'],\n        createdAt: Date.now()\n      });\n\n      if (!success) {\n        this.logger.warn('Failed to register WebSocket connection in pool', {}, { connectionId });\n        ws.close(1013, 'Service overloaded');\n        return;\n      }\n\n      // WebSocket connection established and registered\n\n      // 触发应用层事件\n      (this.app as any).emit('connection', ws, request);\n\n    } catch (error) {\n      this.logger.error('Failed to handle WebSocket connection', {}, {\n        connectionId,\n        error: (error as Error).message\n      });\n      ws.close(1011, 'Server error');\n    }\n  }\n\n  /**\n   * 设置WebSocket事件处理器\n   */\n  private setupWebSocketEventHandlers(ws: WS.WebSocket, connectionId: string): void {\n    // 处理消息 - 通过app.callback()调用middleware链\n    ws.on('message', async (data: Buffer | string) => {\n      try {\n        this.logger.debug('WebSocket message received', {}, {\n          connectionId,\n          dataType: typeof data,\n          dataSize: Buffer.isBuffer(data) ? data.length : data.length\n        });\n\n        // 创建伪造的request和response对象用于middleware\n        // WebSocket没有标准的HTTP req/res,但我们可以创建兼容的对象\n        const pseudoReq: any = {\n          method: 'MESSAGE',\n          url: '/',  // 可以由router根据实际路由修改\n          headers: {},\n          socket: ws,\n          connection: { remoteAddress: (ws as any)._socket?.remoteAddress },\n          // 将WebSocket和消息数据附加到request对象\n          websocket: ws,\n          wsData: data,\n          wsConnectionId: connectionId\n        };\n\n        const pseudoRes: any = {\n          // WebSocket的response通过ws.send()发送\n          // 这里提供一个兼容接口\n          writeHead: () => {},\n          setHeader: () => {},\n          end: (responseData?: any) => {\n            if (responseData !== undefined && responseData !== null) {\n              try {\n                const sendData = typeof responseData === 'string' \n                  ? responseData \n                  : JSON.stringify(responseData);\n                ws.send(sendData);\n              } catch (error) {\n                this.logger.error('Error sending WebSocket response', {}, {\n                  connectionId,\n                  error: (error as Error).message\n                });\n              }\n            }\n          },\n          // 保存WebSocket引用以便在middleware中使用\n          websocket: ws,\n          finished: false\n        };\n\n        // 调用app.callback()执行middleware链\n        // 这样WebSocket就和其他协议保持一致的架构了\n        const wsMiddlewareHandler = this.app.callback('ws');\n        await wsMiddlewareHandler(pseudoReq, pseudoRes);\n\n        this.logger.debug('WebSocket message handled successfully', {}, { connectionId });\n\n      } catch (error) {\n        this.logger.error('Error handling WebSocket message', {}, {\n          connectionId,\n          error: (error as Error).message\n        });\n        \n        // 发送错误消息给客户端\n        try {\n          ws.send(JSON.stringify({\n            error: 'Internal server error',\n            message: (error as Error).message\n          }));\n        } catch (sendError) {\n          this.logger.error('Error sending error message', {}, {\n            connectionId,\n            error: (sendError as Error).message\n          });\n        }\n      }\n    });\n\n    // 处理错误\n    ws.on('error', (error: Error) => {\n      this.logger.warn('WebSocket connection error', {}, {\n        connectionId,\n        error: error.message\n      });\n    });\n\n    // 处理关闭\n    ws.on('close', (_code: number, _reason: Buffer) => {\n      // WebSocket connection closed\n\n      // 从连接池中移除连接\n      this.connectionPool.releaseConnection(ws, { destroy: true });\n    });\n\n    // 处理pong\n    ws.on('pong', () => {\n      this.logger.debug('WebSocket pong received', {}, { connectionId });\n    });\n  }\n\n  protected analyzeConfigChanges(\n    changedKeys: (keyof WebSocketServerOptions)[],\n    oldConfig: WebSocketServerOptions,\n    newConfig: WebSocketServerOptions\n  ): ConfigChangeAnalysis {\n    // 关键配置变更需要重启\n    const criticalKeys: (keyof ListeningOptions)[] = ['hostname', 'port', 'protocol'];\n    \n    if (changedKeys.some(key => criticalKeys.includes(key as keyof ListeningOptions))) {\n      return {\n        requiresRestart: true,\n        changedKeys: changedKeys as string[],\n        restartReason: 'Critical network configuration changed',\n        canApplyRuntime: false\n      };\n    }\n\n    // SSL配置变更 (对于WSS)\n    if (this.hasSSLConfigChanged(oldConfig, newConfig)) {\n      return {\n        requiresRestart: true,\n        changedKeys: changedKeys as string[],\n        restartReason: 'SSL certificate configuration changed',\n        canApplyRuntime: false\n      };\n    }\n\n    // 连接池配置变更\n    if (this.hasConnectionPoolChanged(oldConfig, newConfig)) {\n      return {\n        requiresRestart: false,\n        changedKeys: changedKeys as string[],\n        canApplyRuntime: true\n      };\n    }\n\n    return {\n      requiresRestart: false,\n      changedKeys: changedKeys as string[],\n      canApplyRuntime: true\n    };\n  }\n\n  protected onRuntimeConfigChange(\n    analysis: ConfigChangeAnalysis,\n    newConfig: Partial<WebSocketServerOptions>,\n    traceId: string\n  ): void {\n    // 处理WebSocket特定的运行时配置变更\n    const wsConfig = newConfig as Partial<WebSocketServerOptions>;\n    \n    // 更新连接池配置\n    if (wsConfig.connectionPool) {\n      this.logger.info('Updating WebSocket connection pool configuration', { traceId }, {\n        oldConfig: this.options.connectionPool,\n        newConfig: wsConfig.connectionPool\n      });\n      \n      // 更新连接池配置\n      this.connectionPool.updateConfig(this.options.connectionPool);\n    }\n\n    this.logger.debug('WebSocket runtime configuration changes applied', { traceId });\n  }\n\n  protected extractRelevantConfig(config: WebSocketServerOptions): {\n    hostname: string;\n    port: number;\n    protocol: string;\n    isSecure: boolean;\n    connectionPool: {\n      maxConnections: number | undefined;\n      pingInterval: number | undefined;\n      pongTimeout: number | undefined;\n      heartbeatInterval: number | undefined;\n    } | null;\n    wsOptions: WS.ServerOptions | undefined;\n  } {\n    return {\n      hostname: config.hostname,\n      port: config.port,\n      protocol: config.protocol,\n      isSecure: config.protocol === 'wss',\n      connectionPool: config.connectionPool ? {\n        maxConnections: config.connectionPool.maxConnections,\n        pingInterval: config.connectionPool.pingInterval,\n        pongTimeout: config.connectionPool.pongTimeout,\n        heartbeatInterval: config.connectionPool.heartbeatInterval\n      } : null,\n      wsOptions: config.wsOptions\n    };\n  }\n\n  /**\n   * 检查SSL配置是否变更\n   */\n  private hasSSLConfigChanged(oldConfig: WebSocketServerOptions, newConfig: WebSocketServerOptions): boolean {\n    if (oldConfig.protocol !== 'wss' && newConfig.protocol !== 'wss') return false;\n    \n    return (\n      oldConfig.ssl?.key !== newConfig.ssl?.key ||\n      oldConfig.ssl?.cert !== newConfig.ssl?.cert ||\n      oldConfig.ssl?.ca !== newConfig.ssl?.ca\n    );\n  }\n\n  /**\n   * 检查连接池配置是否变更\n   */\n  private hasConnectionPoolChanged(oldConfig: WebSocketServerOptions, newConfig: WebSocketServerOptions): boolean {\n    const oldPool = oldConfig.connectionPool;\n    const newPool = newConfig.connectionPool;\n\n    if (!oldPool && !newPool) return false;\n    if (!oldPool || !newPool) return true;\n\n    return (\n      oldPool.maxConnections !== newPool.maxConnections ||\n      oldPool.pingInterval !== newPool.pingInterval ||\n      oldPool.pongTimeout !== newPool.pongTimeout ||\n      oldPool.heartbeatInterval !== newPool.heartbeatInterval\n    );\n  }\n\n  // ============= 实现优雅关闭抽象方法 =============\n\n  protected async stopAcceptingNewConnections(traceId: string): Promise<void> {\n    this.logger.info('Step 1: Stopping acceptance of new WebSocket connections', { traceId });\n    \n    // 移除升级处理器以停止接受新的WebSocket连接\n    if (this.upgradeHandler && typeof (this.httpServer as any).removeListener === 'function') {\n      (this.httpServer as any).removeListener('upgrade', this.upgradeHandler);\n      this.logger.debug('WebSocket upgrade handler removed', { traceId });\n    }\n    \n    // 检查服务器是否真的在监听（对测试环境友好）\n    if (this.httpServer.listening) {\n      // 停止HTTP服务器监听\n      await new Promise<void>((resolve, reject) => {\n        this.httpServer.close((err) => {\n          if (err) reject(err);\n          else resolve();\n        });\n      });\n    } else {\n      this.logger.debug('HTTP server is not listening, skip close', { traceId });\n    }\n    \n    this.logger.debug('New WebSocket connection acceptance stopped', { traceId });\n  }\n\n  protected async waitForConnectionCompletion(timeout: number, traceId: string): Promise<void> {\n    this.logger.info('Step 3: Waiting for existing WebSocket connections to complete', { traceId }, {\n      activeConnections: this.getActiveConnectionCount(),\n      timeout: timeout\n    });\n\n    const startTime = Date.now();\n    \n    while (this.getActiveConnectionCount() > 0) {\n      const elapsed = Date.now() - startTime;\n      \n      if (elapsed >= timeout) {\n        this.logger.warn('WebSocket connection completion timeout reached', { traceId }, {\n          remainingConnections: this.getActiveConnectionCount(),\n          elapsed: elapsed\n        });\n        break;\n      }\n      \n      // 每5秒记录一次进度\n      if (elapsed % 5000 < 100) {\n        this.logger.debug('Waiting for WebSocket connections to complete', { traceId }, {\n          remainingConnections: this.getActiveConnectionCount(),\n          elapsed: elapsed\n        });\n      }\n      \n      await new Promise(resolve => setTimeout(resolve, 100));\n    }\n    \n    this.logger.debug('WebSocket connection completion wait finished', { traceId }, {\n      remainingConnections: this.getActiveConnectionCount()\n    });\n  }\n\n  protected async forceCloseRemainingConnections(traceId: string): Promise<void> {\n    const remainingConnections = this.getActiveConnectionCount();\n    \n    if (remainingConnections > 0) {\n      this.logger.info('Step 4: Force closing remaining WebSocket connections', { traceId }, {\n        remainingConnections\n      });\n      \n      // 使用连接池强制关闭所有连接\n      await this.connectionPool.closeAllConnections(5000);\n      \n      this.logger.warn('Forced closure of remaining WebSocket connections', { traceId }, {\n        forcedConnections: remainingConnections\n      });\n    } else {\n      this.logger.debug('Step 4: No remaining WebSocket connections to close', { traceId });\n    }\n  }\n\n  protected forceShutdown(traceId: string): void {\n    this.logger.warn('Force WebSocket server shutdown initiated', { traceId });\n    \n    // 强制关闭WebSocket服务器\n    this.server.close();\n    \n    // 强制关闭HTTP服务器\n    this.httpServer.close();\n    \n    // 停止监控和清理\n    this.stopMonitoringAndCleanup(traceId);\n  }\n\n  // ============= 实现KoattyServer接口 =============\n\n  Start(listenCallback?: () => void): NativeServer {\n    // Simple startup log - no traceId needed\n    this.logger.info('Server starting', {}, {\n      hostname: this.options.hostname,\n      port: this.options.port,\n      protocol: this.options.protocol\n    });\n\n    // 确保升级处理器已绑定（可能在构造函数中已经绑定了）\n    this.ensureUpgradeHandlersAreBound();\n\n    // 添加错误事件监听器，必须在 listen 之前注册\n    const errorHandler = (error: Error) => {\n      // Error logs keep traceId for troubleshooting\n      const errorTraceId = generateTraceId();\n      this.logger.error('Server startup error', { traceId: errorTraceId }, error);\n      // 通过 EventEmitter error 事件传递错误，使调用方可通过 server.on('error', ...) 捕获\n      this.httpServer.emit('error', error);\n    };\n\n    // 检查httpServer是否支持once方法（避免测试中的mock对象问题）\n    if (typeof this.httpServer.once === 'function') {\n      this.httpServer.once('error', errorHandler);\n    }\n\n    this.httpServer.listen(this.options.port, this.options.hostname, () => {\n      // 启动成功，移除启动阶段的错误处理器\n      if (typeof this.httpServer.removeListener === 'function') {\n        (<any>this.httpServer).removeListener('error', errorHandler);\n      }\n      \n      // 添加运行时错误处理器\n      if (typeof this.httpServer.on === 'function') {\n        this.httpServer.on('error', (error: Error) => {\n          // Error logs keep traceId for troubleshooting\n          const runtimeErrorTraceId = generateTraceId();\n          this.logger.error('Server runtime error', { traceId: runtimeErrorTraceId }, error);\n          // 运行时错误不退出进程\n        });\n      }\n      \n      const protocolUpper = this.options.protocol.toUpperCase();\n      const urlProtocol = this.options.protocol.toLowerCase();\n      const serverUrl = `${urlProtocol}://${this.options.hostname || '127.0.0.1'}:${this.options.port}/`;\n      \n      // 输出 Koatty 格式的启动日志 - no traceId needed for simple status log\n      this.logger.info(`Server: ${protocolUpper} running at ${serverUrl}`, {});\n      \n      // Simple completion log - no traceId needed\n      this.logger.info('Server started', {}, {\n        address: `${this.options.hostname}:${this.options.port}`,\n        hostname: this.options.hostname,\n        port: this.options.port,\n        protocol: this.options.protocol,\n        connectionPoolEnabled: !!this.connectionPool,\n        serverId: this.serverId,\n        isSecure: this.options.protocol === 'wss'\n      });\n      \n      // 启动连接池监控\n      this.startConnectionPoolMonitoring();\n      \n      // 调用启动回调\n      if (listenCallback) {\n        listenCallback();\n      }\n    });\n\n    return this.httpServer;\n  }\n\n  getStatus(): number {\n    return this.status;\n  }\n\n  getNativeServer(): NativeServer {\n    return this.httpServer;\n  }\n\n  // ============= WebSocket特定的方法 =============\n\n  /**\n   * 启动连接池监控\n   */\n  private startConnectionPoolMonitoring(): void {\n    // Connection pool monitoring enabled (statistics collected silently)\n    this.timerManager.addTimer('websocket_connection_monitoring', () => {\n      this.getConnectionStats(); // Collect stats but don't log\n    }, 30000); // 每30秒\n  }\n\n  /**\n   * 获取WebSocket连接统计信息\n   */\n  getWebSocketConnectionStats() {\n    const connectionStatus = this.getConnectionsStatus();\n    return {\n      current: connectionStatus.current,\n      max: connectionStatus.max\n    };\n  }\n\n  /**\n   * 获取当前连接状态\n   */\n  getConnectionsStatus(): { current: number; max: number } {\n    const poolConfig = this.connectionPool?.getConfig();\n    return {\n      current: this.getActiveConnectionCount(),\n      max: poolConfig?.maxConnections || 0\n    };\n  }\n\n  /**\n   * 销毁服务器\n   */\n  async destroy(): Promise<void> {\n    const traceId = generateTraceId();\n    this.logger.info('Destroying WebSocket server', { traceId });\n\n    try {\n      await this.gracefulShutdown();\n      \n      // 清理事件监听器\n      if (this.upgradeHandler && typeof (this.httpServer as any).removeListener === 'function') {\n        (this.httpServer as any).removeListener('upgrade', this.upgradeHandler);\n      }\n      if (this.clientErrorHandler && typeof (this.httpServer as any).removeListener === 'function') {\n        (this.httpServer as any).removeListener('clientError', this.clientErrorHandler);\n      }\n      \n      this.logger.info('WebSocket server destroyed successfully', { traceId });\n    } catch (error) {\n      this.logger.error('Error destroying WebSocket server', { traceId }, error);\n      throw error;\n    }\n  }\n}\n\n","/*\n * @Description: Configuration validator\n * @Usage: Validates server configuration at runtime\n * @Author: richen\n * @Date: 2025-10-12\n * @License: BSD (3-Clause)\n */\n\nimport { KoattyProtocol, ListeningOptions } from \"../config/config\";\n\n/**\n * Validation error interface\n */\nexport interface ValidationError {\n  field: string;\n  message: string;\n  value?: unknown;\n}\n\n/**\n * Validation result interface\n */\nexport interface ValidationResult {\n  valid: boolean;\n  errors: ValidationError[];\n}\n\n/**\n * Configuration validator class\n */\nexport class ConfigValidator {\n  private errors: ValidationError[] = [];\n\n  /**\n   * Validate server configuration\n   * @param options Server listening options\n   * @returns Validation result\n   */\n  validate(options: ListeningOptions): ValidationResult {\n    this.errors = [];\n    \n    // Validate hostname\n    this.validateHostname(options.hostname);\n    \n    // Validate port\n    this.validatePort(options.port);\n    \n    // Validate protocol\n    this.validateProtocol(options.protocol as KoattyProtocol);\n    \n    // Validate protocol-specific configuration\n    if (['https', 'http2', 'wss'].includes(options.protocol)) {\n      this.validateSSLConfig(options);\n    }\n    \n    if (options.protocol === 'grpc') {\n      this.validateGrpcConfig(options);\n    }\n\n    // Validate connection pool config if present\n    if (options.connectionPool) {\n      this.validateConnectionPoolConfig(options);\n    }\n    \n    return {\n      valid: this.errors.length === 0,\n      errors: [...this.errors]\n    };\n  }\n\n  /**\n   * Validate hostname\n   */\n  private validateHostname(hostname: string): void {\n    if (!hostname || typeof hostname !== 'string') {\n      this.errors.push({\n        field: 'hostname',\n        message: 'Hostname must be a non-empty string',\n        value: hostname\n      });\n      return;\n    }\n    \n    // Validate hostname format (IP, domain, or localhost)\n    const ipRegex = /^(\\d{1,3}\\.){3}\\d{1,3}$/;\n    const domainRegex = /^([a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,}$/i;\n    const isLocalhost = hostname === 'localhost' || hostname === '0.0.0.0';\n    \n    if (!isLocalhost && !ipRegex.test(hostname) && !domainRegex.test(hostname)) {\n      this.errors.push({\n        field: 'hostname',\n        message: 'Invalid hostname format. Must be a valid IP address, domain name, or localhost',\n        value: hostname\n      });\n    }\n\n    // Validate IP address ranges\n    if (ipRegex.test(hostname)) {\n      const parts = hostname.split('.').map(Number);\n      if (parts.some(part => part < 0 || part > 255)) {\n        this.errors.push({\n          field: 'hostname',\n          message: 'Invalid IP address. Each octet must be between 0 and 255',\n          value: hostname\n        });\n      }\n    }\n  }\n\n  /**\n   * Validate port number\n   */\n  private validatePort(port: number): void {\n    if (!Number.isInteger(port) || port < 1 || port > 65535) {\n      this.errors.push({\n        field: 'port',\n        message: 'Port must be an integer between 1 and 65535',\n        value: port\n      });\n      return;\n    }\n    \n    // Check privileged ports (require root/admin privileges)\n    if (port < 1024 && process.getuid && process.getuid() !== 0) {\n      this.errors.push({\n        field: 'port',\n        message: 'Privileged ports (< 1024) require root/administrator privileges',\n        value: port\n      });\n    }\n\n    // Warn about commonly used ports\n    const commonPorts: Record<number, string> = {\n      22: 'SSH',\n      25: 'SMTP',\n      53: 'DNS',\n      80: 'HTTP',\n      110: 'POP3',\n      143: 'IMAP',\n      443: 'HTTPS',\n      3306: 'MySQL',\n      5432: 'PostgreSQL',\n      6379: 'Redis',\n      27017: 'MongoDB'\n    };\n\n    if (commonPorts[port]) {\n      // This is just a warning, not an error\n      // Could be logged but not added to errors\n      this.errors.push({\n        field: 'port',\n        message: `Commonly used port: ${commonPorts[port]}`,\n        value: port\n      });\n    }\n  }\n\n  /**\n   * Validate protocol\n   */\n  private validateProtocol(_protocol: KoattyProtocol): void {\n    // const validProtocols: KoattyProtocol[] = ['http', 'https', 'http2', 'grpc', 'ws', 'wss'];\n    \n    // if (!validProtocols.includes(protocol)) {\n    //   // default to http\n    //   protocol = 'http';\n    // }\n    return;\n  }\n\n  /**\n   * Validate SSL configuration\n   * Note: Empty strings are allowed as they may be populated from app.config later\n   */\n  private validateSSLConfig(options: ListeningOptions): void {\n    const { ext } = options;\n    \n    if (!ext) {\n      // ext object doesn't exist, which is a problem for secure protocols\n      this.errors.push({\n        field: 'ext',\n        message: `SSL configuration (ext object) required for ${options.protocol} protocol`\n      });\n      return;\n    }\n\n    // ext.key and ext.cert can be empty strings if they will be populated later\n    // Only validate if they are not strings\n    if (ext.key !== undefined && typeof ext.key !== 'string') {\n      this.errors.push({\n        field: 'ext.key',\n        message: `SSL key must be a string (file path or content)`,\n        value: ext.key\n      });\n    }\n\n    if (ext.cert !== undefined && typeof ext.cert !== 'string') {\n      this.errors.push({\n        field: 'ext.cert',\n        message: `SSL certificate must be a string (file path or content)`,\n        value: ext.cert\n      });\n    }\n  }\n\n  /**\n   * Validate gRPC configuration\n   * Note: Empty strings are allowed as they may be populated from app.config later\n   */\n  private validateGrpcConfig(options: ListeningOptions): void {\n    const { ext } = options;\n    \n    if (!ext) {\n      this.errors.push({\n        field: 'ext',\n        message: 'gRPC configuration (ext object) required for grpc protocol'\n      });\n      return;\n    }\n\n    // ext.protoFile can be an empty string if it will be populated later\n    if (ext.protoFile !== undefined && typeof ext.protoFile !== 'string') {\n      this.errors.push({\n        field: 'ext.protoFile',\n        message: 'Proto file path must be a string',\n        value: ext.protoFile\n      });\n    }\n  }\n\n  /**\n   * Validate connection pool configuration\n   */\n  private validateConnectionPoolConfig(options: ListeningOptions): void {\n    const { connectionPool } = options;\n    \n    if (!connectionPool) return;\n\n    if (connectionPool.maxConnections !== undefined) {\n      if (!Number.isInteger(connectionPool.maxConnections) || connectionPool.maxConnections < 1) {\n        this.errors.push({\n          field: 'connectionPool.maxConnections',\n          message: 'maxConnections must be a positive integer',\n          value: connectionPool.maxConnections\n        });\n      }\n    }\n\n    if (connectionPool.connectionTimeout !== undefined) {\n      if (!Number.isInteger(connectionPool.connectionTimeout) || connectionPool.connectionTimeout < 0) {\n        this.errors.push({\n          field: 'connectionPool.connectionTimeout',\n          message: 'connectionTimeout must be a non-negative integer (milliseconds)',\n          value: connectionPool.connectionTimeout\n        });\n      }\n    }\n\n    if (connectionPool.keepAliveTimeout !== undefined) {\n      if (!Number.isInteger(connectionPool.keepAliveTimeout) || connectionPool.keepAliveTimeout < 0) {\n        this.errors.push({\n          field: 'connectionPool.keepAliveTimeout',\n          message: 'keepAliveTimeout must be a non-negative integer (milliseconds)',\n          value: connectionPool.keepAliveTimeout\n        });\n      }\n    }\n\n    if (connectionPool.requestTimeout !== undefined) {\n      if (!Number.isInteger(connectionPool.requestTimeout) || connectionPool.requestTimeout < 0) {\n        this.errors.push({\n          field: 'connectionPool.requestTimeout',\n          message: 'requestTimeout must be a non-negative integer (milliseconds)',\n          value: connectionPool.requestTimeout\n        });\n      }\n    }\n  }\n\n  /**\n   * Format validation errors as a readable message\n   */\n  static formatErrors(errors: ValidationError[]): string {\n    if (errors.length === 0) return '';\n    \n    const messages = errors.map(error => {\n      let msg = `  • ${error.field}: ${error.message}`;\n      if (error.value !== undefined) {\n        msg += ` (received: ${JSON.stringify(error.value)})`;\n      }\n      return msg;\n    });\n    \n    return `Configuration validation failed:\\n${messages.join('\\n')}`;\n  }\n}\n\n/**\n * Quick validation function\n * @param options Server listening options\n * @throws Error if validation fails\n */\nexport function validateConfig(options: ListeningOptions): void {\n  const validator = new ConfigValidator();\n  const result = validator.validate(options);\n  \n  if (!result.valid) {\n    throw new Error(ConfigValidator.formatErrors(result.errors));\n  }\n}\n\n","/*\n * @Description: \n * @Usage: \n * @Author: richen\n * @Date: 2023-12-09 12:02:29\n * @LastEditTime: 2024-12-03 16:23:54\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { KoattyApplication, KoattyServer, NativeServer } from \"koatty_core\";\nimport { createLogger, generateTraceId } from \"../utils/logger\";\nimport { validateConfig } from \"../utils/validator\";\nimport { GrpcServer } from \"./grpc\";\nimport { HttpServer as KoattyHttpServer } from \"./http\";\nimport { Http2Server } from \"./http2\";\nimport { Http3Server } from \"./http3\";\nimport { HttpsServer as KoattyHttpsServer } from \"./https\";\nimport { WsServer } from \"./ws\";\nimport { CreateTerminus } from \"../utils/terminus\";\nimport { ConfigHelper, ListeningOptions } from \"../config/config\";\n\n/**\n * Single protocol server\n */\nexport class SingleProtocolServer implements KoattyServer {\n  private app: KoattyApplication;\n  private serverInstance: KoattyServer | null = null; // Actual server instance\n  server: NativeServer | null = null; // Native server instance\n  private logger = createLogger({ module: 'KoattyServer' });\n\n  readonly protocol: string;\n  readonly options: ListeningOptions;\n  status: number = 0; // Server status\n  listenCallback?: () => void;\n\n  constructor(app: KoattyApplication, opt: ListeningOptions) {\n    this.app = app;\n    this.options = {\n      hostname: '127.0.0.1',\n      port: 3000,\n      protocol: 'http',\n      ...opt\n    };\n    \n    // Set protocol from options\n    this.protocol = this.options.protocol;\n    this.status = 0;\n\n    this.logger.info('Single protocol server initialized', {}, {\n      protocol: this.options.protocol,\n      hostname: this.options.hostname,\n      port: this.options.port\n    });\n\n    CreateTerminus(app, this);\n    \n    // Create server instance immediately to enable RegisterService calls\n    // Note: This creates the server wrapper but doesn't start listening yet\n    this.logger.info('About to call initializeServerInstance', {}, {\n      protocol: this.options.protocol\n    });\n    \n    try {\n      this.initializeServerInstance();\n      this.logger.info('initializeServerInstance completed successfully', {}, {\n        protocol: this.options.protocol,\n        hasServerInstance: !!this.serverInstance\n      });\n    } catch (error) {\n      this.logger.error('initializeServerInstance failed', {}, error);\n      throw error;\n    }\n  }\n  \n  /**\n   * Initialize server instance without starting it\n   * This allows RegisterService to be called before Start()\n   */\n  private initializeServerInstance(): void {\n    const protocolType = this.options.protocol;\n    const port = this.options.port;\n    \n    // Preserve all original options including connectionPool and any custom fields\n    const options: ListeningOptions = {\n      ...this.options,\n      hostname: this.options.hostname,\n      port,\n      protocol: protocolType,\n      trace: this.options.trace,\n      ext: {\n        ...this.options.ext\n      }\n    };\n\n    try {\n      // Simple initialization log - no traceId needed\n      this.logger.info('Initializing server instance', {}, {\n        protocol: protocolType,\n        port: port\n      });\n\n      // 确保 ext 配置存在\n      if (!options.ext) {\n        options.ext = {};\n      }\n\n      // Handle router specific options\n      const routerExt = this.app.config(\"config.RouterComponent\", \"plugin\") || {ext: {}};\n      \n      if (protocolType === \"graphql\") {\n        const schemaFile = routerExt.ext?.graphql?.schemaFile || options.ext.schemaFile;\n        if (schemaFile) {\n          options.ext.schemaFile = schemaFile;\n        }\n      }\n\n      if (protocolType === \"grpc\") {\n        const protoFile = routerExt.ext?.grpc?.protoFile || options.ext.protoFile;\n        if (protoFile) {\n          options.ext.protoFile = protoFile;\n        }\n      }\n      \n      // Handle SSL specific options (pass undefined for traceId since it's optional)\n      ConfigHelper.configureSSLForProtocol(protocolType, options, undefined);\n\n      // Create server instance but don't start it yet\n      const server = this.createServerInstance(protocolType, options);\n      this.serverInstance = server;\n      \n      // Simple completion log - no traceId needed\n      this.logger.info('Server instance initialized', {}, {\n        protocol: protocolType,\n        hasRegisterService: typeof (server as any).RegisterService === 'function'\n      });\n\n    } catch (error) {\n      // Error logs keep traceId for troubleshooting\n      const errorTraceId = generateTraceId();\n      this.logger.error('Failed to initialize server instance', { \n        traceId: errorTraceId, \n        protocol: protocolType, \n        port: port \n      }, error);\n      throw error;\n    }\n  }\n\n  /**\n   * Start server\n   */\n  Start(listenCallback?: () => void): any {\n    this.listenCallback = listenCallback;\n    \n    try {\n      // Simple startup log - no traceId needed for single-line status\n      this.logger.info('Server starting', {}, {\n        protocol: this.options.protocol,\n        hostname: this.options.hostname,\n        port: this.options.port\n      });\n\n      if (!this.serverInstance) {\n        throw new Error('Server instance not initialized');\n      }\n      \n      // Start the already-created server instance\n      this.serverInstance.Start(() => {\n        try {\n          // Set the native server instance\n          if (typeof (this.serverInstance as any).getNativeServer === 'function') {\n            this.server = (this.serverInstance as any).getNativeServer();\n          }\n          \n          // Update status to indicate server is running\n          this.status = 200;\n          \n          // Simple completion log - no traceId needed\n          this.logger.info('Server started', {}, {\n            protocol: this.options.protocol,\n            port: this.options.port\n          });\n\n          if (this.listenCallback) {\n            this.listenCallback();\n          }\n        } catch (error) {\n          // Error logs keep traceId for troubleshooting\n          const errorTraceId = generateTraceId();\n          this.logger.error('Error in server start callback', { traceId: errorTraceId }, error);\n          this.status = 500;\n        }\n      });\n      \n      return this;\n    } catch (error) {\n      // Error logs keep traceId for troubleshooting\n      const errorTraceId = generateTraceId();\n      this.logger.error('Server start error', { traceId: errorTraceId }, error);\n      throw error;\n    }\n  }\n\n  /**\n   * Stop server\n   */\n  Stop(callback?: () => void): void {\n    // Simple stop log - no traceId needed\n    this.logger.info('Server stopping', {}, {\n      protocol: this.options.protocol,\n      port: this.options.port\n    });\n\n    if (this.serverInstance && typeof this.serverInstance.Stop === 'function') {\n      this.serverInstance.Stop(() => {\n        this.serverInstance = null;\n        this.server = null;\n        this.status = 0;\n        this.logger.info('Server stopped', {});\n        if (callback) callback();\n      });\n    } else {\n      this.logger.warn('Server has no Stop method', {});\n      this.serverInstance = null;\n      this.server = null;\n      this.status = 0;\n      if (callback) callback();\n    }\n  }\n\n  /**\n   * Register Service for gRPC server\n   */\n  RegisterService(impl: (...args: any[]) => any) {\n    if (this.serverInstance && typeof (this.serverInstance as any).RegisterService === 'function') {\n      return (this.serverInstance as any).RegisterService(impl);\n    }\n    \n    this.logger.warn('Server does not support RegisterService method');\n    return undefined;\n  }\n\n  /**\n   * Get server status\n   * @returns \n   */\n  getStatus(): number {\n    return this.status;\n  }\n\n  /**\n   * Get native server\n   * @returns \n   */\n  getNativeServer(): NativeServer {\n    if (this.server) {\n      return this.server;\n    }\n    \n    // Fallback: try to get from server instance\n    if (this.serverInstance && typeof (this.serverInstance as any).getNativeServer === 'function') {\n      this.server = (this.serverInstance as any).getNativeServer();\n      return this.server;\n    }\n    \n    throw new Error('Native server not available. Server may not be started.');\n  }\n\n  /**\n   * Get server health status\n   * @returns Health status information\n   */\n  getHealthStatus(): {\n    status: 'healthy' | 'degraded' | 'unhealthy';\n    checks: {\n      server: { \n        status: string; \n        uptime: number;\n        protocol: string;\n        port: number;\n      };\n      connectionPool?: { \n        status: string; \n        activeConnections: number;\n        maxConnections: number;\n        utilizationRate: number;\n      };\n    };\n    timestamp: number;\n  } {\n    const startTime = (this.serverInstance as any)?.startTime ?? Date.now();\n    \n    const checks: any = {\n      server: {\n        status: this.status === 200 ? 'healthy' : 'unhealthy',\n        uptime: Date.now() - startTime,\n        protocol: this.options.protocol,\n        port: this.options.port\n      }\n    };\n\n    // Get connection pool health status\n    if (this.serverInstance && \n        typeof (this.serverInstance as any).getConnectionPoolHealth === 'function') {\n      try {\n        const poolHealth = (this.serverInstance as any).getConnectionPoolHealth();\n        if (poolHealth) {\n          checks.connectionPool = {\n            status: poolHealth.status || 'unknown',\n            activeConnections: poolHealth.activeConnections || 0,\n            maxConnections: poolHealth.maxConnections || 0,\n            utilizationRate: poolHealth.utilizationRate || 0\n          };\n        }\n      } catch (error) {\n        this.logger.debug('Failed to get connection pool health', {}, error);\n      }\n    }\n\n    // Determine overall health status\n    let overallStatus: 'healthy' | 'degraded' | 'unhealthy' = 'healthy';\n    \n    if (checks.server.status === 'unhealthy' || this.status !== 200) {\n      overallStatus = 'unhealthy';\n    } else if (checks.connectionPool) {\n      if (checks.connectionPool.status === 'degraded') {\n        overallStatus = 'degraded';\n      } else if (checks.connectionPool.status === 'overloaded' || \n                 checks.connectionPool.utilizationRate > 0.9) {\n        overallStatus = 'degraded';\n      }\n    }\n\n    return {\n      status: overallStatus,\n      checks,\n      timestamp: Date.now()\n    };\n  }\n\n  /**\n   * Get server metrics in Prometheus format\n   * @returns Prometheus-formatted metrics\n   */\n  getMetrics(): string {\n    const health = this.getHealthStatus();\n    const metrics: string[] = [];\n\n    // Server status metric\n    metrics.push('# HELP koatty_server_status Server status (1=running, 0=stopped)');\n    metrics.push('# TYPE koatty_server_status gauge');\n    metrics.push(`koatty_server_status{protocol=\"${this.options.protocol}\",port=\"${this.options.port}\"} ${this.status === 200 ? 1 : 0}`);\n\n    // Server uptime metric\n    metrics.push('# HELP koatty_server_uptime_seconds Server uptime in seconds');\n    metrics.push('# TYPE koatty_server_uptime_seconds counter');\n    metrics.push(`koatty_server_uptime_seconds{protocol=\"${this.options.protocol}\"} ${(health.checks.server.uptime / 1000).toFixed(2)}`);\n\n    // Connection pool metrics\n    if (health.checks.connectionPool) {\n      const pool = health.checks.connectionPool;\n      \n      metrics.push('# HELP koatty_connection_pool_active Active connections');\n      metrics.push('# TYPE koatty_connection_pool_active gauge');\n      metrics.push(`koatty_connection_pool_active{protocol=\"${this.options.protocol}\"} ${pool.activeConnections}`);\n\n      metrics.push('# HELP koatty_connection_pool_max Maximum connections');\n      metrics.push('# TYPE koatty_connection_pool_max gauge');\n      metrics.push(`koatty_connection_pool_max{protocol=\"${this.options.protocol}\"} ${pool.maxConnections}`);\n\n      metrics.push('# HELP koatty_connection_pool_utilization Connection pool utilization rate (0-1)');\n      metrics.push('# TYPE koatty_connection_pool_utilization gauge');\n      metrics.push(`koatty_connection_pool_utilization{protocol=\"${this.options.protocol}\"} ${pool.utilizationRate.toFixed(4)}`);\n    }\n\n    // Get detailed metrics from server instance\n    if (this.serverInstance && \n        typeof (this.serverInstance as any).getConnectionStats === 'function') {\n      try {\n        const stats = (this.serverInstance as any).getConnectionStats();\n        \n        if (stats) {\n          metrics.push('# HELP koatty_connections_total Total connections since start');\n          metrics.push('# TYPE koatty_connections_total counter');\n          metrics.push(`koatty_connections_total{protocol=\"${this.options.protocol}\"} ${stats.totalConnections || 0}`);\n\n          metrics.push('# HELP koatty_connections_per_second Connections per second');\n          metrics.push('# TYPE koatty_connections_per_second gauge');\n          metrics.push(`koatty_connections_per_second{protocol=\"${this.options.protocol}\"} ${(stats.connectionsPerSecond || 0).toFixed(2)}`);\n\n          metrics.push('# HELP koatty_connection_latency_seconds Average connection latency');\n          metrics.push('# TYPE koatty_connection_latency_seconds gauge');\n          metrics.push(`koatty_connection_latency_seconds{protocol=\"${this.options.protocol}\"} ${((stats.averageLatency || 0) / 1000).toFixed(4)}`);\n\n          metrics.push('# HELP koatty_connection_error_rate Error rate (0-1)');\n          metrics.push('# TYPE koatty_connection_error_rate gauge');\n          metrics.push(`koatty_connection_error_rate{protocol=\"${this.options.protocol}\"} ${(stats.errorRate || 0).toFixed(4)}`);\n        }\n      } catch (error) {\n        this.logger.debug('Failed to get connection stats', {}, error);\n      }\n    }\n\n    return metrics.join('\\n');\n  }\n\n  /**\n   * Create health check middleware for Express/Koa\n   * @returns Middleware function\n   */\n  healthCheckMiddleware() {\n    return async (ctx: any, next: () => Promise<void>) => {\n      const path = ctx.path || ctx.url;\n      \n      // Health check endpoint\n      if (path === '/health' || path === '/healthz') {\n        const health = this.getHealthStatus();\n        ctx.status = health.status === 'healthy' ? 200 : 503;\n        ctx.type = 'application/json';\n        ctx.body = health;\n        return;\n      }\n      \n      // Metrics endpoint\n      if (path === '/metrics') {\n        ctx.status = 200;\n        ctx.type = 'text/plain; version=0.0.4';\n        ctx.body = this.getMetrics();\n        return;\n      }\n      \n      await next();\n    };\n  }\n\n\n  /**\n   * Create server instance based on protocol\n   */\n  private createServerInstance(protocolType: string, options: ListeningOptions): any {\n    const serverMap: Record<string, any> = {\n      grpc: GrpcServer,\n      ws: WsServer,\n      wss: WsServer,\n      https: KoattyHttpsServer,\n      http2: Http2Server,\n      http3: Http3Server,\n      http: KoattyHttpServer,\n      graphql: KoattyHttpServer,\n    };\n    let ServerConstructor = serverMap[protocolType] || KoattyHttpServer;\n    let actualProtocol = protocolType;\n    \n    // GraphQL automatically uses HTTP/2 when SSL is enabled\n    if (protocolType === \"graphql\" && options.ssl?.enabled) {\n        ServerConstructor = Http2Server;\n        actualProtocol = \"http2\";\n        // Set underlying protocol BEFORE creating server\n        if (!options.ext) {\n          options.ext = {};\n        }\n        options.ext._underlyingProtocol = actualProtocol;\n        options.ext._actualProtocol = actualProtocol;\n    } else if (protocolType === \"graphql\") {\n        actualProtocol = \"http\";\n        // Set underlying protocol BEFORE creating server\n        if (!options.ext) {\n          options.ext = {};\n        }\n        options.ext._underlyingProtocol = actualProtocol;\n        options.ext._actualProtocol = actualProtocol;\n    }\n    \n    return new ServerConstructor(this.app, options);\n  }\n\n}\n\n/**\n * Create Server\n *\n * @export\n * @param {KoattyApplication} app\n * @param {ListeningOptions} [opt]\n * @returns {*}  {KoattyServer}\n */\nexport function NewServe(app: KoattyApplication, opt?: ListeningOptions): KoattyServer {\n  // Safe port parsing with validation\n  const parsePort = (envPort: string | undefined): number => {\n    if (!envPort) return 3000;\n    const parsed = parseInt(envPort, 10);\n    return Number.isInteger(parsed) && parsed > 0 && parsed <= 65535 ? parsed : 3000;\n  };\n\n  const options: ListeningOptions = {\n    hostname: process.env.IP || '127.0.0.1',\n    port: parsePort(process.env.PORT || process.env.APP_PORT),\n    protocol: 'http',\n    ext: {\n      key: \"\",\n      cert: \"\",\n      protoFile: \"\",\n      server: null, // used by websocket\n    },\n    ...opt\n  };\n\n  // Validate configuration before creating server\n  try {\n    validateConfig(options);\n  } catch (error) {\n    const logger = createLogger({ module: 'serve' });\n    logger.error('Invalid server configuration', {}, error);\n    throw error;\n  }\n\n  // Create single-protocol server\n  return new SingleProtocolServer(app, options);\n}","/**\n * Connection Pool Metrics Integration\n * Provides integration between koatty-serve connection pools and Application performance metrics\n */\n\nimport { KoattyApplication } from \"koatty_core\";\nimport { ConnectionPoolFactory } from \"./factory\";\n\n/**\n * Register connection pool metrics callback with Application instance\n *\n * @param {KoattyApplication} app - Application instance\n * @returns {void}\n */\nexport function registerConnectionPoolMetrics(app: KoattyApplication): void {\n  if (typeof (app as any).setConnectionPoolMetricsCallback === 'function') {\n    (app as any).setConnectionPoolMetricsCallback(() => {\n      return ConnectionPoolFactory.getAllMetrics();\n    });\n  }\n}\n\n/**\n * Unregister connection pool metrics callback from Application instance\n *\n * @param {KoattyApplication} app - Application instance\n * @returns {void}\n */\nexport function unregisterConnectionPoolMetrics(app: KoattyApplication): void {\n  if (typeof (app as any).setConnectionPoolMetricsCallback === 'function') {\n    (app as any).setConnectionPoolMetricsCallback(() => ({}));\n  }\n}\n","/*\n * @Description: Serve Component for Koatty framework\n * @Usage:\n * @Author: richen\n * @Date: 2026-01-26 12:30:00\n * @LastEditTime: 2026-01-26 12:30: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 { NewServe } from './server/serve';\n\n/**\n * Serve Component\n * Responsible for initializing and managing server\n *\n * Implements IComponent interface (base interface)\n *\n * Event bindings:\n * - loadServe: Initialize server\n * - appStop: Gracefully shutdown server\n */\n@Component('ServeComponent', {\n  scope: 'core',\n  priority: 100,\n  version: '1.0.0',\n  description: 'HTTP/HTTPS/HTTP2/gRPC/WebSocket server for Koatty',\n  requires: [], // Router is optional dependency, not enforced\n})\nexport class ServeComponent implements IComponent {\n  events?: Record<string, string[]>;\n  /**\n   * Initialize server\n   */\n  @OnEvent(AppEvent.loadServe)\n  async initServer(app: KoattyApplication): Promise<void> {\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 servers for protocols: ${protocols.join(', ')}`);\n\n    if (protocols.length > 1) {\n      // Multi-protocol servers\n      const servers: any[] = [];\n      const basePort = Helper.isArray(serveOpts.port) ? serveOpts.port : [serveOpts.port];\n      const ports: number[] = [];\n\n      const portMap: Map<number, string> = new Map();\n      for (let i = 0; i < protocols.length; i++) {\n        let assignedPort: number;\n        if (i < basePort.length) {\n          assignedPort = Helper.toNumber(basePort[i]);\n        } else {\n          assignedPort = Helper.toNumber(basePort[0]) + i;\n        }\n\n        const existingProtocol = portMap.get(assignedPort);\n        if (existingProtocol) {\n          const newPort = assignedPort + protocols.length;\n          Logger.Warn('ServeComponent', \n            `Port ${assignedPort} is already in use by ${existingProtocol}. Auto-assigning port ${newPort} for ${protocols[i]}.`);\n          assignedPort = newPort;\n        } else if (i >= basePort.length) {\n          Logger.Warn('ServeComponent', \n            `No port configured for ${protocols[i]}. Auto-assigning port ${assignedPort}.`);\n        }\n\n        ports.push(assignedPort);\n        portMap.set(assignedPort, protocols[i]);\n      }\n\n      for (let i = 0; i < protocols.length; i++) {\n        const proto = protocols[i];\n        const protoServerOpts = { ...serveOpts, protocol: proto, port: ports[i] };\n        servers.push(NewServe(app, protoServerOpts));\n      }\n\n      Helper.define(app, \"server\", servers);\n    } else {\n      // Single-protocol server\n      const singleProto = protocols[0];\n      const singleServerOpts = { protocol: singleProto, ...serveOpts };\n      const server = NewServe(app, singleServerOpts);\n      Helper.define(app, \"server\", server);\n    }\n\n    Logger.Log('Koatty', '', '✓ Server initialized');\n  }\n\n  /**\n   * Gracefully shutdown server on app stop\n   *\n   * Note: Original appStop event handling triggered by terminus\n   * is now unified to be handled by @OnEvent(AppEvent.appStop) decorator\n   */\n  @OnEvent(AppEvent.appStop)\n  async stopServer(app: KoattyApplication): Promise<void> {\n    const server = app.server as any;\n    if (!server) return;\n\n    Logger.Log('Koatty', '', 'ServeComponent: Gracefully stopping server...');\n\n    try {\n      if (Helper.isArray(server)) {\n        // Multi-protocol: Stop all servers in parallel\n        await Promise.all(server.map((s: any) =>\n          new Promise<void>((resolve) => {\n            if (s.Stop) {\n              s.Stop(() => resolve());\n            } else {\n              resolve();\n            }\n          })\n        ));\n      } else {\n        // Single-protocol: Stop single server\n        await new Promise<void>((resolve) => {\n          if (server.Stop) {\n            server.Stop(() => resolve());\n          } else {\n            resolve();\n          }\n        });\n      }\n      Logger.Log('Koatty', '', '✓ Server stopped gracefully');\n    } catch (error) {\n      Logger.Error('ServeComponent: Error stopping server:', error);\n    }\n  }\n\n}\n","import { IncomingMessage, ServerResponse } from 'http';\n\nexport interface RateLimitOptions {\n  enabled?: boolean;\n  windowMs?: number;\n  max?: number;\n  keyGenerator?: (req: IncomingMessage) => string;\n  message?: string;\n  skipSuccessfulRequests?: boolean;\n}\n\ninterface RateLimitEntry {\n  count: number;\n  resetTime: number;\n}\n\nconst defaultOptions: Required<RateLimitOptions> = {\n  enabled: false,\n  windowMs: 60000,\n  max: 100,\n  keyGenerator: (req: IncomingMessage) => {\n    return req.socket?.remoteAddress || 'unknown';\n  },\n  message: 'Too many requests',\n  skipSuccessfulRequests: false,\n};\n\nexport function createRateLimitMiddleware(options: RateLimitOptions = {}) {\n  const config = { ...defaultOptions, ...options };\n  if (!config.enabled) {\n    return null;\n  }\n\n  const store = new Map<string, RateLimitEntry>();\n\n  const cleanupTimer = setInterval(() => {\n    const now = Date.now();\n    for (const [key, entry] of store) {\n      if (now > entry.resetTime) {\n        store.delete(key);\n      }\n    }\n  }, config.windowMs);\n  cleanupTimer.unref();\n\n  return async (req: IncomingMessage, res: ServerResponse, next: () => Promise<void>) => {\n    const key = config.keyGenerator(req);\n    const now = Date.now();\n\n    let entry = store.get(key);\n    if (!entry || now > entry.resetTime) {\n      entry = { count: 0, resetTime: now + config.windowMs };\n      store.set(key, entry);\n    }\n\n    entry.count++;\n    const remaining = Math.max(0, config.max - entry.count);\n    const resetTimeSeconds = Math.ceil((entry.resetTime - now) / 1000);\n\n    res.setHeader('X-RateLimit-Limit', String(config.max));\n    res.setHeader('X-RateLimit-Remaining', String(remaining));\n    res.setHeader('X-RateLimit-Reset', String(resetTimeSeconds));\n\n    if (entry.count > config.max) {\n      res.writeHead(429, { 'Content-Type': 'application/json' });\n      res.end(JSON.stringify({ error: config.message }));\n      return;\n    }\n\n    await next();\n\n    if (config.skipSuccessfulRequests && (res.statusCode || 200) < 400) {\n      entry.count--;\n    }\n  };\n}\n"]}