nextrush 2.0.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +144 -1231
- package/dist/class.d.ts +3 -0
- package/dist/class.js +60 -0
- package/dist/class.js.map +1 -0
- package/dist/index.d.ts +56 -2283
- package/dist/index.js +58 -9049
- package/dist/index.js.map +1 -1
- package/package.json +68 -100
- package/dist/index.d.mts +0 -2316
- package/dist/index.mjs +0 -9016
- package/dist/index.mjs.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/middleware/body-parser/utils.ts","../src/errors/custom-errors/index.ts","../src/core/middleware/body-parser/http-error.ts","../src/core/middleware/body-parser/json-parser.ts","../src/core/middleware/body-parser/url-encoded-parser.ts","../src/core/middleware/body-parser/multipart-parser.ts","../src/core/middleware/body-parser/text-raw-parsers.ts","../src/utils/cookies.ts","../src/core/enhancers/request-enhancer.ts","../src/utils/header-buffers.ts","../src/core/enhancers/response-enhancer.ts","../src/core/app/context.ts","../src/core/router/optimized-router.ts","../src/core/app/application.ts","../src/plugins/core/base-plugin.ts","../src/plugins/logger/logger-types.ts","../src/plugins/logger/logger-transports.ts","../src/plugins/logger/logger-core.ts","../src/plugins/logger/logger-factories.ts","../src/core/config/validation.ts","../src/core/di/container.ts","../src/core/middleware/body-parser/index.ts","../src/core/middleware/compression.ts","../src/core/middleware/cors.ts","../src/core/middleware/helmet.ts","../src/core/middleware/logger.ts","../src/core/middleware/rate-limiter.ts","../src/core/middleware/request-id.ts","../src/core/middleware/timer.ts","../src/core/di/middleware-factory.ts","../src/core/context/immutable.ts","../src/core/events/event-emitter.ts","../src/core/events/event-store.ts","../src/core/events/event-system.ts","../src/core/events/simple-events.ts","../src/core/compiler/di-preloader.ts","../src/core/compiler/route-compiler.ts","../src/core/compiler/index.ts","../src/index.ts","../src/plugins/static-files/static-utils.ts","../src/plugins/static-files/static-files.plugin.ts","../src/plugins/template/engine/simple-engine.ts","../src/plugins/template/template.plugin.ts","../src/plugins/websocket/connection.ts","../src/plugins/websocket/room-manager.ts","../src/plugins/websocket/types.ts","../src/types/context.ts","../src/plugins/websocket/handshake.ts","../src/plugins/websocket/websocket.plugin.ts"],"names":["StringDecoder","reject","NextRushError","BadRequestError","UnauthorizedError","ForbiddenError","NotFoundError","MethodNotAllowedError","ConflictError","UnprocessableEntityError","TooManyRequestsError","InternalServerError","ServiceUnavailableError","ValidationError","AuthenticationError","AuthorizationError","DatabaseError","NetworkError","TimeoutError","RateLimitError","ErrorFactory","GlobalExceptionFilter","ValidationExceptionFilter","AuthenticationExceptionFilter","AuthorizationExceptionFilter","NotFoundExceptionFilter","RateLimitExceptionFilter","parseTime","url","URL","statSync","createReadStream","extname","createHash","method","path","routeData","LogLevel","requestId","logger","getJsonParser","getUrlEncodedParser","getMultipartParser","getTextParser","getRawParser","resolve","loadavg","cpus","Transform","createGzip","createDeflate","constants","createBrotliCompress","maxRequests","process","container","NodeEventEmitter","performance","randomUUID","EventEmitter","createServer","index","dispatch","normalize","sep","fsp","stream","join","readFileSync","val"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 🚀 Body Parser Utilities - NextRush v2\n *\n * Shared utilities for all body parsers with performance optimizations\n *\n * @author NextRush Framework Team\n * @version 2.0.0\n */\n\nimport { StringDecoder } from 'string_decoder';\n\n/**\n * 💾 Buffer pool for memory optimization\n */\nclass BufferPool {\n private pool: Buffer[] = [];\n private readonly maxSize: number;\n private readonly bufferSize: number;\n\n constructor(maxSize = 100, bufferSize = 1024 * 64) {\n // 64KB default\n this.maxSize = maxSize;\n this.bufferSize = bufferSize;\n }\n\n /**\n * 🎯 Acquire buffer from pool\n */\n acquire(size: number): Buffer {\n if (size <= this.bufferSize && this.pool.length > 0) {\n const buffer = this.pool.pop()!;\n return buffer.subarray(0, size);\n }\n return Buffer.allocUnsafe(size);\n }\n\n /**\n * 🔄 Return buffer to pool\n */\n release(buffer: Buffer): void {\n if (buffer.length === this.bufferSize && this.pool.length < this.maxSize) {\n buffer.fill(0); // Clear sensitive data\n this.pool.push(buffer);\n }\n }\n\n /**\n * 📊 Get pool statistics\n */\n getStats(): { poolSize: number; maxSize: number; bufferSize: number } {\n return {\n poolSize: this.pool.length,\n maxSize: this.maxSize,\n bufferSize: this.bufferSize,\n };\n }\n}\n\n/**\n * 🌍 Global buffer pool instance\n */\nconst globalBufferPool = new BufferPool();\n\n/**\n * ⚡ Optimized buffer to string conversion\n * Uses StringDecoder for better performance with UTF-8\n */\nexport function optimizedBufferToString(\n buffer: Buffer,\n encoding: BufferEncoding = 'utf8'\n): string {\n if (buffer.length === 0) return '';\n\n // Fast path for small buffers\n if (buffer.length < 1024) {\n return buffer.toString(encoding);\n }\n\n // Use StringDecoder for better performance with large UTF-8 buffers\n if (encoding === 'utf8') {\n const decoder = new StringDecoder('utf8');\n return decoder.write(buffer) + decoder.end();\n }\n\n return buffer.toString(encoding);\n}\n\n/**\n * 🎯 Check if data is empty\n */\nexport function isEmpty(data: unknown): boolean {\n if (data == null) return true;\n\n if (typeof data === 'string') return data.length === 0;\n if (typeof data === 'number') return false;\n if (typeof data === 'boolean') return false;\n if (Buffer.isBuffer(data)) return data.length === 0;\n\n if (Array.isArray(data)) return data.length === 0;\n\n if (typeof data === 'object') {\n return Object.keys(data as Record<string, unknown>).length === 0;\n }\n\n return false;\n}\n\n/**\n * 🔍 Detect content type from buffer\n */\nexport function detectContentType(buffer: Buffer): string {\n if (buffer.length === 0) return 'application/octet-stream';\n\n // Check for common content type signatures\n const start = buffer.subarray(0, Math.min(512, buffer.length));\n const startStr = start.toString('utf8', 0, Math.min(100, start.length));\n\n // JSON detection\n if (/^[\\s]*[{[]/.test(startStr)) {\n return 'application/json';\n }\n\n // XML detection\n if (/^[\\s]*<\\?xml|^[\\s]*<[a-zA-Z]/.test(startStr)) {\n return 'application/xml';\n }\n\n // HTML detection\n if (/^[\\s]*<!DOCTYPE|^[\\s]*<html/i.test(startStr)) {\n return 'text/html';\n }\n\n // Form data detection\n if (startStr.includes('=') && startStr.includes('&')) {\n return 'application/x-www-form-urlencoded';\n }\n\n // Binary file signatures\n const signature = start.subarray(0, 4);\n\n // PNG\n if (\n signature.length >= 4 &&\n signature[0] === 0x89 &&\n signature[1] === 0x50 &&\n signature[2] === 0x4e &&\n signature[3] === 0x47\n ) {\n return 'image/png';\n }\n\n // JPEG\n if (signature.length >= 2 && signature[0] === 0xff && signature[1] === 0xd8) {\n return 'image/jpeg';\n }\n\n // PDF\n if (startStr.startsWith('%PDF')) {\n return 'application/pdf';\n }\n\n // Default to text if printable ASCII, otherwise binary\n return isPrintableAscii(startStr) ? 'text/plain' : 'application/octet-stream';\n}\n\n/**\n * 🔤 Check if string contains only printable ASCII characters\n */\nfunction isPrintableAscii(str: string): boolean {\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n if (code < 32 && code !== 9 && code !== 10 && code !== 13) {\n return false; // Non-printable control character (except tab, LF, CR)\n }\n if (code > 126) {\n return false; // Non-ASCII character\n }\n }\n return true;\n}\n\n/**\n * 📏 Validate content length\n */\nexport function validateContentLength(\n buffer: Buffer,\n maxSize: number,\n contentLength?: number\n): void {\n if (buffer.length > maxSize) {\n throw new Error(\n `Request body too large: ${buffer.length} bytes (max: ${maxSize})`\n );\n }\n\n if (contentLength && contentLength !== buffer.length) {\n throw new Error(\n `Content-Length mismatch: declared ${contentLength}, actual ${buffer.length}`\n );\n }\n}\n\n/**\n * 🕐 Create timeout promise\n */\nexport function createTimeoutPromise(timeoutMs: number): Promise<never> {\n return new Promise((_, reject) => {\n setTimeout(() => {\n reject(new Error(`Body parsing timeout after ${timeoutMs}ms`));\n }, timeoutMs);\n });\n}\n\n/**\n * 🎭 Parse query string efficiently\n */\nexport function parseQueryString(\n queryString: string\n): Record<string, string | string[]> {\n const params: Record<string, string | string[]> = {};\n\n if (!queryString || queryString.length === 0) {\n return params;\n }\n\n const pairs = queryString.split('&');\n\n for (const pair of pairs) {\n if (pair.length === 0) continue;\n\n const equalIndex = pair.indexOf('=');\n const key = equalIndex >= 0 ? pair.slice(0, equalIndex) : pair;\n const value = equalIndex >= 0 ? pair.slice(equalIndex + 1) : '';\n\n if (!key) continue;\n\n const decodedKey = decodeURIComponent(key);\n const decodedValue = decodeURIComponent(value);\n\n if (decodedKey in params) {\n // Convert to array if multiple values\n const existing = params[decodedKey];\n if (Array.isArray(existing)) {\n existing.push(decodedValue);\n } else {\n params[decodedKey] = [existing as string, decodedValue];\n }\n } else {\n params[decodedKey] = decodedValue;\n }\n }\n\n return params;\n}\n\n/**\n * 🚀 High-performance string escape for JSON\n */\nexport function escapeJsonString(str: string): string {\n // Use more compliant regex pattern\n const escapeRegex = /[\\\\\"]/g;\n return str.replace(escapeRegex, char => {\n switch (char) {\n case '\\\\':\n return '\\\\\\\\';\n case '\"':\n return '\\\\\"';\n default:\n return char;\n }\n });\n}\n\n/**\n * 📊 Performance measurement utility\n */\nexport class PerformanceTimer {\n private startTime: number;\n\n constructor() {\n this.startTime = performance.now();\n }\n\n /**\n * 🕐 Get elapsed time in milliseconds\n */\n elapsed(): number {\n return performance.now() - this.startTime;\n }\n\n /**\n * 🔄 Reset timer\n */\n reset(): void {\n this.startTime = performance.now();\n }\n}\n\n/**\n * 🗂️ Export buffer pool for advanced usage\n */\nexport { BufferPool, globalBufferPool };\n\n/**\n * 🔧 Utility to get buffer from pool\n */\nexport function getPooledBuffer(size: number): Buffer {\n return globalBufferPool.acquire(size);\n}\n\n/**\n * 🔄 Utility to return buffer to pool\n */\nexport function releasePooledBuffer(buffer: Buffer): void {\n globalBufferPool.release(buffer);\n}\n","/**\n * Custom error classes for NextRush v2\n *\n * @packageDocumentation\n */\n\n/**\n * Base error class for NextRush v2\n */\nexport class NextRushError extends Error {\n public readonly statusCode: number;\n public readonly code: string;\n public readonly isOperational: boolean;\n public readonly timestamp: Date;\n\n constructor(\n message: string,\n statusCode: number = 500,\n code: string = 'INTERNAL_SERVER_ERROR',\n isOperational: boolean = true\n ) {\n super(message);\n this.name = 'NextRushError';\n this.statusCode = statusCode;\n this.code = code;\n this.isOperational = isOperational;\n this.timestamp = new Date();\n\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, NextRushError);\n }\n }\n\n /**\n * Create error from HTTP status code\n */\n public static fromStatusCode(\n statusCode: number,\n message?: string\n ): NextRushError {\n const defaultMessages: Record<number, string> = {\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 403: 'Forbidden',\n 404: 'Not Found',\n 405: 'Method Not Allowed',\n 409: 'Conflict',\n 422: 'Unprocessable Entity',\n 429: 'Too Many Requests',\n 500: 'Internal Server Error',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n 504: 'Gateway Timeout',\n };\n\n return new NextRushError(\n message || defaultMessages[statusCode] || 'Unknown Error',\n statusCode,\n this.getErrorCode(statusCode)\n );\n }\n\n /**\n * Get error code from status code\n */\n private static getErrorCode(statusCode: number): string {\n const errorCodes: Record<number, string> = {\n 400: 'BAD_REQUEST',\n 401: 'UNAUTHORIZED',\n 403: 'FORBIDDEN',\n 404: 'NOT_FOUND',\n 405: 'METHOD_NOT_ALLOWED',\n 409: 'CONFLICT',\n 422: 'UNPROCESSABLE_ENTITY',\n 429: 'TOO_MANY_REQUESTS',\n 500: 'INTERNAL_SERVER_ERROR',\n 502: 'BAD_GATEWAY',\n 503: 'SERVICE_UNAVAILABLE',\n 504: 'GATEWAY_TIMEOUT',\n };\n\n return errorCodes[statusCode] || 'UNKNOWN_ERROR';\n }\n\n /**\n * Convert error to JSON\n */\n public toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n statusCode: this.statusCode,\n code: this.code,\n timestamp: this.timestamp.toISOString(),\n stack: this.stack,\n };\n }\n}\n\n/**\n * Plugin-specific error class\n */\nexport class PluginError extends NextRushError {\n public readonly pluginName: string;\n\n constructor(\n message: string,\n pluginName: string = 'unknown',\n statusCode: number = 500\n ) {\n super(message, statusCode, 'PLUGIN_ERROR');\n this.name = 'PluginError';\n this.pluginName = pluginName;\n }\n\n /**\n * Create plugin error for installation issues\n */\n public static installationFailed(\n pluginName: string,\n reason: string\n ): PluginError {\n return new PluginError(\n `Plugin ${pluginName} installation failed: ${reason}`,\n pluginName,\n 500\n );\n }\n\n /**\n * Create plugin error for configuration issues\n */\n public static configurationError(\n pluginName: string,\n field: string,\n value: unknown\n ): PluginError {\n return new PluginError(\n `Plugin ${pluginName} configuration error: Invalid ${field} = ${value}`,\n pluginName,\n 500\n );\n }\n\n /**\n * Create plugin error for dependency issues\n */\n public static dependencyError(\n pluginName: string,\n dependency: string\n ): PluginError {\n return new PluginError(\n `Plugin ${pluginName} dependency error: Missing ${dependency}`,\n pluginName,\n 500\n );\n }\n}\n\n/**\n * Bad Request Error (400)\n */\nexport class BadRequestError extends NextRushError {\n constructor(message: string = 'Bad Request') {\n super(message, 400, 'BAD_REQUEST');\n }\n}\n\n/**\n * Unauthorized Error (401)\n */\nexport class UnauthorizedError extends NextRushError {\n constructor(message: string = 'Unauthorized') {\n super(message, 401, 'UNAUTHORIZED');\n }\n}\n\n/**\n * Forbidden Error (403)\n */\nexport class ForbiddenError extends NextRushError {\n constructor(message: string = 'Forbidden') {\n super(message, 403, 'FORBIDDEN');\n }\n}\n\n/**\n * Not Found Error (404)\n */\nexport class NotFoundError extends NextRushError {\n constructor(message: string = 'Not Found') {\n super(message, 404, 'NOT_FOUND');\n }\n}\n\n/**\n * Method Not Allowed Error (405)\n */\nexport class MethodNotAllowedError extends NextRushError {\n constructor(message: string = 'Method Not Allowed') {\n super(message, 405, 'METHOD_NOT_ALLOWED');\n }\n}\n\n/**\n * Conflict Error (409)\n */\nexport class ConflictError extends NextRushError {\n constructor(message: string = 'Conflict') {\n super(message, 409, 'CONFLICT');\n }\n}\n\n/**\n * Unprocessable Entity Error (422)\n */\nexport class UnprocessableEntityError extends NextRushError {\n constructor(message: string = 'Unprocessable Entity') {\n super(message, 422, 'UNPROCESSABLE_ENTITY');\n }\n}\n\n/**\n * Too Many Requests Error (429)\n */\nexport class TooManyRequestsError extends NextRushError {\n constructor(message: string = 'Too Many Requests') {\n super(message, 429, 'TOO_MANY_REQUESTS');\n }\n}\n\n/**\n * Internal Server Error (500)\n */\nexport class InternalServerError extends NextRushError {\n constructor(message: string = 'Internal Server Error') {\n super(message, 500, 'INTERNAL_SERVER_ERROR');\n }\n}\n\n/**\n * Service Unavailable Error (503)\n */\nexport class ServiceUnavailableError extends NextRushError {\n constructor(message: string = 'Service Unavailable') {\n super(message, 503, 'SERVICE_UNAVAILABLE');\n }\n}\n\n/**\n * Validation Error (400)\n */\nexport class ValidationError extends NextRushError {\n public readonly field: string;\n public readonly value: unknown;\n\n constructor(\n message: string,\n field: string = 'unknown',\n value: unknown = undefined,\n statusCode: number = 400\n ) {\n super(message, statusCode, 'VALIDATION_ERROR');\n this.field = field;\n this.value = value;\n }\n\n /**\n * Create validation error for specific field\n */\n public static forField(\n field: string,\n message: string,\n value?: unknown\n ): ValidationError {\n return new ValidationError(message, field, value);\n }\n\n /**\n * Create validation error for multiple fields\n */\n public static forFields(\n errors: Array<{ field: string; message: string; value?: unknown }>\n ): ValidationError {\n const message = `Validation failed for ${errors.length} field(s)`;\n const error = new ValidationError(message);\n (error as any).errors = errors;\n return error;\n }\n}\n\n/**\n * Authentication Error (401)\n */\nexport class AuthenticationError extends NextRushError {\n constructor(message: string = 'Authentication required') {\n super(message, 401, 'AUTHENTICATION_ERROR');\n }\n}\n\n/**\n * Authorization Error (403)\n */\nexport class AuthorizationError extends NextRushError {\n constructor(message: string = 'Insufficient permissions') {\n super(message, 403, 'AUTHORIZATION_ERROR');\n }\n}\n\n/**\n * Database Error (500)\n */\nexport class DatabaseError extends NextRushError {\n public readonly operation: string;\n public readonly table: string | undefined;\n\n constructor(\n message: string,\n operation: string = 'unknown',\n table?: string,\n statusCode: number = 500\n ) {\n super(message, statusCode, 'DATABASE_ERROR');\n this.operation = operation;\n this.table = table;\n }\n}\n\n/**\n * Network Error (502)\n */\nexport class NetworkError extends NextRushError {\n public readonly host: string;\n public readonly port: number;\n\n constructor(message: string, host: string, port: number) {\n super(message, 502, 'NETWORK_ERROR');\n this.host = host;\n this.port = port;\n }\n}\n\n/**\n * Timeout Error (408)\n */\nexport class TimeoutError extends NextRushError {\n constructor(message: string = 'Request timeout') {\n super(message, 408, 'TIMEOUT_ERROR');\n }\n}\n\n/**\n * Rate Limit Error (429)\n */\nexport class RateLimitError extends NextRushError {\n public readonly retryAfter: number;\n\n constructor(\n message: string = 'Rate limit exceeded',\n retryAfter: number = 60\n ) {\n super(message, 429, 'RATE_LIMIT_ERROR');\n this.retryAfter = retryAfter;\n }\n}\n\n/**\n * Error Factory for creating common errors\n */\nexport class ErrorFactory {\n /**\n * Create validation error\n */\n public static validation(\n field: string,\n message: string,\n value?: unknown\n ): ValidationError {\n return ValidationError.forField(field, message, value);\n }\n\n /**\n * Create not found error\n */\n public static notFound(resource: string): NotFoundError {\n return new NotFoundError(`${resource} not found`);\n }\n\n /**\n * Create unauthorized error\n */\n public static unauthorized(message?: string): AuthenticationError {\n return new AuthenticationError(message);\n }\n\n /**\n * Create forbidden error\n */\n public static forbidden(message?: string): AuthorizationError {\n return new AuthorizationError(message);\n }\n\n /**\n * Create bad request error\n */\n public static badRequest(message?: string): BadRequestError {\n return new BadRequestError(message);\n }\n\n /**\n * Create conflict error\n */\n public static conflict(message?: string): ConflictError {\n return new ConflictError(message);\n }\n\n /**\n * Create internal server error\n */\n public static internal(message?: string): InternalServerError {\n return new InternalServerError(message);\n }\n\n /**\n * Create rate limit error\n */\n public static rateLimit(\n message?: string,\n retryAfter?: number\n ): RateLimitError {\n return new RateLimitError(message, retryAfter);\n }\n\n /**\n * Create timeout error\n */\n public static timeout(message?: string): TimeoutError {\n return new TimeoutError(message);\n }\n\n /**\n * Create service unavailable error\n */\n public static serviceUnavailable(message?: string): ServiceUnavailableError {\n return new ServiceUnavailableError(message);\n }\n\n /**\n * Create database error\n */\n public static database(\n message: string,\n operation: string,\n table?: string\n ): DatabaseError {\n return new DatabaseError(message, operation, table);\n }\n\n /**\n * Create network error\n */\n public static network(\n message: string,\n host: string,\n port: number\n ): NetworkError {\n return new NetworkError(message, host, port);\n }\n}\n\n/**\n * Exception Filter Interface (NestJS style)\n */\nexport interface ExceptionFilter {\n catch(error: Error, ctx: any): void | Promise<void>;\n}\n\n/**\n * Global Exception Filter\n */\nexport class GlobalExceptionFilter implements ExceptionFilter {\n async catch(error: Error, ctx: any): Promise<void> {\n let statusCode = 500;\n let message = 'Internal Server Error';\n let code = 'INTERNAL_SERVER_ERROR';\n\n // Handle NextRush errors\n if (error instanceof NextRushError) {\n statusCode = error.statusCode;\n message = error.message;\n code = error.code;\n }\n\n // Handle common Node.js errors\n if (error instanceof SyntaxError) {\n statusCode = 400;\n message = 'Invalid JSON';\n code = 'INVALID_JSON';\n }\n\n // Set response\n ctx.status = statusCode;\n ctx.res.json({\n error: {\n name: error.constructor.name,\n message,\n code,\n statusCode,\n timestamp: new Date().toISOString(),\n path: ctx.path,\n method: ctx.method,\n requestId: ctx.id,\n },\n });\n }\n}\n\n/**\n * Exception Filter Decorator (NestJS style)\n */\nexport function Catch(...exceptions: Array<new (...args: any[]) => Error>) {\n return function (target: any) {\n target.exceptions = exceptions;\n };\n}\n\n/**\n * Exception Filter for specific error types\n */\n@Catch(ValidationError, BadRequestError)\nexport class ValidationExceptionFilter implements ExceptionFilter {\n async catch(error: Error, ctx: any): Promise<void> {\n // Handle ValidationError with proper field and value\n if (error instanceof ValidationError) {\n ctx.status = error.statusCode;\n ctx.res.json({\n error: {\n name: 'ValidationError',\n message: error.message,\n code: error.code,\n statusCode: error.statusCode,\n timestamp: new Date().toISOString(),\n field: error.field,\n value: error.value,\n },\n });\n return;\n }\n\n // Handle BadRequestError\n if (error instanceof BadRequestError) {\n ctx.status = error.statusCode;\n ctx.res.json({\n error: {\n name: 'BadRequestError',\n message: error.message,\n code: error.code,\n statusCode: error.statusCode,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n\n // Check if it's a NextRushError with VALIDATION_ERROR code (from body parser)\n if (error instanceof NextRushError && error.code === 'VALIDATION_ERROR') {\n ctx.status = error.statusCode;\n ctx.res.json({\n error: {\n name: 'ValidationError',\n message: error.message,\n code: error.code,\n statusCode: error.statusCode,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n\n // Fallback for other errors\n ctx.status = 400;\n ctx.res.json({\n error: {\n name: 'ValidationError',\n message: error.message,\n code: 'VALIDATION_ERROR',\n statusCode: 400,\n timestamp: new Date().toISOString(),\n },\n });\n }\n}\n\n/**\n * Exception Filter for authentication errors\n */\n@Catch(AuthenticationError, UnauthorizedError)\nexport class AuthenticationExceptionFilter implements ExceptionFilter {\n async catch(error: Error, ctx: any): Promise<void> {\n ctx.status = 401;\n ctx.res.json({\n error: {\n name: 'AuthenticationError',\n message: error.message,\n code: 'AUTHENTICATION_ERROR',\n statusCode: 401,\n timestamp: new Date().toISOString(),\n },\n });\n }\n}\n\n/**\n * Exception Filter for authorization errors\n */\n@Catch(AuthorizationError, ForbiddenError)\nexport class AuthorizationExceptionFilter implements ExceptionFilter {\n async catch(error: Error, ctx: any): Promise<void> {\n ctx.status = 403;\n ctx.res.json({\n error: {\n name: 'AuthorizationError',\n message: error.message,\n code: 'AUTHORIZATION_ERROR',\n statusCode: 403,\n timestamp: new Date().toISOString(),\n },\n });\n }\n}\n\n/**\n * Exception Filter for not found errors\n */\n@Catch(NotFoundError)\nexport class NotFoundExceptionFilter implements ExceptionFilter {\n async catch(error: Error, ctx: any): Promise<void> {\n ctx.status = 404;\n ctx.res.json({\n error: {\n name: 'NotFoundError',\n message: error.message,\n code: 'NOT_FOUND',\n statusCode: 404,\n timestamp: new Date().toISOString(),\n path: ctx.path,\n method: ctx.method,\n requestId: ctx.id,\n },\n });\n }\n}\n\n/**\n * Exception Filter for bad request errors\n */\n@Catch(BadRequestError)\nexport class BadRequestExceptionFilter implements ExceptionFilter {\n async catch(error: Error, ctx: any): Promise<void> {\n ctx.status = 400;\n ctx.res.json({\n error: {\n name: 'BadRequestError',\n message: error.message,\n code: 'BAD_REQUEST',\n statusCode: 400,\n timestamp: new Date().toISOString(),\n },\n });\n }\n}\n\n/**\n * Exception Filter for conflict errors\n */\n@Catch(ConflictError)\nexport class ConflictExceptionFilter implements ExceptionFilter {\n async catch(error: Error, ctx: any): Promise<void> {\n ctx.status = 409;\n ctx.res.json({\n error: {\n name: 'ConflictError',\n message: error.message,\n code: 'CONFLICT',\n statusCode: 409,\n timestamp: new Date().toISOString(),\n },\n });\n }\n}\n\n/**\n * Exception Filter for rate limit errors\n */\n@Catch(RateLimitError, TooManyRequestsError)\nexport class RateLimitExceptionFilter implements ExceptionFilter {\n async catch(error: Error, ctx: any): Promise<void> {\n const retryAfter = (error as RateLimitError).retryAfter || 60;\n\n ctx.status = 429;\n ctx.res.setHeader('retry-after', retryAfter.toString());\n ctx.res.setHeader('Retry-After', retryAfter.toString());\n ctx.res.json({\n error: {\n name: 'RateLimitError',\n message: error.message,\n code: 'RATE_LIMIT_ERROR',\n statusCode: 429,\n timestamp: new Date().toISOString(),\n retryAfter,\n },\n });\n }\n}\n","import { NextRushError } from '../../../errors/custom-errors';\n\n/**\n * 🚨 HTTP Error for body parsing errors\n */\nexport class HttpError extends NextRushError {\n constructor(\n message: string,\n statusCode: number = 500,\n code: string = 'INTERNAL_SERVER_ERROR'\n ) {\n super(message, statusCode, code);\n this.name = 'HttpError';\n }\n}\n","/**\n * 🚀 JSON Body Parser - NextRush v2\n *\n * Ultra-fast JSON parsing with zero-copy optimizations\n * Only loads when Content-Type: application/json is detected\n *\n * Performance Features:\n * - 🔥 Fast JSON validation using regex pre-check\n * - ⚡ Optimized buffer-to-string conversion\n * - 🎯 Early validation to avoid expensive JSON.parse on invalid data\n * - 💾 Memory-efficient parsing\n *\n * @author NextRush Framework Team\n * @version 2.0.0\n */\n\nimport { HttpError } from './http-error';\nimport type { BodyParseResult } from './types';\nimport { isEmpty, optimizedBufferToString } from './utils';\n\n/**\n * JSON Parser configuration\n */\nexport interface JsonParserOptions {\n /** Enable fast validation before parsing (default: true) */\n fastValidation?: boolean;\n\n /** Maximum JSON depth to prevent deep nesting attacks (default: 32) */\n maxDepth?: number;\n\n /** Enable reviver function for JSON.parse (default: false) */\n enableReviver?: boolean;\n}\n\n/**\n * 🎯 Fast JSON structure validation using regex\n * Validates basic JSON structure before expensive JSON.parse\n */\nconst JSON_STRUCTURE_REGEX = /^[\\s]*[{[][\\s\\S]*[}\\]][\\s]*$/;\nconst JSON_PRIMITIVE_REGEX =\n /^[\\s]*(true|false|null|\"[^\"]*\"|-?\\d+\\.?\\d*)[\\s]*$/;\n\n/**\n * ⚡ Ultra-fast JSON parser class\n */\nexport class JsonParser {\n private options: Required<JsonParserOptions>;\n\n constructor(options: JsonParserOptions = {}) {\n this.options = {\n fastValidation: true,\n maxDepth: 32,\n enableReviver: false,\n ...options,\n };\n }\n\n /**\n * 🚀 Parse JSON with optimal performance\n */\n async parse(\n rawData: Buffer,\n contentType: string\n ): Promise<Partial<BodyParseResult>> {\n const parseStart = performance.now();\n\n // Fast path: Convert buffer to string with optimization\n const text = optimizedBufferToString(rawData);\n\n // Fast validation to avoid expensive JSON.parse on invalid data\n if (this.options.fastValidation && !this.isValidJsonStructure(text)) {\n // This should catch 'invalid json' test case\n throw new HttpError(\n 'Invalid JSON structure detected',\n 400,\n 'VALIDATION_ERROR'\n );\n }\n\n // Depth validation for security\n if (\n this.options.maxDepth > 0 &&\n this.getJsonDepth(text) > this.options.maxDepth\n ) {\n throw new HttpError(\n `JSON depth exceeds maximum allowed depth of ${this.options.maxDepth}`,\n 400,\n 'VALIDATION_ERROR'\n );\n }\n\n try {\n // Handle empty strings as null\n if (!text || text.trim().length === 0) {\n const parseTime = performance.now() - parseStart;\n return {\n data: null,\n contentType,\n parser: 'json',\n hasFiles: false,\n isEmpty: true,\n parseTime,\n };\n }\n\n // Parse JSON with optional reviver\n const data: unknown = this.options.enableReviver\n ? JSON.parse(text, this.createReviver())\n : JSON.parse(text);\n\n const parseTime = performance.now() - parseStart;\n\n return {\n data,\n contentType,\n parser: 'json',\n hasFiles: false,\n isEmpty: isEmpty(data),\n parseTime,\n };\n } catch (err) {\n // Create validation error for malformed JSON\n const errorMessage = `JSON parse error: ${err instanceof Error ? err.message : String(err)}`;\n throw new HttpError(errorMessage, 400, 'VALIDATION_ERROR');\n }\n }\n\n /**\n * 🎯 Fast JSON structure validation\n * Pre-validates JSON structure to avoid expensive parsing\n */\n private isValidJsonStructure(text: string): boolean {\n if (!text || text.length === 0) return true; // Empty string is valid (will be parsed as null)\n\n // Fast check for basic JSON structure\n const trimmed = text.trim();\n if (trimmed.length === 0) return true; // Empty trimmed string is valid\n\n // Check for object/array structure or primitive values\n return (\n JSON_STRUCTURE_REGEX.test(trimmed) || JSON_PRIMITIVE_REGEX.test(trimmed)\n );\n }\n\n /**\n * 🔍 Calculate JSON depth for security validation\n */\n private getJsonDepth(text: string): number {\n let depth = 0;\n let maxDepth = 0;\n let inString = false;\n let escaped = false;\n\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n\n if (escaped) {\n escaped = false;\n continue;\n }\n\n if (char === '\\\\' && inString) {\n escaped = true;\n continue;\n }\n\n if (char === '\"') {\n inString = !inString;\n continue;\n }\n\n if (!inString) {\n if (char === '{' || char === '[') {\n depth++;\n maxDepth = Math.max(maxDepth, depth);\n } else if (char === '}' || char === ']') {\n depth--;\n }\n }\n }\n\n return maxDepth;\n }\n\n /**\n * 🔧 Create JSON reviver function for custom parsing\n */\n private createReviver(): (key: string, value: unknown) => unknown {\n return (_key: string, value: unknown) => {\n // Custom JSON processing can be added here\n // For example: date parsing, number validation, etc.\n\n // Parse ISO date strings to Date objects\n if (\n typeof value === 'string' &&\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/.test(value)\n ) {\n const date = new Date(value);\n if (!isNaN(date.getTime())) {\n return date;\n }\n }\n\n return value;\n };\n }\n\n /**\n * 📊 Get parser performance metrics\n */\n getMetrics(): Record<string, number> {\n return {\n maxDepth: this.options.maxDepth,\n fastValidation: this.options.fastValidation ? 1 : 0,\n };\n }\n}\n\n/**\n * 🚀 Default JSON parser instance (lazy-loaded)\n */\nlet defaultJsonParser: JsonParser | null = null;\n\n/**\n * 📦 Factory function for JSON parser\n */\nexport function createJsonParser(options?: JsonParserOptions): JsonParser {\n return new JsonParser(options);\n}\n\n/**\n * ⚡ Get or create default JSON parser instance\n */\nexport function getJsonParser(): JsonParser {\n if (!defaultJsonParser) {\n defaultJsonParser = new JsonParser();\n }\n return defaultJsonParser;\n}\n\n/**\n * 🎯 Quick parse function for simple usage\n */\nexport async function parseJson(\n rawData: Buffer,\n contentType: string = 'application/json',\n options?: JsonParserOptions\n): Promise<Partial<BodyParseResult>> {\n const parser = options ? createJsonParser(options) : getJsonParser();\n return parser.parse(rawData, contentType);\n}\n","/**\n * 🚀 URL-Encoded Body Parser - NextRush v2\n *\n * Ultra-fast URL-encoded form data parsing\n * Only loads when Content-Type: application/x-www-form-urlencoded is detected\n *\n * Performance Features:\n * - 🔥 Fast string parsing with efficient key-value extraction\n * - ⚡ Optimized URL decoding with caching\n * - 🎯 Early validation to detect malformed data\n * - 💾 Memory-efficient parsing for large forms\n *\n * @author NextRush Framework Team\n * @version 2.0.0\n */\n\nimport type { BodyParseResult } from './types';\nimport { isEmpty, optimizedBufferToString } from './utils';\n\n/**\n * URL-Encoded Parser configuration\n */\nexport interface UrlEncodedParserOptions {\n /** Maximum number of fields (default: 1000) */\n maxFields?: number;\n\n /** Maximum field name length (default: 100) */\n maxFieldNameLength?: number;\n\n /** Maximum field value length (default: 1MB) */\n maxFieldValueLength?: number;\n\n /** Enable array notation parsing (e.g., name[]=value) (default: true) */\n parseArrays?: boolean;\n\n /** Enable nested object parsing (e.g., user[name]=value) (default: true) */\n parseObjects?: boolean;\n\n /** Parameter separator (default: '&') */\n separator?: string;\n\n /** Key-value separator (default: '=') */\n assignment?: string;\n}\n\n/**\n * ⚡ Ultra-fast URL-encoded parser class\n */\nexport class UrlEncodedParser {\n private options: Required<UrlEncodedParserOptions>;\n\n constructor(options: UrlEncodedParserOptions = {}) {\n this.options = {\n maxFields: 1000,\n maxFieldNameLength: 100,\n maxFieldValueLength: 1024 * 1024, // 1MB\n parseArrays: true,\n parseObjects: true,\n separator: '&',\n assignment: '=',\n ...options,\n };\n }\n\n /**\n * 🚀 Parse URL-encoded data with optimal performance\n */\n async parse(\n rawData: Buffer,\n contentType: string\n ): Promise<Partial<BodyParseResult>> {\n const parseStart = performance.now();\n\n // Fast path: Convert buffer to string with optimization\n const text = optimizedBufferToString(rawData);\n\n // Early validation\n if (\n this.options.maxFields > 0 &&\n this.countFields(text) > this.options.maxFields\n ) {\n throw new Error(\n `Too many fields: maximum ${this.options.maxFields} allowed`\n );\n }\n\n try {\n // Parse the URL-encoded string\n const data = this.parseUrlEncodedString(text);\n const parseTime = performance.now() - parseStart;\n\n return {\n data,\n contentType,\n parser: 'urlencoded',\n hasFiles: false,\n isEmpty: isEmpty(data),\n fields: data,\n parseTime,\n };\n } catch (err) {\n throw new Error(\n `URL-encoded parse error: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n }\n\n /**\n * 🎯 Parse URL-encoded string with advanced features\n */\n private parseUrlEncodedString(text: string): Record<string, unknown> {\n if (!text || text.length === 0) {\n return {};\n }\n\n const result: Record<string, unknown> = {};\n const pairs = text.split(this.options.separator);\n\n for (const pair of pairs) {\n if (pair.length === 0) continue;\n\n const assignmentIndex = pair.indexOf(this.options.assignment);\n const key = assignmentIndex >= 0 ? pair.slice(0, assignmentIndex) : pair;\n const value = assignmentIndex >= 0 ? pair.slice(assignmentIndex + 1) : '';\n\n if (!key) continue;\n\n // Validate field name length\n if (key.length > this.options.maxFieldNameLength) {\n throw new Error(\n `Field name too long: ${key.length} chars (max: ${this.options.maxFieldNameLength})`\n );\n }\n\n // Validate field value length\n if (value.length > this.options.maxFieldValueLength) {\n throw new Error(\n `Field value too long: ${value.length} chars (max: ${this.options.maxFieldValueLength})`\n );\n }\n\n try {\n // First decode plus signs to spaces for URL-encoded data\n const decodedKey = decodeURIComponent(key.replace(/\\+/g, ' '));\n const decodedValue = decodeURIComponent(value.replace(/\\+/g, ' '));\n\n // Handle array notation: name[] or name[0]\n if (this.options.parseArrays && decodedKey.includes('[')) {\n this.setNestedValue(result, decodedKey, decodedValue);\n }\n // Handle object notation: user[name]\n else if (this.options.parseObjects && decodedKey.includes('[')) {\n this.setNestedValue(result, decodedKey, decodedValue);\n }\n // Handle simple key-value pairs\n else {\n this.setSimpleValue(result, decodedKey, decodedValue);\n }\n } catch {\n // Skip malformed URL encoding - continue processing other fields\n continue;\n }\n }\n\n return result;\n }\n\n /**\n * 🎯 Set simple key-value pair with duplicate handling\n */\n private setSimpleValue(\n result: Record<string, unknown>,\n key: string,\n value: string\n ): void {\n if (key in result) {\n // Convert to array if multiple values\n const existing = result[key];\n if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n result[key] = [existing, value];\n }\n } else {\n result[key] = value;\n }\n }\n\n /**\n * 🏗️ Set nested value for array/object notation\n */\n private setNestedValue(\n result: Record<string, unknown>,\n key: string,\n value: string\n ): void {\n // Parse key like \"user[name]\" or \"items[0]\" or \"items[]\"\n const bracketIndex = key.indexOf('[');\n if (bracketIndex === -1) {\n this.setSimpleValue(result, key, value);\n return;\n }\n\n const baseKey = key.slice(0, bracketIndex);\n const bracketContent = key.slice(bracketIndex + 1, key.indexOf(']'));\n\n // Initialize base key if needed\n if (!(baseKey in result)) {\n result[baseKey] = bracketContent === '' ? [] : {};\n }\n\n const baseValue = result[baseKey];\n\n // Handle array notation: name[] or name[0]\n if (Array.isArray(baseValue)) {\n if (bracketContent === '') {\n // name[] - push to array\n baseValue.push(value);\n } else {\n // name[0] - set at specific index\n const index = parseInt(bracketContent, 10);\n if (!isNaN(index) && index >= 0) {\n baseValue[index] = value;\n }\n }\n }\n // Handle object notation: user[name]\n else if (typeof baseValue === 'object' && baseValue !== null) {\n (baseValue as Record<string, unknown>)[bracketContent] = value;\n }\n }\n\n /**\n * 📊 Count fields for validation\n */\n private countFields(text: string): number {\n if (!text) return 0;\n return text.split(this.options.separator).length;\n }\n\n /**\n * 📊 Get parser performance metrics\n */\n getMetrics(): Record<string, number> {\n return {\n maxFields: this.options.maxFields,\n maxFieldNameLength: this.options.maxFieldNameLength,\n maxFieldValueLength: this.options.maxFieldValueLength,\n parseArrays: this.options.parseArrays ? 1 : 0,\n parseObjects: this.options.parseObjects ? 1 : 0,\n };\n }\n}\n\n/**\n * 🚀 Default URL-encoded parser instance (lazy-loaded)\n */\nlet defaultUrlEncodedParser: UrlEncodedParser | null = null;\n\n/**\n * 📦 Factory function for URL-encoded parser\n */\nexport function createUrlEncodedParser(\n options?: UrlEncodedParserOptions\n): UrlEncodedParser {\n return new UrlEncodedParser(options);\n}\n\n/**\n * ⚡ Get or create default URL-encoded parser instance\n */\nexport function getUrlEncodedParser(): UrlEncodedParser {\n if (!defaultUrlEncodedParser) {\n defaultUrlEncodedParser = new UrlEncodedParser();\n }\n return defaultUrlEncodedParser;\n}\n\n/**\n * 🎯 Quick parse function for simple usage\n */\nexport async function parseUrlEncoded(\n rawData: Buffer,\n contentType: string = 'application/x-www-form-urlencoded',\n options?: UrlEncodedParserOptions\n): Promise<Partial<BodyParseResult>> {\n const parser = options\n ? createUrlEncodedParser(options)\n : getUrlEncodedParser();\n return parser.parse(rawData, contentType);\n}\n","/**\n * 🚀 Multipart Body Parser - NextRush v2\n *\n * Placeholder for multipart parser - will be fully implemented\n * Only loads when Content-Type: multipart/form-data is detected\n *\n * @author NextRush Framework Team\n * @version 2.0.0\n */\n\nimport type { BodyParseResult, BodyParser } from './types';\n\n/**\n * ⚡ Basic multipart parser (placeholder)\n */\nexport class MultipartParser implements BodyParser {\n async parse(\n _rawData: Buffer,\n contentType: string\n ): Promise<Partial<BodyParseResult>> {\n return {\n data: { message: 'Multipart parsing not yet implemented' },\n contentType,\n parser: 'multipart',\n hasFiles: false,\n isEmpty: false,\n parseTime: 0,\n };\n }\n}\n\nlet defaultMultipartParser: MultipartParser | null = null;\n\nexport function getMultipartParser(): MultipartParser {\n if (!defaultMultipartParser) {\n defaultMultipartParser = new MultipartParser();\n }\n return defaultMultipartParser;\n}\n","/**\n * 🚀 Text Body Parser - NextRush v2\n *\n * Ultra-fast text content parsing\n * Only loads when Content-Type: text/* is detected\n *\n * Performance Features:\n * - 🔥 Fast text conversion with encoding detection\n * - ⚡ Optimized buffer handling for text content\n * - 🎯 Early validation for text formats\n * - 💾 Memory-efficient string processing\n *\n * @author NextRush Framework Team\n * @version 2.0.0\n */\n\nimport type { BodyParseResult } from './types';\nimport { isEmpty, optimizedBufferToString } from './utils';\n\n/**\n * Text Parser configuration\n */\nexport interface TextParserOptions {\n /** Default encoding for text content (default: 'utf8') */\n encoding?: BufferEncoding;\n\n /** Maximum text length (default: 1MB) */\n maxLength?: number;\n\n /** Enable line ending normalization (default: false) */\n normalizeLineEndings?: boolean;\n\n /** Trim whitespace from text (default: false) */\n trimWhitespace?: boolean;\n}\n\n/**\n * ⚡ Ultra-fast text parser class\n */\nexport class TextParser {\n private options: Required<TextParserOptions>;\n\n constructor(options: TextParserOptions = {}) {\n this.options = {\n encoding: 'utf8',\n maxLength: 1024 * 1024, // 1MB\n normalizeLineEndings: false,\n trimWhitespace: false,\n ...options,\n };\n }\n\n /**\n * 🚀 Parse text with optimal performance\n */\n async parse(\n rawData: Buffer,\n contentType: string\n ): Promise<Partial<BodyParseResult>> {\n const parseStart = performance.now();\n\n // Validate size\n if (rawData.length > this.options.maxLength) {\n throw new Error(\n `Text too large: ${rawData.length} bytes (max: ${this.options.maxLength})`\n );\n }\n\n try {\n // Convert buffer to string with optimized encoding\n let text = optimizedBufferToString(rawData, this.options.encoding);\n\n // Apply text transformations\n if (this.options.normalizeLineEndings) {\n text = this.normalizeLineEndings(text);\n }\n\n if (this.options.trimWhitespace) {\n text = text.trim();\n }\n\n const parseTime = performance.now() - parseStart;\n\n return {\n data: text,\n contentType,\n parser: 'text',\n hasFiles: false,\n isEmpty: isEmpty(text),\n parseTime,\n };\n } catch (err) {\n throw new Error(\n `Text parse error: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n }\n\n /**\n * 🔄 Normalize line endings to LF\n */\n private normalizeLineEndings(text: string): string {\n return text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n }\n\n /**\n * 📊 Get parser performance metrics\n */\n getMetrics(): Record<string, number> {\n return {\n maxLength: this.options.maxLength,\n normalizeLineEndings: this.options.normalizeLineEndings ? 1 : 0,\n trimWhitespace: this.options.trimWhitespace ? 1 : 0,\n };\n }\n}\n\n/**\n * 🚀 Raw Body Parser - NextRush v2\n *\n * Ultra-fast raw binary data handling\n * Only loads when binary content types are detected\n */\nexport interface RawParserOptions {\n /** Maximum raw data size (default: 10MB) */\n maxSize?: number;\n\n /** Enable buffer copying for safety (default: false) */\n copyBuffer?: boolean;\n}\n\n/**\n * ⚡ Ultra-fast raw parser class\n */\nexport class RawParser {\n private options: Required<RawParserOptions>;\n\n constructor(options: RawParserOptions = {}) {\n this.options = {\n maxSize: 10 * 1024 * 1024, // 10MB\n copyBuffer: false,\n ...options,\n };\n }\n\n /**\n * 🚀 Parse raw data with optimal performance\n */\n async parse(\n rawData: Buffer,\n contentType: string\n ): Promise<Partial<BodyParseResult>> {\n const parseStart = performance.now();\n\n // Validate size\n if (rawData.length > this.options.maxSize) {\n throw new Error(\n `Raw data too large: ${rawData.length} bytes (max: ${this.options.maxSize})`\n );\n }\n\n try {\n // Use original buffer or create copy based on options\n const data = this.options.copyBuffer ? Buffer.from(rawData) : rawData;\n const parseTime = performance.now() - parseStart;\n\n return {\n data,\n contentType,\n parser: 'raw',\n hasFiles: false,\n isEmpty: data.length === 0,\n parseTime,\n };\n } catch (err) {\n throw new Error(\n `Raw parse error: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n }\n\n /**\n * 📊 Get parser performance metrics\n */\n getMetrics(): Record<string, number> {\n return {\n maxSize: this.options.maxSize,\n copyBuffer: this.options.copyBuffer ? 1 : 0,\n };\n }\n}\n\n/**\n * 🚀 Default parser instances (lazy-loaded)\n */\nlet defaultTextParser: TextParser | null = null;\nlet defaultRawParser: RawParser | null = null;\n\n/**\n * 📦 Factory functions\n */\nexport function createTextParser(options?: TextParserOptions): TextParser {\n return new TextParser(options);\n}\n\nexport function createRawParser(options?: RawParserOptions): RawParser {\n return new RawParser(options);\n}\n\n/**\n * ⚡ Get or create default parser instances\n */\nexport function getTextParser(): TextParser {\n if (!defaultTextParser) {\n defaultTextParser = new TextParser();\n }\n return defaultTextParser;\n}\n\nexport function getRawParser(): RawParser {\n if (!defaultRawParser) {\n defaultRawParser = new RawParser();\n }\n return defaultRawParser;\n}\n\n/**\n * 🎯 Quick parse functions for simple usage\n */\nexport async function parseText(\n rawData: Buffer,\n contentType: string = 'text/plain',\n options?: TextParserOptions\n): Promise<Partial<BodyParseResult>> {\n const parser = options ? createTextParser(options) : getTextParser();\n return parser.parse(rawData, contentType);\n}\n\nexport async function parseRaw(\n rawData: Buffer,\n contentType: string = 'application/octet-stream',\n options?: RawParserOptions\n): Promise<Partial<BodyParseResult>> {\n const parser = options ? createRawParser(options) : getRawParser();\n return parser.parse(rawData, contentType);\n}\n","/**\n * High-Performance Cookie Utilities for NextRush v2\n *\n * Features:\n * - ⚡ Ultra-fast cookie parsing with lazy evaluation\n * - 🔒 Built-in signing/verification (HMAC-SHA256)\n * - 🛡️ Security defaults and validation\n * - 📦 JSON serialization helpers\n * - 🎯 Zero-copy parsing where possible\n * - 💾 Minimal memory allocations\n *\n * Performance optimizations:\n * - Single-pass parsing\n * - Efficient string operations\n * - Lazy decoding (only when accessed)\n * - Symbol-based caching\n * - Fast path for simple cases\n */\n\nimport { createHmac, timingSafeEqual } from 'node:crypto';\n\n// Cache symbol for parsed cookies\nexport const PARSED_COOKIES_SYMBOL = Symbol('parsed-cookies');\nexport const COOKIE_CACHE_SYMBOL = Symbol('cookie-cache');\n\n/**\n * Cookie options interface with security defaults\n */\nexport interface CookieOptions {\n /** Domain for the cookie */\n domain?: string;\n /** Expiration date */\n expires?: Date;\n /** HTTP Only flag (default: true for security) */\n httpOnly?: boolean;\n /** Max age in seconds */\n maxAge?: number;\n /** Path (default: '/') */\n path?: string;\n /** Priority (Low, Medium, High) */\n priority?: 'Low' | 'Medium' | 'High';\n /** SameSite attribute (default: 'Strict') */\n sameSite?: 'Strict' | 'Lax' | 'None' | boolean;\n /** Secure flag (default: true in production) */\n secure?: boolean;\n}\n\n/**\n * Signed cookie options\n */\nexport interface SignedCookieOptions extends CookieOptions {\n /** Secret for signing (required for signed cookies) */\n secret?: string;\n}\n\n/**\n * Parsed cookie interface\n */\nexport interface ParsedCookie {\n name: string;\n value: string;\n options?: CookieOptions;\n}\n\n/**\n * Cookie parsing result with lazy decoding\n */\nexport interface CookieParseResult {\n [key: string]: string;\n}\n\n/**\n * Security defaults for cookie options\n */\nexport const SECURE_COOKIE_DEFAULTS: Partial<CookieOptions> = {\n httpOnly: true,\n secure: process.env['NODE_ENV'] === 'production',\n sameSite: 'Strict',\n path: '/',\n};\n\n/**\n * ⚡ Ultra-fast cookie parsing with single-pass algorithm\n *\n * Performance optimizations:\n * - Single loop through the cookie string\n * - Minimal string operations\n * - Lazy URL decoding (only when needed)\n * - Efficient whitespace handling\n *\n * @param cookieHeader Raw cookie header string\n * @returns Parsed cookies object\n */\nexport function parseCookies(cookieHeader: string): CookieParseResult {\n if (!cookieHeader || typeof cookieHeader !== 'string') {\n return {};\n }\n\n const cookies: CookieParseResult = {};\n const len = cookieHeader.length;\n let pos = 0;\n\n // Fast path: single cookie without semicolons\n if (cookieHeader.indexOf(';') === -1) {\n const eqPos = cookieHeader.indexOf('=');\n if (eqPos > 0) {\n const name = cookieHeader.slice(0, eqPos).trim();\n const value = cookieHeader.slice(eqPos + 1).trim();\n if (name) {\n cookies[name] = tryDecodeURIComponent(value);\n }\n }\n return cookies;\n }\n\n // Multi-cookie parsing with single pass\n while (pos < len) {\n // Find next semicolon or end\n let nextSemi = cookieHeader.indexOf(';', pos);\n if (nextSemi === -1) nextSemi = len;\n\n // Extract cookie segment\n const segment = cookieHeader.slice(pos, nextSemi);\n const eqPos = segment.indexOf('=');\n\n if (eqPos > 0) {\n const name = segment.slice(0, eqPos).trim();\n const value = segment.slice(eqPos + 1).trim();\n\n if (name && !cookies[name]) {\n // First occurrence wins\n cookies[name] = tryDecodeURIComponent(value);\n }\n }\n\n pos = nextSemi + 1;\n\n // Skip whitespace after semicolon\n while (pos < len && cookieHeader[pos] === ' ') {\n pos++;\n }\n }\n\n return cookies;\n}\n\n/**\n * Safe URL component decoding with fallback\n * Also handles quoted values properly\n *\n * @param value Value to decode\n * @returns Decoded value or original if decode fails\n */\nfunction tryDecodeURIComponent(value: string): string {\n // Handle quoted values - remove surrounding quotes\n if (value.length >= 2 && value.startsWith('\"') && value.endsWith('\"')) {\n value = value.slice(1, -1);\n }\n\n try {\n // Only decode if it contains encoded characters\n if (value.includes('%')) {\n return decodeURIComponent(value);\n }\n return value;\n } catch {\n return value; // Return original if decoding fails\n }\n}\n\n/**\n * ⚡ High-performance cookie serialization\n *\n * @param name Cookie name\n * @param value Cookie value\n * @param options Cookie options\n * @returns Serialized Set-Cookie header value\n */\nexport function serializeCookie(\n name: string,\n value: string,\n options: CookieOptions = {}\n): string {\n if (!name || typeof name !== 'string') {\n throw new TypeError('Cookie name must be a non-empty string');\n }\n\n // Validate cookie name (RFC 6265)\n if (!/^[a-zA-Z0-9!#$&-+\\-.^_`|~]+$/.test(name)) {\n throw new TypeError('Invalid cookie name characters');\n }\n\n // Apply security defaults in production unless explicitly overridden\n const isProduction = process.env['NODE_ENV'] === 'production';\n const finalOptions = { ...options };\n\n if (isProduction) {\n finalOptions.secure = options.secure !== false; // Default true, can be explicitly false\n finalOptions.httpOnly = options.httpOnly !== false; // Default true, can be explicitly false\n finalOptions.sameSite = options.sameSite || 'Strict'; // Default Strict\n }\n\n // Build cookie string efficiently in consistent order\n const parts: string[] = [`${name}=${encodeURIComponent(value)}`];\n\n if (typeof finalOptions.maxAge === 'number' && finalOptions.maxAge >= 0) {\n parts.push(`Max-Age=${Math.floor(finalOptions.maxAge)}`);\n }\n\n if (finalOptions.expires) {\n parts.push(`Expires=${finalOptions.expires.toUTCString()}`);\n }\n\n if (finalOptions.path) {\n parts.push(`Path=${finalOptions.path}`);\n }\n\n if (finalOptions.domain) {\n parts.push(`Domain=${finalOptions.domain}`);\n }\n\n if (finalOptions.secure) {\n parts.push('Secure');\n }\n\n if (finalOptions.httpOnly) {\n parts.push('HttpOnly');\n }\n\n if (finalOptions.sameSite) {\n if (typeof finalOptions.sameSite === 'boolean') {\n parts.push('SameSite');\n } else {\n parts.push(`SameSite=${finalOptions.sameSite}`);\n }\n }\n\n if (finalOptions.priority) {\n parts.push(`Priority=${finalOptions.priority}`);\n }\n\n return parts.join('; ');\n}\n\n/**\n * 🔒 Sign a cookie value with HMAC-SHA256\n *\n * @param value Value to sign\n * @param secret Secret key for signing\n * @returns Signed value in format: value.signature\n */\nexport function signCookie(value: string, secret: string): string {\n if (!secret) {\n throw new Error('Secret is required for signing cookies');\n }\n\n const signature = createHmac('sha256', secret)\n .update(value)\n .digest('base64url');\n\n return `${value}.${signature}`;\n}\n\n/**\n * 🔒 Verify and unsign a cookie value\n *\n * @param signedValue Signed cookie value\n * @param secret Secret key for verification\n * @returns Original value if valid, false if invalid\n */\nexport function unsignCookie(\n signedValue: string,\n secret: string\n): string | false {\n if (!secret) {\n return false;\n }\n\n const lastDotIndex = signedValue.lastIndexOf('.');\n if (lastDotIndex === -1) {\n return false; // Not a signed cookie\n }\n\n const value = signedValue.slice(0, lastDotIndex);\n const signature = signedValue.slice(lastDotIndex + 1);\n\n try {\n const expectedSignature = createHmac('sha256', secret)\n .update(value)\n .digest('base64url');\n\n // Timing-safe comparison to prevent timing attacks\n if (signature.length !== expectedSignature.length) {\n return false;\n }\n\n const sigBuffer = Buffer.from(signature, 'base64url');\n const expectedBuffer = Buffer.from(expectedSignature, 'base64url');\n\n if (timingSafeEqual(sigBuffer, expectedBuffer)) {\n return value;\n }\n } catch {\n // Ignore signature verification errors\n }\n\n return false;\n}\n\n/**\n * 📦 Serialize value as JSON cookie\n *\n * @param value Value to serialize\n * @returns JSON string or original value if serialization fails\n */\nexport function serializeJsonValue(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\n/**\n * 📦 Deserialize JSON cookie value\n *\n * @param value JSON string value\n * @returns Parsed value or original string if parsing fails\n */\nexport function deserializeJsonValue(value: string): unknown {\n if (!value || typeof value !== 'string') {\n return value;\n }\n\n // Quick check if it looks like JSON\n if (\n !(value.startsWith('{') || value.startsWith('[') || value.startsWith('\"'))\n ) {\n return value;\n }\n\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n}\n\n/**\n * 🛡️ Validate cookie value for security\n *\n * @param value Cookie value\n * @param maxSize Maximum size in bytes (default: 4096)\n * @returns True if valid, false otherwise\n */\nexport function validateCookieValue(value: string, maxSize = 4096): boolean {\n if (typeof value !== 'string') {\n return false;\n }\n\n // Empty values are valid\n if (value === '') {\n return true;\n }\n\n // Check size limit\n if (Buffer.byteLength(value, 'utf8') > maxSize) {\n return false;\n }\n\n // Check for control characters (reject all control chars including tab)\n // eslint-disable-next-line no-control-regex\n if (/[\\x00-\\x1F\\x7F]/.test(value)) {\n return false;\n }\n\n return true;\n}\n\n/**\n * 🎯 Create secure cookie options with defaults\n *\n * @param options User options\n * @returns Options with security defaults applied\n */\nexport function createSecureCookieOptions(\n options: CookieOptions = {}\n): CookieOptions {\n return {\n ...SECURE_COOKIE_DEFAULTS,\n ...options,\n // Always ensure secure in production\n secure: options.secure ?? process.env['NODE_ENV'] === 'production',\n };\n}\n\n/**\n * Performance monitoring utilities\n */\nexport const CookieMetrics = {\n parseTime: 0,\n parseCalls: 0,\n\n startParse(): () => void {\n const start = process.hrtime.bigint();\n return () => {\n const end = process.hrtime.bigint();\n this.parseTime += Number(end - start);\n this.parseCalls++;\n };\n },\n\n getAverageParseTime(): number {\n return this.parseCalls > 0 ? this.parseTime / this.parseCalls : 0;\n },\n\n reset(): void {\n this.parseTime = 0;\n this.parseCalls = 0;\n },\n};\n\n/**\n * Cookie utility class for advanced operations\n */\nexport class CookieJar {\n private cookies: Map<string, string> = new Map();\n\n constructor(cookieHeader?: string) {\n if (cookieHeader) {\n this.parse(cookieHeader);\n }\n }\n\n parse(cookieHeader: string): this {\n const parsed = parseCookies(cookieHeader);\n for (const [name, value] of Object.entries(parsed)) {\n this.cookies.set(name, value);\n }\n return this;\n }\n\n get(name: string): string | undefined {\n return this.cookies.get(name);\n }\n\n set(name: string, value: string): this {\n this.cookies.set(name, value);\n return this;\n }\n\n delete(name: string): boolean {\n return this.cookies.delete(name);\n }\n\n has(name: string): boolean {\n return this.cookies.has(name);\n }\n\n clear(): this {\n this.cookies.clear();\n return this;\n }\n\n toObject(): Record<string, string> {\n return Object.fromEntries(this.cookies);\n }\n\n size(): number {\n return this.cookies.size;\n }\n\n names(): string[] {\n return Array.from(this.cookies.keys());\n }\n\n values(): string[] {\n return Array.from(this.cookies.values());\n }\n}\n","/**\n * Request Enhancer for NextRush v2\n *\n * @packageDocumentation\n */\n\nimport {\n parseCookies,\n PARSED_COOKIES_SYMBOL,\n type CookieParseResult,\n} from '@/utils/cookies';\nimport type { IncomingMessage } from 'node:http';\nimport type { ParsedUrlQuery } from 'node:querystring';\nimport { URL } from 'node:url';\n\n/**\n * Validation rule interface\n */\ninterface ValidationRule {\n required?: boolean;\n type?: 'email' | 'url' | 'number';\n minLength?: number;\n maxLength?: number;\n message?: string;\n custom?: (value: unknown) => boolean;\n sanitize?: Record<string, unknown>;\n}\n\n/**\n * Sanitize options interface\n */\ninterface SanitizeOptions {\n trim?: boolean;\n lowercase?: boolean;\n uppercase?: boolean;\n removeHtml?: boolean;\n escape?: boolean;\n removeSpecialChars?: boolean;\n}\n\n/**\n * Enhanced request interface with Express-like properties and methods\n */\nexport interface EnhancedRequest extends IncomingMessage {\n // Express-like properties\n params: Record<string, string>;\n query: ParsedUrlQuery;\n body: unknown;\n pathname: string;\n originalUrl: string;\n path: string;\n files: Record<string, unknown>;\n cookies: Record<string, string>;\n session: Record<string, unknown>;\n locals: Record<string, unknown>;\n startTime: number;\n fresh: boolean;\n stale: boolean;\n middlewareStack?: string[];\n\n // Basic helper methods\n param(name: string): string | undefined;\n header(name: string): string | undefined;\n get(name: string): string | undefined;\n sanitizeObject(obj: unknown, options?: unknown): unknown;\n getRequestTiming(): unknown;\n\n // Enhanced request properties\n ip: string;\n secure: boolean;\n protocol: string;\n hostname(): string;\n fullUrl(): string;\n is(type: string): boolean;\n accepts(types: string | string[]): string | false;\n\n // Cookie methods\n parseCookies(): Record<string, string>;\n\n // Validation and sanitization\n validate(rules: unknown): unknown;\n sanitize(value: unknown, options?: unknown): unknown;\n isValidEmail(email: string): boolean;\n isValidUrl(url: string): boolean;\n sanitizeValue(value: unknown, rule: unknown): unknown;\n\n // Security and analytics\n fingerprint(): string;\n userAgent(): {\n raw: string;\n browser: string;\n os: string;\n device: string;\n isMobile: boolean;\n isBot: boolean;\n };\n timing(): { start: number; duration: number; timestamp: string };\n rateLimit(): {\n limit: number;\n remaining: number;\n reset: number;\n retryAfter: number;\n };\n\n // User agent parsing methods\n parseBrowser(ua: string): string;\n parseOS(ua: string): string;\n parseDevice(ua: string): string;\n isBot(ua: string): boolean;\n isMobile(ua: string): boolean;\n}\n\n/**\n * Request Enhancer class for NextRush v2\n *\n * @example\n * ```typescript\n * import { RequestEnhancer } from '@/core/enhancers/request-enhancer';\n *\n * const enhancedReq = RequestEnhancer.enhance(req);\n * console.log(enhancedReq.ip()); // Client IP\n * console.log(enhancedReq.userAgent()); // User agent info\n * ```\n */\nexport class RequestEnhancer {\n /**\n * Enhance a Node.js IncomingMessage with NextRush v2 features\n *\n * @param req - The original HTTP request\n * @returns Enhanced request with additional properties and methods\n */\n static enhance(req: IncomingMessage): EnhancedRequest {\n const enhanced = req as EnhancedRequest;\n\n // Initialize properties\n enhanced.params = enhanced.params || {};\n enhanced.query = enhanced.query || {};\n enhanced.body = enhanced.body || undefined; // Initialize body property\n enhanced.pathname = req.url?.split('?')[0] || '/';\n enhanced.originalUrl = req.url || '/';\n enhanced.path = enhanced.pathname;\n enhanced.files = enhanced.files || {};\n enhanced.cookies = enhanced.cookies || {};\n enhanced.session = enhanced.session || {};\n enhanced.locals = enhanced.locals || {};\n enhanced.startTime = enhanced.startTime || Date.now();\n\n // Basic helper methods\n if (!enhanced.param) {\n enhanced.param = (name: string) => enhanced.params[name];\n }\n\n if (!enhanced.header) {\n enhanced.header = (name: string) => enhanced.headers[name] as string;\n }\n\n if (!enhanced.get) {\n enhanced.get = (name: string) => enhanced.header(name);\n }\n\n // Enhanced IP detection with proxy support\n if (!enhanced.ip) {\n const xForwardedFor = enhanced.headers['x-forwarded-for'] as string;\n const xRealIp = enhanced.headers['x-real-ip'] as string;\n const connectionRemoteAddress = (enhanced.socket as any)?.remoteAddress;\n\n if (xForwardedFor) {\n // X-Forwarded-For can contain multiple IPs, take the first one\n enhanced.ip = xForwardedFor.split(',')[0]?.trim() || '127.0.0.1';\n } else if (xRealIp) {\n enhanced.ip = xRealIp;\n } else {\n enhanced.ip = connectionRemoteAddress || '127.0.0.1';\n }\n }\n\n // Security helpers\n if (\n !Object.prototype.hasOwnProperty.call(enhanced, 'secure') ||\n enhanced.secure === undefined\n ) {\n const proto = enhanced.headers['x-forwarded-proto'] as string;\n const connection = enhanced.connection || enhanced.socket;\n const isSecure =\n proto === 'https' || (connection as any)?.encrypted === true;\n\n Object.defineProperty(enhanced, 'secure', {\n value: isSecure,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n\n if (!enhanced.protocol) {\n enhanced.protocol = enhanced.secure ? 'https' : 'http';\n }\n\n if (!enhanced.hostname) {\n enhanced.hostname = () => {\n const host = enhanced.headers.host as string;\n if (host) {\n // Remove port if present\n return host.split(':')[0] || 'localhost';\n }\n return 'localhost';\n };\n }\n\n if (!enhanced.fullUrl) {\n enhanced.fullUrl = () =>\n `${enhanced.protocol}://${enhanced.headers.host || 'localhost'}${\n enhanced.originalUrl\n }`;\n }\n\n // Content type checking\n if (!enhanced.is) {\n enhanced.is = (type: string) => {\n const contentType = (enhanced.headers['content-type'] as string) || '';\n\n const typeMap: Record<string, string> = {\n json: 'application/json',\n html: 'text/html',\n xml: 'application/xml',\n text: 'text/plain',\n form: 'application/x-www-form-urlencoded',\n multipart: 'multipart/form-data',\n };\n\n const checkType = typeMap[type] || type;\n return contentType.toLowerCase().includes(checkType.toLowerCase());\n };\n }\n\n // Accept header parsing\n if (!enhanced.accepts) {\n enhanced.accepts = (types: string | string[]) => {\n const acceptHeader = (enhanced.headers.accept as string) || '*/*';\n const typeArray = Array.isArray(types) ? types : [types];\n\n for (const type of typeArray) {\n const typeMap: Record<string, string> = {\n json: 'application/json',\n html: 'text/html',\n xml: 'application/xml',\n text: 'text/plain',\n };\n\n const checkType = typeMap[type] || type;\n if (\n acceptHeader.includes(checkType) ||\n acceptHeader.includes('*/*')\n ) {\n return type;\n }\n }\n\n return false;\n };\n }\n\n // Cookie parsing with performance optimization and caching\n if (!enhanced.parseCookies) {\n enhanced.parseCookies = () => {\n // Check if cookies are already cached\n if ((enhanced as any)[PARSED_COOKIES_SYMBOL]) {\n return (enhanced as any)[PARSED_COOKIES_SYMBOL] as CookieParseResult;\n }\n\n // Use optimized cookie parser\n const cookieHeader = enhanced.headers.cookie as string;\n const parsed = parseCookies(cookieHeader || '');\n\n // Cache the result to avoid re-parsing\n (enhanced as any)[PARSED_COOKIES_SYMBOL] = parsed;\n\n return parsed;\n };\n }\n\n // Lazy cookie property with getter\n if (!enhanced.cookies || Object.keys(enhanced.cookies).length === 0) {\n // Use lazy evaluation - only parse when first accessed\n Object.defineProperty(enhanced, 'cookies', {\n get() {\n if (!(enhanced as any)[PARSED_COOKIES_SYMBOL]) {\n (enhanced as any)[PARSED_COOKIES_SYMBOL] = enhanced.parseCookies();\n }\n return (enhanced as any)[PARSED_COOKIES_SYMBOL];\n },\n configurable: true,\n enumerable: true,\n });\n }\n\n // Validation framework\n if (!enhanced.validate) {\n enhanced.validate = (rules: Record<string, ValidationRule>) => {\n const errors: Record<string, string[]> = {};\n const sanitized: Record<string, unknown> = {};\n\n for (const [field, rule] of Object.entries(rules)) {\n const value =\n (enhanced.body as Record<string, unknown>)?.[field] ||\n enhanced.query[field] ||\n enhanced.params[field];\n const fieldErrors: string[] = [];\n\n // Required validation\n if (\n rule.required &&\n (value === undefined || value === null || value === '')\n ) {\n fieldErrors.push(rule.message || `${field} is required`);\n continue;\n }\n\n // Only process validation if value exists and is not empty\n if (value !== undefined && value !== null && value !== '') {\n // Type validation\n if (rule.type) {\n if (\n rule.type === 'email' &&\n !enhanced.isValidEmail(String(value))\n ) {\n fieldErrors.push(\n rule.message || `${field} must be a valid email`\n );\n } else if (\n rule.type === 'url' &&\n !enhanced.isValidUrl(String(value))\n ) {\n fieldErrors.push(\n rule.message || `${field} must be a valid URL`\n );\n } else if (rule.type === 'number' && isNaN(Number(value))) {\n fieldErrors.push(rule.message || `${field} must be a number`);\n }\n }\n\n // Length validation\n if (rule.minLength && String(value).length < rule.minLength) {\n fieldErrors.push(\n rule.message ||\n `${field} must be at least ${rule.minLength} characters`\n );\n }\n if (rule.maxLength && String(value).length > rule.maxLength) {\n fieldErrors.push(\n rule.message ||\n `${field} must be no more than ${rule.maxLength} characters`\n );\n }\n\n // Custom validation\n if (\n rule.custom &&\n typeof rule.custom === 'function' &&\n !rule.custom(value)\n ) {\n fieldErrors.push(\n rule.message || `${field} failed custom validation`\n );\n }\n\n // Sanitize value\n let sanitizedValue: unknown = value;\n if (rule.sanitize) {\n sanitizedValue = enhanced.sanitize(\n value,\n rule.sanitize as SanitizeOptions\n );\n }\n\n (sanitized as Record<string, unknown>)[field] = sanitizedValue;\n }\n\n if (fieldErrors.length > 0) {\n errors[field] = fieldErrors;\n }\n }\n\n return {\n isValid: Object.keys(errors).length === 0,\n errors,\n sanitized,\n };\n };\n }\n\n // Data sanitization\n if (!enhanced.sanitize) {\n enhanced.sanitize = (value: unknown, options: SanitizeOptions = {}) => {\n if (typeof value !== 'string') return value;\n\n let sanitized = value as string;\n\n if (options.trim) {\n sanitized = sanitized.trim();\n }\n\n if (options.lowercase) {\n sanitized = sanitized.toLowerCase();\n }\n\n if (options.uppercase) {\n sanitized = sanitized.toUpperCase();\n }\n\n if (options.removeHtml) {\n sanitized = sanitized.replace(/<[^>]*>/g, '');\n }\n\n if (options.escape) {\n sanitized = sanitized\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n }\n\n if (options.removeSpecialChars) {\n sanitized = sanitized.replace(/[^a-zA-Z0-9\\s]/g, '');\n }\n\n return sanitized;\n };\n }\n\n // Email validation\n if (!enhanced.isValidEmail) {\n enhanced.isValidEmail = (email: string) => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n };\n }\n\n // URL validation\n if (!enhanced.isValidUrl) {\n enhanced.isValidUrl = (url: string) => {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n };\n }\n\n // Request fingerprinting\n if (!enhanced.fingerprint) {\n enhanced.fingerprint = () => {\n const userAgent = enhanced.headers['user-agent'] || '';\n const accept = enhanced.headers.accept || '';\n const acceptLanguage = enhanced.headers['accept-language'] || '';\n const ip = enhanced.ip;\n\n const fingerprint = `${ip}-${userAgent}-${accept}-${acceptLanguage}`;\n return Buffer.from(fingerprint).toString('base64').substring(0, 16);\n };\n }\n\n // User agent parsing\n if (!enhanced.userAgent) {\n enhanced.userAgent = () => {\n const ua = (enhanced.headers['user-agent'] as string) || '';\n\n const isMobile = /Mobile|Android|iPhone|iPad|iPhone OS/.test(ua);\n const isBot = /bot|crawler|spider|crawling/i.test(ua);\n\n let browser = 'Unknown';\n if (ua.includes('Chrome') && !ua.includes('Edg')) browser = 'Chrome';\n else if (ua.includes('Firefox')) browser = 'Firefox';\n else if (ua.includes('Safari') && !ua.includes('Chrome'))\n browser = 'Safari';\n else if (ua.includes('Edge')) browser = 'Edge';\n else if (ua.includes('AppleWebKit')) browser = 'Chrome'; // Fallback for Chrome\n\n let os = 'Unknown';\n if (ua.includes('Windows')) os = 'Windows';\n else if (ua.includes('Mac')) os = 'macOS';\n else if (ua.includes('Linux')) os = 'Linux';\n else if (ua.includes('Android')) os = 'Android';\n else if (ua.includes('iOS') || ua.includes('iPhone OS')) os = 'iOS';\n\n let device = 'Desktop';\n if (isMobile) device = 'Mobile';\n if (ua.includes('Tablet') || ua.includes('iPad')) device = 'Tablet';\n\n return {\n raw: ua,\n browser,\n os,\n device,\n isMobile,\n isBot,\n };\n };\n }\n\n // Request timing\n if (!enhanced.timing) {\n enhanced.timing = () => ({\n start: enhanced.startTime,\n duration: Date.now() - enhanced.startTime,\n timestamp: new Date().toISOString(),\n });\n }\n\n // Rate limit info (placeholder)\n if (!enhanced.rateLimit) {\n enhanced.rateLimit = () => ({\n limit: 100,\n remaining: 99,\n reset: Date.now() + 3600000,\n retryAfter: 0,\n });\n }\n\n // Helper for sanitizing objects\n if (!enhanced.sanitizeObject) {\n enhanced.sanitizeObject = (obj: unknown, options: any = {}) => {\n if (typeof obj !== 'object' || obj === null) return obj;\n\n const sanitized: any = {};\n for (const [key, value] of Object.entries(\n obj as Record<string, unknown>\n )) {\n if (typeof value === 'string') {\n sanitized[key] = enhanced.sanitize(value, options);\n } else if (typeof value === 'object' && value !== null) {\n sanitized[key] = enhanced.sanitizeObject(value, options);\n } else {\n sanitized[key] = value;\n }\n }\n return sanitized;\n };\n }\n\n // Helper for request timing\n if (!enhanced.getRequestTiming) {\n enhanced.getRequestTiming = () => enhanced.timing();\n }\n\n // User agent parsing methods\n if (!enhanced.sanitizeValue) {\n enhanced.sanitizeValue = (value: unknown, rule: any) =>\n enhanced.sanitize(value, rule?.sanitize);\n }\n\n if (!enhanced.parseBrowser) {\n enhanced.parseBrowser = (ua: string) => {\n if (ua.includes('Chrome')) return 'Chrome';\n if (ua.includes('Firefox')) return 'Firefox';\n if (ua.includes('Safari')) return 'Safari';\n if (ua.includes('Edge')) return 'Edge';\n return 'Unknown';\n };\n }\n\n if (!enhanced.parseOS) {\n enhanced.parseOS = (ua: string) => {\n if (ua.includes('Windows')) return 'Windows';\n if (ua.includes('Mac')) return 'macOS';\n if (ua.includes('Linux')) return 'Linux';\n if (ua.includes('Android')) return 'Android';\n if (ua.includes('iOS')) return 'iOS';\n return 'Unknown';\n };\n }\n\n if (!enhanced.parseDevice) {\n enhanced.parseDevice = (ua: string) => {\n if (ua.includes('Mobile')) return 'Mobile';\n if (ua.includes('Tablet')) return 'Tablet';\n return 'Desktop';\n };\n }\n\n if (!enhanced.isBot) {\n enhanced.isBot = (ua: string) => /bot|crawler|spider|crawling/i.test(ua);\n }\n\n if (!enhanced.isMobile) {\n enhanced.isMobile = (ua: string) => /Mobile|Android|iPhone|iPad/.test(ua);\n }\n\n return enhanced;\n }\n}\n","/**\n * Pre-built Header Buffers for NextRush v2\n *\n * Pre-allocates common HTTP headers as buffers to avoid repeated string allocations.\n * This provides 5-10% performance improvement across all routes with minimal memory cost.\n *\n * **Why This is Safe:**\n * - Only pre-builds STATIC headers (Content-Type, etc.)\n * - Total memory cost: ~10KB (negligible)\n * - Dynamic headers (Date, Content-Length) still generated per-request\n * - Works for unlimited routes without memory explosion\n *\n * @module HeaderBuffers\n */\n\n/**\n * Common Content-Type header values pre-built as buffers\n */\nexport const CONTENT_TYPE_BUFFERS = {\n JSON: Buffer.from('application/json; charset=utf-8'),\n HTML: Buffer.from('text/html; charset=utf-8'),\n TEXT: Buffer.from('text/plain; charset=utf-8'),\n XML: Buffer.from('application/xml; charset=utf-8'),\n OCTET_STREAM: Buffer.from('application/octet-stream'),\n FORM_URLENCODED: Buffer.from('application/x-www-form-urlencoded'),\n MULTIPART: Buffer.from('multipart/form-data'),\n} as const;\n\n/**\n * Common static headers pre-built as strings\n * These are concatenated with dynamic values\n */\nexport const STATIC_HEADERS = {\n CONTENT_TYPE: 'Content-Type',\n CONTENT_LENGTH: 'Content-Length',\n CONNECTION: 'Connection',\n KEEP_ALIVE: 'keep-alive',\n DATE: 'Date',\n SERVER: 'NextRush/2.0',\n} as const;\n\n/**\n * Pre-built common header combinations\n * Format: \"Header-Name: Value\\r\\n\"\n */\nexport const HEADER_LINES = {\n JSON: 'Content-Type: application/json; charset=utf-8\\r\\n',\n HTML: 'Content-Type: text/html; charset=utf-8\\r\\n',\n TEXT: 'Content-Type: text/plain; charset=utf-8\\r\\n',\n XML: 'Content-Type: application/xml; charset=utf-8\\r\\n',\n CONNECTION_KEEP_ALIVE: 'Connection: keep-alive\\r\\n',\n SERVER: 'Server: NextRush/2.0\\r\\n',\n} as const;\n\n/**\n * Fast header builder using pre-built buffers\n */\nexport class FastHeaderBuilder {\n /**\n * Build JSON response headers\n */\n static jsonHeaders(contentLength: number): Record<string, string> {\n return {\n 'Content-Type': 'application/json; charset=utf-8',\n 'Content-Length': String(contentLength),\n };\n }\n\n /**\n * Build HTML response headers\n */\n static htmlHeaders(contentLength: number): Record<string, string> {\n return {\n 'Content-Type': 'text/html; charset=utf-8',\n 'Content-Length': String(contentLength),\n };\n }\n\n /**\n * Build text response headers\n */\n static textHeaders(contentLength: number): Record<string, string> {\n return {\n 'Content-Type': 'text/plain; charset=utf-8',\n 'Content-Length': String(contentLength),\n };\n }\n\n /**\n * Build XML response headers\n */\n static xmlHeaders(contentLength: number): Record<string, string> {\n return {\n 'Content-Type': 'application/xml; charset=utf-8',\n 'Content-Length': String(contentLength),\n };\n }\n}\n\n/**\n * Fast JSON stringification with type hints\n * Avoids expensive JSON.stringify analysis for known types\n */\nexport class FastJSON {\n /**\n * Fast stringify for objects (most common case)\n */\n static stringifyObject(obj: Record<string, unknown>): string {\n // For small objects, JSON.stringify is already optimized by V8\n return JSON.stringify(obj);\n }\n\n /**\n * Fast stringify for arrays\n */\n static stringifyArray(arr: unknown[]): string {\n return JSON.stringify(arr);\n }\n\n /**\n * Convert primitive to JSON string without stringify overhead\n */\n static stringifyPrimitive(value: string | number | boolean | null): string {\n if (typeof value === 'string') {\n return `\"${value.replace(/\"/g, '\\\\\"')}\"`;\n }\n return String(value);\n }\n}\n\n/**\n * Memory statistics for header buffers\n */\nexport function getHeaderBufferStats(): {\n totalBuffers: number;\n totalBytes: number;\n buffers: Record<string, number>;\n} {\n const buffers = Object.entries(CONTENT_TYPE_BUFFERS).reduce(\n (acc, [key, buf]) => {\n acc[key] = buf.length;\n return acc;\n },\n {} as Record<string, number>\n );\n\n const totalBytes = Object.values(buffers).reduce(\n (sum, size) => sum + size,\n 0\n );\n\n return {\n totalBuffers: Object.keys(buffers).length,\n totalBytes,\n buffers,\n };\n}\n","/**\n * Response Enhancer for NextRush v2\n *\n * @packageDocumentation\n */\n\nimport { createHash } from 'node:crypto';\nimport { createReadStream, statSync } from 'node:fs';\nimport type { ServerResponse } from 'node:http';\nimport { extname } from 'node:path';\nimport { type CookieOptions, serializeCookie } from '../../utils/cookies.js';\nimport { FastHeaderBuilder } from '../../utils/header-buffers.js';\n\n/**\n * File options interface\n */\ninterface FileOptions {\n etag?: boolean;\n root?: string;\n}\n\n/**\n * Enhanced response interface with Express-like methods\n */\nexport interface EnhancedResponse extends ServerResponse {\n locals: Record<string, unknown>;\n\n // Status\n status(code: number): EnhancedResponse;\n\n // Core response methods\n json(data: unknown): void;\n send(data: string | Buffer | object): void;\n html(data: string): void;\n text(data: string): void;\n xml(data: string): void;\n\n // Enhanced response methods\n csv(data: unknown[], filename?: string): void;\n stream(stream: NodeJS.ReadableStream, contentType?: string): void;\n\n // File operations\n sendFile(filePath: string, options?: FileOptions): void;\n file(filePath: string, options?: FileOptions): EnhancedResponse;\n download(filePath: string, filename?: string, options?: FileOptions): void;\n\n // Smart file operations\n getSmartContentType(filePath: string): string;\n generateETag(stats: unknown): string;\n\n // Redirect methods\n redirect(url: string, status?: number): void;\n redirectPermanent(url: string): void;\n redirectTemporary(url: string): void;\n\n // Header methods\n set(field: string | Record<string, string>, value?: string): EnhancedResponse;\n header(field: string, value: string): EnhancedResponse;\n removeHeader(field: string): EnhancedResponse;\n remove(field: string): EnhancedResponse;\n get(field: string): string | undefined;\n type(type: string): EnhancedResponse;\n length(length: number): EnhancedResponse;\n etag(etag: string): EnhancedResponse;\n lastModified(date: Date): EnhancedResponse;\n\n // Cookie methods\n cookie(\n name: string,\n value: string,\n options?: CookieOptions\n ): EnhancedResponse;\n clearCookie(name: string, options?: CookieOptions): EnhancedResponse;\n\n // Template rendering\n render(template: string, data?: unknown): void;\n\n // Template helper methods\n getNestedValue(obj: unknown, path: string): unknown;\n isTruthy(value: unknown): boolean;\n\n // Cache control\n cache(seconds: number): EnhancedResponse;\n noCache(): EnhancedResponse;\n\n // CORS support\n cors(origin?: string): EnhancedResponse;\n\n // Security headers\n security(): EnhancedResponse;\n\n // Compression hint\n compress(): EnhancedResponse;\n\n // API response helpers\n success(data: unknown, message?: string): void;\n error(message: string, code?: number, details?: unknown): void;\n paginate(data: unknown[], page: number, limit: number, total: number): void;\n\n // Content type utilities\n getContentTypeFromExtension(ext: string): string;\n\n // Helper methods\n convertToCSV(data: unknown[]): string;\n\n // Performance\n time(label?: string): EnhancedResponse;\n}\n\n/**\n * Response Enhancer class for NextRush v2\n *\n * @example\n * ```typescript\n * import { ResponseEnhancer } from '@/core/enhancers/response-enhancer';\n *\n * const enhancedRes = ResponseEnhancer.enhance(res);\n * enhancedRes.json({ message: 'Hello World' });\n * ```\n */\nexport class ResponseEnhancer {\n /**\n * Enhance a Node.js ServerResponse with NextRush v2 features\n *\n * @param res - The original HTTP response\n * @returns Enhanced response with additional methods\n */\n static enhance(res: ServerResponse): EnhancedResponse {\n const enhanced = res as EnhancedResponse;\n\n // Initialize properties\n enhanced.locals = enhanced.locals || {};\n\n // Status management\n if (!enhanced.status) {\n enhanced.status = (code: number) => {\n enhanced.statusCode = code;\n return enhanced;\n };\n }\n\n // Core response methods\n if (!enhanced.json) {\n enhanced.json = (data: unknown) => {\n if (enhanced.headersSent || enhanced.finished) {\n return; // Don't write if response has already been sent\n }\n const jsonString = JSON.stringify(data);\n // Ensure statusCode is set\n if (enhanced.status) {\n enhanced.statusCode =\n typeof enhanced.status === 'function'\n ? enhanced.statusCode\n : (enhanced.status as unknown as number);\n }\n // Use writeHead for performance if available, otherwise setHeader for compatibility\n if (typeof enhanced.writeHead === 'function') {\n const headers = FastHeaderBuilder.jsonHeaders(\n Buffer.byteLength(jsonString)\n );\n enhanced.writeHead(enhanced.statusCode, headers);\n } else {\n enhanced.setHeader('Content-Type', 'application/json; charset=utf-8');\n enhanced.setHeader(\n 'Content-Length',\n Buffer.byteLength(jsonString).toString()\n );\n }\n enhanced.end(jsonString);\n };\n }\n\n if (!enhanced.send) {\n enhanced.send = (data: string | Buffer | object) => {\n if (enhanced.headersSent || enhanced.finished) {\n return; // Don't write if response has already been sent\n }\n if (typeof data === 'object' && !Buffer.isBuffer(data)) {\n enhanced.json(data);\n } else {\n // Ensure statusCode is set\n if (enhanced.status) {\n enhanced.statusCode =\n typeof enhanced.status === 'function'\n ? enhanced.statusCode\n : (enhanced.status as unknown as number);\n }\n enhanced.end(data);\n }\n };\n }\n\n if (!enhanced.html) {\n enhanced.html = (data: string) => {\n if (enhanced.headersSent || enhanced.finished) {\n return; // Don't write if response has already been sent\n }\n // Ensure statusCode is set\n if (enhanced.status) {\n enhanced.statusCode =\n typeof enhanced.status === 'function'\n ? enhanced.statusCode\n : (enhanced.status as unknown as number);\n }\n // Use writeHead for performance if available, otherwise setHeader for compatibility\n if (typeof enhanced.writeHead === 'function') {\n const headers = FastHeaderBuilder.htmlHeaders(\n Buffer.byteLength(data)\n );\n enhanced.writeHead(enhanced.statusCode, headers);\n } else {\n enhanced.setHeader('Content-Type', 'text/html; charset=utf-8');\n enhanced.setHeader(\n 'Content-Length',\n Buffer.byteLength(data).toString()\n );\n }\n enhanced.end(data);\n };\n }\n\n if (!enhanced.text) {\n enhanced.text = (data: string) => {\n if (enhanced.headersSent || enhanced.finished) {\n return; // Don't write if response has already been sent\n }\n // Ensure statusCode is set\n if (enhanced.status) {\n enhanced.statusCode =\n typeof enhanced.status === 'function'\n ? enhanced.statusCode\n : (enhanced.status as unknown as number);\n }\n // Use writeHead for performance if available, otherwise setHeader for compatibility\n if (typeof enhanced.writeHead === 'function') {\n const headers = FastHeaderBuilder.textHeaders(\n Buffer.byteLength(data)\n );\n enhanced.writeHead(enhanced.statusCode, headers);\n } else {\n enhanced.setHeader('Content-Type', 'text/plain; charset=utf-8');\n enhanced.setHeader(\n 'Content-Length',\n Buffer.byteLength(data).toString()\n );\n }\n enhanced.end(data);\n };\n }\n\n if (!enhanced.xml) {\n enhanced.xml = (data: string) => {\n if (enhanced.headersSent || enhanced.finished) {\n return; // Don't write if response has already been sent\n }\n // Ensure statusCode is set\n if (enhanced.status) {\n enhanced.statusCode =\n typeof enhanced.status === 'function'\n ? enhanced.statusCode\n : (enhanced.status as unknown as number);\n }\n // Use writeHead for performance if available, otherwise setHeader for compatibility\n if (typeof enhanced.writeHead === 'function') {\n const headers = FastHeaderBuilder.xmlHeaders(Buffer.byteLength(data));\n enhanced.writeHead(enhanced.statusCode, headers);\n } else {\n enhanced.setHeader('Content-Type', 'application/xml; charset=utf-8');\n enhanced.setHeader(\n 'Content-Length',\n Buffer.byteLength(data).toString()\n );\n }\n enhanced.end(data);\n };\n }\n\n // Enhanced response methods\n if (!enhanced.csv) {\n enhanced.csv = (data: unknown[], filename?: string) => {\n const csvContent = enhanced.convertToCSV(data);\n if (!enhanced.headersSent) {\n enhanced.setHeader('Content-Type', 'text/csv');\n if (filename) {\n enhanced.setHeader(\n 'Content-Disposition',\n `attachment; filename=\"${filename}\"`\n );\n }\n }\n // Ensure statusCode is set\n if (enhanced.status) {\n enhanced.statusCode =\n typeof enhanced.status === 'function'\n ? enhanced.statusCode\n : (enhanced.status as unknown as number);\n }\n enhanced.end(csvContent);\n };\n }\n\n if (!enhanced.stream) {\n enhanced.stream = (\n stream: NodeJS.ReadableStream,\n contentType?: string\n ) => {\n if (contentType && !enhanced.headersSent) {\n enhanced.setHeader('Content-Type', contentType);\n }\n stream.pipe(enhanced);\n };\n }\n\n // File operations\n if (!enhanced.sendFile) {\n enhanced.sendFile = (filePath: string, _options?: FileOptions) => {\n try {\n const stats = statSync(filePath);\n const contentType = enhanced.getSmartContentType(filePath);\n\n enhanced.setHeader('Content-Type', contentType);\n enhanced.setHeader('Content-Length', stats.size);\n enhanced.setHeader('Last-Modified', stats.mtime.toUTCString());\n\n if (_options?.etag !== false) {\n const etag = enhanced.generateETag(stats);\n enhanced.setHeader('ETag', etag);\n }\n\n const stream = createReadStream(filePath);\n stream.pipe(enhanced);\n } catch {\n enhanced.status(404).json({ error: 'File not found' });\n }\n };\n }\n\n if (!enhanced.download) {\n enhanced.download = (\n filePath: string,\n filename?: string,\n options?: FileOptions\n ) => {\n const name = filename || filePath.split('/').pop() || 'download';\n enhanced.setHeader(\n 'Content-Disposition',\n `attachment; filename=\"${name}\"`\n );\n enhanced.sendFile(filePath, options);\n };\n }\n\n // Smart file operations\n if (!enhanced.getSmartContentType) {\n enhanced.getSmartContentType = (filePath: string) => {\n const ext = extname(filePath).toLowerCase();\n return enhanced.getContentTypeFromExtension(ext);\n };\n }\n\n if (!enhanced.generateETag) {\n enhanced.generateETag = (stats: { size: number; mtime: Date }) => {\n const hash = createHash('md5');\n hash.update(`${stats.size}-${stats.mtime.getTime()}`);\n return `\"${hash.digest('hex')}\"`;\n };\n }\n\n // Redirect methods\n if (!enhanced.redirect) {\n enhanced.redirect = (url: string, status: number = 302) => {\n enhanced.statusCode = status;\n enhanced.setHeader('Location', url);\n enhanced.end();\n };\n }\n\n if (!enhanced.redirectPermanent) {\n enhanced.redirectPermanent = (url: string) => {\n enhanced.redirect(url, 301);\n };\n }\n\n if (!enhanced.redirectTemporary) {\n enhanced.redirectTemporary = (url: string) => {\n enhanced.redirect(url, 307);\n };\n }\n\n // Header methods\n if (!enhanced.set) {\n enhanced.set = (\n field: string | Record<string, string>,\n value?: string\n ) => {\n if (typeof field === 'string' && value !== undefined) {\n enhanced.setHeader(field, value);\n } else if (typeof field === 'object') {\n Object.entries(field).forEach(([key, val]) => {\n enhanced.setHeader(key, val);\n });\n }\n return enhanced;\n };\n }\n\n if (!enhanced.header) {\n enhanced.header = (field: string, value: string) => {\n enhanced.setHeader(field, value);\n return enhanced;\n };\n }\n\n if (!enhanced.removeHeader) {\n enhanced.removeHeader = (field: string) => {\n // Use the native removeHeader method from ServerResponse\n (enhanced as ServerResponse).removeHeader(field);\n return enhanced;\n };\n }\n\n if (!enhanced.get) {\n enhanced.get = (field: string) => {\n return enhanced.getHeader(field) as string | undefined;\n };\n }\n\n // Cookie methods\n if (!enhanced.cookie) {\n enhanced.cookie = (\n name: string,\n value: string,\n options?: CookieOptions\n ) => {\n const cookie = serializeCookie(name, value, options);\n enhanced.setHeader('Set-Cookie', cookie);\n return enhanced;\n };\n }\n\n if (!enhanced.clearCookie) {\n enhanced.clearCookie = (name: string, options?: CookieOptions) => {\n enhanced.cookie(name, '', {\n ...options,\n maxAge: 0,\n expires: new Date(0),\n });\n return enhanced;\n };\n }\n\n // Template rendering\n if (!enhanced.render) {\n enhanced.render = (template: string, data?: unknown) => {\n // Basic template rendering - can be extended with template engine\n let rendered = template;\n\n if (data && typeof data === 'object') {\n Object.entries(data as Record<string, unknown>).forEach(\n ([key, value]) => {\n const regex = new RegExp(`{{${key}}}`, 'g');\n rendered = rendered.replace(regex, String(value));\n }\n );\n }\n\n enhanced.html(rendered);\n };\n }\n\n // Template helper methods\n if (!enhanced.getNestedValue) {\n enhanced.getNestedValue = (obj: unknown, path: string) => {\n return path.split('.').reduce(\n (current: Record<string, unknown> | null, key: string) => {\n return current && typeof current === 'object' && key in current\n ? (current[key] as Record<string, unknown> | null)\n : null;\n },\n obj as Record<string, unknown> | null\n );\n };\n }\n\n if (!enhanced.isTruthy) {\n enhanced.isTruthy = (value: unknown) => {\n return (\n value !== null &&\n value !== undefined &&\n value !== false &&\n value !== 0 &&\n value !== ''\n );\n };\n }\n\n // Cache control\n if (!enhanced.cache) {\n enhanced.cache = (seconds: number) => {\n enhanced.setHeader('Cache-Control', `public, max-age=${seconds}`);\n return enhanced;\n };\n }\n\n if (!enhanced.noCache) {\n enhanced.noCache = () => {\n enhanced.setHeader(\n 'Cache-Control',\n 'no-cache, no-store, must-revalidate'\n );\n enhanced.setHeader('Pragma', 'no-cache');\n enhanced.setHeader('Expires', '0');\n return enhanced;\n };\n }\n\n // CORS support\n if (!enhanced.cors) {\n enhanced.cors = (origin?: string) => {\n enhanced.setHeader('Access-Control-Allow-Origin', origin || '*');\n enhanced.setHeader(\n 'Access-Control-Allow-Methods',\n 'GET, POST, PUT, DELETE, OPTIONS'\n );\n enhanced.setHeader(\n 'Access-Control-Allow-Headers',\n 'Content-Type, Authorization'\n );\n return enhanced;\n };\n }\n\n // Security headers\n if (!enhanced.security) {\n enhanced.security = () => {\n enhanced.setHeader('X-Content-Type-Options', 'nosniff');\n enhanced.setHeader('X-Frame-Options', 'DENY');\n enhanced.setHeader('X-XSS-Protection', '1; mode=block');\n enhanced.setHeader(\n 'Referrer-Policy',\n 'strict-origin-when-cross-origin'\n );\n return enhanced;\n };\n }\n\n // Compression hint\n if (!enhanced.compress) {\n enhanced.compress = () => {\n enhanced.setHeader('Content-Encoding', 'gzip');\n return enhanced;\n };\n }\n\n // API response helpers\n if (!enhanced.success) {\n enhanced.success = (data: unknown, message?: string) => {\n enhanced.json({\n success: true,\n data,\n message: message || 'Success',\n timestamp: new Date().toISOString(),\n });\n };\n }\n\n if (!enhanced.error) {\n enhanced.error = (\n message: string,\n code: number = 500,\n details?: unknown\n ) => {\n enhanced.status(code).json({\n success: false,\n error: message,\n details,\n timestamp: new Date().toISOString(),\n });\n };\n }\n\n if (!enhanced.paginate) {\n enhanced.paginate = (\n data: unknown[],\n page: number,\n limit: number,\n total: number\n ) => {\n const totalPages = Math.ceil(total / limit);\n enhanced.json({\n success: true,\n data,\n pagination: {\n page,\n limit,\n total,\n totalPages,\n hasNext: page < totalPages,\n hasPrev: page > 1,\n },\n timestamp: new Date().toISOString(),\n });\n };\n }\n\n // Content type utilities\n if (!enhanced.getContentTypeFromExtension) {\n enhanced.getContentTypeFromExtension = (ext: string) => {\n const mimeTypes: Record<string, string> = {\n '.html': 'text/html',\n '.css': 'text/css',\n '.js': 'application/javascript',\n '.json': 'application/json',\n '.xml': 'application/xml',\n '.txt': 'text/plain',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.pdf': 'application/pdf',\n '.zip': 'application/zip',\n '.csv': 'text/csv',\n };\n return mimeTypes[ext] || 'application/octet-stream';\n };\n }\n\n // Performance\n if (!enhanced.time) {\n enhanced.time = (label?: string) => {\n const timing = process.hrtime.bigint();\n enhanced.setHeader('X-Response-Time', `${timing}ns`);\n if (label) {\n enhanced.setHeader('X-Timing-Label', label);\n }\n return enhanced;\n };\n }\n\n // Helper method for CSV conversion\n if (!enhanced.convertToCSV) {\n enhanced.convertToCSV = (data: unknown[]) => {\n if (!Array.isArray(data) || data.length === 0) {\n return '';\n }\n\n const headers = Object.keys(data[0] as Record<string, unknown>);\n const csvRows = [headers.join(',')];\n\n for (const row of data) {\n const values = headers.map(header => {\n const value = (row as Record<string, unknown>)[header];\n return `\"${String(value || '').replace(/\"/g, '\"\"')}\"`;\n });\n csvRows.push(values.join(','));\n }\n\n return csvRows.join('\\n');\n };\n }\n\n // Missing methods that are declared in TypeScript interface\n\n // Alias for sendFile\n if (!enhanced.file) {\n enhanced.file = (path: string, options?: FileOptions) => {\n enhanced.sendFile(path, options);\n return enhanced;\n };\n }\n\n // Alias for removeHeader\n if (!enhanced.remove) {\n enhanced.remove = (field: string) => {\n enhanced.removeHeader(field);\n return enhanced;\n };\n }\n\n // Set content type\n if (!enhanced.type) {\n enhanced.type = (type: string) => {\n enhanced.setHeader('Content-Type', type);\n return enhanced;\n };\n }\n\n // Set content length\n if (!enhanced.length) {\n enhanced.length = (length: number) => {\n enhanced.setHeader('Content-Length', length.toString());\n return enhanced;\n };\n }\n\n // Set ETag\n if (!enhanced.etag) {\n enhanced.etag = (etag: string) => {\n enhanced.setHeader('ETag', etag);\n return enhanced;\n };\n }\n\n // Set Last-Modified\n if (!enhanced.lastModified) {\n enhanced.lastModified = (date: Date) => {\n enhanced.setHeader('Last-Modified', date.toUTCString());\n return enhanced;\n };\n }\n\n return enhanced;\n }\n}\n","/**\n * Context factory for NextRush v2\n *\n * @packageDocumentation\n */\n\nimport {\n RequestEnhancer,\n type EnhancedRequest,\n} from '@/core/enhancers/request-enhancer';\nimport {\n ResponseEnhancer,\n type EnhancedResponse,\n} from '@/core/enhancers/response-enhancer';\nimport { parseQueryString } from '@/core/middleware/body-parser/utils';\nimport type { Context, NextRushResponse } from '@/types/context';\nimport type { ApplicationOptions, NextRushRequest } from '@/types/http';\nimport type { CookieOptions } from '@/utils/cookies';\nimport type { IncomingMessage, ServerResponse } from 'node:http';\n\n/**\n * Context pool for performance optimization\n */\nclass ContextPool {\n private static pool: Partial<Context>[] = [];\n private static readonly MAX_POOL_SIZE = 100;\n\n static acquire(): Partial<Context> {\n return this.pool.pop() || {};\n }\n\n static release(ctx: Partial<Context>): void {\n if (this.pool.length < this.MAX_POOL_SIZE) {\n // ⚡ Optimized: Reset properties instead of deleting (avoids V8 deoptimization)\n ctx.req = undefined as any;\n ctx.res = undefined as any;\n ctx.method = undefined as any;\n ctx.url = undefined as any;\n ctx.path = undefined as any;\n ctx.query = undefined as any;\n ctx.params = undefined as any;\n ctx.body = undefined as any;\n ctx.headers = undefined as any;\n ctx.status = undefined as any;\n ctx.id = undefined as any;\n ctx.ip = undefined as any;\n ctx.secure = undefined as any;\n ctx.protocol = undefined as any;\n ctx.state = undefined as any;\n ctx.cookie = undefined as any;\n\n this.pool.push(ctx);\n }\n }\n\n static clear(): void {\n this.pool.length = 0;\n }\n}\n\n/**\n * Create a Koa-style context object with Express-like design\n *\n * @param req - HTTP request object\n * @param res - HTTP response object\n * @param options - Application options\n * @returns Enhanced context object\n *\n * @example\n * ```typescript\n * import { createContext } from '@/core/context';\n *\n * const ctx = createContext(req, res, options);\n * console.log(ctx.req.ip()); // Client IP\n * ctx.res.json({ message: 'Hello' });\n * ```\n */\nexport function createContext(\n req: IncomingMessage | NextRushRequest,\n res: ServerResponse | NextRushResponse,\n _options: Required<ApplicationOptions>\n): Context {\n // Optimized enhancement check - avoid double enhancement\n const isEnhancedReq =\n typeof (req as any).originalUrl === 'string' ||\n typeof (req as any).params === 'object';\n const isEnhancedRes = typeof (res as any).json === 'function';\n\n const enhancedReq = isEnhancedReq ? req : RequestEnhancer.enhance(req);\n const enhancedRes = isEnhancedRes ? res : ResponseEnhancer.enhance(res);\n\n // Fast path parsing - avoid expensive URL constructor\n const method = req.method || 'GET';\n const url = req.url || '/';\n const host = req.headers.host || 'localhost';\n const protocol =\n req.headers['x-forwarded-proto'] === 'https' ? 'https' : 'http';\n\n // Fast path extraction\n const pathEnd = url.indexOf('?');\n const path = pathEnd === -1 ? url : url.slice(0, pathEnd);\n\n // Fast IP detection - avoid string operations\n const forwardedFor = req.headers['x-forwarded-for'] as string;\n const ip = forwardedFor\n ? forwardedFor.split(',')[0]?.trim() || '127.0.0.1'\n : (req.headers['x-real-ip'] as string) ||\n (req.socket as any)?.remoteAddress ||\n '127.0.0.1';\n\n // Fast security detection\n const secure =\n req.headers['x-forwarded-proto'] === 'https' ||\n (req.socket as any)?.encrypted === true;\n\n // Fast hostname detection\n const hostname = host.split(':')[0] || 'localhost';\n\n // Use context pool for better performance\n const ctx = ContextPool.acquire() as Context;\n\n // Set optimized properties\n ctx.req = enhancedReq as any;\n ctx.res = enhancedRes as any;\n\n // Ensure ctx.body and ctx.req.body are synchronized\n (ctx as any).body = (enhancedReq as EnhancedRequest).body; // Reference the same body from enhanced request\n\n ctx.method = method;\n ctx.url = url;\n ctx.path = path;\n ctx.headers = req.headers;\n ctx.params = {};\n\n // ⚡ Optimized: Skip ID generation in production (zero overhead)\n if (process.env['NODE_ENV'] !== 'production') {\n ctx.id = `ctx-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n\n ctx.state = {};\n ctx.startTime = Date.now();\n ctx.ip = ip;\n ctx.secure = secure;\n ctx.protocol = protocol;\n ctx.hostname = hostname;\n ctx.host = host;\n ctx.origin = `${protocol}://${host}`;\n ctx.href = `${protocol}://${host}${url}`;\n ctx.search = pathEnd === -1 ? '' : url.slice(pathEnd);\n ctx.responseHeaders = {}; // To track headers set via ctx.set\n\n // Lazy load expensive properties only when accessed\n let _query: Record<string, string | string[]> = {};\n let _searchParams: URLSearchParams | undefined;\n\n Object.defineProperty(ctx, 'query', {\n get() {\n if (Object.keys(_query).length === 0 && ctx.search) {\n _query = parseQueryString(ctx.search.slice(1));\n // Freeze once to ensure read-only semantics for consumers\n Object.freeze(_query);\n }\n return _query;\n },\n set(value) {\n _query = value;\n // Keep consistent behavior: if value is an object, freeze it to enforce immutability-by-design\n if (value && typeof value === 'object') {\n Object.freeze(_query);\n }\n },\n enumerable: true,\n configurable: true,\n });\n\n Object.defineProperty(ctx, 'searchParams', {\n get() {\n if (!_searchParams && ctx.search) {\n _searchParams = new URLSearchParams(ctx.search.slice(1));\n }\n return _searchParams || new URLSearchParams();\n },\n set(value) {\n _searchParams = value;\n },\n enumerable: true,\n configurable: true,\n });\n\n // Define getter/setter for status to avoid property creation overhead\n Object.defineProperty(ctx, 'status', {\n get(): number {\n return (enhancedRes as any).statusCode || 200;\n },\n set(code: number) {\n (enhancedRes as any).statusCode = code;\n },\n enumerable: true,\n configurable: true,\n });\n\n // Add context methods (Koa-style)\n ctx.throw = function (status: number, message?: string): never {\n const error = new Error(message || 'HTTP Error');\n (error as any).status = status;\n throw error;\n };\n\n ctx.assert = function (\n condition: unknown,\n status: number,\n message?: string\n ): asserts condition {\n if (!condition) {\n this.throw(status, message);\n }\n };\n\n ctx.fresh = function (): boolean {\n const method = this.method;\n const status = this.status;\n\n if (method !== 'GET' && method !== 'HEAD') return false;\n if (status >= 200 && status < 300) return true;\n if (status === 304) return true;\n return false;\n };\n\n ctx.stale = function (): boolean {\n return !this.fresh();\n };\n\n ctx.idempotent = function (): boolean {\n return ['GET', 'HEAD', 'PUT', 'DELETE', 'OPTIONS', 'TRACE'].includes(\n this.method\n );\n };\n\n ctx.cacheable = function (): boolean {\n return this.method === 'GET' && this.status === 200;\n };\n\n // Set response header (Koa-style)\n ctx.set = function (name: string, value: string | number | string[]): void {\n (enhancedRes as any).setHeader(name, value);\n this.responseHeaders[name] = value;\n };\n\n // Convenience: ctx.sendFile delegates to enhanced response\n (ctx as any).sendFile = function (\n path: string,\n options?: { root?: string; etag?: boolean }\n ): void {\n (enhancedRes as any).sendFile(path, options);\n };\n\n // Convenience methods for better DX - most popular response methods\n\n // ctx.json() - most used method (99% of APIs)\n (ctx as any).json = function (data: unknown): void {\n (enhancedRes as EnhancedResponse).json(data);\n };\n\n // ctx.send() - second most used\n (ctx as any).send = function (data: string | Buffer | object): void {\n (enhancedRes as EnhancedResponse).send(data);\n };\n\n // ctx.redirect() - common for redirects\n (ctx as any).redirect = function (url: string, statusCode?: number): void {\n (enhancedRes as EnhancedResponse).redirect(url, statusCode);\n };\n\n // ctx.cookie() - common for session management\n (ctx as any).cookie = function (\n name: string,\n value: string,\n options?: CookieOptions\n ): EnhancedResponse {\n return (enhancedRes as EnhancedResponse).cookie(name, value, options);\n };\n\n return ctx;\n}\n\n/**\n * Release context back to pool for reuse\n * Call this when the request is complete\n */\nexport function releaseContext(ctx: Context): void {\n ContextPool.release(ctx);\n}\n\n/**\n * Clear the context pool\n * Call this during application shutdown\n */\nexport function clearContextPool(): void {\n ContextPool.clear();\n}\n","/**\n * Optimized Radix Tree Router for NextRush v2\n *\n * High-performance router with O(k) lookup performance\n * where k is path length, not route count.\n *\n * Performance optimizations:\n * - Zero-copy path splitting\n * - LRU cache for frequent paths\n * - Iterative traversal (no recursion)\n * - Pre-allocated parameter objects\n * - Optimized parameter matching\n *\n * @packageDocumentation\n */\n\nimport type {\n Middleware,\n RouteConfig,\n RouteData,\n RouteHandler,\n Router as RouterInterface,\n} from '@/types/context';\n\n/**\n * Optimized radix tree node\n */\ninterface OptimizedRadixNode {\n path: string;\n handlers: Map<string, RouteData>;\n children: Map<string, OptimizedRadixNode>;\n paramChild?: OptimizedRadixNode; // Single parameter child for O(1) access\n isParam: boolean;\n paramName?: string;\n paramIndex?: number; // Pre-computed parameter index\n wildcardChild?: OptimizedRadixNode;\n regex?: RegExp; // For regex patterns\n}\n\n/**\n * Route match result with pre-allocated parameter object\n */\ninterface OptimizedRouteMatch {\n handler: RouteHandler;\n middleware: Middleware[];\n params: Record<string, string>;\n path: string;\n compiled?: (ctx: any) => Promise<void>; // ✨ Compiled handler for maximum performance\n}\n\n/**\n * High-performance cache using Map for O(1) operations\n * Simplified design eliminates LRU overhead for better performance\n */\nclass RouteCache {\n private cache = new Map<string, OptimizedRouteMatch | null>();\n private maxSize: number;\n private cacheHits = 0;\n private cacheMisses = 0;\n\n constructor(maxSize: number = 1000) {\n this.maxSize = maxSize;\n }\n\n get(key: string): OptimizedRouteMatch | null | undefined {\n const result = this.cache.get(key);\n if (result !== undefined) {\n this.cacheHits++;\n return result;\n }\n this.cacheMisses++;\n return undefined;\n }\n\n set(key: string, value: OptimizedRouteMatch | null): void {\n // Simple size-based eviction - clear half when full for better performance\n if (this.cache.size >= this.maxSize) {\n const entries = Array.from(this.cache.entries());\n this.cache.clear();\n // Keep the second half (more recently used entries)\n const keepFrom = Math.floor(entries.length / 2);\n for (let i = keepFrom; i < entries.length; i++) {\n const entry = entries[i];\n if (entry) {\n this.cache.set(entry[0], entry[1]);\n }\n }\n }\n this.cache.set(key, value);\n }\n\n clear(): void {\n this.cache.clear();\n this.cacheHits = 0;\n this.cacheMisses = 0;\n }\n\n getSize(): number {\n return this.cache.size;\n }\n\n getStats(): { size: number; hitRate: number; hits: number; misses: number } {\n const total = this.cacheHits + this.cacheMisses;\n const hitRate = total === 0 ? 0 : this.cacheHits / total;\n return {\n size: this.getSize(),\n hitRate,\n hits: this.cacheHits,\n misses: this.cacheMisses,\n };\n }\n}\n\n/**\n * Ultra-fast path splitter with optimized splitting algorithm\n */\nclass PathSplitter {\n private static readonly CACHE_SIZE = 500; // Increased cache size\n private static pathCache = new Map<string, string[]>();\n\n // Pre-compiled common patterns for faster detection\n private static readonly PARAM_CHAR_CODE = 58; // ':'\n private static readonly SLASH_CHAR_CODE = 47; // '/'\n\n /**\n * Get cache size for statistics\n */\n static getCacheSize(): number {\n return this.pathCache.size;\n }\n\n static split(path: string): string[] {\n if (path === '/' || path === '') return [];\n\n // Check cache first for frequently used paths\n const cached = this.pathCache.get(path);\n if (cached) {\n return cached;\n }\n\n const parts: string[] = [];\n let start = path.charCodeAt(0) === this.SLASH_CHAR_CODE ? 1 : 0;\n\n // Ultra-optimized splitting using single pass with charCodeAt\n for (let i = start; i <= path.length; i++) {\n const charCode =\n i < path.length ? path.charCodeAt(i) : this.SLASH_CHAR_CODE;\n\n if (charCode === this.SLASH_CHAR_CODE || i === path.length) {\n if (i > start) {\n parts.push(path.substring(start, i));\n }\n start = i + 1;\n }\n }\n\n // Cache result for future lookups\n if (this.pathCache.size < this.CACHE_SIZE) {\n this.pathCache.set(path, parts);\n }\n\n return parts;\n }\n\n static clearCache(): void {\n this.pathCache.clear();\n }\n\n /**\n * Ultra-fast parameter detection\n */\n static isParameterized(segment: string): boolean {\n return segment.length > 0 && segment.charCodeAt(0) === this.PARAM_CHAR_CODE;\n }\n\n /**\n * Extract parameter name from path segment (optimized)\n */\n static extractParamName(segment: string): string | null {\n return this.isParameterized(segment) ? segment.substring(1) : null;\n }\n}\n\n/**\n * Optimized Router class with performance improvements\n */\nexport class OptimizedRouter implements RouterInterface {\n private root: OptimizedRadixNode;\n private middleware: Middleware[] = [];\n private prefix: string = '';\n private cache: RouteCache;\n private paramPool: Record<string, string>[] = [];\n private maxPoolSize = 200; // Increased pool size for better performance\n private poolHits = 0;\n private poolMisses = 0;\n // ⚡ Static route fast path - O(1) lookup for routes without params (e.g., /, /health, /api)\n private readonly staticRoutes = new Map<string, OptimizedRouteMatch>();\n\n constructor(prefix: string = '', cacheSize: number = 1000) {\n this.prefix = prefix;\n this.cache = new RouteCache(cacheSize);\n this.root = {\n path: '',\n handlers: new Map(),\n children: new Map(),\n isParam: false,\n };\n\n // Pre-allocate parameter objects with better sizing\n for (let i = 0; i < 200; i++) {\n this.paramPool.push({});\n }\n }\n\n /**\n * Optimized parameter object management\n */\n private getParamObject(): Record<string, string> {\n if (this.paramPool.length > 0) {\n this.poolHits++;\n const params = this.paramPool.pop()!;\n // Efficiently clear object properties\n for (const key in params) {\n if (Object.prototype.hasOwnProperty.call(params, key)) {\n delete params[key];\n }\n }\n return params;\n }\n\n this.poolMisses++;\n return {}; // Create new object if pool is empty\n }\n\n /**\n * Get pool statistics for monitoring\n */\n private getPoolStats() {\n const total = this.poolHits + this.poolMisses;\n return {\n poolSize: this.paramPool.length,\n maxSize: this.maxPoolSize,\n hits: this.poolHits,\n misses: this.poolMisses,\n hitRate: total === 0 ? 0 : this.poolHits / total,\n };\n }\n\n /**\n * Register a GET route\n */\n public get(\n path: string,\n handler: RouteHandler | RouteConfig\n ): OptimizedRouter {\n this.registerRoute('GET', path, handler);\n return this;\n }\n\n /**\n * Register a POST route\n */\n public post(\n path: string,\n handler: RouteHandler | RouteConfig\n ): OptimizedRouter {\n this.registerRoute('POST', path, handler);\n return this;\n }\n\n /**\n * Register a PUT route\n */\n public put(\n path: string,\n handler: RouteHandler | RouteConfig\n ): OptimizedRouter {\n this.registerRoute('PUT', path, handler);\n return this;\n }\n\n /**\n * Register a DELETE route\n */\n public delete(\n path: string,\n handler: RouteHandler | RouteConfig\n ): OptimizedRouter {\n this.registerRoute('DELETE', path, handler);\n return this;\n }\n\n /**\n * Register a PATCH route\n */\n public patch(\n path: string,\n handler: RouteHandler | RouteConfig\n ): OptimizedRouter {\n this.registerRoute('PATCH', path, handler);\n return this;\n }\n\n /**\n * Use middleware or create sub-router\n */\n public use(\n middlewareOrPrefix: string | Middleware,\n router?: RouterInterface\n ): OptimizedRouter {\n if (typeof middlewareOrPrefix === 'string') {\n // Create sub-router\n if (router) {\n const subRouter = router as OptimizedRouter;\n const subRoutes = subRouter.getRoutes();\n\n // Add sub-router routes with prefix\n for (const [routeKey, handler] of subRoutes) {\n const colonIndex = routeKey.indexOf(':');\n if (colonIndex !== -1) {\n const method = routeKey.substring(0, colonIndex);\n const path = routeKey.substring(colonIndex + 1);\n if (method && path) {\n const fullPath = `${middlewareOrPrefix}${path}`;\n this.registerRoute(method, fullPath, handler);\n }\n }\n }\n }\n } else {\n // Add middleware\n this.middleware.push(middlewareOrPrefix);\n }\n\n return this;\n }\n\n /**\n * Get all registered routes for sub-router integration\n */\n public getRoutes(): Map<string, RouteData> {\n const routes = new Map<string, RouteData>();\n this.collectRoutesIterative(this.root, '', routes);\n return routes;\n }\n\n /**\n * Get router middleware\n */\n public getMiddleware(): Middleware[] {\n return [...this.middleware];\n }\n\n /**\n * 🔥 Inject compiled handler for a route (used by compiler)\n * This allows the pre-compilation system to inject optimized handlers\n */\n public setCompiledHandler(\n method: string,\n pattern: string,\n compiledExecute: (ctx: any) => Promise<void>\n ): void {\n // Update in static routes if it exists\n const staticKey = `${method}:${pattern}`;\n const staticRoute = this.staticRoutes.get(staticKey);\n if (staticRoute) {\n staticRoute.compiled = compiledExecute;\n return;\n }\n\n // Otherwise need to find in tree\n const pathParts = PathSplitter.split(pattern);\n let currentNode = this.root;\n\n // Navigate to the route node\n for (const part of pathParts) {\n if (!part) continue;\n\n if (PathSplitter.isParameterized(part)) {\n if (currentNode.paramChild) {\n currentNode = currentNode.paramChild;\n } else {\n return; // Route not found\n }\n } else if (part === '*') {\n if (currentNode.wildcardChild) {\n currentNode = currentNode.wildcardChild;\n } else {\n return; // Route not found\n }\n } else {\n const child = currentNode.children.get(part);\n if (child) {\n currentNode = child;\n } else {\n return; // Route not found\n }\n }\n }\n\n // Update the handler with compiled version (store in node data)\n const routeData = currentNode.handlers.get(method);\n if (routeData) {\n (routeData as any).compiled = compiledExecute;\n }\n }\n\n /**\n * Get comprehensive cache and performance statistics\n */\n public getCacheStats() {\n const cacheStats = this.cache.getStats();\n const poolStats = this.getPoolStats();\n\n return {\n cache: cacheStats,\n pool: poolStats,\n performance: {\n totalRoutes: this.getTotalRoutes(),\n pathCacheSize: PathSplitter.getCacheSize(),\n },\n };\n }\n\n /**\n * Get total number of registered routes\n */\n private getTotalRoutes(): number {\n let count = 0;\n\n function countRoutes(node: OptimizedRadixNode): void {\n count += node.handlers.size;\n for (const child of node.children.values()) {\n countRoutes(child);\n }\n if (node.paramChild) countRoutes(node.paramChild);\n if (node.wildcardChild) countRoutes(node.wildcardChild);\n }\n\n countRoutes(this.root);\n return count;\n }\n\n /**\n * Clear the route cache\n */\n public clearCache(): void {\n this.cache.clear();\n }\n\n /**\n * Ultra-fast route finder with aggressive optimizations\n */\n public find(method: string, path: string): OptimizedRouteMatch | null {\n // Ultra-fast cache check\n const cacheKey = `${method}:${path}`;\n const cached = this.cache.get(cacheKey);\n if (cached !== undefined) {\n return cached;\n }\n\n // Fast path: direct match without alternative paths\n const result = this.findInternalOptimized(method, path);\n\n // Cache and return immediately if found\n if (result) {\n this.cache.set(cacheKey, result);\n return result;\n }\n\n // Slow path: only try alternatives for non-root paths\n if (path.length > 1) {\n const alternativePath = path.endsWith('/')\n ? path.slice(0, -1)\n : `${path}/`;\n const alternativeResult = this.findInternalOptimized(\n method,\n alternativePath\n );\n\n if (alternativeResult) {\n this.cache.set(cacheKey, alternativeResult);\n return alternativeResult;\n }\n }\n\n // Cache null result and return\n this.cache.set(cacheKey, null);\n return null;\n }\n\n /**\n * Hyper-optimized internal finder with minimal allocations\n */\n private findInternalOptimized(\n method: string,\n path: string\n ): OptimizedRouteMatch | null {\n // ⚡ FAST PATH: Check static routes FIRST for O(1) lookup\n // This bypasses tree traversal entirely for routes without params\n const staticKey = `${method}:${path}`;\n const staticRoute = this.staticRoutes.get(staticKey);\n if (staticRoute) {\n return staticRoute;\n }\n\n // Fast root path check\n if (path === '/' || path === '') {\n const routeData = this.root.handlers.get(method);\n return routeData\n ? {\n handler: routeData.handler,\n middleware: routeData.middleware,\n params: {},\n path,\n }\n : null;\n }\n\n // Ultra-fast path splitting\n const pathParts = PathSplitter.split(path);\n if (pathParts.length === 0) {\n const routeData = this.root.handlers.get(method);\n return routeData\n ? {\n handler: routeData.handler,\n middleware: routeData.middleware,\n params: {},\n path,\n }\n : null;\n }\n\n let currentNode = this.root;\n const params = this.getParamObject();\n\n // Optimized single-pass traversal\n for (let i = 0; i < pathParts.length; i++) {\n const part = pathParts[i];\n if (!part) continue;\n\n // Try exact match first (hot path)\n const exactChild = currentNode.children.get(part);\n if (exactChild) {\n currentNode = exactChild;\n continue;\n }\n\n // Parameter match (warm path)\n const paramChild = currentNode.paramChild;\n if (paramChild?.paramName) {\n params[paramChild.paramName] = part;\n currentNode = paramChild;\n continue;\n }\n\n // Wildcard match (cold path)\n const wildcardChild = currentNode.wildcardChild;\n if (wildcardChild) {\n params['*'] = pathParts.slice(i).join('/');\n currentNode = wildcardChild;\n break;\n }\n\n // No match - early exit\n return null;\n }\n\n // Final handler check\n const routeData = currentNode.handlers.get(method);\n return routeData\n ? {\n handler: routeData.handler,\n middleware: routeData.middleware,\n params,\n path,\n }\n : null;\n }\n\n /**\n * Optimized route registration with O(k) insertion\n */\n private registerRoute(\n method: string,\n path: string,\n handler: RouteHandler | RouteConfig\n ): void {\n const fullPath = this.prefix ? `${this.prefix}${path}` : path;\n const pathParts = PathSplitter.split(fullPath);\n let currentNode = this.root;\n\n // Extract handler and middleware efficiently\n let actualHandler: RouteHandler;\n let routeMiddleware: Middleware[] = [];\n\n if (typeof handler === 'function') {\n actualHandler = handler;\n } else {\n actualHandler = handler.handler;\n if (handler.middleware) {\n routeMiddleware = Array.isArray(handler.middleware)\n ? handler.middleware\n : [handler.middleware];\n }\n }\n\n // Create route data with handler and middleware\n const routeData: RouteData = {\n handler: actualHandler,\n middleware: routeMiddleware,\n };\n\n // Handle root path case\n if (pathParts.length === 0) {\n currentNode.handlers.set(method, routeData);\n // ⚡ Add to static route fast path\n const staticKey = `${method}:${fullPath}`;\n this.staticRoutes.set(staticKey, {\n handler: actualHandler,\n middleware: routeMiddleware,\n params: {},\n path: fullPath,\n });\n return;\n }\n\n // Build tree with optimized node creation\n for (let i = 0; i < pathParts.length; i++) {\n const part = pathParts[i];\n if (!part) continue; // Skip empty parts\n\n if (PathSplitter.isParameterized(part)) {\n // Parameter node\n const paramName = PathSplitter.extractParamName(part);\n\n if (!currentNode.paramChild && paramName) {\n currentNode.paramChild = {\n path: part,\n handlers: new Map(),\n children: new Map(),\n isParam: true,\n paramName,\n paramIndex: i,\n };\n }\n if (currentNode.paramChild) {\n currentNode = currentNode.paramChild;\n }\n } else if (part === '*') {\n // Wildcard node\n if (!currentNode.wildcardChild) {\n currentNode.wildcardChild = {\n path: part,\n handlers: new Map(),\n children: new Map(),\n isParam: false,\n };\n }\n currentNode = currentNode.wildcardChild;\n } else {\n // Static node - optimized creation\n let childNode = currentNode.children.get(part);\n if (!childNode) {\n childNode = {\n path: part,\n handlers: new Map(),\n children: new Map(),\n isParam: false,\n };\n currentNode.children.set(part, childNode);\n }\n currentNode = childNode;\n }\n }\n\n // Set handler at final node\n currentNode.handlers.set(method, routeData);\n\n // ⚡ Add to static route fast path if no params or wildcards\n if (!fullPath.includes(':') && !fullPath.includes('*')) {\n const staticKey = `${method}:${fullPath}`;\n this.staticRoutes.set(staticKey, {\n handler: actualHandler,\n middleware: routeMiddleware,\n params: {},\n path: fullPath,\n });\n }\n }\n\n /**\n * Iteratively collect all routes from the tree (no recursion)\n */\n private collectRoutesIterative(\n startNode: OptimizedRadixNode,\n startPath: string,\n routes: Map<string, RouteData>\n ): void {\n const stack: Array<{ node: OptimizedRadixNode; path: string }> = [\n { node: startNode, path: startPath },\n ];\n\n while (stack.length > 0) {\n const { node, path } = stack.pop()!;\n\n // Add handlers at current node\n for (const [method, routeData] of node.handlers) {\n const routeKey = `${method}:${path || '/'}`;\n routes.set(routeKey, routeData);\n }\n\n // Add children to stack\n for (const childNode of node.children.values()) {\n const childPath = `${path}/${childNode.path}`;\n stack.push({ node: childNode, path: childPath });\n }\n\n // Add parameter child to stack\n if (node.paramChild) {\n const childPath = `${path}/${node.paramChild.path}`;\n stack.push({ node: node.paramChild, path: childPath });\n }\n\n // Add wildcard child to stack\n if (node.wildcardChild) {\n const childPath = `${path}/${node.wildcardChild.path}`;\n stack.push({ node: node.wildcardChild, path: childPath });\n }\n }\n }\n}\n\n/**\n * Create a new optimized router instance\n *\n * @param prefix - Optional route prefix\n * @param cacheSize - Optional cache size (default: 1000)\n * @returns OptimizedRouter instance\n *\n * @example\n * ```typescript\n * import { createOptimizedRouter } from 'nextrush-v2';\n *\n * const userRouter = createOptimizedRouter('/users', 2000);\n *\n * userRouter.get('/profile', async (ctx) => {\n * ctx.res.json({ user: 'profile' });\n * });\n *\n * app.use(userRouter);\n * ```\n */\nexport function createOptimizedRouter(\n prefix: string = '',\n cacheSize: number = 1000\n): OptimizedRouter {\n return new OptimizedRouter(prefix, cacheSize);\n}\n","/**\n * Core Application class for NextRush v2\n *\n * @packageDocumentation\n */\n\nimport { createContext, releaseContext } from '@/core/app/context';\nimport { Router as RouterClass } from '@/core/router';\nimport {\n GlobalExceptionFilter,\n type ExceptionFilter,\n} from '@/errors/custom-errors';\nimport {\n LoggerPlugin,\n createDevLogger,\n createProdLogger,\n} from '@/plugins/logger';\nimport type {\n Application,\n Context,\n Middleware,\n RouteConfig,\n RouteHandler,\n Router,\n} from '@/types/context';\nimport type { ApplicationOptions } from '@/types/http';\nimport { EventEmitter } from 'node:events';\nimport {\n createServer,\n type IncomingMessage,\n type Server,\n type ServerResponse,\n} from 'node:http';\n\n// Import DI system\nimport { createSafeConfiguration } from '@/core/config/validation';\nimport {\n createContainer,\n createMiddlewareFactory,\n registerDefaultMiddleware,\n type DIContainer,\n type MiddlewareFactory,\n} from '@/core/di';\n\n// Import SafeContext system\nimport {\n createSafeContext,\n createSafeMiddleware,\n} from '@/core/context/immutable';\n\n// Import Event System\nimport { NextRushEventSystem } from '@/core/events/event-system';\nimport {\n createSimpleEventsAPI,\n type SimpleEventsAPI,\n} from '@/core/events/simple-events';\n\n// Import built-in middleware types for backward compatibility\nimport type { EnhancedBodyParserOptions } from '@/core/middleware/body-parser/types';\nimport type {\n CompressionOptions,\n CorsOptions,\n HelmetOptions,\n LoggerOptions,\n RateLimiterOptions,\n RequestIdOptions,\n TimerOptions,\n} from '@/core/middleware/types';\nimport type { NextRushRequest, NextRushResponse } from '@/types/http';\n\n// Import Application Compiler\nimport {\n createApplicationCompiler,\n type ApplicationCompiler,\n} from '@/core/compiler';\n\n/**\n * NextRush Application class with Koa-style middleware and Express-like design\n *\n * @example\n * ```typescript\n * import { createApp } from 'nextrush-v2';\n *\n * const app = createApp({ port: 3000 });\n *\n * app.use(async (ctx, next) => {\n * console.log(`${ctx.method} ${ctx.path}`);\n * await next();\n * });\n *\n * app.get('/hello', async (ctx) => {\n * ctx.res.json({ message: 'Hello, World!' });\n * });\n *\n * app.listen(3000, () => {\n * console.log('Server running on http://localhost:3000');\n * });\n * ```\n */\nexport class NextRushApplication extends EventEmitter implements Application {\n private server!: Server;\n private middleware: Middleware[] = [];\n private internalRouter: RouterClass = new RouterClass();\n private options: Required<ApplicationOptions>;\n private isShuttingDown = false;\n private container: DIContainer;\n private middlewareFactory: MiddlewareFactory;\n private compiler: ApplicationCompiler;\n // Cache for exception filter middleware to avoid per-request scanning\n private cachedExceptionFilter: Middleware | null = null;\n private static readonly EXCEPTION_FILTER_MARK = Symbol('ExceptionFilter');\n\n // Event System Integration\n private _eventSystem: NextRushEventSystem;\n private _simpleEvents: SimpleEventsAPI;\n\n constructor(options: ApplicationOptions = {}) {\n super();\n\n // Create safe configuration with validation\n this.options = createSafeConfiguration(options);\n\n // Initialize Event System\n this._eventSystem = new NextRushEventSystem();\n this._simpleEvents = createSimpleEventsAPI(this._eventSystem);\n\n // Initialize DI container and middleware factory\n this.container = createContainer();\n registerDefaultMiddleware(this.container);\n this.middlewareFactory = createMiddlewareFactory(this.container);\n\n // Initialize compiler for pre-compilation\n this.compiler = createApplicationCompiler();\n\n this.server = this.createServer();\n this.setupEventHandlers();\n }\n\n /**\n * Create HTTP server\n */\n private createServer(): Server {\n const server = createServer((req, res) => {\n // Handle async request processing without blocking\n this.handleRequest(req, res).catch(error => {\n console.error('Request handling error:', error);\n if (!res.headersSent) {\n res.statusCode = 500;\n res.end('Internal Server Error');\n }\n });\n });\n\n // Connection tuning: leverage validated options\n // Keep-alive timeout controls how long to keep idle sockets open\n server.keepAliveTimeout = this.options.keepAlive;\n // Request timeout protects against hanging requests\n server.requestTimeout = this.options.timeout;\n // Ensure headers timeout exceeds keep-alive to avoid premature teardown\n const safetyBufferMs = 1000;\n server.headersTimeout = this.options.keepAlive + safetyBufferMs;\n\n return server;\n }\n\n /**\n * Setup event handlers\n */\n private setupEventHandlers(): void {\n this.on('error', error => {\n console.error('Application error:', error);\n });\n }\n\n /**\n * Get cached exception filter or scan once and cache it\n */\n private getOrFindExceptionFilter(): Middleware | null {\n if (this.cachedExceptionFilter !== null) {\n return this.cachedExceptionFilter;\n }\n const found = this.middleware.find(mw => {\n const marked =\n (mw as any)[NextRushApplication.EXCEPTION_FILTER_MARK] === true;\n if (marked) return true;\n const s = mw.toString();\n return s.includes('exceptionFilter') || s.includes('ExceptionFilter');\n });\n this.cachedExceptionFilter = found ?? null;\n return this.cachedExceptionFilter;\n }\n\n /**\n * Handle incoming requests\n */\n private async handleRequest(\n req: IncomingMessage,\n res: ServerResponse\n ): Promise<void> {\n // Create context with proper type casting\n const ctx = createContext(\n req as NextRushRequest,\n res as NextRushResponse,\n this.options\n );\n\n // Find the exception filter middleware (cached once discovered)\n const exceptionFilter = this.getOrFindExceptionFilter();\n\n // Add async boundary to prevent event loop blocking\n const executeRequestWithBoundary = async (): Promise<void> => {\n if (exceptionFilter) {\n // Wrap the entire request handling in the exception filter\n await exceptionFilter(ctx, async () => {\n // Execute middleware with async boundary\n await this.executeMiddlewareWithBoundary(ctx);\n\n // Copy the parsed body from context to the already enhanced request\n ctx.req.body = ctx.body;\n\n // Execute route with async boundary\n await this.executeRouteWithBoundary(ctx);\n });\n } else {\n // No exception filter found, use basic error handling\n await this.executeMiddlewareWithBoundary(ctx);\n ctx.req.body = ctx.body;\n await this.executeRouteWithBoundary(ctx);\n }\n };\n\n // Execute with async boundary to prevent event loop blocking\n try {\n await executeRequestWithBoundary();\n } finally {\n // Release context back to pool for reuse\n releaseContext(ctx);\n }\n }\n\n /**\n * Execute middleware stack.\n * - Production: run directly on ctx for maximum performance.\n * - Debug mode: wrap with SafeContext for diagnostics.\n */\n private async executeMiddlewareWithBoundary(ctx: Context): Promise<void> {\n if (this.options.debug) {\n // Debug mode: keep SafeContext to detect misuse during development\n let safeCtx = createSafeContext(ctx);\n let index = 0;\n\n const dispatch = async (): Promise<void> => {\n if (index >= this.middleware.length) {\n return;\n }\n\n const middleware = this.middleware[index++];\n if (middleware) {\n const safeMiddleware = createSafeMiddleware(middleware);\n const result = await safeMiddleware(safeCtx, dispatch);\n\n if (result) {\n safeCtx = result;\n }\n }\n };\n\n await dispatch();\n safeCtx.commit();\n return;\n }\n\n // Production: direct execution without SafeContext wrapping\n let index = 0;\n const dispatch = async (): Promise<void> => {\n if (index >= this.middleware.length) {\n return;\n }\n const middleware = this.middleware[index++];\n if (!middleware) return;\n const result = middleware(ctx, dispatch);\n if (result instanceof Promise) {\n await result;\n }\n };\n\n await dispatch();\n }\n\n /**\n * Execute route handler with high-performance direct execution\n */\n private async executeRouteWithBoundary(ctx: Context): Promise<void> {\n const match = this.internalRouter.find(ctx.method, ctx.path);\n\n if (match) {\n // Set route parameters in context\n // Freeze params to make them read-only for the rest of the pipeline\n const frozenParams = Object.freeze({\n ...match.params,\n }) as unknown as typeof ctx.params;\n ctx.params = frozenParams;\n\n // 🔥 USE COMPILED HANDLER if available (ultra-fast path!)\n if (match.compiled) {\n // ✨ Pre-compiled handler with inlined middleware - maximum performance!\n // Smart execution: sync if possible, async if needed\n const result = match.compiled(ctx);\n if (result && typeof result.then === 'function') {\n await result;\n }\n return;\n }\n\n // Fallback: Regular handler execution (development mode)\n // Debug logging\n if (this.options.debug) {\n console.log(`🎯 Route match found: ${ctx.method} ${ctx.path}`);\n console.log(\n `📋 Route has ${match.middleware ? match.middleware.length : 0} middleware`\n );\n console.log(\n `🔧 Middleware:`,\n match.middleware?.map(m => m.name || 'anonymous')\n );\n }\n\n // Execute route-specific middleware first\n if (match.middleware && match.middleware.length > 0) {\n let index = 0;\n const dispatch = async (): Promise<void> => {\n if (index >= match.middleware.length) {\n // All middleware executed, now run the handler\n if (this.options.debug) {\n console.log(`🚀 All middleware complete, executing handler`);\n }\n await match.handler(ctx);\n return;\n }\n const middleware = match.middleware[index++];\n if (middleware) {\n if (this.options.debug) {\n console.log(\n `⚡ Executing middleware ${index}/${match.middleware.length}: ${middleware.name || 'anonymous'}`\n );\n }\n await middleware(ctx, dispatch);\n }\n };\n await dispatch();\n } else {\n // No route middleware, execute handler directly\n if (this.options.debug) {\n console.log(`🏃 No route middleware, executing handler directly`);\n }\n await match.handler(ctx);\n }\n } else {\n // No route found\n ctx.res.status(404).json({ error: 'Not Found' });\n }\n }\n\n /**\n * Register GET route\n */\n public get(path: string, handler: RouteHandler | RouteConfig): this {\n this.registerRoute('GET', path, handler);\n return this;\n }\n\n /**\n * Register POST route\n */\n public post(path: string, handler: RouteHandler | RouteConfig): this {\n this.registerRoute('POST', path, handler);\n return this;\n }\n\n /**\n * Register PUT route\n */\n public put(path: string, handler: RouteHandler | RouteConfig): this {\n this.registerRoute('PUT', path, handler);\n return this;\n }\n\n /**\n * Register DELETE route\n */\n public delete(path: string, handler: RouteHandler | RouteConfig): this {\n this.registerRoute('DELETE', path, handler);\n return this;\n }\n\n /**\n * Register PATCH route\n */\n public patch(path: string, handler: RouteHandler | RouteConfig): this {\n this.registerRoute('PATCH', path, handler);\n return this;\n }\n\n /**\n * Register middleware or sub-router\n */\n public use(middleware: Middleware): this;\n public use(prefix: string, router: Router): this;\n public use(middlewareOrPrefix: Middleware | string, router?: Router): this {\n if (typeof middlewareOrPrefix === 'function') {\n // Register middleware\n this.middleware.push(middlewareOrPrefix);\n // Invalidate cached exception filter when middleware changes\n this.cachedExceptionFilter = null;\n } else if (router) {\n // Register sub-router\n const subRouter = router as any;\n const subRoutes = subRouter.getRoutes();\n const subMiddleware = subRouter.getMiddleware();\n\n // Add sub-router middleware\n this.middleware.push(...subMiddleware);\n // Invalidate cached exception filter when middleware changes\n this.cachedExceptionFilter = null;\n\n // Add sub-router routes with prefix\n for (const [routeKey, routeData] of subRoutes) {\n const colonIndex = routeKey.indexOf(':');\n if (colonIndex !== -1) {\n const method = routeKey.substring(0, colonIndex);\n const path = routeKey.substring(colonIndex + 1);\n if (method && path) {\n const fullPath = `${middlewareOrPrefix}${path}`;\n // Convert RouteData back to RouteConfig for registration\n const routeConfig: RouteConfig = {\n handler: routeData.handler,\n middleware:\n routeData.middleware.length > 0\n ? routeData.middleware\n : undefined,\n };\n this.registerRoute(method, fullPath, routeConfig);\n }\n }\n }\n }\n\n return this;\n }\n\n /**\n * Create router instance\n */\n public router(): Router {\n return new RouterClass();\n }\n\n /**\n * Register a route with the router\n */\n private registerRoute(\n method: string,\n path: string,\n handler: RouteHandler | RouteConfig\n ): void {\n // Pass the entire handler (function or RouteConfig) to the router\n // The router will handle extracting the handler and middleware\n switch (method) {\n case 'GET':\n this.internalRouter.get(path, handler);\n break;\n case 'POST':\n this.internalRouter.post(path, handler);\n break;\n case 'PUT':\n this.internalRouter.put(path, handler);\n break;\n case 'DELETE':\n this.internalRouter.delete(path, handler);\n break;\n case 'PATCH':\n this.internalRouter.patch(path, handler);\n break;\n default:\n throw new Error(`Unsupported HTTP method: ${method}`);\n }\n }\n\n /**\n * Start the server\n */\n public listen(port?: number, callback?: () => void): Server;\n public listen(port?: number, host?: string, callback?: () => void): Server;\n public listen(\n port?: number,\n hostOrCallback?: string | (() => void),\n callback?: () => void\n ): Server {\n let actualPort: number;\n let actualHost: string;\n let actualCallback: (() => void) | undefined;\n\n // Handle overloaded parameters\n if (typeof hostOrCallback === 'function') {\n // listen(port, callback)\n actualPort = port ?? this.options.port;\n actualHost = this.options.host;\n actualCallback = hostOrCallback;\n } else {\n // listen(port, host, callback)\n actualPort = port ?? this.options.port;\n actualHost = hostOrCallback ?? this.options.host;\n actualCallback = callback;\n }\n\n // Pre-compile routes and dependencies for maximum performance\n if (process.env['NODE_ENV'] === 'production') {\n this.compiler\n .compile(this.internalRouter, this.container)\n .then(() => {\n // Start server AFTER compilation\n this.server.listen(actualPort, actualHost, () => {\n this.emit('listening', { port: actualPort, host: actualHost });\n actualCallback?.();\n });\n })\n .catch(err => {\n console.error('❌ Compilation failed:', err);\n // Start server anyway\n this.server.listen(actualPort, actualHost, () => {\n this.emit('listening', { port: actualPort, host: actualHost });\n actualCallback?.();\n });\n });\n } else {\n // Development mode: skip compilation, start immediately\n this.server.listen(actualPort, actualHost, () => {\n this.emit('listening', { port: actualPort, host: actualHost });\n actualCallback?.();\n });\n }\n\n return this.server;\n }\n\n /**\n * Get the underlying HTTP server\n */\n public getServer(): Server {\n return this.server;\n }\n\n /**\n * Get simple events API for Express-style event handling\n *\n * @example\n * ```typescript\n * app.events.emit('user.created', { userId: '123' });\n * app.events.on('user.created', (data) => console.log(data));\n * ```\n */\n public get events(): SimpleEventsAPI {\n return this._simpleEvents;\n }\n\n /**\n * Get advanced event system for CQRS and Event Sourcing\n *\n * @example\n * ```typescript\n * app.eventSystem.dispatch(new CreateUserCommand({ name: 'John' }));\n * app.eventSystem.subscribe(UserCreatedEvent, handler);\n * ```\n */\n public get eventSystem(): NextRushEventSystem {\n return this._eventSystem;\n }\n\n /**\n * Gracefully shutdown the application\n */\n public async shutdown(): Promise<void> {\n if (this.isShuttingDown) return;\n\n this.isShuttingDown = true;\n this.emit('shutdown');\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error('Server shutdown timeout'));\n }, 5000);\n\n this.server.close(() => {\n clearTimeout(timeout);\n this.emit('closed');\n resolve();\n });\n\n // Force close if normal close doesn't work\n setTimeout(() => {\n try {\n this.server.unref();\n clearTimeout(timeout);\n resolve();\n } catch {\n clearTimeout(timeout);\n resolve();\n }\n }, 3000);\n });\n }\n\n // ==================== MIDDLEWARE FACTORY METHODS ====================\n\n /**\n * Create CORS middleware - now delegated to middleware factory\n */\n public cors(options: CorsOptions = {}): Middleware {\n return this.middlewareFactory.createCors(options);\n }\n\n /**\n * Create helmet middleware - now delegated to middleware factory\n */\n public helmet(options: HelmetOptions = {}): Middleware {\n return this.middlewareFactory.createHelmet(options);\n }\n\n /**\n * Create JSON body parser middleware - now delegated to middleware factory\n */\n public json(options: EnhancedBodyParserOptions = {}): Middleware {\n return this.middlewareFactory.createJson(options);\n }\n\n /**\n * Create URL-encoded body parser middleware - now delegated to middleware factory\n */\n public urlencoded(options: EnhancedBodyParserOptions = {}): Middleware {\n return this.middlewareFactory.createUrlencoded(options);\n }\n\n /**\n * Create text body parser middleware - now delegated to middleware factory\n */\n public text(options: EnhancedBodyParserOptions = {}): Middleware {\n return this.middlewareFactory.createText(options);\n }\n\n /**\n * Create rate limiter middleware - now delegated to middleware factory\n */\n public rateLimit(options: RateLimiterOptions = {}): Middleware {\n return this.middlewareFactory.createRateLimit(options);\n }\n\n /**\n * Create logger middleware - now delegated to middleware factory\n */\n public logger(options: LoggerOptions = {}): Middleware {\n return this.middlewareFactory.createLogger(options);\n }\n\n /**\n * Create compression middleware - now delegated to middleware factory\n */\n public compression(options: CompressionOptions = {}): Middleware {\n return this.middlewareFactory.createCompression(options);\n }\n\n /**\n * Create request ID middleware - now delegated to middleware factory\n */\n public requestId(options: RequestIdOptions = {}): Middleware {\n return this.middlewareFactory.createRequestId(options);\n }\n\n /**\n * Create timer middleware - now delegated to middleware factory\n */\n public timer(options: TimerOptions = {}): Middleware {\n return this.middlewareFactory.createTimer(options);\n }\n\n /**\n * Create smart body parser middleware - now delegated to middleware factory\n */\n public smartBodyParser(options: EnhancedBodyParserOptions = {}): Middleware {\n return this.middlewareFactory.createSmartBodyParser(options);\n }\n\n /**\n * Create exception filter middleware\n *\n * Provides NestJS-style exception handling with custom error classes\n * and automatic error response formatting.\n *\n * @param filters - Array of exception filters to use\n * @returns Exception filter middleware function\n *\n * @example\n * ```typescript\n * const app = createApp();\n *\n * // Global exception filter\n * app.use(app.exceptionFilter());\n *\n * // With custom filters\n * app.use(app.exceptionFilter([\n * new ValidationExceptionFilter(),\n * new AuthenticationExceptionFilter(),\n * new GlobalExceptionFilter()\n * ]));\n * ```\n */\n public exceptionFilter(\n filters: ExceptionFilter[] = [new GlobalExceptionFilter()]\n ): Middleware {\n const middleware: Middleware = async (ctx, next) => {\n try {\n await next();\n } catch (error) {\n // Find the appropriate filter for this error type\n const filter = filters.find(f => {\n if (f.constructor.name === 'GlobalExceptionFilter') {\n return true; // Global filter catches all\n }\n\n // Check if filter has exceptions property (from @Catch decorator)\n const filterClass = f.constructor as any;\n if (filterClass.exceptions) {\n return filterClass.exceptions.some(\n (ExceptionClass: any) => error instanceof ExceptionClass\n );\n }\n\n return false;\n });\n\n if (filter) {\n await filter.catch(error as Error, ctx);\n } else {\n // Fallback to global error handling\n const globalFilter = new GlobalExceptionFilter();\n await globalFilter.catch(error as Error, ctx);\n }\n }\n };\n // Mark this middleware as an exception filter for O(1) detection\n (middleware as any)[NextRushApplication.EXCEPTION_FILTER_MARK] = true;\n // Cache immediately to avoid first-request scan\n this.cachedExceptionFilter = middleware;\n return middleware;\n }\n\n /**\n * Create advanced logger plugin\n *\n * Provides comprehensive logging capabilities similar to Winston/Pino\n * with multiple transports, structured logging, and performance optimization.\n *\n * @param config - Logger configuration options\n * @returns Logger plugin instance\n *\n * @example\n * ```typescript\n * const app = createApp();\n *\n * // Development logger\n * const logger = app.createLogger({\n * level: 'debug',\n * requestLogging: true,\n * performance: true\n * });\n * logger.install(app);\n *\n * // Use logger in routes\n * app.get('/users', ctx => {\n * app.logger.info('Fetching users', { userId: ctx.params.id });\n * ctx.res.json({ users: [] });\n * });\n * ```\n */\n public createLogger(\n config: {\n level?:\n | 'error'\n | 'warn'\n | 'info'\n | 'http'\n | 'verbose'\n | 'debug'\n | 'silly';\n transports?: any[];\n format?: 'json' | 'text' | 'combined';\n colorize?: boolean;\n timestamp?: boolean;\n context?: string;\n requestLogging?: boolean;\n performance?: boolean;\n structured?: boolean;\n } = {}\n ): LoggerPlugin {\n // Convert string log levels to LogLevel enum\n const loggerConfig = {\n ...config,\n level: config.level ? this.convertLogLevel(config.level) : undefined,\n };\n return new LoggerPlugin(loggerConfig as any);\n }\n\n private convertLogLevel(level: string): number {\n const levelMap: Record<string, number> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n trace: 4,\n http: 2, // Same as info\n verbose: 3, // Same as debug\n silly: 4, // Same as trace\n };\n return levelMap[level] ?? 2; // Default to info\n }\n\n /**\n * Create development logger\n *\n * Optimized for development with debug level, colors, and detailed logging.\n *\n * @returns Development logger plugin\n */\n public createDevLogger(): LoggerPlugin {\n return createDevLogger();\n }\n\n /**\n * Create production logger\n *\n * Optimized for production with info level, JSON format, and file logging.\n *\n * @returns Production logger plugin\n */\n public createProdLogger(): LoggerPlugin {\n return createProdLogger();\n }\n}\n\n/**\n * Create a new NextRush application instance\n *\n * @param options - Application configuration options\n * @returns Application instance\n *\n * @example\n * ```typescript\n * import { createApp } from 'nextrush-v2';\n *\n * const app = createApp({\n * port: 3000,\n * host: 'localhost',\n * cors: true,\n * });\n *\n * app.use(app.cors());\n * app.use(app.helmet());\n *\n * app.get('/hello', (ctx) => {\n * ctx.res.json({ message: 'Hello, World!' });\n * });\n *\n * app.listen(3000, () => {\n * console.log('Server running on http://localhost:3000');\n * });\n * ```\n */\nexport function createApp(options?: ApplicationOptions): Application {\n return new NextRushApplication(options);\n}\n\n// Type exports\nexport type { Application, ApplicationOptions };\n","/**\n * Base plugin class for NextRush v2\n *\n * @packageDocumentation\n */\n\nimport type { Application } from '@/core/app/application';\nimport { PluginError } from '@/errors/custom-errors';\nimport type { Context, Middleware } from '@/types/context';\n\n/**\n * Plugin interface\n */\nexport interface Plugin {\n /** Plugin name */\n name: string;\n /** Plugin version */\n version: string;\n /** Plugin description */\n description?: string;\n /** Plugin author */\n author?: string;\n /** Plugin homepage */\n homepage?: string;\n /** Plugin license */\n license?: string;\n /** Plugin keywords */\n keywords?: string[];\n /** Install plugin on application */\n install(app: Application): void;\n /** Plugin initialization */\n init?(): void | Promise<void>;\n /** Plugin cleanup */\n cleanup?(): void | Promise<void>;\n /** Plugin configuration validation */\n validateConfig?(): boolean;\n /** Plugin health check */\n healthCheck?(): Promise<boolean>;\n}\n\n/**\n * Plugin options interface\n */\nexport interface PluginOptions {\n /** Enable/disable plugin */\n enabled?: boolean;\n /** Plugin configuration */\n config?: Record<string, unknown>;\n /** Plugin priority (lower = higher priority) */\n priority?: number;\n /** Plugin dependencies */\n dependencies?: string[];\n /** Plugin conflicts */\n conflicts?: string[];\n}\n\n/**\n * Plugin metadata interface\n */\nexport interface PluginMetadata {\n name: string;\n version: string;\n description?: string;\n author?: string;\n homepage?: string;\n license?: string;\n keywords?: string[];\n dependencies?: string[];\n conflicts?: string[];\n}\n\n/**\n * Base plugin class that all plugins should extend\n *\n * @example\n * ```typescript\n * import { BasePlugin } from 'nextrush-v2';\n * import type { Application } from 'nextrush-v2';\n *\n * export class MyPlugin extends BasePlugin {\n * name = 'MyPlugin';\n * version = '1.0.0';\n * description = 'A custom plugin';\n *\n * install(app: Application): void {\n * // Plugin installation logic\n * app.use((req, res, next) => {\n * // Middleware logic\n * next();\n * });\n * }\n *\n * async init(): Promise<void> {\n * // Plugin initialization\n * }\n *\n * async cleanup(): Promise<void> {\n * // Plugin cleanup\n * }\n * }\n * ```\n */\nexport abstract class BasePlugin implements Plugin {\n public abstract name: string;\n public abstract version: string;\n public abstract onInstall(app: Application): void;\n public description?: string;\n public author?: string;\n public homepage?: string;\n public license?: string;\n public keywords?: string[];\n public dependencies?: string[];\n public conflicts?: string[];\n\n protected app?: Application;\n protected config: Record<string, unknown> = {};\n protected isInitialized = false;\n protected isInstalled = false;\n\n /**\n * Install the plugin on an application\n */\n public install(app: Application): void {\n if (this.isInstalled) {\n throw new PluginError(\n `Plugin ${this.name} is already installed`,\n this.name,\n 500\n );\n }\n\n this.app = app;\n this.isInstalled = true;\n\n // Validate configuration\n if (this.validateConfig && !this.validateConfig()) {\n throw new PluginError(\n `Invalid configuration for plugin ${this.name}`,\n this.name,\n 500\n );\n }\n\n // Call the abstract install method\n this.onInstall(app);\n\n // Initialize if init method exists\n if ((this as any).init) {\n (this as any).init().catch((error: any) => {\n throw new PluginError(\n `Failed to initialize plugin ${this.name}: ${error.message}`,\n this.name,\n 500\n );\n });\n }\n }\n\n /**\n * Abstract method that plugins must implement\n */\n\n /**\n * Get plugin metadata\n */\n public getMetadata(): PluginMetadata {\n return {\n name: this.name,\n version: this.version,\n description: this.description || '',\n author: this.author || '',\n homepage: this.homepage || '',\n license: this.license || '',\n keywords: this.keywords || [],\n dependencies: this.dependencies || [],\n conflicts: this.conflicts || [],\n };\n }\n\n /**\n * Set plugin configuration\n */\n public setConfig(config: Record<string, unknown>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Get plugin configuration\n */\n public getConfig(): Record<string, unknown> {\n return { ...this.config };\n }\n\n /**\n * Get a specific configuration value\n */\n public getConfigValue<T>(key: string, defaultValue?: T): T | undefined {\n return (this.config[key] as T) ?? defaultValue;\n }\n\n /**\n * Check if plugin is installed\n */\n public isPluginInstalled(): boolean {\n return this.isInstalled;\n }\n\n /**\n * Check if plugin is initialized\n */\n public isPluginInitialized(): boolean {\n return this.isInitialized;\n }\n\n /**\n * Register middleware with the application\n */\n protected registerMiddleware(middleware: Middleware): void {\n if (!this.app) {\n throw new PluginError(\n `Plugin ${this.name} is not installed`,\n this.name,\n 500\n );\n }\n\n this.app.use(middleware as any);\n }\n\n /**\n * Log plugin message\n */\n protected log(message: string): void {\n console.log(`[${this.name}] ${message}`);\n }\n\n /**\n * Log plugin error\n */\n protected logError(message: string, error?: Error): void {\n console.error(`[${this.name}] ${message}`, error);\n }\n\n /**\n * Log plugin warning\n */\n protected logWarning(message: string): void {\n console.warn(`[${this.name}] ${message}`);\n }\n\n /**\n * Log plugin debug message\n */\n protected logDebug(message: string): void {\n if (this.getConfigValue('debug', false)) {\n console.debug(`[${this.name}] ${message}`);\n }\n }\n\n /**\n * Emit plugin event\n */\n protected emit(event: string, ...args: unknown[]): void {\n if (this.app && 'emit' in this.app) {\n (this.app as any).emit(`plugin:${this.name}:${event}`, ...args);\n }\n }\n\n /**\n * Create a middleware that wraps the plugin's functionality\n */\n protected createMiddleware(\n handler: (ctx: Context, next: () => Promise<void>) => void | Promise<void>\n ): Middleware {\n return async (ctx: Context, next: () => Promise<void>) => {\n try {\n await handler(ctx, next);\n } catch (error) {\n this.logError('Middleware error', error as Error);\n // rethrow to let upstream error handlers manage it\n throw error;\n }\n };\n }\n\n /**\n * Create an async middleware that wraps the plugin's functionality\n */\n protected createAsyncMiddleware(\n handler: (ctx: Context, next: () => Promise<void>) => Promise<void>\n ): Middleware {\n return async (ctx: Context, next: () => Promise<void>) => {\n try {\n await handler(ctx, next);\n } catch (error) {\n this.logError('Async middleware error', error as Error);\n throw error;\n }\n };\n }\n\n /**\n * Validate plugin configuration\n */\n public validateConfig(): boolean {\n // Default implementation - plugins can override\n return true;\n }\n\n /**\n * Plugin health check\n */\n public async healthCheck(): Promise<boolean> {\n // Default implementation - plugins can override\n return this.isInstalled && this.isInitialized;\n }\n\n /**\n * Get plugin status\n */\n public getStatus(): Record<string, unknown> {\n return {\n name: this.name,\n version: this.version,\n installed: this.isInstalled,\n initialized: this.isInitialized,\n config: this.config,\n };\n }\n}\n","/**\n * Logger Types and Interfaces for NextRush v2\n *\n * @packageDocumentation\n */\n\n// Define log levels\nexport enum LogLevel {\n ERROR = 0,\n WARN = 1,\n INFO = 2,\n DEBUG = 3,\n TRACE = 4,\n}\n\nexport interface LogEntry {\n timestamp: Date | string;\n level: LogLevel | string;\n message: string;\n context?: Record<string, unknown>;\n error?: Error;\n}\n\nexport interface LoggerConfig extends Record<string, unknown> {\n level?: LogLevel;\n format?: 'json' | 'text' | 'simple';\n timestamp?: boolean;\n colors?: boolean;\n maxEntries?: number;\n flushInterval?: number;\n maxMemoryUsage?: number; // Maximum memory usage in MB\n asyncFlush?: boolean; // Use async flushing\n transports?: Array<{\n type: 'console' | 'file' | 'stream';\n options?: Record<string, unknown>;\n }>;\n}\n\n/**\n * Transport interface\n */\nexport interface Transport {\n name: string;\n level: string;\n write(entry: LogEntry): void | Promise<void>;\n}\n","/**\n * Logger Transport implementations for NextRush v2\n *\n * @packageDocumentation\n */\n\nimport { LogLevel, type LogEntry, type Transport } from './logger-types';\n\n/**\n * Console Transport\n */\nexport class ConsoleTransport implements Transport {\n public name = 'console';\n private _level: LogLevel;\n private _levelString: string;\n\n constructor(level: LogLevel | string = LogLevel.INFO) {\n if (typeof level === 'string') {\n this._level = LogLevel[level.toUpperCase() as keyof typeof LogLevel];\n this._levelString = level;\n } else {\n this._level = level;\n this._levelString = LogLevel[level];\n }\n }\n\n get levelString(): string {\n return this._levelString;\n }\n\n // For test compatibility\n get level(): string {\n return this._levelString;\n }\n\n set level(value: LogLevel | string) {\n if (typeof value === 'string') {\n this._level = LogLevel[value.toUpperCase() as keyof typeof LogLevel];\n this._levelString = value;\n } else {\n this._level = value;\n this._levelString = LogLevel[value];\n }\n }\n\n write(entry: LogEntry): void {\n const level =\n typeof entry.level === 'string'\n ? LogLevel[entry.level.toUpperCase() as keyof typeof LogLevel]\n : entry.level;\n\n if (level <= this._level) {\n const timestamp =\n typeof entry.timestamp === 'string'\n ? entry.timestamp\n : entry.timestamp.toISOString();\n const levelName =\n typeof entry.level === 'string'\n ? entry.level.toUpperCase()\n : LogLevel[entry.level];\n const message = `${timestamp} [${levelName}] ${entry.message}`;\n\n switch (level) {\n case LogLevel.ERROR:\n console.error(message);\n break;\n case LogLevel.WARN:\n console.warn(message);\n break;\n case LogLevel.INFO:\n console.info(message);\n break;\n case LogLevel.DEBUG:\n console.log(message);\n break;\n case LogLevel.TRACE:\n console.log(message);\n break;\n }\n }\n }\n}\n\n/**\n * File Transport\n */\nexport class FileTransport implements Transport {\n public name = 'file';\n private _level: LogLevel;\n private filePath: string;\n private _levelString: string;\n\n constructor(filePath: string, level: LogLevel | string = LogLevel.INFO) {\n this.filePath = filePath;\n if (typeof level === 'string') {\n this._level = LogLevel[level.toUpperCase() as keyof typeof LogLevel];\n this._levelString = level;\n } else {\n this._level = level;\n this._levelString = LogLevel[level];\n }\n }\n\n get levelString(): string {\n return this._levelString;\n }\n\n // For test compatibility\n get level(): string {\n return this._levelString;\n }\n\n set level(value: LogLevel | string) {\n if (typeof value === 'string') {\n this._level = LogLevel[value.toUpperCase() as keyof typeof LogLevel];\n this._levelString = value;\n } else {\n this._level = value;\n this._levelString = LogLevel[value];\n }\n }\n\n async write(entry: LogEntry): Promise<void> {\n const level =\n typeof entry.level === 'string'\n ? LogLevel[entry.level.toUpperCase() as keyof typeof LogLevel]\n : entry.level;\n\n if (level <= this._level) {\n const timestamp =\n typeof entry.timestamp === 'string'\n ? entry.timestamp\n : entry.timestamp.toISOString();\n const levelName =\n typeof entry.level === 'string'\n ? entry.level.toUpperCase()\n : LogLevel[entry.level];\n const message = `${timestamp} [${levelName}] ${entry.message}\\n`;\n\n try {\n const fs = await import('node:fs/promises');\n await fs.appendFile(this.filePath, message);\n } catch (error) {\n console.error('Failed to write to log file:', error);\n }\n }\n }\n}\n\n/**\n * HTTP Transport\n */\nexport class HttpTransport implements Transport {\n public name = 'http';\n private _level: LogLevel;\n private url: string;\n private _levelString: string;\n\n constructor(url: string, level: LogLevel | string = LogLevel.INFO) {\n this.url = url;\n if (typeof level === 'string') {\n this._level = LogLevel[level.toUpperCase() as keyof typeof LogLevel];\n this._levelString = level;\n } else {\n this._level = level;\n this._levelString = LogLevel[level];\n }\n }\n\n get levelString(): string {\n return this._levelString;\n }\n\n // For test compatibility\n get level(): string {\n return this._levelString;\n }\n\n set level(value: LogLevel | string) {\n if (typeof value === 'string') {\n this._level = LogLevel[value.toUpperCase() as keyof typeof LogLevel];\n this._levelString = value;\n } else {\n this._level = value;\n this._levelString = LogLevel[value];\n }\n }\n\n async write(entry: LogEntry): Promise<void> {\n const level =\n typeof entry.level === 'string'\n ? LogLevel[entry.level.toUpperCase() as keyof typeof LogLevel]\n : entry.level;\n\n if (level <= this._level) {\n try {\n const response = await fetch(this.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(entry),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n } catch (error) {\n console.error('Failed to send log to HTTP endpoint:', error);\n }\n }\n }\n}\n\n/**\n * Stream Transport\n */\nexport class StreamTransport implements Transport {\n public name = 'stream';\n private _level: LogLevel;\n private stream: NodeJS.WritableStream;\n private _levelString: string;\n\n constructor(\n stream: NodeJS.WritableStream,\n level: LogLevel | string = LogLevel.INFO\n ) {\n this.stream = stream;\n if (typeof level === 'string') {\n this._level = LogLevel[level.toUpperCase() as keyof typeof LogLevel];\n this._levelString = level;\n } else {\n this._level = level;\n this._levelString = LogLevel[level];\n }\n }\n\n get levelString(): string {\n return this._levelString;\n }\n\n // For test compatibility\n get level(): string {\n return this._levelString;\n }\n\n set level(value: LogLevel | string) {\n if (typeof value === 'string') {\n this._level = LogLevel[value.toUpperCase() as keyof typeof LogLevel];\n this._levelString = value;\n } else {\n this._level = value;\n this._levelString = LogLevel[value];\n }\n }\n\n write(entry: LogEntry): void {\n const level =\n typeof entry.level === 'string'\n ? LogLevel[entry.level.toUpperCase() as keyof typeof LogLevel]\n : entry.level;\n\n if (level <= this._level) {\n const timestamp =\n typeof entry.timestamp === 'string'\n ? entry.timestamp\n : entry.timestamp.toISOString();\n const levelName =\n typeof entry.level === 'string'\n ? entry.level.toUpperCase()\n : LogLevel[entry.level];\n const message = `${timestamp} [${levelName}] ${entry.message}\\n`;\n\n this.stream.write(message);\n }\n }\n}\n","/**\n * Core Logger Plugin for NextRush v2\n *\n * @packageDocumentation\n */\n\nimport { BasePlugin } from '@/plugins/core/base-plugin';\nimport { Application } from '@/types/context';\nimport { ConsoleTransport } from './logger-transports';\nimport {\n LogLevel,\n type LogEntry,\n type LoggerConfig,\n type Transport,\n} from './logger-types';\n\n// Re-export types for convenience\nexport {\n LogLevel,\n type LogEntry,\n type LoggerConfig,\n type Transport,\n} from './logger-types';\n\nexport class LoggerPlugin extends BasePlugin {\n public name = 'Logger';\n public version = '1.0.0';\n\n public override config: LoggerConfig;\n private entries: LogEntry[] = [];\n private flushTimer?: NodeJS.Timeout;\n private _transports: Transport[] = [];\n private eventListeners: Map<string, Array<(entry: LogEntry) => void>> =\n new Map();\n\n constructor(config: LoggerConfig = {}) {\n super();\n this.config = {\n level: LogLevel.INFO,\n format: 'text',\n timestamp: true,\n colors: true,\n maxEntries: 1000,\n flushInterval: 5000,\n maxMemoryUsage: 50, // 50MB default\n asyncFlush: true, // Enable async flushing by default\n transports: [{ type: 'console' }],\n ...config,\n };\n\n // Initialize default console transport\n this._transports.push(new ConsoleTransport(this.config.level));\n }\n\n override onInstall(app: Application): void {\n // Add logger methods to the application\n app.loggerInstance = {\n error: this.error.bind(this),\n warn: this.warn.bind(this),\n info: this.info.bind(this),\n debug: this.debug.bind(this),\n trace: this.trace.bind(this),\n log: this.info.bind(this),\n };\n\n // Also add a simple alias for better DX\n (app as any).logger = app.loggerInstance;\n\n // Add logging middleware\n app.use(async (ctx, next) => {\n const startTime = Date.now();\n const requestId = ctx.id || 'unknown';\n\n this.info(`Request started: ${ctx.req.method} ${ctx.req.url}`, {\n requestId,\n method: ctx.req.method,\n url: ctx.req.url,\n userAgent: ctx.req.headers['user-agent'],\n ip: ctx.ip,\n });\n\n try {\n await next();\n } catch (error) {\n this.error('Request failed', {\n requestId,\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n });\n throw error;\n }\n\n this.info(`Request completed: ${ctx.res.statusCode}`, {\n requestId,\n statusCode: ctx.res.statusCode,\n duration: Date.now() - startTime,\n });\n });\n\n // Start flush timer\n this.startFlushTimer();\n\n this.isInstalled = true;\n this.log('Logger plugin installed');\n }\n\n private startFlushTimer(): void {\n if (this.config.flushInterval && this.config.flushInterval > 0) {\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.config.flushInterval);\n }\n }\n\n private stopFlushTimer(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = undefined as any;\n }\n }\n\n private addEntry(\n level: LogLevel,\n message: string,\n context?: Record<string, unknown>\n ): void {\n const entry: LogEntry = {\n timestamp: new Date(),\n level,\n message,\n context: context || {},\n };\n\n this.entries.push(entry);\n\n // Check memory usage and flush if necessary\n this.checkMemoryUsage();\n\n // Limit entries\n if (this.entries.length > this.config.maxEntries!) {\n this.entries = this.entries.slice(-this.config.maxEntries!);\n }\n\n // Immediate write for error and warn levels (don't remove from entries)\n if (level <= LogLevel.WARN) {\n this.writeToTransports();\n }\n }\n\n /**\n * Check memory usage and flush if necessary\n */\n private checkMemoryUsage(): void {\n if (!this.config.maxMemoryUsage) {\n return;\n }\n\n const memoryUsage = process.memoryUsage();\n const heapUsedMB = memoryUsage.heapUsed / 1024 / 1024;\n\n if (heapUsedMB > this.config.maxMemoryUsage) {\n // Force flush to free memory\n this.flush();\n\n // If still over limit, clear some entries\n if (this.entries.length > this.config.maxEntries! / 2) {\n this.entries = this.entries.slice(-this.config.maxEntries! / 2);\n }\n }\n }\n\n private flush(): void {\n if (this.entries.length === 0) {\n return;\n }\n\n const entriesToFlush = [...this.entries];\n\n if (this.config.asyncFlush) {\n // Async flush to prevent blocking\n setImmediate(() => {\n this._transports.forEach(transport => {\n this.writeToTransport(transport, entriesToFlush);\n });\n // Clear entries after writing\n if (this.entries.length === entriesToFlush.length) {\n this.entries = [];\n }\n });\n } else {\n // Synchronous flush\n this._transports.forEach(transport => {\n this.writeToTransport(transport, entriesToFlush);\n });\n // Clear entries after writing\n this.entries = [];\n }\n }\n\n private writeToTransport(transport: Transport, entries: LogEntry[]): void {\n try {\n entries.forEach(entry => {\n const result = transport.write(entry);\n if (result instanceof Promise) {\n result.catch(error => {\n console.error(\n `Failed to write to transport ${transport.name}:`,\n error\n );\n });\n }\n });\n } catch (error) {\n console.error(`Failed to write to transport ${transport.name}:`, error);\n }\n }\n\n /**\n * Write latest entry to all transports\n */\n private writeToTransports(): void {\n if (this.entries.length === 0) {\n return;\n }\n\n const latestEntry = this.entries[this.entries.length - 1];\n\n this._transports.forEach(transport => {\n try {\n if (latestEntry) {\n const result = transport.write(latestEntry);\n if (result instanceof Promise) {\n result.catch(error => {\n console.error('Transport error:', error);\n });\n }\n }\n } catch (error) {\n console.error('Transport error error:', error);\n }\n });\n }\n\n // Public logging methods\n error(message: string, context?: Record<string, unknown>): void {\n if (LogLevel.ERROR <= this.config.level!) {\n this.addEntry(LogLevel.ERROR, message, context);\n }\n }\n\n warn(message: string, context?: Record<string, unknown>): void {\n if (LogLevel.WARN <= this.config.level!) {\n this.addEntry(LogLevel.WARN, message, context);\n }\n }\n\n info(message: string, context?: Record<string, unknown>): void {\n if (LogLevel.INFO <= this.config.level!) {\n this.addEntry(LogLevel.INFO, message, context);\n this.writeToTransports();\n }\n }\n\n debug(message: string, context?: Record<string, unknown>): void {\n if (LogLevel.DEBUG <= this.config.level!) {\n this.addEntry(LogLevel.DEBUG, message, context);\n this.writeToTransports();\n }\n }\n\n trace(message: string, context?: Record<string, unknown>): void {\n if (LogLevel.TRACE <= this.config.level!) {\n this.addEntry(LogLevel.TRACE, message, context);\n this.writeToTransports();\n }\n }\n\n override log(message: string, context?: Record<string, unknown>): void {\n this.info(message, context);\n }\n\n // Utility methods\n getEntries(): LogEntry[] {\n return [...this.entries];\n }\n\n clear(): void {\n this.entries = [];\n }\n\n setLevel(level: LogLevel | string): void {\n const logLevel =\n typeof level === 'string'\n ? LogLevel[level.toUpperCase() as keyof typeof LogLevel]\n : level;\n this.config.level = logLevel;\n this._transports.forEach(transport => {\n if ('level' in transport) {\n const transportLevel =\n typeof level === 'string'\n ? level.toLowerCase()\n : LogLevel[logLevel].toLowerCase();\n (transport as any).level = transportLevel;\n }\n });\n }\n\n /**\n * Add a transport\n */\n addTransport(transport: Transport): void {\n this._transports.push(transport);\n }\n\n /**\n * Remove a transport by name\n */\n removeTransport(name: string): void {\n this._transports = this._transports.filter(t => t.name !== name);\n }\n\n /**\n * Add event listener\n */\n on(event: string, listener: (entry: LogEntry) => void): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, []);\n }\n this.eventListeners.get(event)!.push(listener);\n }\n\n /**\n * Remove event listener\n */\n off(event: string, listener: (entry: LogEntry) => void): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n const index = listeners.indexOf(listener);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n }\n }\n\n /**\n * Log a message (internal method for testing)\n */\n logMessage(\n level: LogLevel | string,\n message: string,\n context?: Record<string, unknown>\n ): void {\n const logLevel =\n typeof level === 'string'\n ? LogLevel[level.toUpperCase() as keyof typeof LogLevel]\n : level;\n this.addEntry(logLevel, message, context);\n\n // Write to transports to trigger error handling\n this.writeToTransports();\n\n // Emit event with complete entry data\n const entry = this.entries[this.entries.length - 1];\n if (entry) {\n const eventEntry = {\n ...entry,\n level: typeof level === 'string' ? level : LogLevel[logLevel],\n message: entry.message,\n context: entry.context,\n timestamp: entry.timestamp,\n };\n const listeners = this.eventListeners.get('log');\n if (listeners) {\n listeners.forEach(listener => listener(eventEntry as LogEntry));\n }\n }\n }\n\n /**\n * Get transports (for testing)\n */\n getTransports(): Transport[] {\n return this._transports;\n }\n\n /**\n * Get transports property (for testing)\n */\n get transports(): Transport[] {\n return this._transports;\n }\n\n // Cleanup\n cleanup(): void {\n this.stopFlushTimer();\n this.flush();\n this.entries = [];\n }\n}\n","/**\n * Logger Factory Functions for NextRush v2\n *\n * @packageDocumentation\n */\n\nimport { LoggerPlugin } from './logger-core';\nimport { LogLevel } from './logger-types';\n\n/**\n * Create minimal logger for testing\n */\nexport function createMinimalLogger(): LoggerPlugin {\n const logger = new LoggerPlugin({\n level: LogLevel.INFO,\n format: 'simple',\n timestamp: false,\n colors: false,\n maxEntries: 100,\n flushInterval: 1000,\n transports: [{ type: 'console' }],\n });\n\n // Console transport is already added in constructor\n return logger;\n}\n\n/**\n * Create development logger\n */\nexport function createDevLogger(): LoggerPlugin {\n const logger = new LoggerPlugin({\n level: LogLevel.DEBUG,\n format: 'text',\n timestamp: true,\n colors: true,\n maxEntries: 1000,\n flushInterval: 5000,\n transports: [{ type: 'console' }],\n });\n\n // Console transport is already added in constructor\n return logger;\n}\n\n/**\n * Create production logger\n */\nexport function createProdLogger(): LoggerPlugin {\n const logger = new LoggerPlugin({\n level: LogLevel.INFO,\n format: 'json',\n timestamp: true,\n colors: false,\n maxEntries: 10000,\n flushInterval: 10000,\n transports: [\n { type: 'console' },\n { type: 'file', options: { path: 'logs/app.log' } },\n ],\n });\n\n // Console transport is already added in constructor\n return logger;\n}\n\n/**\n * Create test logger\n */\nexport function createTestLogger(): LoggerPlugin {\n const logger = new LoggerPlugin({\n level: LogLevel.ERROR,\n format: 'simple',\n timestamp: false,\n colors: false,\n maxEntries: 10,\n flushInterval: 100,\n transports: [{ type: 'console' }],\n });\n\n // Console transport is already added in constructor\n return logger;\n}\n","/**\n * Configuration Validation System for NextRush v2\n *\n * Provides type-safe configuration validation to prevent runtime errors\n * and ensure proper application initialization.\n *\n * @packageDocumentation\n */\n\nimport type { ApplicationOptions } from '@/types/http';\n\n/**\n * Configuration validation errors\n */\nexport class ConfigurationError extends Error {\n constructor(\n message: string,\n public readonly field: string,\n public readonly value: unknown\n ) {\n super(message);\n this.name = 'ConfigurationError';\n }\n}\n\n/**\n * Validation rules for application options\n */\nexport interface ValidationRule<T = unknown> {\n validate: (value: T) => boolean;\n message: string;\n}\n\n/**\n * Built-in validation rules\n */\nexport const ValidationRules = {\n /**\n * Validate port number\n */\n port: {\n validate: (port: number) =>\n Number.isInteger(port) && port >= 0 && port <= 65535,\n message: 'Port must be an integer between 0 and 65535',\n } as ValidationRule<number>,\n\n /**\n * Validate host string\n */\n host: {\n validate: (host: string) => typeof host === 'string' && host.length > 0,\n message: 'Host must be a non-empty string',\n } as ValidationRule<string>,\n\n /**\n * Validate timeout\n */\n timeout: {\n validate: (timeout: number) =>\n Number.isInteger(timeout) && timeout > 0 && timeout <= 300000, // Max 5 minutes\n message: 'Timeout must be a positive integer (max 300000ms)',\n } as ValidationRule<number>,\n\n /**\n * Validate maxBodySize\n */\n maxBodySize: {\n validate: (size: number) =>\n Number.isInteger(size) && size > 0 && size <= 100 * 1024 * 1024, // Max 100MB\n message: 'MaxBodySize must be a positive integer (max 100MB)',\n } as ValidationRule<number>,\n\n /**\n * Validate keepAlive\n */\n keepAlive: {\n validate: (keepAlive: number) =>\n Number.isInteger(keepAlive) && keepAlive >= 0 && keepAlive <= 300000, // Max 5 minutes\n message: 'KeepAlive must be a non-negative integer (max 300000ms)',\n } as ValidationRule<number>,\n\n /**\n * Validate boolean values\n */\n boolean: {\n validate: (value: boolean) => typeof value === 'boolean',\n message: 'Value must be a boolean',\n } as ValidationRule<boolean>,\n\n /**\n * Validate string values\n */\n string: {\n validate: (value: string) => typeof value === 'string',\n message: 'Value must be a string',\n } as ValidationRule<string>,\n\n /**\n * Validate template engine configuration\n */\n template: {\n validate: (template: { engine: string; directory: string }) =>\n typeof template === 'object' &&\n template !== null &&\n typeof template.engine === 'string' &&\n typeof template.directory === 'string' &&\n template.engine.length > 0 &&\n template.directory.length > 0,\n message:\n 'Template must be an object with non-empty engine and directory strings',\n } as ValidationRule<{ engine: string; directory: string }>,\n};\n\n/**\n * Configuration schema definition\n */\nconst CONFIG_SCHEMA: Record<string, ValidationRule<unknown>> = {\n port: ValidationRules.port as ValidationRule<unknown>,\n host: ValidationRules.host as ValidationRule<unknown>,\n debug: ValidationRules.boolean as ValidationRule<unknown>,\n trustProxy: ValidationRules.boolean as ValidationRule<unknown>,\n maxBodySize: ValidationRules.maxBodySize as ValidationRule<unknown>,\n timeout: ValidationRules.timeout as ValidationRule<unknown>,\n cors: ValidationRules.boolean as ValidationRule<unknown>,\n static: ValidationRules.string as ValidationRule<unknown>,\n template: ValidationRules.template as ValidationRule<unknown>,\n keepAlive: ValidationRules.keepAlive as ValidationRule<unknown>,\n};\n\n/**\n * Validate a single configuration field\n */\nexport function validateField<T>(\n fieldName: string,\n value: T,\n rule: ValidationRule<T>\n): void {\n if (!rule.validate(value)) {\n throw new ConfigurationError(\n `Invalid ${fieldName}: ${rule.message}`,\n fieldName,\n value\n );\n }\n}\n\n/**\n * Validate complete application options\n */\nexport function validateApplicationOptions(\n options: Partial<ApplicationOptions>\n): void {\n const errors: ConfigurationError[] = [];\n\n // Validate each provided option\n for (const [key, value] of Object.entries(options)) {\n const rule = CONFIG_SCHEMA[key as keyof ApplicationOptions];\n\n if (!rule) {\n errors.push(\n new ConfigurationError(\n `Unknown configuration option: ${key}`,\n key,\n value\n )\n );\n continue;\n }\n\n try {\n validateField(key, value, rule as ValidationRule);\n } catch (error) {\n if (error instanceof ConfigurationError) {\n errors.push(error);\n }\n }\n }\n\n if (errors.length > 0) {\n const messages = errors.map(e => e.message).join(', ');\n throw new ConfigurationError(\n `Configuration validation failed: ${messages}`,\n 'multiple',\n options\n );\n }\n}\n\n/**\n * Create safe configuration with defaults and validation\n */\nexport function createSafeConfiguration(\n options: Partial<ApplicationOptions> = {}\n): Required<ApplicationOptions> {\n // Validate provided options first\n validateApplicationOptions(options);\n\n // Merge with safe defaults\n const safeDefaults: Required<ApplicationOptions> = {\n port: 3000,\n host: 'localhost',\n\n debug: false,\n trustProxy: false,\n maxBodySize: 1024 * 1024, // 1MB\n timeout: 30000, // 30 seconds\n cors: true,\n static: 'public',\n template: {\n engine: 'simple',\n directory: 'views',\n },\n keepAlive: 10000, // 10 seconds\n };\n\n const mergedOptions = { ...safeDefaults, ...options };\n\n // Validate final configuration\n validateApplicationOptions(mergedOptions);\n\n return mergedOptions;\n}\n\n/**\n * Configuration validation utilities\n */\nexport const ConfigUtils = {\n /**\n * Check if a value is a valid port\n */\n isValidPort: (value: unknown): value is number =>\n ValidationRules.port.validate(value as number),\n\n /**\n * Check if a value is a valid host\n */\n isValidHost: (value: unknown): value is string =>\n ValidationRules.host.validate(value as string),\n\n /**\n * Check if a value is a valid timeout\n */\n isValidTimeout: (value: unknown): value is number =>\n ValidationRules.timeout.validate(value as number),\n\n /**\n * Sanitize configuration by removing invalid fields\n */\n sanitize: (options: Record<string, unknown>): Partial<ApplicationOptions> => {\n const sanitized: Partial<ApplicationOptions> = {};\n\n for (const [key, value] of Object.entries(options)) {\n const rule = CONFIG_SCHEMA[key as keyof ApplicationOptions];\n if (rule && rule.validate(value)) {\n (sanitized as Record<string, unknown>)[key] = value;\n }\n }\n\n return sanitized;\n },\n};\n","/**\n * Lightweight Dependency Injection Container for NextRush v2\n *\n * Custom DI implementation that provides:\n * - Zero external dependencies\n * - Type-safe service registration and resolution\n * - Singleton and transient lifecycles\n * - Performance-optimized for framework use\n *\n * @packageDocumentation\n */\n\n/**\n * Service lifecycle options\n */\nexport enum ServiceLifetime {\n /** New instance created on each resolution */\n TRANSIENT = 'transient',\n /** Single instance shared across all resolutions */\n SINGLETON = 'singleton',\n /** Instance created once per request scope */\n SCOPED = 'scoped',\n}\n\n/**\n * Service descriptor for registration\n */\nexport interface ServiceDescriptor<T = any> {\n /** Service identifier token */\n token: string | symbol;\n /** Factory function to create the service */\n factory: (...args: any[]) => T;\n /** Service lifetime */\n lifetime: ServiceLifetime;\n /** Dependencies to inject into factory */\n dependencies?: (string | symbol)[];\n}\n\n/**\n * Container interface for dependency injection\n */\nexport interface DIContainer {\n /** Register a service with the container */\n register<T>(descriptor: ServiceDescriptor<T>): void;\n\n /** Register a singleton service */\n singleton<T>(\n token: string | symbol,\n factory: (...args: any[]) => T,\n dependencies?: (string | symbol)[]\n ): void;\n\n /** Register a transient service */\n transient<T>(\n token: string | symbol,\n factory: (...args: any[]) => T,\n dependencies?: (string | symbol)[]\n ): void;\n\n /** Resolve a service from the container */\n resolve<T>(token: string | symbol): T;\n\n /** Check if a service is registered */\n isRegistered(token: string | symbol): boolean;\n\n /** Clear all services */\n clear(): void;\n\n /** Get container statistics */\n getStats(): ContainerStats;\n}\n\n/**\n * Container statistics for monitoring\n */\nexport interface ContainerStats {\n /** Total number of registered services */\n totalServices: number;\n /** Number of singleton instances created */\n singletonInstances: number;\n /** Number of resolutions performed */\n resolutions: number;\n /** Cache hit rate for singletons */\n cacheHitRate: number;\n}\n\n/**\n * Circular dependency detection\n */\nclass CircularDependencyDetector {\n private resolutionStack: (string | symbol)[] = [];\n\n enterResolution(token: string | symbol): void {\n if (this.resolutionStack.includes(token)) {\n const cycle = [...this.resolutionStack, token].join(' -> ');\n throw new Error(`Circular dependency detected: ${cycle}`);\n }\n this.resolutionStack.push(token);\n }\n\n exitResolution(): void {\n this.resolutionStack.pop();\n }\n\n reset(): void {\n this.resolutionStack.length = 0;\n }\n}\n\n/**\n * High-performance DI Container implementation\n */\nexport class NextRushContainer implements DIContainer {\n private services = new Map<string | symbol, ServiceDescriptor>();\n private singletonInstances = new Map<string | symbol, any>();\n private circularDetector = new CircularDependencyDetector();\n private stats = {\n resolutions: 0,\n cacheHits: 0,\n cacheMisses: 0,\n };\n\n /**\n * Register a service with the container\n */\n register<T>(descriptor: ServiceDescriptor<T>): void {\n if (this.services.has(descriptor.token)) {\n throw new Error(\n `Service with token '${String(descriptor.token)}' is already registered`\n );\n }\n\n this.services.set(descriptor.token, descriptor);\n }\n\n /**\n * Register a singleton service\n */\n singleton<T>(\n token: string | symbol,\n factory: (...args: any[]) => T,\n dependencies: (string | symbol)[] = []\n ): void {\n this.register({\n token,\n factory,\n lifetime: ServiceLifetime.SINGLETON,\n dependencies,\n });\n }\n\n /**\n * Register a transient service\n */\n transient<T>(\n token: string | symbol,\n factory: (...args: any[]) => T,\n dependencies: (string | symbol)[] = []\n ): void {\n this.register({\n token,\n factory,\n lifetime: ServiceLifetime.TRANSIENT,\n dependencies,\n });\n }\n\n /**\n * Resolve a service from the container\n */\n resolve<T>(token: string | symbol): T {\n this.stats.resolutions++;\n\n const descriptor = this.services.get(token);\n if (!descriptor) {\n throw new Error(\n `Service with token '${String(token)}' is not registered`\n );\n }\n\n // Check for singleton instance\n if (descriptor.lifetime === ServiceLifetime.SINGLETON) {\n if (this.singletonInstances.has(token)) {\n this.stats.cacheHits++;\n return this.singletonInstances.get(token);\n }\n this.stats.cacheMisses++;\n }\n\n // Resolve with circular dependency detection\n this.circularDetector.enterResolution(token);\n\n try {\n // Resolve dependencies\n const resolvedDependencies = (descriptor.dependencies || []).map(dep =>\n this.resolve(dep)\n );\n\n // Create instance\n const instance = descriptor.factory(...resolvedDependencies);\n\n // Cache singleton\n if (descriptor.lifetime === ServiceLifetime.SINGLETON) {\n this.singletonInstances.set(token, instance);\n }\n\n return instance;\n } finally {\n this.circularDetector.exitResolution();\n }\n }\n\n /**\n * Check if a service is registered\n */\n isRegistered(token: string | symbol): boolean {\n return this.services.has(token);\n }\n\n /**\n * Clear all services and instances\n */\n clear(): void {\n this.services.clear();\n this.singletonInstances.clear();\n this.circularDetector.reset();\n this.stats = {\n resolutions: 0,\n cacheHits: 0,\n cacheMisses: 0,\n };\n }\n\n /**\n * Get container statistics\n */\n getStats(): ContainerStats {\n const total = this.stats.cacheHits + this.stats.cacheMisses;\n return {\n totalServices: this.services.size,\n singletonInstances: this.singletonInstances.size,\n resolutions: this.stats.resolutions,\n cacheHitRate: total === 0 ? 0 : this.stats.cacheHits / total,\n };\n }\n\n /**\n * Advanced: Register a class constructor with automatic dependency injection\n */\n registerClass<T>(\n token: string | symbol,\n constructor: new (...args: any[]) => T,\n lifetime: ServiceLifetime = ServiceLifetime.SINGLETON,\n dependencies: (string | symbol)[] = []\n ): void {\n this.register({\n token,\n factory: (...args: any[]) => new constructor(...args),\n lifetime,\n dependencies,\n });\n }\n\n /**\n * Advanced: Register a value directly (useful for configuration)\n */\n registerValue<T>(token: string | symbol, value: T): void {\n this.register({\n token,\n factory: () => value,\n lifetime: ServiceLifetime.SINGLETON,\n dependencies: [],\n });\n }\n}\n\n/**\n * Service tokens for built-in framework services\n */\nexport const SERVICE_TOKENS = {\n // Core services\n LOGGER: Symbol('LOGGER'),\n ROUTER: Symbol('ROUTER'),\n CONTEXT_FACTORY: Symbol('CONTEXT_FACTORY'),\n\n // Middleware services\n CORS_MIDDLEWARE: Symbol('CORS_MIDDLEWARE'),\n HELMET_MIDDLEWARE: Symbol('HELMET_MIDDLEWARE'),\n BODY_PARSER_MIDDLEWARE: Symbol('BODY_PARSER_MIDDLEWARE'),\n COMPRESSION_MIDDLEWARE: Symbol('COMPRESSION_MIDDLEWARE'),\n RATE_LIMITER_MIDDLEWARE: Symbol('RATE_LIMITER_MIDDLEWARE'),\n\n // Configuration\n APPLICATION_CONFIG: Symbol('APPLICATION_CONFIG'),\n MIDDLEWARE_CONFIG: Symbol('MIDDLEWARE_CONFIG'),\n} as const;\n\n/**\n * Create a new DI container instance\n */\nexport function createContainer(): DIContainer {\n return new NextRushContainer();\n}\n\n/**\n * Default global container instance\n */\nexport const globalContainer = createContainer();\n","/**\n * 🚀 Smart Body Parser Dispatcher - NextRush v2\n *\n * INTELLIGENT CONTENT-TYPE AWARE PARSER LOADER\n *\n * 🎯 **PERFORMANCE BREAKTHROUGH:**\n * - 🔥 Only loads the parser you need based on Content-Type\n * - ⚡ JSON request → Only loads JSON parser (~150 lines)\n * - 🌊 Multipart request → Only loads multipart parser (~200 lines)\n * - 🎭 Form request → Only loads URL-encoded parser (~150 lines)\n * - 📄 Text request → Only loads text parser (~100 lines)\n * - 💾 Raw request → Only loads raw parser (~100 lines)\n *\n * OLD WAY: Every request loads 1,032 lines ❌\n * NEW WAY: Each request loads only 100-200 lines ✅\n *\n * @author NextRush Framework Team\n * @version 2.0.0\n */\n\nimport type { Context, Middleware } from '../../../types/context';\nimport { HttpError } from './http-error';\nimport type {\n BodyParser,\n BodyParseResult,\n EnhancedBodyParserOptions,\n} from './types';\nimport {\n createTimeoutPromise,\n detectContentType,\n validateContentLength,\n} from './utils';\n\nexport type BodyParserMetrics = {\n parser: string;\n parseTime: number;\n size: number;\n hasFiles: boolean;\n};\n\nexport type ContextWithMetrics = Context & {\n bodyParserMetrics?: BodyParserMetrics;\n};\n\nexport type SmartBodyParserOptions = EnhancedBodyParserOptions & {\n /** Enable intelligent parser selection (default: true) */\n enableSmartParsing?: boolean;\n\n /** Enable parser lazy loading (default: true) */\n enableLazyLoading?: boolean;\n\n /** Custom parser priority (default: auto-detected) */\n parserPriority?: ('json' | 'urlencoded' | 'multipart' | 'text' | 'raw')[];\n};\n\n/**\n * 🎯 Pre-compiled regex patterns for maximum speed\n */\nconst CONTENT_TYPE_PATTERNS = {\n json: /^application\\/(?:json|.*\\+json)$/i,\n urlencoded: /^application\\/x-www-form-urlencoded$/i,\n multipart: /^multipart\\/form-data/i,\n text: /^text\\//i,\n xml: /^(?:application|text)\\/(?:xml|.*\\+xml)$/i,\n} as const;\n\n/**\n * 🚀 Smart body parser dispatcher class\n */\nexport class SmartBodyParser {\n private options: Required<EnhancedBodyParserOptions>;\n private metrics = {\n totalRequests: 0,\n parserLoads: {\n json: 0,\n urlencoded: 0,\n multipart: 0,\n text: 0,\n raw: 0,\n },\n };\n\n // 💾 Lazy-loaded parsers (only load when needed)\n private parsers = {\n json: null as BodyParser | null,\n urlencoded: null as BodyParser | null,\n multipart: null as BodyParser | null,\n text: null as BodyParser | null,\n raw: null as BodyParser | null,\n };\n\n constructor(options: EnhancedBodyParserOptions = {}) {\n this.options = {\n maxSize: 10 * 1024 * 1024, // 10MB\n timeout: 5000, // 5 seconds\n enableStreaming: true,\n streamingThreshold: 50 * 1024 * 1024, // 50MB\n poolSize: 100,\n fastValidation: true,\n autoDetectContentType: true,\n strictContentType: false,\n enableMetrics: true,\n encoding: 'utf8',\n errorMessages: {\n maxSizeExceeded: 'Request body too large',\n timeoutError: 'Body parsing timeout',\n invalidContentType: 'Unsupported content type',\n parseError: 'Failed to parse request body',\n },\n ...options,\n };\n }\n\n /**\n * 🎯 Main parsing dispatcher - SMART LOADING\n */\n async parse(ctx: Context): Promise<BodyParseResult> {\n const startTime = performance.now();\n this.metrics.totalRequests++;\n\n try {\n // Get raw body data\n const rawData = await this.getRawBody(ctx);\n\n // Detect content type\n const contentType = this.getContentType(ctx, rawData);\n\n // Validate content length\n validateContentLength(rawData, this.options.maxSize);\n\n // 🚀 SMART PARSER SELECTION - Only load what we need!\n const parser = await this.getParser(contentType);\n\n // Parse with timeout protection\n const parsePromise = parser.parse(rawData, contentType);\n const timeoutPromise = createTimeoutPromise(this.options.timeout);\n\n const partialResult = await Promise.race([parsePromise, timeoutPromise]);\n\n // Build complete result\n const result: BodyParseResult = {\n raw: rawData,\n size: rawData.length,\n ...partialResult,\n parseTime: performance.now() - startTime,\n } as BodyParseResult;\n\n return result;\n } catch (error) {\n // Handle JSON parsing errors with appropriate HTTP status codes\n if (error instanceof Error) {\n // Check if it's a JSON syntax error and return 400 (Bad Request)\n if (\n error.message.includes('JSON') ||\n error.message.includes('syntax') ||\n error.message.includes('Invalid JSON') ||\n error.message.includes('Unexpected token')\n ) {\n throw new HttpError(\n `${this.options.errorMessages.parseError}: ${error.message}`,\n 400,\n 'VALIDATION_ERROR'\n );\n }\n }\n\n throw new HttpError(\n `${this.options.errorMessages.parseError}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n 500,\n 'INTERNAL_SERVER_ERROR'\n );\n }\n }\n\n /**\n * 🎯 SMART PARSER LOADER - Only loads the parser you need!\n */\n private async getParser(contentType: string): Promise<BodyParser> {\n // 🔥 JSON parser (most common - load first)\n if (CONTENT_TYPE_PATTERNS.json.test(contentType)) {\n if (!this.parsers.json) {\n const { getJsonParser } = await import('./json-parser');\n this.parsers.json = getJsonParser();\n this.metrics.parserLoads.json++;\n }\n return this.parsers.json!;\n }\n\n // 🌊 URL-encoded parser\n if (CONTENT_TYPE_PATTERNS.urlencoded.test(contentType)) {\n if (!this.parsers.urlencoded) {\n const { getUrlEncodedParser } = await import('./url-encoded-parser');\n this.parsers.urlencoded = getUrlEncodedParser();\n this.metrics.parserLoads.urlencoded++;\n }\n return this.parsers.urlencoded!;\n }\n\n // 📁 Multipart parser (file uploads)\n if (CONTENT_TYPE_PATTERNS.multipart.test(contentType)) {\n if (!this.parsers.multipart) {\n const { getMultipartParser } = await import('./multipart-parser');\n this.parsers.multipart = getMultipartParser();\n this.metrics.parserLoads.multipart++;\n }\n return this.parsers.multipart!;\n }\n\n // 📄 Text parser\n if (\n CONTENT_TYPE_PATTERNS.text.test(contentType) ||\n CONTENT_TYPE_PATTERNS.xml.test(contentType)\n ) {\n if (!this.parsers.text) {\n const { getTextParser } = await import('./text-raw-parsers');\n this.parsers.text = getTextParser();\n this.metrics.parserLoads.text++;\n }\n return this.parsers.text!;\n }\n\n // 💾 Raw parser (fallback for binary data)\n if (!this.parsers.raw) {\n const { getRawParser } = await import('./text-raw-parsers');\n this.parsers.raw = getRawParser();\n this.metrics.parserLoads.raw++;\n }\n return this.parsers.raw!;\n }\n\n /**\n * 🔍 Get content type with auto-detection\n */\n private getContentType(ctx: Context, rawData: Buffer): string {\n const headerContentType = ctx.headers['content-type'] || '';\n\n // Use header content type if available\n if (headerContentType && !this.options.autoDetectContentType) {\n return headerContentType.split(';')[0]?.trim().toLowerCase() || '';\n }\n\n // Auto-detect if enabled or no header present\n if (this.options.autoDetectContentType || !headerContentType) {\n const detected = detectContentType(rawData);\n return headerContentType || detected;\n }\n\n return headerContentType.split(';')[0]?.trim().toLowerCase() || '';\n }\n\n /**\n * 📥 Get raw body data from request\n */\n private async getRawBody(ctx: Context): Promise<Buffer> {\n // If body already exists on context, return it\n if (ctx.req.body && Buffer.isBuffer(ctx.req.body)) {\n return ctx.req.body;\n }\n\n // Read from request stream\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n let totalSize = 0;\n\n ctx.req.on('data', (chunk: Buffer) => {\n totalSize += chunk.length;\n\n if (totalSize > this.options.maxSize) {\n reject(new Error(this.options.errorMessages.maxSizeExceeded!));\n return;\n }\n\n chunks.push(chunk);\n });\n\n ctx.req.on('end', () => {\n resolve(Buffer.concat(chunks));\n });\n\n ctx.req.on('error', (error: Error) => {\n reject(error);\n });\n\n // Set timeout\n const timeout = setTimeout(() => {\n reject(new Error(this.options.errorMessages.timeoutError!));\n }, this.options.timeout);\n\n ctx.req.on('end', () => clearTimeout(timeout));\n ctx.req.on('error', () => clearTimeout(timeout));\n });\n }\n\n /**\n * 📊 Get performance metrics\n */\n getMetrics() {\n return {\n ...this.metrics,\n efficiency: {\n totalRequests: this.metrics.totalRequests,\n averageParserLoads:\n Object.values(this.metrics.parserLoads).reduce((a, b) => a + b, 0) /\n this.metrics.totalRequests,\n parserUsage: this.metrics.parserLoads,\n },\n };\n }\n}\n\n/**\n * 🌍 Global smart parser instance (removed unused variable)\n */\n\n/**\n * 🚀 Create smart body parser middleware\n */\nexport function smartBodyParser(\n options?: EnhancedBodyParserOptions\n): Middleware {\n const parser = new SmartBodyParser(options);\n\n return async (ctx: Context, next: () => Promise<void>) => {\n // Skip if body already parsed\n if (ctx.body !== undefined) {\n await next();\n return;\n }\n\n // Skip if no body expected\n const method = ctx.method.toUpperCase();\n if (method === 'GET' || method === 'HEAD' || method === 'DELETE') {\n await next();\n return;\n }\n\n try {\n // 🚀 SMART PARSING - Only loads needed parser!\n const result = await parser.parse(ctx);\n\n // Set parsed data on context (handle empty body case)\n ctx.body = result.data !== undefined ? result.data : null;\n\n // Add metadata for debugging\n if (options?.enableMetrics) {\n (ctx as ContextWithMetrics).bodyParserMetrics = {\n parser: result.parser,\n parseTime: result.parseTime,\n size: result.size,\n hasFiles: result.hasFiles,\n };\n }\n\n await next();\n } catch (error) {\n // Convert specific errors to HttpError if they aren't already\n let httpError: HttpError;\n\n if (error instanceof HttpError) {\n httpError = error;\n } else if (error instanceof Error) {\n // Check if it's a JSON validation error or other client error\n if (\n error.message.includes('JSON parse error') ||\n error.message.includes('Invalid JSON') ||\n error.message.includes('invalid character') ||\n error.message.includes('Unexpected') ||\n error.message.includes('too large') ||\n error.message.includes('maxSize') ||\n error.message.includes('structure detected')\n ) {\n httpError = new HttpError(error.message, 400, 'VALIDATION_ERROR');\n } else {\n httpError = new HttpError(\n error.message,\n 500,\n 'INTERNAL_SERVER_ERROR'\n );\n }\n } else {\n httpError = new HttpError(\n 'Unknown error occurred',\n 500,\n 'INTERNAL_SERVER_ERROR'\n );\n }\n\n // Always throw the error to let exception filters handle it\n throw httpError;\n }\n };\n}\n\n/**\n * 📦 Default exports for easy import\n */\nexport { SmartBodyParser as BodyParser };\nexport default smartBodyParser;\n","/**\n * Compression middleware for NextRush v2\n *\n * @packageDocumentation\n */\n\nimport type { CompressionOptions } from '@/core/middleware/types';\nimport type { Context, Middleware, NextRushResponse } from '@/types/context';\nimport { cpus, loadavg } from 'node:os';\nimport { performance } from 'node:perf_hooks';\nimport { Transform, type TransformCallback } from 'node:stream';\nimport {\n constants,\n createBrotliCompress,\n createDeflate,\n createGzip,\n type BrotliOptions,\n type ZlibOptions,\n} from 'node:zlib';\n\n/**\n * Enhanced compression options with proper defaults\n */\ninterface EnhancedCompressionOptions extends Required<CompressionOptions> {\n /** Pre-compiled regex patterns for content type matching */\n excludePatterns: (RegExp | string)[];\n /** Pre-compiled regex patterns for content type matching */\n contentTypePatterns: (RegExp | string)[];\n}\n\n/**\n * Default compression options\n */\nconst defaultCompressionOptions: Required<CompressionOptions> = {\n gzip: true,\n deflate: false,\n brotli: false,\n level: 6,\n threshold: 1024,\n filter: () => true,\n contentType: ['text/*', 'application/json', 'application/xml'],\n exclude: ['image/*', 'video/*', 'audio/*'],\n windowBits: 16,\n memLevel: 8,\n strategy: 0,\n chunkSize: 16384,\n dictionary: Buffer.alloc(0),\n adaptive: false,\n maxCpuUsage: 80,\n backpressureThreshold: 16384,\n};\n\n/**\n * Pre-compile regex patterns for efficient content type matching\n */\nfunction compilePatterns(patterns: string[]): (RegExp | string)[] {\n return patterns.map(pattern => {\n if (pattern.includes('*')) {\n return new RegExp(`^${pattern.replace(/\\*/g, '.*')}$`);\n }\n return pattern;\n });\n}\n\n/**\n * Get the best compression algorithm based on accept-encoding\n */\nfunction getBestCompression(\n acceptEncoding: string,\n options: EnhancedCompressionOptions\n): string | null {\n if (!acceptEncoding) return null;\n\n const encodings = acceptEncoding\n .toLowerCase()\n .split(',')\n .map(e => e.trim().split(';')[0]); // Remove q-values\n\n // Check brotli first (best compression)\n if (options.brotli && encodings.includes('br')) {\n return 'br';\n }\n\n // Check gzip\n if (options.gzip && encodings.includes('gzip')) {\n return 'gzip';\n }\n\n // Check deflate as last resort\n if (options.deflate && encodings.includes('deflate')) {\n return 'deflate';\n }\n\n return null;\n}\n\n/**\n * Check if content type should be compressed using pre-compiled patterns\n */\nfunction shouldCompressContentType(\n contentType: string,\n options: EnhancedCompressionOptions\n): boolean {\n if (!contentType) return false;\n\n const normalizedContentType = contentType.toLowerCase().split(';')[0];\n if (!normalizedContentType) return false;\n\n // Check exclusions first\n for (const pattern of options.excludePatterns) {\n if (typeof pattern === 'string') {\n if (normalizedContentType.startsWith(pattern)) {\n return false;\n }\n } else if (pattern.test(normalizedContentType)) {\n return false;\n }\n }\n\n // Check included content types\n for (const pattern of options.contentTypePatterns) {\n if (typeof pattern === 'string') {\n if (normalizedContentType.startsWith(pattern)) {\n return true;\n }\n } else if (pattern.test(normalizedContentType)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Check if response is already compressed\n */\nfunction isAlreadyCompressed(res: Context['res']): boolean {\n const contentEncoding = res.getHeader('Content-Encoding');\n const transferEncoding = res.getHeader('Transfer-Encoding');\n\n return !!(\n contentEncoding ||\n transferEncoding === 'chunked' ||\n transferEncoding === 'gzip' ||\n transferEncoding === 'deflate' ||\n transferEncoding === 'br'\n );\n}\n\n/**\n * Get response content length\n */\nfunction getContentLength(res: Context['res']): number {\n const contentLength = res.getHeader('Content-Length');\n if (typeof contentLength === 'string') {\n return parseInt(contentLength, 10) || 0;\n }\n if (typeof contentLength === 'number') {\n return contentLength;\n }\n return 0;\n}\n\n/**\n * Check CPU usage for adaptive compression\n */\nfunction shouldSkipForCpuUsage(options: EnhancedCompressionOptions): boolean {\n if (!options.adaptive || !options.maxCpuUsage) {\n return false;\n }\n\n try {\n // Use os.loadavg() for more accurate real-time load detection\n const load = loadavg()[0]; // 1-minute load average\n if (load === undefined) {\n throw new Error('loadavg() returned undefined');\n }\n const cpuCount = cpus().length;\n const cpuUsagePercent = (load / cpuCount) * 100;\n\n return cpuUsagePercent > options.maxCpuUsage;\n } catch {\n // Fallback to process.cpuUsage() if os.loadavg() fails\n const cpuUsage = process.cpuUsage();\n const totalCpuMicroseconds = cpuUsage.user + cpuUsage.system;\n return totalCpuMicroseconds > options.maxCpuUsage * 1000000; // Convert to microseconds\n }\n}\n\n/**\n * Compression stream wrapper for proper error handling\n */\nclass CompressionStream extends Transform {\n private compressionStream!: Transform;\n private error: Error | null = null;\n\n constructor(algorithm: string, options: EnhancedCompressionOptions) {\n super();\n\n try {\n this.compressionStream = this.createCompressionStream(algorithm, options);\n\n this.compressionStream.on('data', chunk => {\n this.push(chunk);\n });\n\n this.compressionStream.on('end', () => {\n this.push(null);\n });\n\n this.compressionStream.on('error', err => {\n this.error = err;\n this.emit('error', err);\n });\n } catch (err) {\n this.error = err as Error;\n this.emit('error', err);\n }\n }\n\n private createCompressionStream(\n algorithm: string,\n options: EnhancedCompressionOptions\n ): Transform {\n const zlibOptions: ZlibOptions = {\n level: options.level,\n windowBits: options.windowBits,\n memLevel: options.memLevel,\n strategy: options.strategy,\n chunkSize: options.chunkSize,\n dictionary: options.dictionary,\n };\n\n switch (algorithm) {\n case 'gzip': {\n return createGzip(zlibOptions);\n }\n case 'deflate': {\n return createDeflate(zlibOptions);\n }\n case 'br': {\n const brotliOptions: BrotliOptions = {\n params: {\n [constants.BROTLI_PARAM_QUALITY]: options.level,\n [constants.BROTLI_PARAM_SIZE_HINT]: options.chunkSize,\n },\n };\n return createBrotliCompress(brotliOptions);\n }\n default:\n throw new Error(`Unsupported compression algorithm: ${algorithm}`);\n }\n }\n\n override _transform(\n chunk: Buffer,\n encoding: BufferEncoding,\n callback: TransformCallback\n ): void {\n if (this.error) {\n callback(this.error);\n return;\n }\n\n try {\n this.compressionStream.write(chunk, encoding, callback);\n } catch (err) {\n callback(err as Error);\n }\n }\n\n override _flush(callback: TransformCallback): void {\n if (this.error) {\n callback(this.error);\n return;\n }\n\n try {\n this.compressionStream.end(callback);\n } catch (err) {\n callback(err as Error);\n }\n }\n}\n\n/**\n * Validate compression options\n */\nfunction validateCompressionOptions(options: CompressionOptions): void {\n const config = { ...defaultCompressionOptions, ...options };\n\n if (!Number.isInteger(config.level) || config.level < 0 || config.level > 9) {\n throw new Error('Compression level must be an integer between 0 and 9');\n }\n\n if (config.threshold < 0) {\n throw new Error('Threshold must be non-negative');\n }\n\n if (\n config.maxCpuUsage &&\n (config.maxCpuUsage < 0 || config.maxCpuUsage > 100)\n ) {\n throw new Error('maxCpuUsage must be between 0 and 100');\n }\n\n if (!config.gzip && !config.deflate && !config.brotli) {\n throw new Error('At least one compression algorithm must be enabled');\n }\n}\n\n/**\n * Compression middleware factory\n */\nexport function compression(options: CompressionOptions = {}): Middleware {\n // Validate options\n validateCompressionOptions(options);\n\n const config: EnhancedCompressionOptions = {\n ...defaultCompressionOptions,\n ...options,\n excludePatterns: compilePatterns(\n options.exclude || defaultCompressionOptions.exclude\n ),\n contentTypePatterns: compilePatterns(\n options.contentType || defaultCompressionOptions.contentType\n ),\n };\n\n return async (ctx: Context, next) => {\n // Let downstream middleware set content-type and body\n await next();\n\n // Early exit conditions\n if (!config.filter(ctx)) {\n return;\n }\n\n const acceptEncoding = ctx.req.headers['accept-encoding'] as string;\n if (!acceptEncoding) {\n return;\n }\n\n // Get content type safely\n const contentType =\n ctx.res.getHeader('content-type')?.toString() ||\n ctx.res.getHeader('Content-Type')?.toString();\n\n if (!contentType || !shouldCompressContentType(contentType, config)) {\n return;\n }\n\n // Check if already compressed\n if (isAlreadyCompressed(ctx.res)) {\n return;\n }\n\n // Check threshold\n const contentLength = getContentLength(ctx.res);\n if (contentLength > 0 && contentLength < config.threshold) {\n return;\n }\n\n // Check CPU usage for adaptive compression\n if (shouldSkipForCpuUsage(config)) {\n return;\n }\n\n // Pick algorithm\n const algorithm = getBestCompression(acceptEncoding, config);\n if (!algorithm) {\n return;\n }\n\n // Set compression headers\n ctx.res.setHeader('Content-Encoding', algorithm);\n ctx.res.setHeader('Vary', 'Accept-Encoding');\n\n // Create compression stream\n try {\n const compressionStream = new CompressionStream(algorithm, config);\n\n // Override response methods to pipe through compression\n const originalWrite = ctx.res.write.bind(ctx.res);\n const originalEnd = ctx.res.end.bind(ctx.res);\n\n let isCompressing = false;\n let hasError = false;\n\n compressionStream.on('data', chunk => {\n if (!hasError) {\n originalWrite(chunk);\n }\n });\n\n compressionStream.on('end', () => {\n if (!hasError) {\n originalEnd();\n }\n });\n\n compressionStream.on('error', err => {\n hasError = true;\n // Remove compression headers on error\n ctx.res.removeHeader('Content-Encoding');\n ctx.res.removeHeader('Vary');\n console.error('[CompressionMiddleware] Compression failed:', err);\n });\n\n // Override write method\n ctx.res.write = function (\n chunk: any,\n encoding?: BufferEncoding | ((error: Error | null | undefined) => void),\n callback?: (error: Error | null | undefined) => void\n ): boolean {\n if (!hasError && !isCompressing) {\n isCompressing = true;\n if (typeof encoding === 'function') {\n compressionStream.write(chunk, encoding);\n } else {\n compressionStream.write(chunk, encoding || 'utf8', callback);\n }\n }\n return true;\n };\n\n // Override end method\n ctx.res.end = function (\n chunk?: any,\n encoding?: BufferEncoding | (() => void),\n callback?: () => void\n ): NextRushResponse {\n if (!hasError && !isCompressing) {\n isCompressing = true;\n if (chunk) {\n if (typeof encoding === 'function') {\n compressionStream.end(chunk, encoding);\n } else {\n compressionStream.end(chunk, encoding || 'utf8', callback);\n }\n } else {\n compressionStream.end();\n }\n }\n return ctx.res;\n };\n } catch (err) {\n // Remove compression headers on error\n ctx.res.removeHeader('Content-Encoding');\n ctx.res.removeHeader('Vary');\n console.error(\n '[CompressionMiddleware] Failed to create compression stream:',\n err\n );\n }\n };\n}\n\n/**\n * Compression utilities\n */\nexport const compressionUtils = {\n /**\n * Create a compression stream\n */\n createCompressionStream(algorithm: string, level: number = 6): Transform {\n const zlibOptions: ZlibOptions = { level };\n\n switch (algorithm) {\n case 'gzip':\n return createGzip(zlibOptions);\n case 'deflate':\n return createDeflate(zlibOptions);\n case 'br':\n return createBrotliCompress({\n params: { [constants.BROTLI_PARAM_QUALITY]: level },\n });\n default:\n throw new Error(`Unsupported compression algorithm: ${algorithm}`);\n }\n },\n\n /**\n * Get compression level based on content type\n */\n getCompressionLevel(\n contentType: string | undefined,\n baseLevel: number = 6\n ): number {\n if (contentType?.includes('json')) {\n return Math.min(baseLevel + 2, 9);\n }\n if (contentType?.includes('xml')) {\n return Math.min(baseLevel + 1, 9);\n }\n return baseLevel;\n },\n\n /**\n * Check if content should be compressed\n */\n shouldCompress(\n contentType: string | undefined,\n exclude: string[] = []\n ): boolean {\n if (!contentType) return false;\n\n const excludePatterns = compilePatterns(exclude);\n const normalizedContentType = contentType.toLowerCase().split(';')[0];\n if (!normalizedContentType) return false;\n\n for (const pattern of excludePatterns) {\n if (typeof pattern === 'string') {\n if (normalizedContentType.startsWith(pattern)) {\n return false;\n }\n } else if (pattern.test(normalizedContentType)) {\n return false;\n }\n }\n\n return true;\n },\n\n /**\n * Check if content type should be compressed\n */\n shouldCompressContentType,\n\n /**\n * Get the best compression algorithm\n */\n getBestCompression,\n};\n\n/**\n * Compression with specific algorithm\n */\nexport function compressionWithAlgorithm(\n algorithm: 'gzip' | 'deflate' | 'brotli',\n options: CompressionOptions = {}\n): Middleware {\n const config = { ...defaultCompressionOptions, ...options };\n config.gzip = algorithm === 'gzip';\n config.deflate = algorithm === 'deflate';\n config.brotli = algorithm === 'brotli';\n return compression(config);\n}\n\n/**\n * Compression with metrics collection\n */\nexport function compressionWithMetrics(\n options: CompressionOptions = {}\n): Middleware {\n return async (ctx: Context, next) => {\n const startTime = performance.now();\n const originalBody = ctx.body;\n\n await compression(options)(ctx, next);\n\n const endTime = performance.now();\n const duration = endTime - startTime;\n const contentEncoding = ctx.res.getHeader('Content-Encoding');\n const algorithm =\n typeof contentEncoding === 'string' ? contentEncoding : 'none';\n\n // Store metrics in context for external collection\n if (!ctx.state['compressionMetrics']) {\n ctx.state['compressionMetrics'] = [];\n }\n\n (\n ctx.state['compressionMetrics'] as Array<{\n algorithm: string;\n duration: number;\n originalSize: number;\n compressedSize: number;\n }>\n ).push({\n algorithm,\n duration,\n originalSize:\n typeof originalBody === 'string' ? Buffer.byteLength(originalBody) : 0,\n compressedSize: (() => {\n const contentLength = ctx.res.getHeader('Content-Length');\n if (typeof contentLength === 'string') {\n return parseInt(contentLength, 10) || 0;\n }\n if (typeof contentLength === 'number') {\n return contentLength;\n }\n return 0;\n })(),\n });\n };\n}\n\n// Legacy exports for backward compatibility\nexport const gzip = (options: CompressionOptions = {}) =>\n compression({ ...options, gzip: true, deflate: false, brotli: false });\n\nexport const deflate = (options: CompressionOptions = {}) =>\n compression({ ...options, gzip: false, deflate: true, brotli: false });\n\nexport const brotli = (options: CompressionOptions = {}) =>\n compression({ ...options, gzip: false, deflate: false, brotli: true });\n","/**\n * CORS Middleware for NextRush v2\n *\n * High-performance CORS implementation with pre-computed headers\n * and optimized origin checking for enterprise applications.\n *\n * @packageDocumentation\n */\n\nimport type { Context } from '@/types/context';\nimport type { CorsOptions, Middleware } from './types';\n\n/**\n * Default CORS options\n */\nconst DEFAULT_CORS_OPTIONS: Required<CorsOptions> = {\n origin: '*',\n methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'],\n allowedHeaders: ['Content-Type', 'Authorization'],\n exposedHeaders: [],\n credentials: false,\n maxAge: 86400,\n preflightContinue: false,\n optionsSuccessStatus: 204,\n};\n\n/**\n * Pre-computed CORS headers for common configurations\n */\nclass CorsHeaderCache {\n private static cache = new Map<string, Record<string, string>>();\n\n /**\n * Get cached headers for a specific configuration\n */\n static getHeaders(options: CorsOptions): Record<string, string> {\n const key = this.generateCacheKey(options);\n\n if (!this.cache.has(key)) {\n this.cache.set(key, this.computeHeaders(options));\n }\n\n return this.cache.get(key)!;\n }\n\n /**\n * Generate cache key for options\n */\n private static generateCacheKey(options: CorsOptions): string {\n const origin = Array.isArray(options.origin)\n ? options.origin.sort().join(',')\n : String(options.origin);\n\n return `${origin}|${options.methods?.join(',') || ''}|${options.credentials}|${options.maxAge}`;\n }\n\n /**\n * Compute CORS headers\n */\n private static computeHeaders(options: CorsOptions): Record<string, string> {\n const headers: Record<string, string> = {};\n\n // Origin header\n if (options.origin !== false) {\n headers['Access-Control-Allow-Origin'] = Array.isArray(options.origin)\n ? options.origin[0] || '*' // Use first origin for pre-computed headers\n : String(options.origin || '*');\n }\n\n // Credentials\n if (options.credentials) {\n headers['Access-Control-Allow-Credentials'] = 'true';\n }\n\n // Methods\n if (options.methods && options.methods.length > 0) {\n headers['Access-Control-Allow-Methods'] = options.methods.join(', ');\n }\n\n // Headers\n if (options.allowedHeaders && options.allowedHeaders.length > 0) {\n headers['Access-Control-Allow-Headers'] =\n options.allowedHeaders.join(', ');\n }\n\n // Exposed headers\n if (options.exposedHeaders && options.exposedHeaders.length > 0) {\n headers['Access-Control-Expose-Headers'] =\n options.exposedHeaders.join(', ');\n }\n\n // Max age\n if (options.maxAge) {\n headers['Access-Control-Max-Age'] = String(options.maxAge);\n }\n\n return headers;\n }\n\n /**\n * Clear cache\n */\n static clear(): void {\n this.cache.clear();\n }\n}\n\n/**\n * Origin validation function\n */\nfunction createOriginValidator(\n options: CorsOptions\n): (origin: string) => boolean {\n if (options.origin === false) {\n return () => false;\n }\n\n if (options.origin === true || options.origin === '*') {\n return () => true;\n }\n\n if (typeof options.origin === 'string') {\n return (origin: string) => origin === options.origin;\n }\n\n if (Array.isArray(options.origin)) {\n return (origin: string) => (options.origin as string[]).includes(origin);\n }\n\n if (typeof options.origin === 'function') {\n return options.origin;\n }\n\n return () => false;\n}\n\n/**\n * Create CORS middleware\n *\n * @param options - CORS configuration options\n * @returns CORS middleware function\n *\n * @example\n * ```typescript\n * import { createApp } from 'nextrush-v2';\n * import { cors } from '@/core/middleware';\n *\n * const app = createApp();\n *\n * // Basic CORS\n * app.use(cors());\n *\n * // Advanced CORS\n * app.use(cors({\n * origin: ['https://app.example.com', 'https://admin.example.com'],\n * credentials: true,\n * methods: ['GET', 'POST', 'PUT', 'DELETE'],\n * allowedHeaders: ['Content-Type', 'Authorization', 'X-API-Key'],\n * }));\n * ```\n */\nexport function cors(options: CorsOptions = {}): Middleware {\n const config = { ...DEFAULT_CORS_OPTIONS, ...options };\n const validateOrigin = createOriginValidator(config);\n const preComputedHeaders = CorsHeaderCache.getHeaders(config);\n\n return async (ctx: Context, next: () => Promise<void>): Promise<void> => {\n const origin = ctx.req.headers.origin;\n\n // Handle preflight requests\n if (ctx.method === 'OPTIONS') {\n // Set pre-computed headers\n Object.entries(preComputedHeaders).forEach(([key, value]) => {\n ctx.res.setHeader(key, value);\n });\n\n // Handle dynamic origin for preflight\n if (origin && validateOrigin(origin)) {\n ctx.res.setHeader('Access-Control-Allow-Origin', origin);\n }\n\n // End preflight request\n if (!config.preflightContinue) {\n ctx.status = config.optionsSuccessStatus;\n ctx.res.end();\n return;\n }\n // If preflightContinue is true, continue to next middleware\n // (next() will be called at the end)\n } else {\n // Handle actual requests\n if (origin && validateOrigin(origin)) {\n ctx.res.setHeader('Access-Control-Allow-Origin', origin);\n } else if (config.origin === '*' || config.origin === true) {\n // Set wildcard origin for all requests\n ctx.res.setHeader('Access-Control-Allow-Origin', '*');\n } else if (typeof config.origin === 'string' && config.origin !== '*') {\n // For string origins, set the configured origin\n ctx.res.setHeader('Access-Control-Allow-Origin', config.origin);\n }\n // Don't set origin header if no origin is provided and not using wildcard\n\n // Set other CORS headers\n Object.entries(preComputedHeaders).forEach(([key, value]) => {\n if (key !== 'Access-Control-Allow-Origin') {\n ctx.res.setHeader(key, value);\n }\n });\n }\n\n await next();\n };\n}\n\n/**\n * CORS middleware with performance tracking\n */\nexport function corsWithMetrics(options: CorsOptions = {}): Middleware {\n const corsMiddleware = cors(options);\n\n return async (ctx: Context, next: () => Promise<void>): Promise<void> => {\n const start = process.hrtime.bigint();\n\n await corsMiddleware(ctx, async () => {\n const end = process.hrtime.bigint();\n const duration = Number(end - start) / 1000000; // Convert to milliseconds\n\n // Store duration in context for external monitoring\n (ctx as any).corsDuration = duration;\n\n await next();\n });\n };\n}\n\n/**\n * CORS utilities\n */\nexport const corsUtils = {\n /**\n * Clear CORS header cache\n */\n clearCache: () => CorsHeaderCache.clear(),\n\n /**\n * Validate origin against allowed origins\n */\n validateOrigin: (origin: string, allowedOrigins: string[]): boolean => {\n return allowedOrigins.includes(origin);\n },\n\n /**\n * Generate CORS headers for a specific origin\n */\n generateHeaders: (\n origin: string,\n options: CorsOptions = {}\n ): Record<string, string> => {\n const config = { ...DEFAULT_CORS_OPTIONS, ...options };\n const headers = CorsHeaderCache.getHeaders(config);\n\n if (origin) {\n headers['Access-Control-Allow-Origin'] = origin;\n }\n\n return headers;\n },\n};\n","/**\n * Helmet Middleware for NextRush v2\n *\n * Provides security headers to protect against common vulnerabilities\n *\n * @packageDocumentation\n */\n\nimport type { Context } from '@/types/context';\nimport type { HelmetOptions, Middleware } from './types';\n\n/**\n * Default Helmet security options\n */\nconst DEFAULT_HELMET_OPTIONS: HelmetOptions = {\n contentSecurityPolicy: {\n directives: {\n defaultSrc: [\"'self'\"],\n scriptSrc: [\"'self'\"],\n styleSrc: [\"'self'\", \"'unsafe-inline'\"],\n imgSrc: [\"'self'\", 'data:', 'https:'],\n connectSrc: [\"'self'\"],\n fontSrc: [\"'self'\"],\n objectSrc: [\"'none'\"],\n mediaSrc: [\"'self'\"],\n frameSrc: [\"'none'\"],\n },\n },\n dnsPrefetchControl: { allow: false },\n frameguard: { action: 'SAMEORIGIN' },\n hidePoweredBy: true,\n hsts: {\n maxAge: 31536000,\n includeSubDomains: true,\n preload: true,\n },\n ieNoOpen: true,\n noSniff: true,\n permittedCrossDomainPolicies: { permittedPolicies: 'none' },\n referrerPolicy: { policy: 'strict-origin-when-cross-origin' },\n xssFilter: true,\n};\n\n/**\n * Generate Content Security Policy header value\n */\nfunction generateCSPHeader(directives: Record<string, string[]>): string {\n return Object.entries(directives)\n .map(([key, values]) => `${key} ${values.join(' ')}`)\n .join('; ');\n}\n\n/**\n * Create Helmet middleware for security headers\n *\n * @param options - Helmet configuration options\n * @returns Helmet middleware function\n *\n * @example\n * ```typescript\n * import { helmet } from '@/core/middleware/helmet';\n *\n * const app = createApp();\n * app.use(helmet());\n *\n * // With custom options\n * app.use(helmet({\n * contentSecurityPolicy: {\n * directives: {\n * defaultSrc: [\"'self'\"],\n * scriptSrc: [\"'self'\", \"'unsafe-inline'\"],\n * },\n * },\n * }));\n * ```\n */\nexport function helmet(options: HelmetOptions = {}): Middleware {\n const config = { ...DEFAULT_HELMET_OPTIONS, ...options };\n\n return async (ctx: Context, next: () => Promise<void>): Promise<void> => {\n // Hide X-Powered-By header\n if (config.hidePoweredBy) {\n ctx.res.removeHeader('X-Powered-By');\n }\n\n // X-Content-Type-Options: nosniff\n if (config.noSniff) {\n ctx.res.setHeader('X-Content-Type-Options', 'nosniff');\n }\n\n // X-Frame-Options: DENY\n if (config.frameguard) {\n const action = config.frameguard.action || 'deny';\n ctx.res.setHeader('X-Frame-Options', action.toUpperCase());\n }\n\n // X-XSS-Protection: 1; mode=block\n if (config.xssFilter) {\n ctx.res.setHeader('X-XSS-Protection', '1; mode=block');\n }\n\n // X-DNS-Prefetch-Control\n if (config.dnsPrefetchControl) {\n const allow = config.dnsPrefetchControl.allow || false;\n ctx.res.setHeader('X-DNS-Prefetch-Control', allow ? 'on' : 'off');\n }\n\n // X-Download-Options: noopen\n if (config.ieNoOpen) {\n ctx.res.setHeader('X-Download-Options', 'noopen');\n }\n\n // X-Permitted-Cross-Domain-Policies\n if (config.permittedCrossDomainPolicies) {\n const policy =\n config.permittedCrossDomainPolicies.permittedPolicies || 'none';\n ctx.res.setHeader('X-Permitted-Cross-Domain-Policies', policy);\n }\n\n // Referrer-Policy\n if (config.referrerPolicy) {\n const policy =\n config.referrerPolicy.policy || 'strict-origin-when-cross-origin';\n ctx.res.setHeader('Referrer-Policy', policy);\n }\n\n // Strict-Transport-Security\n if (config.hsts) {\n const maxAge = config.hsts.maxAge || 31536000;\n const includeSubDomains = config.hsts.includeSubDomains || false;\n const preload = config.hsts.preload || false;\n\n let hstsValue = `max-age=${maxAge}`;\n if (includeSubDomains) hstsValue += '; includeSubDomains';\n if (preload) hstsValue += '; preload';\n\n ctx.res.setHeader('Strict-Transport-Security', hstsValue);\n }\n\n // Content-Security-Policy\n if (config.contentSecurityPolicy) {\n const cspValue = generateCSPHeader(\n config.contentSecurityPolicy.directives\n );\n ctx.res.setHeader('Content-Security-Policy', cspValue);\n }\n\n await next();\n };\n}\n\n/**\n * Create Helmet middleware with metrics\n *\n * @param options - Helmet configuration options\n * @returns Helmet middleware function with performance monitoring\n */\nexport function helmetWithMetrics(options: HelmetOptions = {}): Middleware {\n const helmetMiddleware = helmet(options);\n\n return async (ctx: Context, next: () => Promise<void>): Promise<void> => {\n const start = process.hrtime.bigint();\n\n await helmetMiddleware(ctx, async () => {\n const end = process.hrtime.bigint();\n const duration = Number(end - start) / 1000000; // Convert to milliseconds\n\n // Store duration in context for external monitoring\n (ctx as any).helmetDuration = duration;\n\n await next();\n });\n };\n}\n\n/**\n * Helmet utilities for testing and advanced usage\n */\nexport const helmetUtils = {\n /**\n * Generate CSP header value for testing\n */\n generateCSPHeader,\n\n /**\n * Default helmet options\n */\n DEFAULT_OPTIONS: DEFAULT_HELMET_OPTIONS,\n};\n","/**\n * Logger Middleware for NextRush v2\n *\n * Provides request logging functionality\n *\n * @packageDocumentation\n */\n\nimport type { Context } from '@/types/context';\nimport type { LoggerOptions, Middleware } from './types';\n\n/**\n * Default logger options\n */\nconst DEFAULT_LOGGER_OPTIONS: LoggerOptions = {\n format: 'combined',\n level: 'info',\n colorize: true,\n timestamp: true,\n showHeaders: false,\n showBody: false,\n showQuery: false,\n showResponseTime: true,\n showUserAgent: true,\n showReferer: true,\n showIP: true,\n showMethod: true,\n showURL: true,\n showStatus: true,\n showResponseSize: true,\n\n filter: () => true,\n};\n\n/**\n * Log levels and their numeric values\n */\nconst LOG_LEVELS = {\n error: 0,\n warn: 1,\n info: 2,\n http: 3,\n verbose: 4,\n debug: 5,\n silly: 6,\n} as const;\n\n// type LogLevel = keyof typeof LOG_LEVELS;\n\n/**\n * ANSI color codes for terminal output\n */\nconst COLORS = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n} as const;\n\n/**\n * Get color for status code\n */\nfunction getStatusColor(status: number): string {\n if (status >= 500) return COLORS.red;\n if (status >= 400) return COLORS.yellow;\n if (status >= 300) return COLORS.cyan;\n if (status >= 200) return COLORS.green;\n return COLORS.white;\n}\n\n/**\n * Get color for method\n */\nfunction getMethodColor(method: string): string {\n switch (method.toUpperCase()) {\n case 'GET':\n return COLORS.green;\n case 'POST':\n return COLORS.blue;\n case 'PUT':\n return COLORS.yellow;\n case 'DELETE':\n return COLORS.red;\n case 'PATCH':\n return COLORS.magenta;\n default:\n return COLORS.white;\n }\n}\n\n/**\n * Format timestamp\n */\nfunction formatTimestamp(): string {\n return new Date().toISOString();\n}\n\n/**\n * Format request log entry\n */\nfunction formatRequestLog(\n ctx: Context,\n duration: number,\n options: Required<LoggerOptions>\n): string {\n const {\n colorize,\n timestamp,\n showHeaders,\n showBody,\n showQuery,\n showResponseTime,\n showUserAgent,\n showReferer,\n showIP,\n showMethod,\n showURL,\n showStatus,\n showResponseSize,\n customFormat,\n } = options;\n\n // Use custom format if provided\n if (customFormat) {\n return customFormat(ctx, duration);\n }\n\n // Build log parts\n const parts: string[] = [];\n\n if (timestamp) {\n parts.push(formatTimestamp());\n }\n\n if (showIP) {\n parts.push(ctx.ip || 'unknown');\n }\n\n if (showMethod) {\n const method = ctx.method.toUpperCase();\n const methodStr = colorize\n ? `${getMethodColor(method)}${method}${COLORS.reset}`\n : method;\n parts.push(methodStr);\n }\n\n if (showURL) {\n parts.push(ctx.path || ctx.url || '/');\n }\n\n if (showStatus) {\n const status = ctx.res?.statusCode || ctx.status || 200;\n const statusStr = colorize\n ? `${getStatusColor(status)}${status}${COLORS.reset}`\n : status.toString();\n parts.push(statusStr);\n }\n\n if (showResponseTime) {\n parts.push(`${duration}ms`);\n }\n\n if (showResponseSize) {\n const size = ctx.res?.getHeader?.('content-length') || 0;\n parts.push(`${size}b`);\n }\n\n if (showUserAgent) {\n const userAgent = ctx.req?.headers?.['user-agent'] || '-';\n parts.push(`\"${userAgent}\"`);\n }\n\n if (showReferer) {\n const referer = ctx.req?.headers?.referer || '-';\n parts.push(`\"${referer}\"`);\n }\n\n if (showQuery && ctx.query && Object.keys(ctx.query).length > 0) {\n const queryStr = new URLSearchParams(\n ctx.query as Record<string, string>\n ).toString();\n parts.push(`query: ${queryStr}`);\n }\n\n if (\n showHeaders &&\n ctx.req?.headers &&\n Object.keys(ctx.req.headers).length > 0\n ) {\n const headersStr = JSON.stringify(ctx.req.headers);\n parts.push(`headers: ${headersStr}`);\n }\n\n if (showBody && ctx.body) {\n const bodyStr =\n typeof ctx.body === 'string' ? ctx.body : JSON.stringify(ctx.body);\n parts.push(`body: ${bodyStr}`);\n }\n\n return parts.join(' ');\n}\n\n/**\n * Create logger middleware\n *\n * @param options - Logger configuration options\n * @returns Logger middleware function\n *\n * @example\n * ```typescript\n * import { logger } from '@/core/middleware/logger';\n *\n * const app = createApp();\n *\n * // Basic logging\n * app.use(logger());\n *\n * // Advanced logging\n * app.use(logger({\n * format: 'combined',\n * level: 'info',\n * colorize: true,\n * showResponseTime: true,\n * showUserAgent: true,\n * }));\n * ```\n */\nexport function logger(options: LoggerOptions = {}): Middleware {\n const config = { ...DEFAULT_LOGGER_OPTIONS, ...options };\n\n return async (ctx: Context, next: () => Promise<void>): Promise<void> => {\n try {\n // Skip logging if filter returns false\n let shouldLog = true;\n try {\n shouldLog = config.filter?.(ctx) ?? true;\n } catch (filterError) {\n // eslint-disable-next-line no-console\n console.error('Logger middleware error:', filterError);\n // Continue with logging even if filter fails\n shouldLog = true;\n }\n\n if (!shouldLog) {\n await next();\n return;\n }\n\n const start = Date.now();\n\n // Log request start (only in debug/verbose mode)\n const requestLog = formatRequestLog(\n ctx,\n 0,\n config as Required<LoggerOptions>\n );\n if (config.level === 'debug' || config.level === 'verbose') {\n if (config.stream) {\n config.stream.write(`→ ${requestLog}\\n`);\n } else {\n // eslint-disable-next-line no-console\n console.log(`→ ${requestLog}`);\n }\n }\n\n // Call next middleware\n try {\n await next();\n } catch (nextError) {\n // Log the error but continue with response logging\n // eslint-disable-next-line no-console\n console.error('Logger middleware error:', nextError);\n }\n\n // Calculate duration\n const duration = Date.now() - start;\n\n // Log response (always log responses)\n const responseLog = formatRequestLog(\n ctx,\n duration,\n config as Required<LoggerOptions>\n );\n if (config.stream) {\n config.stream.write(`← ${responseLog}\\n`);\n } else {\n // eslint-disable-next-line no-console\n console.log(`← ${responseLog}`);\n }\n } catch (error) {\n // Handle errors gracefully\n // eslint-disable-next-line no-console\n console.error('Logger middleware error:', error);\n await next();\n }\n };\n}\n\n/**\n * Create logger middleware with custom format\n *\n * @param format - Custom format function\n * @param options - Logger configuration options\n * @returns Logger middleware function\n */\nexport function loggerWithFormat(\n format: (ctx: Context, duration: number) => string,\n options: LoggerOptions = {}\n): Middleware {\n return logger({\n ...options,\n customFormat: format,\n });\n}\n\n/**\n * Create development logger with colors\n *\n * @param options - Logger configuration options\n * @returns Logger middleware function\n */\nexport function devLogger(options: LoggerOptions = {}): Middleware {\n return logger({\n colorize: true,\n timestamp: true,\n showResponseTime: true,\n showUserAgent: true,\n showIP: true,\n level: 'debug',\n ...options,\n });\n}\n\n/**\n * Create production logger without colors\n *\n * @param options - Logger configuration options\n * @returns Logger middleware function\n */\nexport function prodLogger(options: LoggerOptions = {}): Middleware {\n return logger({\n colorize: false,\n timestamp: true,\n showResponseTime: true,\n showUserAgent: false,\n showIP: true,\n level: 'info',\n ...options,\n });\n}\n\n/**\n * Create minimal logger\n *\n * @param options - Logger configuration options\n * @returns Logger middleware function\n */\nexport function minimalLogger(options: LoggerOptions = {}): Middleware {\n return logger({\n timestamp: false,\n showResponseTime: true,\n showUserAgent: false,\n showIP: false,\n showReferer: false,\n showQuery: false,\n showHeaders: false,\n showBody: false,\n showResponseSize: false,\n ...options,\n });\n}\n\n/**\n * Logger utilities for testing and advanced usage\n */\nexport const loggerUtils = {\n /**\n * Get color for status code\n */\n getStatusColor,\n\n /**\n * Get color for method\n */\n getMethodColor,\n\n /**\n * Format timestamp\n */\n formatTimestamp,\n\n /**\n * Format request log\n */\n formatRequestLog,\n\n /**\n * Default logger options\n */\n DEFAULT_OPTIONS: DEFAULT_LOGGER_OPTIONS,\n\n /**\n * Log levels\n */\n LOG_LEVELS,\n\n /**\n * Colors\n */\n COLORS,\n};\n","/**\n * Rate Limiter Middleware for NextRush v2\n *\n * Provides rate limiting functionality to prevent abuse\n *\n * @packageDocumentation\n */\n\nimport type { Context } from '@/types/context';\nimport type { Middleware, RateLimiterOptions } from './types';\n\n/**\n * Default rate limiter options\n */\nconst DEFAULT_RATE_LIMITER_OPTIONS: RateLimiterOptions = {\n windowMs: 15 * 60 * 1000, // 15 minutes\n max: 100, // limit each IP to 100 requests per windowMs\n message: 'Too many requests, please try again later.',\n statusCode: 429,\n headers: true,\n skipSuccessfulRequests: false,\n skipFailedRequests: false,\n keyGenerator: (ctx: Context) => ctx.ip || 'unknown',\n skip: () => false,\n handler: (ctx: Context) => {\n ctx.status = 429;\n ctx.res.json({ error: 'Too many requests, please try again later.' });\n },\n // store will be created dynamically based on windowMs\n};\n\n/**\n * Memory-based rate limiter store\n */\nexport class MemoryStore {\n private store = new Map<string, { count: number; resetTime: number }>();\n\n constructor(private windowMs: number) {}\n\n /**\n * Get current count for a key\n */\n get(key: string): { count: number; resetTime: number } | null {\n const entry = this.store.get(key);\n if (!entry) return null;\n\n // Check if window has expired\n if (Date.now() > entry.resetTime) {\n this.store.delete(key);\n return null;\n }\n\n return entry;\n }\n\n /**\n * Increment count for a key\n */\n increment(key: string): { count: number; resetTime: number } {\n const now = Date.now();\n const entry = this.get(key);\n\n if (!entry) {\n const newEntry = {\n count: 1,\n resetTime: now + this.windowMs,\n };\n this.store.set(key, newEntry);\n return newEntry;\n }\n\n entry.count++;\n this.store.set(key, entry);\n return entry;\n }\n\n /**\n * Reset count for a key\n */\n reset(key: string): void {\n this.store.delete(key);\n }\n\n /**\n * Clear all entries\n */\n clear(): void {\n this.store.clear();\n }\n}\n\n/**\n * Create rate limiter middleware\n *\n * @param options - Rate limiter configuration options\n * @returns Rate limiter middleware function\n *\n * @example\n * ```typescript\n * import { rateLimit } from '@/core/middleware/rate-limiter';\n *\n * const app = createApp();\n *\n * // Basic rate limiting\n * app.use(rateLimit({ windowMs: 15 * 60 * 1000, max: 100 }));\n *\n * // Advanced rate limiting\n * app.use(rateLimit({\n * windowMs: 15 * 60 * 1000,\n * max: 100,\n * message: 'Too many requests from this IP',\n * keyGenerator: (ctx) => ctx.ip,\n * skip: (ctx) => ctx.path.startsWith('/public'),\n * }));\n * ```\n */\nexport function rateLimit(options: RateLimiterOptions = {}): Middleware {\n const config = { ...DEFAULT_RATE_LIMITER_OPTIONS, ...options };\n const store =\n config.store || new MemoryStore(config.windowMs || 15 * 60 * 1000);\n\n return async (ctx: Context, next: () => Promise<void>): Promise<void> => {\n try {\n // Skip rate limiting if configured\n if (config.skip?.(ctx)) {\n await next();\n return;\n }\n\n // Generate key for rate limiting\n const key = config.keyGenerator?.(ctx) || ctx.ip || 'unknown';\n const entry = store.increment(key);\n\n // Set rate limit headers\n if (config.headers) {\n const maxRequests = config.max !== undefined ? config.max : 100;\n ctx.res.setHeader('X-RateLimit-Limit', maxRequests.toString());\n ctx.res.setHeader(\n 'X-RateLimit-Remaining',\n Math.max(0, maxRequests - entry.count).toString()\n );\n ctx.res.setHeader(\n 'X-RateLimit-Reset',\n new Date(entry.resetTime).toISOString()\n );\n }\n\n // Check if rate limit exceeded\n const maxRequests = config.max !== undefined ? config.max : 100;\n if (entry.count > maxRequests) {\n // Call custom handler or use default\n if (config.handler) {\n config.handler(ctx);\n } else {\n ctx.status = config.statusCode || 429;\n ctx.res.json({\n error:\n config.message || 'Too many requests, please try again later.',\n });\n }\n return;\n }\n\n // Continue to next middleware\n await next();\n\n // Skip successful requests if configured (this is for tracking, not blocking)\n if (config.skipSuccessfulRequests && ctx.status < 400) {\n // Don't count successful requests in the rate limit\n store.reset(key);\n }\n } catch (error) {\n // Handle errors gracefully\n // eslint-disable-next-line no-console\n console.warn('Rate limiter error:', error);\n await next();\n }\n };\n}\n\n/**\n * Create rate limiter middleware with metrics\n *\n * @param options - Rate limiter configuration options\n * @returns Rate limiter middleware function with performance monitoring\n */\nexport function rateLimitWithMetrics(\n options: RateLimiterOptions = {}\n): Middleware {\n const rateLimitMiddleware = rateLimit(options);\n\n return async (ctx: Context, next: () => Promise<void>): Promise<void> => {\n const start = Date.now();\n\n await rateLimitMiddleware(ctx, async () => {\n const end = Date.now();\n const duration = end - start; // Duration in milliseconds\n\n if (duration > 1) {\n // eslint-disable-next-line no-console\n console.warn(`Slow rate limiting: ${duration.toFixed(3)}ms`);\n }\n\n await next();\n });\n };\n}\n\n/**\n * Create a rate limiter for specific routes\n *\n * @param options - Rate limiter configuration options\n * @returns Rate limiter middleware function\n */\nexport function createRouteRateLimit(\n options: RateLimiterOptions = {}\n): Middleware {\n const baseOptions = { ...options };\n\n return rateLimit({\n ...baseOptions,\n keyGenerator: (ctx: Context) => {\n const baseKey = baseOptions.keyGenerator\n ? baseOptions.keyGenerator(ctx)\n : ctx.ip || 'unknown';\n return `${baseKey}:${ctx.path}`;\n },\n });\n}\n\n/**\n * Create a rate limiter for authentication endpoints\n *\n * @param options - Rate limiter configuration options\n * @returns Rate limiter middleware function\n */\nexport function createAuthRateLimit(\n options: RateLimiterOptions = {}\n): Middleware {\n return rateLimit({\n windowMs: 15 * 60 * 1000, // 15 minutes\n max: 5, // 5 attempts per 15 minutes\n message: 'Too many authentication attempts, please try again later.',\n statusCode: 429,\n ...options,\n keyGenerator: (ctx: Context) => {\n const baseKey = options.keyGenerator\n ? options.keyGenerator(ctx)\n : ctx.ip || 'unknown';\n return `auth:${baseKey}`;\n },\n });\n}\n\n/**\n * Rate limiter utilities for testing and advanced usage\n */\nexport const rateLimitUtils = {\n /**\n * Memory store for testing\n */\n MemoryStore,\n\n /**\n * Default rate limiter options\n */\n DEFAULT_OPTIONS: DEFAULT_RATE_LIMITER_OPTIONS,\n\n /**\n * Create route-specific rate limiter\n */\n createRouteRateLimit,\n\n /**\n * Create authentication rate limiter\n */\n createAuthRateLimit,\n\n /**\n * Clear all stores (for testing)\n */\n clearStores: () => {\n // This is a no-op for now since we don't have global store management\n // In a real implementation, this would clear all active stores\n },\n\n /**\n * Generate default key for rate limiting\n */\n generateKey: (ctx: Context) => ctx.ip || 'unknown',\n\n /**\n * Validate rate limiter options\n */\n validateOptions: (options: RateLimiterOptions) => {\n if (options.windowMs && options.windowMs <= 0) {\n throw new Error('windowMs must be greater than 0');\n }\n if (options.max && options.max <= 0) {\n throw new Error('max must be greater than 0');\n }\n return true;\n },\n};\n","/**\n * Request ID Middleware for NextRush v2\n *\n * Provides request ID generation and tracking functionality\n *\n * @packageDocumentation\n */\n\nimport type { Context } from '@/types/context';\nimport { randomBytes } from 'node:crypto';\nimport type { Middleware, RequestIdOptions } from './types';\n\n/**\n * Simple logger interface to avoid console dependencies\n */\ninterface Logger {\n log: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n}\n\n/**\n * No-op logger for production environments\n */\nconst noopLogger: Logger = {\n log: () => {},\n error: () => {},\n warn: () => {},\n info: () => {},\n};\n\n/**\n * Console logger for development\n */\nconst consoleLogger: Logger = {\n log: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.log(...args);\n },\n error: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.error(...args);\n },\n warn: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.warn(...args);\n },\n info: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.info(...args);\n },\n};\n\n/**\n * Default logger implementation\n */\nconst defaultLogger: Logger =\n process.env['NODE_ENV'] === 'production' ? noopLogger : consoleLogger;\n\n/**\n * Default request ID options\n */\nconst DEFAULT_REQUEST_ID_OPTIONS: Required<RequestIdOptions> = {\n headerName: 'X-Request-ID',\n generator: generateUUID,\n addResponseHeader: true,\n echoHeader: false,\n setInContext: true,\n includeInLogs: true,\n};\n\n/**\n * Generate a UUID v4\n */\nfunction generateUUID(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * Generate a timestamp-based ID\n */\nfunction generateTimestampId(): string {\n return `${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Generate a crypto-based ID\n */\nfunction generateCryptoId(): string {\n return randomBytes(8).toString('hex');\n}\n\n/**\n * Create request ID middleware\n *\n * @param options - Request ID configuration options\n * @returns Request ID middleware function\n *\n * @example\n * ```typescript\n * import { requestId } from '@/core/middleware/request-id';\n *\n * const app = createApp();\n *\n * // Basic request ID\n * app.use(requestId());\n *\n * // Advanced request ID\n * app.use(requestId({\n * headerName: 'X-Correlation-ID',\n * generator: () => generateUUID(),\n * addResponseHeader: true,\n * echoHeader: true,\n * }));\n * ```\n */\nexport function requestId(options: RequestIdOptions = {}): Middleware {\n const config = { ...DEFAULT_REQUEST_ID_OPTIONS, ...options };\n\n return async (ctx: Context, next: () => Promise<void>): Promise<void> => {\n let requestId: string;\n\n try {\n // Check if request ID is already in headers\n requestId = ctx.req?.headers?.[config.headerName.toLowerCase()] as string;\n\n // Handle whitespace-only or empty request IDs\n if (requestId && requestId.trim() === '') {\n requestId = '';\n }\n\n // Generate new request ID if not found (and not in echo mode)\n if (!requestId && !config.echoHeader) {\n try {\n requestId = config.generator();\n } catch {\n // Fallback to UUID if generator fails\n requestId = generateUUID();\n }\n }\n\n // Set request ID in request headers (only if we have an ID)\n if (requestId && ctx.req?.headers) {\n ctx.req.headers[config.headerName.toLowerCase()] = requestId;\n }\n\n // Set request ID in context\n if (config.setInContext && requestId) {\n ctx.id = requestId;\n }\n\n // Add request ID to response headers\n if (config.addResponseHeader && requestId && ctx.res?.setHeader) {\n ctx.res.setHeader(config.headerName, requestId);\n }\n\n // Add request ID to logs if configured\n if (config.includeInLogs && requestId) {\n // Store request ID in context for logging\n ctx.requestId = requestId;\n\n // Create request-specific logger that can be used by other middleware\n const requestLogger: Logger = {\n log: (...args: unknown[]) =>\n defaultLogger.log(`[${requestId}]`, ...args),\n error: (...args: unknown[]) =>\n defaultLogger.error(`[${requestId}]`, ...args),\n warn: (...args: unknown[]) =>\n defaultLogger.warn(`[${requestId}]`, ...args),\n info: (...args: unknown[]) =>\n defaultLogger.info(`[${requestId}]`, ...args),\n };\n\n // Store logger in context for other middleware to use\n ctx.logger = requestLogger;\n }\n } catch (error) {\n // Silently handle any errors to prevent middleware from crashing\n defaultLogger.warn('Request ID middleware error:', error);\n }\n\n await next();\n };\n}\n\n/**\n * Create request ID middleware with UUID generator\n *\n * @param options - Request ID configuration options\n * @returns Request ID middleware function\n */\nexport function requestIdWithUUID(options: RequestIdOptions = {}): Middleware {\n return requestId({\n ...options,\n generator: generateUUID,\n });\n}\n\n/**\n * Create request ID middleware with timestamp generator\n *\n * @param options - Request ID configuration options\n * @returns Request ID middleware function\n */\nexport function requestIdWithTimestamp(\n options: RequestIdOptions = {}\n): Middleware {\n return requestId({\n ...options,\n generator: generateTimestampId,\n });\n}\n\n/**\n * Create request ID middleware with crypto generator\n *\n * @param options - Request ID configuration options\n * @returns Request ID middleware function\n */\nexport function requestIdWithCrypto(\n options: RequestIdOptions = {}\n): Middleware {\n return requestId({\n ...options,\n generator: generateCryptoId,\n });\n}\n\n/**\n * Create request ID middleware that echoes existing headers\n *\n * @param options - Request ID configuration options\n * @returns Request ID middleware function\n */\nexport function requestIdEcho(options: RequestIdOptions = {}): Middleware {\n return requestId({\n ...options,\n echoHeader: true,\n });\n}\n\n/**\n * Create request ID middleware with metrics\n *\n * @param options - Request ID configuration options\n * @returns Request ID middleware function with performance monitoring\n */\nexport function requestIdWithMetrics(\n options: RequestIdOptions = {}\n): Middleware {\n const requestIdMiddleware = requestId(options);\n\n return async (ctx: Context, next: () => Promise<void>): Promise<void> => {\n const start = process.hrtime\n ? process.hrtime.bigint?.() || BigInt(0)\n : BigInt(0);\n\n await requestIdMiddleware(ctx, async () => {\n const end = process.hrtime\n ? process.hrtime.bigint?.() || BigInt(0)\n : BigInt(0);\n const duration = Number(end - start) / 1000000; // Convert to milliseconds\n\n if (duration > 1) {\n defaultLogger.warn(\n `Slow request ID generation: ${duration.toFixed(3)}ms`\n );\n }\n\n await next();\n });\n };\n}\n\n/**\n * Request ID utilities for testing and advanced usage\n */\nexport const requestIdUtils = {\n /**\n * Generate UUID v4\n */\n generateUUID,\n\n /**\n * Generate timestamp-based ID\n */\n generateTimestampId,\n\n /**\n * Generate crypto-based ID\n */\n generateCryptoId,\n\n /**\n * Default request ID options\n */\n DEFAULT_OPTIONS: DEFAULT_REQUEST_ID_OPTIONS,\n};\n","/**\n * Timer middleware for NextRush v2\n *\n * @packageDocumentation\n */\n\nimport { Context } from '@/types/context';\nimport process from 'node:process';\nimport type { Middleware, TimerOptions } from './types';\n\n/**\n * Default timer options\n */\nconst DEFAULT_TIMER_OPTIONS: TimerOptions = {\n header: 'X-Response-Time',\n digits: 3,\n suffix: 'ms',\n includeStartTime: false,\n includeEndTime: false,\n includeDuration: true,\n format: 'milliseconds',\n threshold: 0,\n logSlow: false,\n logSlowThreshold: 1000,\n};\n\n/**\n * Format duration based on format option\n */\nfunction formatDuration(duration: number, options: TimerOptions): string {\n if (options.customFormat) {\n try {\n return options.customFormat(duration);\n } catch {\n // Fallback to default format if custom format fails\n return `${duration.toFixed(options.digits)}${options.suffix}`;\n }\n }\n\n const digits = options.digits ?? 3;\n const suffix = options.suffix ?? 'ms';\n\n switch (options.format) {\n case 'milliseconds':\n return `${Math.round(duration)}${suffix}`;\n\n case 'seconds':\n return `${(duration / 1000).toFixed(digits)}s`;\n\n case 'microseconds':\n return `${(duration * 1000).toFixed(digits)}μs`;\n\n case 'nanoseconds':\n return `${(duration * 1000000).toFixed(digits)}ns`;\n\n default:\n return `${duration.toFixed(digits)}${suffix}`;\n }\n}\n\n/**\n * Create timer middleware\n *\n * @param options - Timer configuration options\n * @returns Timer middleware function\n *\n * @example\n * ```typescript\n * import { timer } from '@/core/middleware/timer';\n *\n * const app = createApp();\n *\n * // Basic timer\n * app.use(timer());\n *\n * // Advanced timer\n * app.use(timer({\n * header: 'X-Response-Time',\n * digits: 3,\n * suffix: 'ms',\n * logSlow: true,\n * logSlowThreshold: 1000,\n * }));\n * ```\n */\nexport function timer(options: TimerOptions = {}): Middleware {\n const config = { ...DEFAULT_TIMER_OPTIONS, ...options };\n\n return async (ctx: Context, next: () => Promise<void>): Promise<void> => {\n const start = process.hrtime\n ? process.hrtime.bigint?.() || BigInt(0)\n : BigInt(0);\n const startTime = Date.now();\n\n // Add start time header if configured\n if (config.includeStartTime && ctx.res?.setHeader) {\n ctx.res.setHeader('X-Request-Start', startTime.toString());\n }\n\n // Override the end method to set the response time header before sending\n if (ctx.res?.end) {\n const originalEnd = ctx.res.end;\n ctx.res.end = function (chunk?: any, encoding?: any, cb?: any) {\n // Set response time header before sending\n if (config.header && ctx.res && !ctx.res.headersSent) {\n try {\n const end = process.hrtime\n ? process.hrtime.bigint?.() || BigInt(0)\n : BigInt(0);\n const duration = Number(end - start) / 1000000; // Convert to milliseconds\n const formattedDuration = formatDuration(duration, config);\n ctx.res.setHeader(config.header, formattedDuration);\n } catch {\n // Ignore header set errors\n }\n }\n return originalEnd.call(this, chunk, encoding, cb);\n };\n }\n\n try {\n // Call next middleware\n await next();\n } finally {\n // Calculate duration\n const end = process.hrtime\n ? process.hrtime.bigint?.() || BigInt(0)\n : BigInt(0);\n const endTime = Date.now();\n const duration = Number(end - start) / 1000000; // Convert to milliseconds\n\n // Set response time header if not already set\n if (config.header && ctx.res?.setHeader && !ctx.res.headersSent) {\n try {\n const formattedDuration = formatDuration(duration, config);\n ctx.res.setHeader(config.header, formattedDuration);\n } catch {\n // Headers already sent, ignore\n }\n }\n\n // Add end time header if configured\n if (config.includeEndTime && ctx.res?.setHeader && !ctx.res.headersSent) {\n try {\n ctx.res.setHeader('X-Request-End', endTime.toString());\n } catch {\n // Headers already sent, ignore\n }\n }\n\n // Add duration header if configured\n if (\n config.includeDuration &&\n ctx.res?.setHeader &&\n !ctx.res.headersSent\n ) {\n try {\n const formattedDuration = formatDuration(duration, config);\n ctx.res.setHeader('X-Request-Duration', formattedDuration);\n } catch {\n // Headers already sent, ignore\n }\n }\n\n // Log slow requests if configured\n if (config.logSlow && duration > (config.logSlowThreshold ?? 1000)) {\n // eslint-disable-next-line no-console\n console.warn(`Slow request: ${duration.toFixed(3)}ms`);\n }\n }\n };\n}\n\n/**\n * Create timer middleware with high precision\n *\n * @param options - Timer configuration options\n * @returns Timer middleware function\n */\nexport function highPrecisionTimer(options: TimerOptions = {}): Middleware {\n return timer({\n ...options,\n digits: 6,\n format: 'milliseconds',\n });\n}\n\n/**\n * Create timer middleware with seconds format\n *\n * @param options - Timer configuration options\n * @returns Timer middleware function\n */\nexport function timerInSeconds(options: TimerOptions = {}): Middleware {\n return timer({\n ...options,\n format: 'seconds',\n suffix: 's',\n });\n}\n\n/**\n * Create timer middleware with nanoseconds format\n *\n * @param options - Timer configuration options\n * @returns Timer middleware function\n */\nexport function timerInNanoseconds(options: TimerOptions = {}): Middleware {\n return timer({\n ...options,\n format: 'nanoseconds',\n digits: 9,\n });\n}\n\n/**\n * Create timer middleware that logs slow requests\n *\n * @param threshold - Threshold in milliseconds\n * @param options - Timer configuration options\n * @returns Timer middleware function\n */\nexport function slowRequestTimer(\n threshold: number,\n options: TimerOptions = {}\n): Middleware {\n return timer({\n ...options,\n logSlow: true,\n logSlowThreshold: threshold,\n });\n}\n\n/**\n * Create timer middleware with custom format\n *\n * @param format - Custom format function\n * @param options - Timer configuration options\n * @returns Timer middleware function\n */\nexport function timerWithCustomFormat(\n format: (duration: number) => string,\n options: TimerOptions = {}\n): Middleware {\n return timer({\n ...options,\n customFormat: format,\n });\n}\n\n/**\n * Create timer middleware with metrics\n *\n * @param options - Timer configuration options\n * @returns Timer middleware function with performance monitoring\n */\nexport function timerWithMetrics(options: TimerOptions = {}): Middleware {\n const timerMiddleware = timer(options);\n\n return async (ctx: Context, next: () => Promise<void>): Promise<void> => {\n const start = process.hrtime\n ? process.hrtime.bigint?.() || BigInt(0)\n : BigInt(0);\n\n await timerMiddleware(ctx, async () => {\n const end = process.hrtime\n ? process.hrtime.bigint?.() || BigInt(0)\n : BigInt(0);\n const duration = Number(end - start) / 1000000; // Convert to milliseconds\n\n if (duration > 1) {\n // eslint-disable-next-line no-console\n console.warn(`Slow timing operation: ${duration.toFixed(3)}ms`);\n }\n\n await next();\n });\n };\n}\n\n/**\n * Timer utilities for testing and advanced usage\n */\nexport const timerUtils = {\n /**\n * Format duration\n */\n formatDuration,\n\n /**\n * Default timer options\n */\n DEFAULT_OPTIONS: DEFAULT_TIMER_OPTIONS,\n};\n","/**\n * Middleware Factory for NextRush v2\n *\n * Uses DI container to create middleware instances with proper dependency injection.\n * This separates middleware creation from the Application class, following SRP and OCP.\n *\n * @packageDocumentation\n */\n\nimport type { DIContainer } from '@/core/di/container';\nimport { SERVICE_TOKENS } from '@/core/di/container';\nimport type { Middleware } from '@/types/context';\n\n// Import middleware creation functions\nimport { smartBodyParser } from '@/core/middleware/body-parser';\nimport { compression } from '@/core/middleware/compression';\nimport { cors } from '@/core/middleware/cors';\nimport { helmet } from '@/core/middleware/helmet';\nimport { logger } from '@/core/middleware/logger';\nimport { rateLimit } from '@/core/middleware/rate-limiter';\nimport { requestId } from '@/core/middleware/request-id';\nimport { timer } from '@/core/middleware/timer';\n\n// Import middleware option types\nimport type { EnhancedBodyParserOptions } from '@/core/middleware/body-parser/types';\nimport type {\n CompressionOptions,\n CorsOptions,\n HelmetOptions,\n LoggerOptions,\n RateLimiterOptions,\n RequestIdOptions,\n TimerOptions,\n} from '@/core/middleware/types';\n\n/**\n * Middleware factory interface\n */\nexport interface MiddlewareFactory {\n /** Create CORS middleware */\n createCors(options?: CorsOptions): Middleware;\n\n /** Create Helmet security middleware */\n createHelmet(options?: HelmetOptions): Middleware;\n\n /** Create JSON body parser middleware */\n createJson(options?: EnhancedBodyParserOptions): Middleware;\n\n /** Create URL-encoded body parser middleware */\n createUrlencoded(options?: EnhancedBodyParserOptions): Middleware;\n\n /** Create text body parser middleware */\n createText(options?: EnhancedBodyParserOptions): Middleware;\n\n /** Create smart body parser middleware */\n createSmartBodyParser(options?: EnhancedBodyParserOptions): Middleware;\n\n /** Create rate limiter middleware */\n createRateLimit(options?: RateLimiterOptions): Middleware;\n\n /** Create logger middleware */\n createLogger(options?: LoggerOptions): Middleware;\n\n /** Create compression middleware */\n createCompression(options?: CompressionOptions): Middleware;\n\n /** Create request ID middleware */\n createRequestId(options?: RequestIdOptions): Middleware;\n\n /** Create timer middleware */\n createTimer(options?: TimerOptions): Middleware;\n}\n\n/**\n * Default middleware factory implementation using DI container\n */\nexport class DefaultMiddlewareFactory implements MiddlewareFactory {\n constructor(private container: DIContainer) {}\n\n /**\n * Create CORS middleware\n */\n createCors(options: CorsOptions = {}): Middleware {\n // Try to resolve from container first, fallback to direct creation\n try {\n const corsFactory = this.container.resolve<\n (options: CorsOptions) => Middleware\n >(SERVICE_TOKENS.CORS_MIDDLEWARE);\n return corsFactory(options);\n } catch {\n return cors(options);\n }\n }\n\n /**\n * Create Helmet security middleware\n */\n createHelmet(options: HelmetOptions = {}): Middleware {\n try {\n const helmetFactory = this.container.resolve<\n (options: HelmetOptions) => Middleware\n >(SERVICE_TOKENS.HELMET_MIDDLEWARE);\n return helmetFactory(options);\n } catch {\n return helmet(options);\n }\n }\n\n /**\n * Create JSON body parser middleware\n */\n createJson(options: EnhancedBodyParserOptions = {}): Middleware {\n try {\n const bodyParserFactory = this.container.resolve<\n (options: EnhancedBodyParserOptions) => Middleware\n >(SERVICE_TOKENS.BODY_PARSER_MIDDLEWARE);\n return bodyParserFactory({ ...options, autoDetectContentType: false });\n } catch {\n return smartBodyParser({ ...options, autoDetectContentType: false });\n }\n }\n\n /**\n * Create URL-encoded body parser middleware\n */\n createUrlencoded(options: EnhancedBodyParserOptions = {}): Middleware {\n try {\n const bodyParserFactory = this.container.resolve<\n (options: EnhancedBodyParserOptions) => Middleware\n >(SERVICE_TOKENS.BODY_PARSER_MIDDLEWARE);\n return bodyParserFactory({ ...options, autoDetectContentType: false });\n } catch {\n return smartBodyParser({ ...options, autoDetectContentType: false });\n }\n }\n\n /**\n * Create text body parser middleware\n */\n createText(options: EnhancedBodyParserOptions = {}): Middleware {\n try {\n const bodyParserFactory = this.container.resolve<\n (options: EnhancedBodyParserOptions) => Middleware\n >(SERVICE_TOKENS.BODY_PARSER_MIDDLEWARE);\n return bodyParserFactory({ ...options, autoDetectContentType: false });\n } catch {\n return smartBodyParser({ ...options, autoDetectContentType: false });\n }\n }\n\n /**\n * Create smart body parser middleware\n */\n createSmartBodyParser(options: EnhancedBodyParserOptions = {}): Middleware {\n try {\n const bodyParserFactory = this.container.resolve<\n (options: EnhancedBodyParserOptions) => Middleware\n >(SERVICE_TOKENS.BODY_PARSER_MIDDLEWARE);\n return bodyParserFactory(options);\n } catch {\n return smartBodyParser(options);\n }\n }\n\n /**\n * Create rate limiter middleware\n */\n createRateLimit(options: RateLimiterOptions = {}): Middleware {\n try {\n const rateLimitFactory = this.container.resolve<\n (options: RateLimiterOptions) => Middleware\n >(SERVICE_TOKENS.RATE_LIMITER_MIDDLEWARE);\n return rateLimitFactory(options);\n } catch {\n return rateLimit(options);\n }\n }\n\n /**\n * Create logger middleware\n */\n createLogger(options: LoggerOptions = {}): Middleware {\n try {\n const loggerFactory = this.container.resolve<\n (options: LoggerOptions) => Middleware\n >(SERVICE_TOKENS.LOGGER);\n return loggerFactory(options);\n } catch {\n return logger(options);\n }\n }\n\n /**\n * Create compression middleware\n */\n createCompression(options: CompressionOptions = {}): Middleware {\n try {\n const compressionFactory = this.container.resolve<\n (options: CompressionOptions) => Middleware\n >(SERVICE_TOKENS.COMPRESSION_MIDDLEWARE);\n return compressionFactory(options);\n } catch {\n return compression(options);\n }\n }\n\n /**\n * Create request ID middleware\n */\n createRequestId(options: RequestIdOptions = {}): Middleware {\n return requestId(options);\n }\n\n /**\n * Create timer middleware\n */\n createTimer(options: TimerOptions = {}): Middleware {\n return timer(options);\n }\n}\n\n/**\n * Register default middleware factories with the DI container\n */\nexport function registerDefaultMiddleware(container: DIContainer): void {\n // Register middleware factories\n container.singleton(SERVICE_TOKENS.CORS_MIDDLEWARE, () => cors);\n container.singleton(SERVICE_TOKENS.HELMET_MIDDLEWARE, () => helmet);\n container.singleton(\n SERVICE_TOKENS.BODY_PARSER_MIDDLEWARE,\n () => smartBodyParser\n );\n container.singleton(SERVICE_TOKENS.COMPRESSION_MIDDLEWARE, () => compression);\n container.singleton(SERVICE_TOKENS.RATE_LIMITER_MIDDLEWARE, () => rateLimit);\n\n // Register middleware factory itself\n container.singleton(\n 'MIDDLEWARE_FACTORY',\n (container: DIContainer) => new DefaultMiddlewareFactory(container),\n ['CONTAINER']\n );\n}\n\n/**\n * Create a middleware factory instance\n */\nexport function createMiddlewareFactory(\n container: DIContainer\n): MiddlewareFactory {\n return new DefaultMiddlewareFactory(container);\n}\n","/**\n * Context Safety Utilities for NextRush v2\n *\n * Provides context safety utilities to prevent race conditions\n * and improve thread safety for critical context properties.\n *\n * @packageDocumentation\n */\n\nimport type { Context } from '@/types/context';\n\n/**\n * Context properties that should be immutable (race condition prone)\n */\ntype ImmutableProps =\n | 'body'\n | 'params'\n | 'state'\n | 'query'\n | 'requestId'\n | 'logger';\n\n/**\n * Context update operations\n */\nexport interface ContextUpdates {\n body?: unknown;\n params?: Record<string, string>;\n state?: Record<string, unknown>;\n query?: Record<string, string | string[] | undefined>;\n requestId?: string;\n logger?: Context['logger'];\n}\n\n/**\n * Thread-safe context wrapper\n */\nexport class SafeContext {\n private _context: Context;\n private _frozenProps: Partial<Pick<Context, ImmutableProps>>;\n\n constructor(context: Context) {\n this._context = context;\n\n // Create frozen copies of mutable properties with proper typing\n this._frozenProps = {\n body: context.body,\n params: { ...context.params },\n state: { ...context.state },\n query: { ...context.query },\n };\n\n // Handle optional properties separately\n if (context.requestId) {\n this._frozenProps.requestId = context.requestId;\n }\n if (context.logger) {\n this._frozenProps.logger = context.logger;\n }\n }\n\n /**\n * Get the underlying context (for performance-critical operations)\n */\n get context(): Context {\n return this._context;\n }\n\n /**\n * Get frozen body (safe)\n */\n get body(): unknown {\n return this._frozenProps.body;\n }\n\n /**\n * Get frozen params (safe)\n */\n get params(): Record<string, string> {\n return { ...this._frozenProps.params };\n }\n\n /**\n * Get frozen state (safe)\n */\n get state(): Record<string, unknown> {\n return { ...this._frozenProps.state };\n }\n\n /**\n * Get frozen query (safe)\n */\n get query(): Record<string, string | string[] | undefined> {\n return { ...this._frozenProps.query };\n }\n\n /**\n * Get request ID (safe)\n */\n get requestId(): string | undefined {\n return this._frozenProps.requestId;\n }\n\n /**\n * Get logger (safe)\n */\n get logger(): Context['logger'] {\n return this._frozenProps.logger;\n }\n\n /**\n * Create new SafeContext with updates (immutable operation)\n */\n withUpdates(updates: ContextUpdates): SafeContext {\n const newContext = { ...this._context };\n\n // Apply updates to the underlying context\n if (updates.body !== undefined) {\n newContext.body = updates.body;\n }\n if (updates.params) {\n newContext.params = { ...updates.params };\n }\n if (updates.state) {\n newContext.state = { ...updates.state };\n }\n if (updates.query) {\n newContext.query = { ...updates.query };\n }\n if (updates.requestId !== undefined) {\n newContext.requestId = updates.requestId;\n }\n if (updates.logger !== undefined) {\n newContext.logger = updates.logger;\n }\n\n return new SafeContext(newContext);\n }\n\n /**\n * Update body immutably\n */\n withBody(body: unknown): SafeContext {\n return this.withUpdates({ body });\n }\n\n /**\n * Update params immutably\n */\n withParams(params: Record<string, string>): SafeContext {\n return this.withUpdates({ params });\n }\n\n /**\n * Add param immutably\n */\n withParam(key: string, value: string): SafeContext {\n return this.withUpdates({\n params: { ...this._frozenProps.params, [key]: value },\n });\n }\n\n /**\n * Update state immutably\n */\n withState(state: Record<string, unknown>): SafeContext {\n return this.withUpdates({ state });\n }\n\n /**\n * Add state property immutably\n */\n withStateProperty(key: string, value: unknown): SafeContext {\n return this.withUpdates({\n state: { ...this._frozenProps.state, [key]: value },\n });\n }\n\n /**\n * Update query immutably\n */\n withQuery(query: Record<string, string | string[] | undefined>): SafeContext {\n return this.withUpdates({ query });\n }\n\n /**\n * Update request ID immutably\n */\n withRequestId(requestId: string): SafeContext {\n return this.withUpdates({ requestId });\n }\n\n /**\n * Update logger immutably\n */\n withLogger(logger: Context['logger']): SafeContext {\n return this.withUpdates({ logger });\n }\n\n /**\n * Apply updates to the original context (mutable operation - use with caution)\n */\n commit(): Context {\n // Apply frozen properties back to the original context\n this._context.body = this._frozenProps.body;\n this._context.params = { ...this._frozenProps.params };\n this._context.state = { ...this._frozenProps.state };\n this._context.query = { ...this._frozenProps.query };\n\n // Handle optional properties with proper type checking\n if (this._frozenProps.requestId !== undefined) {\n this._context.requestId = this._frozenProps.requestId;\n }\n if (this._frozenProps.logger !== undefined) {\n this._context.logger = this._frozenProps.logger;\n }\n\n return this._context;\n }\n}\n\n/**\n * Create a thread-safe context wrapper\n */\nexport function createSafeContext(context: Context): SafeContext {\n return new SafeContext(context);\n}\n\n/**\n * Middleware utility type for safe contexts\n */\nexport type SafeMiddleware = (\n ctx: SafeContext,\n next: () => Promise<void>\n) => Promise<SafeContext | void>;\n\n/**\n * Convert regular middleware to work with safe contexts\n */\nexport function createSafeMiddleware(\n middleware: (ctx: Context, next: () => Promise<void>) => Promise<void>\n): SafeMiddleware {\n return async (\n safeCtx: SafeContext,\n next: () => Promise<void>\n ): Promise<SafeContext | void> => {\n // Get the underlying context\n const ctx = safeCtx.context;\n\n // Run middleware with the underlying context\n await middleware(ctx, next);\n\n // Return updated safe context\n return createSafeContext(ctx);\n };\n}\n\n/**\n * Context safety utilities\n */\nexport const ContextSafety = {\n /**\n * Check if two contexts have the same immutable properties\n */\n areEqual: (ctx1: SafeContext, ctx2: SafeContext): boolean => {\n return (\n ctx1.body === ctx2.body &&\n JSON.stringify(ctx1.params) === JSON.stringify(ctx2.params) &&\n JSON.stringify(ctx1.state) === JSON.stringify(ctx2.state) &&\n JSON.stringify(ctx1.query) === JSON.stringify(ctx2.query) &&\n ctx1.requestId === ctx2.requestId\n );\n },\n\n /**\n * Create context snapshot for debugging\n */\n snapshot: (ctx: SafeContext) => ({\n body: ctx.body,\n params: ctx.params,\n state: ctx.state,\n query: ctx.query,\n requestId: ctx.requestId,\n timestamp: Date.now(),\n }),\n\n /**\n * Validate context integrity\n */\n validate: (ctx: SafeContext): boolean => {\n try {\n // Check if all required properties exist\n return !!(\n ctx.context &&\n ctx.context.req &&\n ctx.context.res &&\n typeof ctx.context.method === 'string' &&\n typeof ctx.context.url === 'string'\n );\n } catch {\n return false;\n }\n },\n\n /**\n * Deep freeze context state to prevent mutations\n */\n deepFreeze: (obj: Record<string, unknown>): Record<string, unknown> => {\n Object.freeze(obj);\n Object.values(obj).forEach(value => {\n if (value && typeof value === 'object') {\n ContextSafety.deepFreeze(value as Record<string, unknown>);\n }\n });\n return obj;\n },\n};\n\n/**\n * Context performance pool for reusing SafeContext instances\n */\nclass SafeContextPool {\n private static pool: SafeContext[] = [];\n private static readonly MAX_POOL_SIZE = 25;\n\n static acquire(context: Context): SafeContext {\n const pooled = this.pool.pop();\n\n if (pooled) {\n // Reset pooled context - create new instance for safety\n return new SafeContext(context);\n }\n\n return new SafeContext(context);\n }\n\n static release(_safeCtx: SafeContext): void {\n if (this.pool.length < this.MAX_POOL_SIZE) {\n // Don't actually pool - create fresh instances for safety\n // This method exists for interface compatibility\n }\n }\n\n static clear(): void {\n this.pool.length = 0;\n }\n\n static size(): number {\n return this.pool.length;\n }\n}\n\nexport { SafeContextPool };\n","/**\n * NextRush v2 Event Emitter Implementation\n *\n * High-performance, type-safe event emitter with pipeline support,\n * error handling, retry mechanisms, and comprehensive monitoring.\n *\n * @version 2.0.0\n * @author NextRush Core Team\n */\n\nimport { randomUUID } from 'node:crypto';\nimport { EventEmitter as NodeEventEmitter } from 'node:events';\nimport { performance } from 'node:perf_hooks';\n\nimport type {\n BaseEventMetadata,\n DomainEvent,\n Event,\n EventEmitter,\n EventHandler,\n EventHandlerDefinition,\n EventMetrics,\n EventPipelineConfig,\n EventPipelineMiddleware,\n EventPipelineStage,\n EventSubscription,\n} from '../../types/events';\n\n/**\n * Internal subscription data\n */\ninterface InternalSubscription<T extends Event = Event> {\n readonly id: string;\n readonly eventType: string;\n readonly handler: EventHandler<T>;\n readonly definition: EventHandlerDefinition<T>;\n readonly createdAt: number;\n active: boolean;\n}\n\n/**\n * Pipeline execution context\n */\ninterface PipelineExecutionContext<T extends Event = Event> {\n readonly event: T;\n readonly pipelineName: string;\n stage: string;\n readonly startTime: number;\n transformedEvent: T;\n aborted: boolean;\n}\n\n/**\n * Mutable metrics interface for internal use\n */\ninterface MutableEventMetrics {\n eventsEmitted: Record<string, number>;\n eventsProcessed: Record<string, number>;\n processingErrors: Record<string, number>;\n averageProcessingTime: Record<string, number>;\n pipelineStats: Record<string, MutablePipelineStats>;\n memoryUsage: {\n heapUsed: number;\n heapTotal: number;\n external: number;\n };\n}\n\n/**\n * Mutable pipeline stats for internal use\n */\ninterface MutablePipelineStats {\n executions: number;\n averageExecutionTime: number;\n successes: number;\n failures: number;\n stageStats: Record<\n string,\n {\n executions: number;\n averageTime: number;\n failures: number;\n }\n >;\n}\n\n/**\n * High-performance event emitter with pipeline support\n */\nexport class NextRushEventEmitter\n extends NodeEventEmitter\n implements EventEmitter\n{\n private readonly subscriptions = new Map<\n string,\n Map<string, InternalSubscription>\n >();\n private readonly pipelines = new Map<string, EventPipelineConfig[]>();\n private readonly metrics: MutableEventMetrics = {\n eventsEmitted: {},\n eventsProcessed: {},\n processingErrors: {},\n averageProcessingTime: {},\n pipelineStats: {},\n memoryUsage: {\n heapUsed: 0,\n heapTotal: 0,\n external: 0,\n },\n };\n\n private monitoringEnabled = true;\n private readonly maxListeners = 100;\n private readonly defaultTimeout = 5000; // 5 seconds\n private readonly cleanupInterval: NodeJS.Timeout;\n\n constructor() {\n super();\n this.setMaxListeners(this.maxListeners);\n\n // Start cleanup interval for inactive subscriptions\n this.cleanupInterval = setInterval(() => {\n this.cleanupInactiveSubscriptions();\n this.updateMemoryMetrics();\n }, 30000); // Every 30 seconds\n }\n\n /**\n * Emit an event through the pipeline system\n */\n async emitEvent<T extends Event>(event: T): Promise<void> {\n const startTime = performance.now();\n\n try {\n // Update metrics\n if (this.monitoringEnabled) {\n this.updateEmissionMetrics(event.type);\n }\n\n // Process event through pipelines\n let processedEvent: T | null = event;\n const pipelines = this.pipelines.get(event.type) || [];\n\n for (const pipelineConfig of pipelines) {\n if (processedEvent === null) break; // Stop if previous pipeline aborted\n\n try {\n processedEvent = await this.executePipeline(\n processedEvent,\n pipelineConfig\n );\n } catch (error) {\n if (this.monitoringEnabled) {\n this.updateErrorMetrics(event.type);\n }\n\n if (pipelineConfig.errorHandling === 'stop') {\n throw error;\n }\n\n if (pipelineConfig.errorHandling === 'retry') {\n // Implement retry logic here\n this.logWarning(\n `Pipeline ${pipelineConfig.name} failed, retrying...`,\n error\n );\n continue;\n }\n\n // Continue with next pipeline on error\n this.logWarning(\n `Pipeline ${pipelineConfig.name} failed, continuing...`,\n error\n );\n }\n }\n\n // Only emit to subscribers if event wasn't filtered out\n if (processedEvent !== null) {\n await this.emitToSubscribers(processedEvent);\n }\n\n // Update processing metrics\n if (this.monitoringEnabled) {\n const processingTime = performance.now() - startTime;\n this.updateProcessingMetrics(event.type, processingTime);\n }\n } catch (error) {\n if (this.monitoringEnabled) {\n this.updateErrorMetrics(event.type);\n }\n throw error;\n }\n }\n\n /**\n * Emit a NextRush event - implements EventEmitter interface\n */\n async emitEventAsync<T extends Event>(event: T): Promise<void> {\n return this.emitEvent(event);\n }\n\n /**\n * Emit an event (EventBus interface implementation)\n * This shadows Node.js EventEmitter.emit for our interface\n */\n override async emit<T extends Event>(event: T): Promise<void>;\n override emit(eventName: string | symbol, ...args: unknown[]): boolean;\n override emit<T extends Event>(\n eventOrName: T | string | symbol,\n ...args: unknown[]\n ): Promise<void> | boolean {\n // If first argument is our Event type, handle as NextRush event\n if (\n typeof eventOrName === 'object' &&\n eventOrName !== null &&\n 'type' in eventOrName &&\n 'data' in eventOrName\n ) {\n return this.emitEvent(eventOrName as T);\n }\n\n // Otherwise, delegate to Node.js EventEmitter\n return super.emit(eventOrName as string | symbol, ...args);\n }\n\n /**\n * Subscribe to events with basic handler\n */\n subscribe<T extends Event>(\n eventType: string,\n handler: EventHandler<T>\n ): EventSubscription {\n return this.subscribeWithOptions(eventType, { handler });\n }\n\n /**\n * Subscribe to events with full handler definition\n */\n subscribeWithOptions<T extends Event>(\n eventType: string,\n definition: EventHandlerDefinition<T>\n ): EventSubscription {\n const subscriptionId = randomUUID();\n\n const subscription: InternalSubscription<T> = {\n id: subscriptionId,\n eventType,\n handler: definition.handler,\n definition,\n createdAt: Date.now(),\n active: true,\n };\n\n // Get or create subscriptions map for this event type\n if (!this.subscriptions.has(eventType)) {\n this.subscriptions.set(eventType, new Map());\n }\n\n const typeSubscriptions = this.subscriptions.get(eventType)!;\n typeSubscriptions.set(subscriptionId, subscription as InternalSubscription);\n\n // Return subscription handle\n return {\n id: subscriptionId,\n unsubscribe: async () => {\n subscription.active = false;\n typeSubscriptions.delete(subscriptionId);\n\n if (typeSubscriptions.size === 0) {\n this.subscriptions.delete(eventType);\n }\n },\n isActive: () => subscription.active,\n };\n }\n\n /**\n * Unsubscribe all handlers for event type\n */\n async unsubscribeAll(eventType: string): Promise<void> {\n const typeSubscriptions = this.subscriptions.get(eventType);\n if (!typeSubscriptions) return;\n\n // Mark all subscriptions as inactive\n for (const subscription of Array.from(typeSubscriptions.values())) {\n subscription.active = false;\n }\n\n // Clear the map\n this.subscriptions.delete(eventType);\n }\n\n /**\n * Get active subscriptions count\n */\n getSubscriptionCount(eventType?: string): number {\n if (eventType) {\n const typeSubscriptions = this.subscriptions.get(eventType);\n return typeSubscriptions?.size || 0;\n }\n\n let total = 0;\n for (const typeSubscriptions of Array.from(this.subscriptions.values())) {\n total += typeSubscriptions.size;\n }\n return total;\n }\n\n /**\n * Clear all subscriptions\n */\n async clear(): Promise<void> {\n // Mark all subscriptions as inactive\n for (const typeSubscriptions of Array.from(this.subscriptions.values())) {\n for (const subscription of Array.from(typeSubscriptions.values())) {\n subscription.active = false;\n }\n }\n\n // Clear all maps\n this.subscriptions.clear();\n this.pipelines.clear();\n\n // Reset metrics\n Object.assign(this.metrics, {\n eventsEmitted: {},\n eventsProcessed: {},\n processingErrors: {},\n averageProcessingTime: {},\n pipelineStats: {},\n });\n }\n\n /**\n * Add event pipeline\n */\n addPipeline<T extends Event>(\n eventType: string,\n pipeline: EventPipelineConfig<T>\n ): void {\n if (!this.pipelines.has(eventType)) {\n this.pipelines.set(eventType, []);\n }\n\n const typePipelines = this.pipelines.get(eventType)!;\n\n // Remove existing pipeline with same name\n const existingIndex = typePipelines.findIndex(\n p => p.name === pipeline.name\n );\n if (existingIndex >= 0) {\n typePipelines.splice(existingIndex, 1);\n }\n\n typePipelines.push(pipeline as unknown as EventPipelineConfig);\n }\n\n /**\n * Remove event pipeline\n */\n removePipeline(eventType: string, pipelineName: string): void {\n const typePipelines = this.pipelines.get(eventType);\n if (!typePipelines) return;\n\n const index = typePipelines.findIndex(p => p.name === pipelineName);\n if (index >= 0) {\n typePipelines.splice(index, 1);\n }\n\n if (typePipelines.length === 0) {\n this.pipelines.delete(eventType);\n }\n }\n\n /**\n * Get pipeline names for event type\n */\n getPipelineNames(eventType: string): string[] {\n const typePipelines = this.pipelines.get(eventType);\n return typePipelines ? typePipelines.map(p => p.name) : [];\n }\n\n /**\n * Enable/disable monitoring\n */\n setMonitoring(enabled: boolean): void {\n this.monitoringEnabled = enabled;\n }\n\n /**\n * Get event metrics\n */\n getMetrics(): EventMetrics {\n return {\n ...this.metrics,\n memoryUsage: {\n ...process.memoryUsage(),\n },\n } as EventMetrics;\n }\n\n /**\n * Execute pipeline for an event\n */\n private async executePipeline<T extends Event>(\n event: T,\n config: EventPipelineConfig\n ): Promise<T | null> {\n const startTime = performance.now();\n const context: PipelineExecutionContext<T> = {\n event,\n pipelineName: config.name,\n stage: '',\n startTime,\n transformedEvent: event,\n aborted: false,\n };\n\n // Initialize pipeline metrics if monitoring is enabled\n if (this.monitoringEnabled) {\n this.initializePipelineStats(config.name);\n }\n\n try {\n // Execute each stage\n for (const stage of config.stages) {\n if (context.aborted) break;\n\n context.stage = stage.name;\n const stageStartTime = performance.now();\n\n try {\n await this.executeStage(context, stage);\n\n if (this.monitoringEnabled) {\n this.updateStageMetrics(\n config.name,\n stage.name,\n performance.now() - stageStartTime,\n true\n );\n }\n } catch (error) {\n if (this.monitoringEnabled) {\n this.updateStageMetrics(\n config.name,\n stage.name,\n performance.now() - stageStartTime,\n false\n );\n }\n throw error;\n }\n }\n\n if (this.monitoringEnabled) {\n this.updatePipelineMetrics(\n config.name,\n performance.now() - startTime,\n true\n );\n }\n\n // Return null if event was aborted by filters\n if (context.aborted) {\n return null;\n }\n\n return context.transformedEvent;\n } catch (error) {\n if (this.monitoringEnabled) {\n this.updatePipelineMetrics(\n config.name,\n performance.now() - startTime,\n false\n );\n }\n throw error;\n }\n }\n\n /**\n * Execute pipeline stage\n */\n private async executeStage<T extends Event>(\n context: PipelineExecutionContext<T>,\n stage: EventPipelineStage\n ): Promise<void> {\n // Apply filters first\n if (stage.filters) {\n for (const filter of stage.filters) {\n const shouldContinue = await Promise.resolve(\n filter(context.transformedEvent)\n );\n if (!shouldContinue) {\n context.aborted = true;\n return;\n }\n }\n }\n\n // Apply transformers\n if (stage.transformers) {\n for (const transformer of stage.transformers) {\n context.transformedEvent = (await Promise.resolve(\n transformer(context.transformedEvent)\n )) as T;\n }\n }\n\n // Execute middleware\n if (stage.middleware && stage.middleware.length > 0) {\n await this.executeMiddlewareChain(context, stage.middleware);\n }\n }\n\n /**\n * Execute middleware chain\n */\n private async executeMiddlewareChain<T extends Event>(\n context: PipelineExecutionContext<T>,\n middleware: EventPipelineMiddleware[]\n ): Promise<void> {\n let index = 0;\n\n const next = async (): Promise<void> => {\n if (index >= middleware.length || context.aborted) return;\n\n const currentMiddleware = middleware[index++];\n if (currentMiddleware) {\n await Promise.resolve(\n currentMiddleware(context.transformedEvent, next)\n );\n }\n };\n\n await next();\n }\n\n /**\n * Emit event to all subscribers\n */\n private async emitToSubscribers<T extends Event>(event: T): Promise<void> {\n const subscriptionPromises: Promise<void>[] = [];\n\n // Get direct type subscriptions\n const typeSubscriptions = this.subscriptions.get(event.type);\n if (typeSubscriptions) {\n for (const subscription of Array.from(typeSubscriptions.values())) {\n if (!subscription.active) continue;\n subscriptionPromises.push(\n this.executeSubscription(event, subscription)\n );\n }\n }\n\n // Get wildcard subscriptions\n const wildcardSubscriptions = this.subscriptions.get('*');\n if (wildcardSubscriptions) {\n for (const subscription of Array.from(wildcardSubscriptions.values())) {\n if (!subscription.active) continue;\n subscriptionPromises.push(\n this.executeSubscription(event, subscription)\n );\n }\n }\n\n if (subscriptionPromises.length > 0) {\n await Promise.allSettled(subscriptionPromises);\n }\n }\n\n /**\n * Execute individual subscription\n */\n private async executeSubscription<T extends Event>(\n event: T,\n subscription: InternalSubscription\n ): Promise<void> {\n const { handler, definition } = subscription;\n const timeout = definition.timeout || this.defaultTimeout;\n\n try {\n // Create timeout promise\n const timeoutPromise = new Promise<void>((_, reject) => {\n setTimeout(() => {\n reject(new Error(`Handler timeout after ${timeout}ms`));\n }, timeout);\n });\n\n // Execute handler with timeout\n const handlerPromise = Promise.resolve(handler(event as never));\n await Promise.race([handlerPromise, timeoutPromise]);\n\n // Mark as one-time if specified\n if (definition.once) {\n subscription.active = false;\n }\n } catch (error) {\n this.logError(`Event handler failed for ${event.type}:`, error);\n\n // Implement retry logic if configured\n if (definition.retry) {\n await this.retryHandler(event, subscription, error as Error);\n }\n\n // Don't rethrow to prevent one handler failure from affecting others\n }\n }\n\n /**\n * Retry failed handler execution\n */\n private async retryHandler<T extends Event>(\n event: T,\n subscription: InternalSubscription,\n lastError: Error,\n attempt: number = 1\n ): Promise<void> {\n const retry = subscription.definition.retry!;\n\n if (attempt > retry.maxAttempts) {\n this.logError(\n `Handler retry failed after ${retry.maxAttempts} attempts for ${event.type}:`,\n lastError\n );\n return;\n }\n\n const delay =\n retry.delay * Math.pow(retry.backoffMultiplier || 1, attempt - 1);\n\n await new Promise(resolve => setTimeout(resolve, delay));\n\n try {\n await Promise.resolve(subscription.handler(event as never));\n } catch (error) {\n await this.retryHandler(event, subscription, error as Error, attempt + 1);\n }\n }\n\n /**\n * Update emission metrics\n */\n private updateEmissionMetrics(eventType: string): void {\n this.metrics.eventsEmitted[eventType] =\n (this.metrics.eventsEmitted[eventType] || 0) + 1;\n }\n\n /**\n * Update processing metrics\n */\n private updateProcessingMetrics(\n eventType: string,\n processingTime: number\n ): void {\n this.metrics.eventsProcessed[eventType] =\n (this.metrics.eventsProcessed[eventType] || 0) + 1;\n\n const current = this.metrics.averageProcessingTime[eventType] || 0;\n const count = this.metrics.eventsProcessed[eventType];\n this.metrics.averageProcessingTime[eventType] =\n (current * (count - 1) + processingTime) / count;\n }\n\n /**\n * Update error metrics\n */\n private updateErrorMetrics(eventType: string): void {\n this.metrics.processingErrors[eventType] =\n (this.metrics.processingErrors[eventType] || 0) + 1;\n }\n\n /**\n * Initialize pipeline stats if not exists\n */\n private initializePipelineStats(pipelineName: string): void {\n if (!this.metrics.pipelineStats[pipelineName]) {\n this.metrics.pipelineStats[pipelineName] = {\n executions: 0,\n averageExecutionTime: 0,\n successes: 0,\n failures: 0,\n stageStats: {},\n };\n }\n }\n\n /**\n * Update pipeline metrics\n */\n private updatePipelineMetrics(\n pipelineName: string,\n executionTime: number,\n success: boolean\n ): void {\n // Pipeline stats should already be initialized\n const stats = this.metrics.pipelineStats[pipelineName];\n if (!stats) return;\n\n stats.executions++;\n\n if (success) {\n stats.successes++;\n } else {\n stats.failures++;\n }\n\n stats.averageExecutionTime =\n (stats.averageExecutionTime * (stats.executions - 1) + executionTime) /\n stats.executions;\n }\n\n /**\n * Update stage metrics\n */\n private updateStageMetrics(\n pipelineName: string,\n stageName: string,\n executionTime: number,\n success: boolean\n ): void {\n if (!this.metrics.pipelineStats[pipelineName]) return;\n\n const pipelineStats = this.metrics.pipelineStats[pipelineName];\n if (!pipelineStats.stageStats[stageName]) {\n pipelineStats.stageStats[stageName] = {\n executions: 0,\n averageTime: 0,\n failures: 0,\n };\n }\n\n const stageStats = pipelineStats.stageStats[stageName];\n stageStats.executions++;\n\n if (!success) {\n stageStats.failures++;\n }\n\n stageStats.averageTime =\n (stageStats.averageTime * (stageStats.executions - 1) + executionTime) /\n stageStats.executions;\n }\n\n /**\n * Update memory metrics\n */\n private updateMemoryMetrics(): void {\n const memoryUsage = process.memoryUsage();\n this.metrics.memoryUsage = {\n heapUsed: memoryUsage.heapUsed,\n heapTotal: memoryUsage.heapTotal,\n external: memoryUsage.external,\n };\n }\n\n /**\n * Cleanup inactive subscriptions\n */\n private cleanupInactiveSubscriptions(): void {\n for (const [eventType, typeSubscriptions] of Array.from(\n this.subscriptions.entries()\n )) {\n for (const [subscriptionId, subscription] of Array.from(\n typeSubscriptions.entries()\n )) {\n if (!subscription.active) {\n typeSubscriptions.delete(subscriptionId);\n }\n }\n\n if (typeSubscriptions.size === 0) {\n this.subscriptions.delete(eventType);\n }\n }\n }\n\n /**\n * Log warning message\n */\n private logWarning(message: string, error?: unknown): void {\n // In production, use proper logger\n if (process.env['NODE_ENV'] !== 'test') {\n // eslint-disable-next-line no-console\n console.warn(message, error);\n }\n }\n\n /**\n * Log error message\n */\n private logError(message: string, error?: unknown): void {\n // In production, use proper logger\n if (process.env['NODE_ENV'] !== 'test') {\n // eslint-disable-next-line no-console\n console.error(message, error);\n }\n }\n\n /**\n * Cleanup resources\n */\n destroy(): void {\n clearInterval(this.cleanupInterval);\n void this.clear();\n this.removeAllListeners();\n }\n}\n\n/**\n * Create event metadata with defaults\n */\nexport function createEventMetadata(\n overrides: Partial<BaseEventMetadata> = {}\n): BaseEventMetadata {\n return {\n id: randomUUID(),\n timestamp: Date.now(),\n source: 'nextrush-framework',\n version: 1,\n ...overrides,\n };\n}\n\n/**\n * Create a domain event\n */\nexport function createEvent<T extends Event>(\n type: T['type'],\n data: T['data'],\n metadata?: Partial<BaseEventMetadata>\n): T {\n return {\n type,\n data,\n metadata: createEventMetadata(metadata),\n } as T;\n}\n\n/**\n * Create a domain event\n */\nexport function createDomainEvent<T extends DomainEvent>(\n type: T['type'],\n data: T['data'],\n aggregateId: string,\n aggregateType: string,\n sequenceNumber: number,\n metadata?: Partial<BaseEventMetadata>\n): T {\n return {\n type,\n data,\n aggregateId,\n aggregateType,\n sequenceNumber,\n metadata: createEventMetadata(metadata),\n } as T;\n}\n\n/**\n * Type guard for checking event types\n */\nexport function isEventOfType<T extends Event>(\n event: Event,\n type: T['type']\n): event is T {\n return event.type === type;\n}\n","/**\n * NextRush v2 Event Store Implementation\n *\n * High-performance event store with in-memory and persistent storage options,\n * supporting event sourcing patterns and stream processing.\n *\n * @version 2.0.0\n * @author NextRush Core Team\n */\n\nimport { randomUUID } from 'node:crypto';\n\nimport type {\n DomainEvent,\n Event,\n EventFilter,\n EventHandler,\n EventStore,\n EventStoreStats,\n EventSubscription,\n} from '../../types/events';\n\n/**\n * In-memory event store implementation\n */\nexport class InMemoryEventStore implements EventStore {\n private readonly events: Map<string, Event> = new Map();\n private readonly eventsByType: Map<string, string[]> = new Map();\n private readonly eventsByCorrelation: Map<string, string[]> = new Map();\n private readonly eventsByAggregate: Map<string, string[]> = new Map();\n private readonly subscriptions: Map<string, EventStoreSubscription> =\n new Map();\n\n private eventCounter = 0;\n private readonly maxEvents: number;\n\n constructor(maxEvents = 100000) {\n this.maxEvents = maxEvents;\n }\n\n /**\n * Save event to store\n */\n async save<T extends Event>(event: T): Promise<void> {\n const eventId = event.metadata.id;\n\n // Store the event\n this.events.set(eventId, event);\n\n // Index by type\n if (!this.eventsByType.has(event.type)) {\n this.eventsByType.set(event.type, []);\n }\n this.eventsByType.get(event.type)!.push(eventId);\n\n // Index by correlation ID if present\n if (event.metadata.correlationId) {\n if (!this.eventsByCorrelation.has(event.metadata.correlationId)) {\n this.eventsByCorrelation.set(event.metadata.correlationId, []);\n }\n this.eventsByCorrelation.get(event.metadata.correlationId)!.push(eventId);\n }\n\n // Index by aggregate ID for domain events\n if (this.isDomainEvent(event)) {\n if (!this.eventsByAggregate.has(event.aggregateId)) {\n this.eventsByAggregate.set(event.aggregateId, []);\n }\n this.eventsByAggregate.get(event.aggregateId)!.push(eventId);\n }\n\n this.eventCounter++;\n\n // Cleanup old events if we exceed max\n if (this.eventCounter > this.maxEvents) {\n await this.cleanup();\n }\n\n // Notify subscribers\n await this.notifySubscribers(event);\n }\n\n /**\n * Save multiple events atomically\n */\n async saveMany<T extends Event>(events: T[]): Promise<void> {\n // In a real implementation, this would be atomic\n for (const event of events) {\n await this.save(event);\n }\n }\n\n /**\n * Load events by type\n */\n async loadByType<T extends Event>(\n type: string,\n options: {\n readonly after?: Date;\n readonly before?: Date;\n readonly limit?: number;\n readonly offset?: number;\n } = {}\n ): Promise<T[]> {\n const eventIds = this.eventsByType.get(type) || [];\n const events = this.getEventsById(eventIds) as T[];\n\n return this.filterAndPaginateEvents(events, options);\n }\n\n /**\n * Load events by correlation ID\n */\n async loadByCorrelationId<T extends Event>(\n correlationId: string,\n options: {\n readonly limit?: number;\n readonly offset?: number;\n } = {}\n ): Promise<T[]> {\n const eventIds = this.eventsByCorrelation.get(correlationId) || [];\n const events = this.getEventsById(eventIds) as T[];\n\n // Sort by timestamp\n events.sort((a, b) => a.metadata.timestamp - b.metadata.timestamp);\n\n const { limit = 1000, offset = 0 } = options;\n return events.slice(offset, offset + limit);\n }\n\n /**\n * Load events for aggregate\n */\n async loadByAggregateId<T extends DomainEvent>(\n aggregateId: string,\n options: {\n readonly afterSequence?: number;\n readonly limit?: number;\n } = {}\n ): Promise<T[]> {\n const eventIds = this.eventsByAggregate.get(aggregateId) || [];\n const events = this.getEventsById(eventIds) as T[];\n\n // Filter domain events\n const domainEvents = events.filter(this.isDomainEvent) as T[];\n\n // Sort by sequence number\n domainEvents.sort((a, b) => a.sequenceNumber - b.sequenceNumber);\n\n // Filter by sequence number if specified\n let filteredEvents = domainEvents;\n if (options.afterSequence !== undefined) {\n filteredEvents = domainEvents.filter(\n e => e.sequenceNumber > options.afterSequence!\n );\n }\n\n // Apply limit\n if (options.limit !== undefined) {\n filteredEvents = filteredEvents.slice(0, options.limit);\n }\n\n return filteredEvents;\n }\n\n /**\n * Create event stream subscription\n */\n async subscribe<T extends Event>(\n filter: EventFilter<T>,\n handler: EventHandler<T>\n ): Promise<EventSubscription> {\n const subscriptionId = randomUUID();\n\n const subscription: EventStoreSubscription = {\n id: subscriptionId,\n filter: filter as EventFilter,\n handler: handler as EventHandler,\n active: true,\n };\n\n this.subscriptions.set(subscriptionId, subscription);\n\n return {\n id: subscriptionId,\n unsubscribe: async () => {\n subscription.active = false;\n this.subscriptions.delete(subscriptionId);\n },\n isActive: () => subscription.active,\n };\n }\n\n /**\n * Get event statistics\n */\n async getStats(): Promise<EventStoreStats> {\n const eventsByType: Record<string, number> = {};\n\n for (const [type, eventIds] of this.eventsByType.entries()) {\n eventsByType[type] = eventIds.length;\n }\n\n const timestamps = Array.from(this.events.values()).map(\n e => e.metadata.timestamp\n );\n\n const lastEventTimestamp =\n timestamps.length > 0 ? Math.max(...timestamps) : undefined;\n\n const result: EventStoreStats = {\n totalEvents: this.events.size,\n eventsByType,\n storageSize: this.estimateStorageSize(),\n ...(lastEventTimestamp !== undefined && { lastEventTimestamp }),\n };\n\n return result;\n }\n\n /**\n * Clear all events from store\n */\n async clear(): Promise<void> {\n this.events.clear();\n this.eventsByType.clear();\n this.eventsByCorrelation.clear();\n this.eventsByAggregate.clear();\n this.eventCounter = 0;\n\n // Notify all subscribers to unsubscribe\n for (const subscription of this.subscriptions.values()) {\n subscription.active = false;\n }\n this.subscriptions.clear();\n }\n\n /**\n * Get events by ID array\n */\n private getEventsById(eventIds: string[]): Event[] {\n return eventIds\n .map(id => this.events.get(id))\n .filter((event): event is Event => event !== undefined);\n }\n\n /**\n * Filter and paginate events based on options\n */\n private filterAndPaginateEvents<T extends Event>(\n events: T[],\n options: {\n readonly after?: Date;\n readonly before?: Date;\n readonly limit?: number;\n readonly offset?: number;\n }\n ): T[] {\n let filteredEvents = [...events];\n\n // Sort by timestamp\n filteredEvents.sort((a, b) => a.metadata.timestamp - b.metadata.timestamp);\n\n // Filter by time range\n if (options.after) {\n const afterMs = options.after.getTime();\n filteredEvents = filteredEvents.filter(\n e => e.metadata.timestamp > afterMs\n );\n }\n\n if (options.before) {\n const beforeMs = options.before.getTime();\n filteredEvents = filteredEvents.filter(\n e => e.metadata.timestamp < beforeMs\n );\n }\n\n // Apply pagination\n const { limit = 1000, offset = 0 } = options;\n return filteredEvents.slice(offset, offset + limit);\n }\n\n /**\n * Notify subscribers of new event\n */\n private async notifySubscribers<T extends Event>(event: T): Promise<void> {\n const notifyPromises: Promise<void>[] = [];\n\n for (const subscription of this.subscriptions.values()) {\n if (!subscription.active) continue;\n\n try {\n const shouldNotify = await Promise.resolve(subscription.filter(event));\n if (shouldNotify) {\n notifyPromises.push(\n Promise.resolve(subscription.handler(event)).catch(() => {\n // Silently ignore subscription handler errors\n })\n );\n }\n } catch {\n // Silently ignore subscription filter errors\n }\n }\n\n if (notifyPromises.length > 0) {\n await Promise.allSettled(notifyPromises);\n }\n }\n\n /**\n * Cleanup old events when approaching max capacity\n */\n private async cleanup(): Promise<void> {\n const allEvents = Array.from(this.events.values());\n\n // Sort by timestamp (oldest first)\n allEvents.sort((a, b) => a.metadata.timestamp - b.metadata.timestamp);\n\n // Remove oldest 10% of events\n const eventsToRemove = Math.floor(allEvents.length * 0.1);\n const oldestEvents = allEvents.slice(0, eventsToRemove);\n\n for (const event of oldestEvents) {\n await this.removeEvent(event);\n }\n }\n\n /**\n * Remove a specific event from all indexes\n */\n private async removeEvent(event: Event): Promise<void> {\n const eventId = event.metadata.id;\n\n // Remove from main store\n this.events.delete(eventId);\n\n // Remove from type index\n const typeEventIds = this.eventsByType.get(event.type);\n if (typeEventIds) {\n const index = typeEventIds.indexOf(eventId);\n if (index >= 0) {\n typeEventIds.splice(index, 1);\n }\n if (typeEventIds.length === 0) {\n this.eventsByType.delete(event.type);\n }\n }\n\n // Remove from correlation index\n if (event.metadata.correlationId) {\n const correlationEventIds = this.eventsByCorrelation.get(\n event.metadata.correlationId\n );\n if (correlationEventIds) {\n const index = correlationEventIds.indexOf(eventId);\n if (index >= 0) {\n correlationEventIds.splice(index, 1);\n }\n if (correlationEventIds.length === 0) {\n this.eventsByCorrelation.delete(event.metadata.correlationId);\n }\n }\n }\n\n // Remove from aggregate index\n if (this.isDomainEvent(event)) {\n const aggregateEventIds = this.eventsByAggregate.get(event.aggregateId);\n if (aggregateEventIds) {\n const index = aggregateEventIds.indexOf(eventId);\n if (index >= 0) {\n aggregateEventIds.splice(index, 1);\n }\n if (aggregateEventIds.length === 0) {\n this.eventsByAggregate.delete(event.aggregateId);\n }\n }\n }\n }\n\n /**\n * Check if event is a domain event\n */\n private isDomainEvent(event: Event): event is DomainEvent {\n return (\n 'aggregateId' in event &&\n 'aggregateType' in event &&\n 'sequenceNumber' in event\n );\n }\n\n /**\n * Estimate storage size in bytes\n */\n private estimateStorageSize(): number {\n let totalSize = 0;\n\n for (const event of this.events.values()) {\n // Rough estimation: JSON string length * 2 (for UTF-16)\n totalSize += JSON.stringify(event).length * 2;\n }\n\n return totalSize;\n }\n}\n\n/**\n * Internal subscription data\n */\ninterface EventStoreSubscription {\n readonly id: string;\n readonly filter: EventFilter;\n readonly handler: EventHandler;\n active: boolean;\n}\n\n/**\n * Persistent event store implementation (placeholder for database integration)\n */\nexport class PersistentEventStore implements EventStore {\n private readonly inMemoryStore: InMemoryEventStore;\n\n constructor() {\n this.inMemoryStore = new InMemoryEventStore();\n }\n\n async save<T extends Event>(event: T): Promise<void> {\n // In a real implementation, this would persist to database\n // For now, delegate to in-memory store\n await this.inMemoryStore.save(event);\n }\n\n async saveMany<T extends Event>(events: T[]): Promise<void> {\n // In a real implementation, this would use database transactions\n await this.inMemoryStore.saveMany(events);\n }\n\n async loadByType<T extends Event>(\n type: string,\n options?: {\n readonly after?: Date;\n readonly before?: Date;\n readonly limit?: number;\n readonly offset?: number;\n }\n ): Promise<T[]> {\n // In a real implementation, this would query database\n return this.inMemoryStore.loadByType(type, options);\n }\n\n async loadByCorrelationId<T extends Event>(\n correlationId: string,\n options?: {\n readonly limit?: number;\n readonly offset?: number;\n }\n ): Promise<T[]> {\n // In a real implementation, this would query database\n return this.inMemoryStore.loadByCorrelationId(correlationId, options);\n }\n\n async loadByAggregateId<T extends DomainEvent>(\n aggregateId: string,\n options?: {\n readonly afterSequence?: number;\n readonly limit?: number;\n }\n ): Promise<T[]> {\n // In a real implementation, this would query database\n return this.inMemoryStore.loadByAggregateId(aggregateId, options);\n }\n\n async subscribe<T extends Event>(\n filter: EventFilter<T>,\n handler: EventHandler<T>\n ): Promise<EventSubscription> {\n // In a real implementation, this might use database change streams\n return this.inMemoryStore.subscribe(filter, handler);\n }\n\n async getStats(): Promise<EventStoreStats> {\n // In a real implementation, this would query database statistics\n return this.inMemoryStore.getStats();\n }\n}\n\n/**\n * Event store factory\n */\nexport class EventStoreFactory {\n /**\n * Create event store based on configuration\n */\n static create(\n type: 'memory' | 'persistent' = 'memory',\n options: {\n maxEvents?: number;\n } = {}\n ): EventStore {\n switch (type) {\n case 'memory':\n return new InMemoryEventStore(options.maxEvents);\n case 'persistent':\n return new PersistentEventStore();\n default:\n throw new Error(`Unknown event store type: ${type}`);\n }\n }\n}\n\n/**\n * Event store builder for fluent configuration\n */\nexport class EventStoreBuilder {\n private type: 'memory' | 'persistent' = 'memory';\n private maxEvents = 100000;\n\n /**\n * Set store type\n */\n withType(type: 'memory' | 'persistent'): this {\n this.type = type;\n return this;\n }\n\n /**\n * Set max events for in-memory store\n */\n withMaxEvents(maxEvents: number): this {\n this.maxEvents = maxEvents;\n return this;\n }\n\n /**\n * Build the event store\n */\n build(): EventStore {\n return EventStoreFactory.create(this.type, {\n maxEvents: this.maxEvents,\n });\n }\n}\n\n/**\n * Create event store builder\n */\nexport function createEventStore(): EventStoreBuilder {\n return new EventStoreBuilder();\n}\n","/**\n * NextRush v2 Event System Integration\n *\n * Complete event-driven architecture with CQRS, Event Sourcing,\n * and pipeline processing capabilities.\n *\n * @version 2.0.0\n * @author NextRush Core Team\n */\n\nimport { performance } from 'node:perf_hooks';\n\nimport type {\n BaseEventMetadata,\n Command,\n DomainEvent,\n Event,\n EventHandler,\n EventHandlerDefinition,\n EventMetrics,\n EventPipelineConfig,\n EventStore,\n EventSubscription,\n Query,\n SystemEvent,\n} from '../../types/events';\n\nimport {\n NextRushEventEmitter,\n createDomainEvent,\n createEvent,\n createEventMetadata,\n} from './event-emitter';\nimport { EventStoreFactory } from './event-store';\n\n/**\n * Command handler type\n */\nexport type CommandHandler<TCommand extends Command, TResult = void> = (\n command: TCommand\n) => Promise<TResult> | TResult;\n\n/**\n * Query handler type\n */\nexport type QueryHandler<TQuery extends Query, TResult = unknown> = (\n query: TQuery\n) => Promise<TResult> | TResult;\n\n/**\n * Event system configuration\n */\nexport interface EventSystemConfig {\n /** Enable event store persistence */\n readonly enableEventStore?: boolean;\n /** Event store type */\n readonly eventStoreType?: 'memory' | 'persistent';\n /** Maximum events for in-memory store */\n readonly maxStoredEvents?: number;\n /** Enable performance monitoring */\n readonly enableMonitoring?: boolean;\n /** Default event handler timeout */\n readonly defaultTimeout?: number;\n /** Maximum concurrent event processing */\n readonly maxConcurrency?: number;\n}\n\n/**\n * Complete event system with CQRS and Event Sourcing\n */\nexport class NextRushEventSystem {\n private readonly eventEmitter: NextRushEventEmitter;\n private readonly eventStore?: EventStore;\n private readonly commandHandlers = new Map<string, CommandHandler<Command>>();\n private readonly queryHandlers = new Map<string, QueryHandler<Query>>();\n private readonly config: Required<EventSystemConfig>;\n private systemSubscriptions: EventSubscription[] = []; // Track system subscriptions\n\n constructor(config: EventSystemConfig = {}) {\n this.config = {\n enableEventStore: config.enableEventStore ?? true,\n eventStoreType: config.eventStoreType ?? 'memory',\n maxStoredEvents: config.maxStoredEvents ?? 100000,\n enableMonitoring: config.enableMonitoring ?? true,\n defaultTimeout: config.defaultTimeout ?? 5000,\n maxConcurrency: config.maxConcurrency ?? 100,\n };\n\n this.eventEmitter = new NextRushEventEmitter();\n this.eventEmitter.setMonitoring(this.config.enableMonitoring);\n\n if (this.config.enableEventStore) {\n this.eventStore = EventStoreFactory.create(this.config.eventStoreType, {\n maxEvents: this.config.maxStoredEvents,\n });\n\n // Auto-persist events to store\n const subscription = this.eventEmitter.subscribe(\n '*',\n this.persistEventHandler.bind(this)\n );\n this.systemSubscriptions.push(subscription); // Track as system subscription\n }\n }\n\n // ==================== Event Operations ====================\n\n /**\n * Emit an event\n */\n async emit<T extends Event>(event: T): Promise<void> {\n await this.eventEmitter.emitEvent(event);\n }\n\n /**\n * Create and emit an event\n */\n async emitEvent<T extends Event>(\n type: T['type'],\n data: T['data'],\n metadata?: Partial<BaseEventMetadata>\n ): Promise<void> {\n const event = createEvent<T>(type, data, metadata);\n await this.emit(event);\n }\n\n /**\n * Create and emit a domain event\n */\n async emitDomainEvent<T extends DomainEvent>(\n type: T['type'],\n data: T['data'],\n aggregateId: string,\n aggregateType: string,\n sequenceNumber: number,\n metadata?: Partial<BaseEventMetadata>\n ): Promise<void> {\n const event = createDomainEvent<T>(\n type,\n data,\n aggregateId,\n aggregateType,\n sequenceNumber,\n metadata\n );\n await this.emit(event);\n }\n\n /**\n * Subscribe to events\n */\n subscribe<T extends Event>(\n eventType: string,\n handler: EventHandler<T>\n ): EventSubscription {\n return this.eventEmitter.subscribe(eventType, handler);\n }\n\n /**\n * Subscribe with options\n */\n subscribeWithOptions<T extends Event>(\n eventType: string,\n definition: EventHandlerDefinition<T>\n ): EventSubscription {\n return this.eventEmitter.subscribeWithOptions(eventType, definition);\n }\n\n /**\n * Unsubscribe from events\n */\n async unsubscribeAll(eventType: string): Promise<void> {\n await this.eventEmitter.unsubscribeAll(eventType);\n }\n\n // ==================== Pipeline Operations ====================\n\n /**\n * Add event pipeline\n */\n addPipeline<T extends Event>(\n eventType: string,\n pipeline: EventPipelineConfig<T>\n ): void {\n this.eventEmitter.addPipeline(eventType, pipeline);\n }\n\n /**\n * Remove event pipeline\n */\n removePipeline(eventType: string, pipelineName: string): void {\n this.eventEmitter.removePipeline(eventType, pipelineName);\n }\n\n /**\n * Get pipeline names\n */\n getPipelineNames(eventType: string): string[] {\n return this.eventEmitter.getPipelineNames(eventType);\n }\n\n // ==================== CQRS Operations ====================\n\n /**\n * Register command handler\n */\n registerCommandHandler<TCommand extends Command, TResult = void>(\n commandType: string,\n handler: CommandHandler<TCommand, TResult>\n ): void {\n this.commandHandlers.set(\n commandType,\n handler as unknown as CommandHandler<Command>\n );\n }\n\n /**\n * Execute command\n */\n async executeCommand<TCommand extends Command, TResult = void>(\n command: TCommand\n ): Promise<TResult> {\n const handler = this.commandHandlers.get(command.type);\n if (!handler) {\n throw new Error(\n `No handler registered for command type: ${command.type}`\n );\n }\n\n const startTime = performance.now();\n\n try {\n // Emit command started event\n await this.emitSystemEvent('command.started', {\n commandType: command.type,\n commandId: command.metadata.id,\n correlationId: command.metadata.correlationId,\n source: command.metadata.source,\n });\n\n const result = await Promise.resolve(handler(command as never));\n\n // Emit command completed event\n await this.emitSystemEvent('command.completed', {\n commandType: command.type,\n commandId: command.metadata.id,\n correlationId: command.metadata.correlationId,\n executionTime: performance.now() - startTime,\n });\n\n return result as TResult;\n } catch (error) {\n // Emit command failed event\n await this.emitSystemEvent('command.failed', {\n commandType: command.type,\n commandId: command.metadata.id,\n correlationId: command.metadata.correlationId,\n error: {\n name: (error as Error).name,\n message: (error as Error).message,\n stack: (error as Error).stack,\n },\n executionTime: performance.now() - startTime,\n });\n\n throw error;\n }\n }\n\n /**\n * Register query handler\n */\n registerQueryHandler<TQuery extends Query, TResult = unknown>(\n queryType: string,\n handler: QueryHandler<TQuery, TResult>\n ): void {\n this.queryHandlers.set(\n queryType,\n handler as unknown as QueryHandler<Query>\n );\n }\n\n /**\n * Execute query\n */\n async executeQuery<TQuery extends Query, TResult = unknown>(\n query: TQuery\n ): Promise<TResult> {\n const handler = this.queryHandlers.get(query.type);\n if (!handler) {\n throw new Error(`No handler registered for query type: ${query.type}`);\n }\n\n const startTime = performance.now();\n\n try {\n // Emit query started event\n await this.emitSystemEvent('query.started', {\n queryType: query.type,\n queryId: query.metadata.id,\n correlationId: query.metadata.correlationId,\n source: query.metadata.source,\n });\n\n const result = await Promise.resolve(handler(query as never));\n\n // Emit query completed event\n await this.emitSystemEvent('query.completed', {\n queryType: query.type,\n queryId: query.metadata.id,\n correlationId: query.metadata.correlationId,\n executionTime: performance.now() - startTime,\n });\n\n return result as TResult;\n } catch (error) {\n // Emit query failed event\n await this.emitSystemEvent('query.failed', {\n queryType: query.type,\n queryId: query.metadata.id,\n correlationId: query.metadata.correlationId,\n error: {\n name: (error as Error).name,\n message: (error as Error).message,\n stack: (error as Error).stack,\n },\n executionTime: performance.now() - startTime,\n });\n\n throw error;\n }\n }\n\n // ==================== Event Sourcing Operations ====================\n\n /**\n * Load events for aggregate\n */\n async loadAggregateEvents<T extends DomainEvent>(\n aggregateId: string,\n options?: {\n readonly afterSequence?: number;\n readonly limit?: number;\n }\n ): Promise<T[]> {\n if (!this.eventStore) {\n throw new Error('Event store is not enabled');\n }\n\n return this.eventStore.loadByAggregateId(aggregateId, options);\n }\n\n /**\n * Load events by correlation ID\n */\n async loadCorrelatedEvents<T extends Event>(\n correlationId: string,\n options?: {\n readonly limit?: number;\n readonly offset?: number;\n }\n ): Promise<T[]> {\n if (!this.eventStore) {\n throw new Error('Event store is not enabled');\n }\n\n return this.eventStore.loadByCorrelationId(correlationId, options);\n }\n\n /**\n * Load events by type\n */\n async loadEventsByType<T extends Event>(\n eventType: string,\n options?: {\n readonly after?: Date;\n readonly before?: Date;\n readonly limit?: number;\n readonly offset?: number;\n }\n ): Promise<T[]> {\n if (!this.eventStore) {\n throw new Error('Event store is not enabled');\n }\n\n return this.eventStore.loadByType(eventType, options);\n }\n\n // ==================== Monitoring and Metrics ====================\n\n /**\n * Get event metrics\n */\n getMetrics(): EventMetrics {\n return this.eventEmitter.getMetrics();\n }\n\n /**\n * Get event store statistics\n */\n async getEventStoreStats() {\n if (!this.eventStore) {\n throw new Error('Event store is not enabled');\n }\n\n return this.eventStore.getStats();\n }\n\n /**\n * Get subscription count\n */\n getSubscriptionCount(eventType?: string): number {\n return this.eventEmitter.getSubscriptionCount(eventType);\n }\n\n /**\n * Enable/disable monitoring\n */\n setMonitoring(enabled: boolean): void {\n this.eventEmitter.setMonitoring(enabled);\n }\n\n // ==================== Lifecycle Operations ====================\n\n /**\n * Clear all events and subscriptions\n */\n async clear(): Promise<void> {\n await this.eventEmitter.clear();\n // Note: EventStore interface doesn't define clear method\n // In a real implementation, you would add this to the interface\n this.commandHandlers.clear();\n this.queryHandlers.clear();\n }\n\n /**\n * Shutdown the event system\n */\n async shutdown(): Promise<void> {\n await this.clear();\n this.eventEmitter.destroy();\n }\n\n // ==================== Utility Methods ====================\n\n /**\n * Create event with metadata\n */\n createEvent<T extends Event>(\n type: T['type'],\n data: T['data'],\n metadata?: Partial<BaseEventMetadata>\n ): T {\n return createEvent<T>(type, data, metadata);\n }\n\n /**\n * Create command with metadata\n */\n createCommand<T extends Command>(\n type: T['type'],\n data: T['data'],\n metadata?: Partial<BaseEventMetadata>\n ): T {\n return createEvent<T>(type, data, {\n ...metadata,\n source: metadata?.source ?? 'command-handler',\n });\n }\n\n /**\n * Create query with metadata\n */\n createQuery<T extends Query>(\n type: T['type'],\n data: T['data'],\n metadata?: Partial<BaseEventMetadata>\n ): T {\n return createEvent<T>(type, data, {\n ...metadata,\n source: metadata?.source ?? 'query-handler',\n });\n }\n\n /**\n * Create domain event with aggregate info\n */\n createDomainEvent<T extends DomainEvent>(\n type: T['type'],\n data: T['data'],\n aggregateId: string,\n aggregateType: string,\n sequenceNumber: number,\n metadata?: Partial<BaseEventMetadata>\n ): T {\n const event = createEvent<T>(type, data, metadata);\n return {\n ...event,\n aggregateId,\n aggregateType,\n sequenceNumber,\n };\n }\n\n /**\n * Emit system event\n */\n private async emitSystemEvent(\n type: string,\n data: Record<string, unknown>\n ): Promise<void> {\n const systemEvent: SystemEvent = {\n type,\n data,\n metadata: createEventMetadata({\n source: 'nextrush-event-system',\n }),\n component: 'event-system',\n level: 'info',\n };\n\n await this.emit(systemEvent);\n }\n\n /**\n * Auto-persist events to store\n */\n private async persistEventHandler<T extends Event>(event: T): Promise<void> {\n if (this.eventStore) {\n try {\n await this.eventStore.save(event);\n } catch (error) {\n // Emit error event but don't throw to prevent cascading failures\n await this.emitSystemEvent('event-store.persist-failed', {\n eventType: event.type,\n eventId: event.metadata.id,\n error: {\n name: (error as Error).name,\n message: (error as Error).message,\n },\n });\n }\n } else {\n // eslint-disable-next-line no-console\n console.log('No event store available for persistence');\n }\n }\n\n // ==================== Generic Dispatch Method ====================\n\n /**\n * Generic dispatch method for commands, queries, or events\n * This provides a unified interface for different operation types\n */\n async dispatch<T = any>(operation: Command | Query | Event): Promise<T> {\n // Check if it's a command\n if (\n 'type' in operation &&\n 'metadata' in operation &&\n !('data' in operation && 'timestamp' in operation)\n ) {\n return (await this.executeCommand(operation as Command)) as T;\n }\n\n // Check if it's a query\n if (\n 'type' in operation &&\n 'metadata' in operation &&\n 'parameters' in operation\n ) {\n return (await this.executeQuery(operation as Query)) as T;\n }\n\n // Otherwise treat as event\n if (\n 'type' in operation &&\n 'data' in operation &&\n 'timestamp' in operation\n ) {\n await this.emit(operation as Event);\n return undefined as T;\n }\n\n throw new Error(\n 'Invalid operation type for dispatch. Must be Command, Query, or Event.'\n );\n }\n}\n\n/**\n * Event system builder for fluent configuration\n */\nexport class EventSystemBuilder {\n private config: EventSystemConfig = {};\n\n /**\n * Enable event store\n */\n withEventStore(\n type: 'memory' | 'persistent' = 'memory',\n maxEvents = 100000\n ): this {\n this.config = {\n ...this.config,\n enableEventStore: true,\n eventStoreType: type,\n maxStoredEvents: maxEvents,\n };\n return this;\n }\n\n /**\n * Disable event store\n */\n withoutEventStore(): this {\n this.config = {\n ...this.config,\n enableEventStore: false,\n };\n return this;\n }\n\n /**\n * Enable monitoring\n */\n withMonitoring(): this {\n this.config = {\n ...this.config,\n enableMonitoring: true,\n };\n return this;\n }\n\n /**\n * Disable monitoring\n */\n withoutMonitoring(): this {\n this.config = {\n ...this.config,\n enableMonitoring: false,\n };\n return this;\n }\n\n /**\n * Set default timeout\n */\n withTimeout(timeoutMs: number): this {\n this.config = {\n ...this.config,\n defaultTimeout: timeoutMs,\n };\n return this;\n }\n\n /**\n * Set max concurrency\n */\n withMaxConcurrency(maxConcurrency: number): this {\n this.config = {\n ...this.config,\n maxConcurrency,\n };\n return this;\n }\n\n /**\n * Build the event system\n */\n build(): NextRushEventSystem {\n return new NextRushEventSystem(this.config);\n }\n}\n\n/**\n * Create event system builder\n */\nexport function createEventSystem(): EventSystemBuilder {\n return new EventSystemBuilder();\n}\n\n/**\n * Create default event system\n */\nexport function createDefaultEventSystem(): NextRushEventSystem {\n return new NextRushEventSystem();\n}\n","/**\n * Simple Events API Facade for NextRush v2\n *\n * Provides a simple string-based event API that bridges to the sophisticated\n * CQRS/Event Sourcing implementation underneath.\n *\n * @version 2.0.0\n * @author NextRush Core Team\n */\n\nimport type { Event, EventSubscription } from '../../types/events';\nimport { createEventMetadata } from './event-emitter';\nimport type { NextRushEventSystem } from './event-system';\n\n/**\n * Simple event handler type for string-based events\n */\nexport type SimpleEventHandler = (data: any) => void | Promise<void>;\n\n/**\n * Simple event listener registration\n */\nexport interface SimpleEventListener {\n eventName: string;\n handler: SimpleEventHandler;\n subscription: EventSubscription;\n}\n\n/**\n * Simple Event implementation for string-based events\n */\nclass SimpleEvent implements Event {\n public readonly type: string;\n public readonly data: any;\n public readonly metadata: any;\n\n constructor(eventName: string, eventData: any) {\n this.type = eventName;\n this.data = eventData;\n this.metadata = createEventMetadata({\n id: `simple_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n timestamp: Date.now(),\n source: 'simple-api',\n correlationId: `simple_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n version: 1,\n });\n }\n\n // Keep name for backwards compatibility with simple API\n public get name(): string {\n return this.type;\n }\n}\n\n/**\n * Simple Events API Facade\n *\n * Provides familiar Express-style event API while leveraging\n * the sophisticated CQRS implementation underneath.\n */\nexport class SimpleEventsAPI {\n private listeners: Map<string, SimpleEventListener[]> = new Map();\n\n constructor(private eventSystem: NextRushEventSystem) {}\n\n /**\n * Emit a simple string-based event\n *\n * @param eventName - Event name\n * @param data - Event data\n * @returns Promise that resolves when event is processed\n *\n * @example\n * ```typescript\n * app.events.emit('user.created', { userId: '123', name: 'John' });\n * ```\n */\n async emit(eventName: string, data?: any): Promise<void> {\n // Create a SimpleEvent that implements our Event interface\n // Use undefined if no data is provided, otherwise use the provided data\n const eventData = arguments.length > 1 ? data : {};\n const event = new SimpleEvent(eventName, eventData);\n\n // Emit through the sophisticated event system\n await this.eventSystem.emit(event);\n }\n\n /**\n * Listen for a simple string-based event\n *\n * @param eventName - Event name to listen for\n * @param handler - Handler function\n * @returns Unsubscribe function\n *\n * @example\n * ```typescript\n * const unsubscribe = app.events.on('user.created', (data) => {\n * console.log('User created:', data.userId);\n * });\n * ```\n */\n on(eventName: string, handler: SimpleEventHandler): () => void {\n // Subscribe to SimpleEvent type through the sophisticated system\n const subscription = this.eventSystem.subscribe(\n eventName,\n async (event: SimpleEvent) => {\n // Only handle SimpleEvent instances with matching names\n if (event.type === eventName) {\n try {\n await handler(event.data);\n } catch (error) {\n // Log error but don't break other handlers\n console.error(`Error in event handler for '${eventName}':`, error);\n }\n }\n }\n );\n\n // Store listener reference for management\n const listener: SimpleEventListener = {\n eventName,\n handler,\n subscription,\n };\n\n if (!this.listeners.has(eventName)) {\n this.listeners.set(eventName, []);\n }\n this.listeners.get(eventName)!.push(listener);\n\n // Return unsubscribe function\n return () => {\n subscription.unsubscribe();\n\n // Remove from our tracking\n const eventListeners = this.listeners.get(eventName);\n if (eventListeners) {\n const index = eventListeners.indexOf(listener);\n if (index !== -1) {\n eventListeners.splice(index, 1);\n }\n if (eventListeners.length === 0) {\n this.listeners.delete(eventName);\n }\n }\n };\n }\n\n /**\n * Listen for a simple string-based event (once)\n *\n * @param eventName - Event name to listen for\n * @param handler - Handler function\n * @returns Promise that resolves with event data\n *\n * @example\n * ```typescript\n * const data = await app.events.once('user.created');\n * console.log('User created:', data.userId);\n * ```\n */\n once(eventName: string, handler?: SimpleEventHandler): Promise<any> {\n return new Promise(resolve => {\n const unsubscribe = this.on(eventName, async data => {\n unsubscribe();\n if (handler) {\n await handler(data);\n }\n resolve(data);\n });\n });\n }\n\n /**\n * Remove all listeners for an event\n *\n * @param eventName - Event name\n *\n * @example\n * ```typescript\n * app.events.off('user.created');\n * ```\n */\n off(eventName: string): void {\n const eventListeners = this.listeners.get(eventName);\n if (eventListeners) {\n // Unsubscribe all listeners\n eventListeners.forEach(listener => {\n listener.subscription.unsubscribe();\n });\n this.listeners.delete(eventName);\n }\n }\n\n /**\n * Remove all listeners\n *\n * @example\n * ```typescript\n * app.events.removeAllListeners();\n * ```\n */\n removeAllListeners(): void {\n for (const [eventName] of this.listeners) {\n this.off(eventName);\n }\n }\n\n /**\n * Get list of event names that have listeners\n *\n * @returns Array of event names\n */\n eventNames(): string[] {\n return Array.from(this.listeners.keys());\n }\n\n /**\n * Get number of listeners for an event\n *\n * @param eventName - Event name\n * @returns Number of listeners\n */\n listenerCount(eventName: string): number {\n const eventListeners = this.listeners.get(eventName);\n return eventListeners ? eventListeners.length : 0;\n }\n\n /**\n * Get maximum number of listeners (for compatibility)\n * Returns Infinity as we don't impose limits\n */\n getMaxListeners(): number {\n return Infinity;\n }\n\n /**\n * Set maximum number of listeners (for compatibility)\n * No-op as we don't impose limits\n */\n setMaxListeners(_n: number): this {\n return this;\n }\n}\n\n/**\n * Create a simple events API instance\n *\n * @param eventSystem - Underlying sophisticated event system\n * @returns Simple events API\n */\nexport function createSimpleEventsAPI(\n eventSystem: NextRushEventSystem\n): SimpleEventsAPI {\n return new SimpleEventsAPI(eventSystem);\n}\n","/**\n * Dependency Injection Pre-loader for NextRush v2\n *\n * Pre-resolves all singleton dependencies during app.listen()\n * Eliminates runtime resolution overhead for maximum performance\n *\n * @packageDocumentation\n */\n\nimport type { DIContainer } from '../di/container.js';\n\n/**\n * Pre-loaded dependency cache\n */\nexport interface PreloadedDependency<T = any> {\n token: string | symbol;\n instance: T;\n preloadedAt: number;\n resolutionTime: number;\n}\n\n/**\n * DI Pre-loading statistics\n */\nexport interface PreloadStats {\n totalPreloaded: number;\n totalTime: number;\n avgResolutionTime: number;\n cacheHitRate: number;\n}\n\n/**\n * DI Pre-loader - Resolves all dependencies before server starts\n */\nexport class DIPreloader {\n private preloadedCache = new Map<string | symbol, any>();\n private stats: PreloadStats = {\n totalPreloaded: 0,\n totalTime: 0,\n avgResolutionTime: 0,\n cacheHitRate: 1.0, // 100% after preload\n };\n\n /**\n * Pre-load all singleton services from container\n */\n public async preloadContainer(_container: DIContainer): Promise<void> {\n const startTime = Date.now();\n\n // For now, we manually track which services to preload\n // In production, we'd iterate through all registered singletons\n\n this.stats.totalTime = Date.now() - startTime;\n this.stats.avgResolutionTime =\n this.stats.totalPreloaded > 0\n ? this.stats.totalTime / this.stats.totalPreloaded\n : 0;\n }\n\n /**\n * Pre-load a specific service\n */\n public preloadService<T>(container: DIContainer, token: string | symbol): T {\n // Check cache first\n if (this.preloadedCache.has(token)) {\n return this.preloadedCache.get(token);\n }\n\n const startTime = Date.now();\n const instance = container.resolve<T>(token);\n const resolutionTime = Date.now() - startTime;\n\n this.preloadedCache.set(token, instance);\n this.stats.totalPreloaded++;\n this.stats.totalTime += resolutionTime;\n\n return instance;\n }\n\n /**\n * Get pre-loaded instance (O(1) lookup, no resolution)\n */\n public get<T>(token: string | symbol): T | undefined {\n return this.preloadedCache.get(token);\n }\n\n /**\n * Check if service is pre-loaded\n */\n public has(token: string | symbol): boolean {\n return this.preloadedCache.has(token);\n }\n\n /**\n * Get pre-loading statistics\n */\n public getStats(): PreloadStats {\n return { ...this.stats };\n }\n\n /**\n * Clear pre-loaded cache\n */\n public clear(): void {\n this.preloadedCache.clear();\n this.stats = {\n totalPreloaded: 0,\n totalTime: 0,\n avgResolutionTime: 0,\n cacheHitRate: 1.0,\n };\n }\n\n /**\n * Get cache size\n */\n public getCacheSize(): number {\n return this.preloadedCache.size;\n }\n}\n\n/**\n * Global DI pre-loader instance\n */\nexport const globalDIPreloader = new DIPreloader();\n\n/**\n * Create a new DI pre-loader\n */\nexport function createDIPreloader(): DIPreloader {\n return new DIPreloader();\n}\n","/**\n * Route Compiler for NextRush v2\n *\n * Pre-compiles routes during app.listen() for maximum performance:\n * - Generates optimized route lookup tables\n * - Inlines middleware chains\n * - Pre-extracts parameter patterns\n * - Eliminates runtime overhead\n *\n * @packageDocumentation\n */\n\nimport type { Context, Middleware, RouteHandler } from '@/types/context';\n\n/**\n * Compiled route entry with optimized execution path\n */\nexport interface CompiledRoute {\n /** Pre-compiled handler with inlined middleware */\n execute: (ctx: Context) => Promise<void>;\n /** Original handler for debugging */\n handler: RouteHandler;\n /** Parameter extraction function (pre-compiled) */\n extractParams: (path: string) => Record<string, string> | null;\n /** Route pattern */\n pattern: string;\n /** HTTP method */\n method: string;\n /** Compiled at timestamp */\n compiledAt: number;\n}\n\n/**\n * Route compilation statistics\n */\nexport interface CompilationStats {\n totalRoutes: number;\n compiledRoutes: number;\n inlinedMiddleware: number;\n compilationTime: number;\n memoryUsed: number;\n}\n\n/**\n * Route Compiler - Pre-compiles routes for ultra-fast execution\n */\nexport class RouteCompiler {\n private compiledRoutes = new Map<string, CompiledRoute>();\n private stats: CompilationStats = {\n totalRoutes: 0,\n compiledRoutes: 0,\n inlinedMiddleware: 0,\n compilationTime: 0,\n memoryUsed: 0,\n };\n\n /**\n * Compile a route with its middleware chain\n */\n public compileRoute(\n method: string,\n pattern: string,\n handler: RouteHandler,\n middleware: Middleware[] = []\n ): CompiledRoute {\n const startTime = Date.now();\n const routeKey = `${method}:${pattern}`;\n\n // Pre-compile parameter extractor\n const extractParams = this.compileParamExtractor(pattern);\n\n // Inline middleware chain with handler\n const execute = this.inlineMiddlewareChain(handler, middleware);\n\n const compiled: CompiledRoute = {\n execute,\n handler,\n extractParams,\n pattern,\n method,\n compiledAt: Date.now(),\n };\n\n this.compiledRoutes.set(routeKey, compiled);\n\n this.stats.totalRoutes++;\n this.stats.compiledRoutes++;\n this.stats.inlinedMiddleware += middleware.length;\n this.stats.compilationTime += Date.now() - startTime;\n\n return compiled;\n }\n\n /**\n * Get compiled route by key\n */\n public getCompiledRoute(\n method: string,\n pattern: string\n ): CompiledRoute | undefined {\n return this.compiledRoutes.get(`${method}:${pattern}`);\n }\n\n /**\n * Get all compiled routes\n */\n public getAllCompiledRoutes(): Map<string, CompiledRoute> {\n return new Map(this.compiledRoutes);\n }\n\n /**\n * Get compilation statistics\n */\n public getStats(): CompilationStats {\n return { ...this.stats };\n }\n\n /**\n * Clear compiled routes\n */\n public clear(): void {\n this.compiledRoutes.clear();\n this.stats = {\n totalRoutes: 0,\n compiledRoutes: 0,\n inlinedMiddleware: 0,\n compilationTime: 0,\n memoryUsed: 0,\n };\n }\n\n /**\n * Pre-compile parameter extractor function\n * Generates optimized param extraction based on route pattern\n */\n private compileParamExtractor(\n pattern: string\n ): (path: string) => Record<string, string> | null {\n const segments = pattern.split('/').filter(Boolean);\n const paramIndices: Array<{ index: number; name: string }> = [];\n\n // Find parameter positions\n segments.forEach((segment, index) => {\n if (segment.startsWith(':')) {\n paramIndices.push({\n index,\n name: segment.slice(1),\n });\n }\n });\n\n // No params? Return fast path\n if (paramIndices.length === 0) {\n return () => ({});\n }\n\n // Generate optimized extractor\n return (path: string) => {\n const pathSegments = path.split('/').filter(Boolean);\n const params: Record<string, string> = {};\n\n // Direct indexed access - O(1) per param\n for (const { index, name } of paramIndices) {\n const value = pathSegments[index];\n if (value === undefined) {\n return null;\n }\n params[name] = value;\n }\n\n return params;\n };\n }\n\n /**\n * Inline middleware chain into single optimized function\n * Eliminates dispatch overhead and function call stack\n *\n * SMART: Detects if handler is sync or async and optimizes accordingly\n */\n private inlineMiddlewareChain(\n handler: RouteHandler,\n middleware: Middleware[]\n ): (ctx: Context) => Promise<void> {\n // No middleware? Optimize based on handler type\n if (middleware.length === 0) {\n // Check if handler is async\n const isAsync =\n handler.constructor.name === 'AsyncFunction' ||\n handler.toString().includes('async ') ||\n handler.toString().includes('await ');\n\n if (isAsync) {\n return async (ctx: Context) => {\n await handler(ctx);\n };\n } else {\n // Sync handler - minimal Promise overhead\n return async (ctx: Context) => {\n handler(ctx);\n };\n }\n }\n\n // Single middleware? Inline it directly\n if (middleware.length === 1) {\n const mw = middleware[0]!;\n return async (ctx: Context) => {\n await mw(ctx, async () => {\n await handler(ctx);\n });\n };\n }\n\n // Multiple middleware: Create optimized execution chain\n // Most routes have async handlers, so default to async path\n return async (ctx: Context) => {\n let index = -1;\n\n const dispatch = async (i: number): Promise<void> => {\n if (i <= index) {\n throw new Error('next() called multiple times');\n }\n index = i;\n\n if (i < middleware.length) {\n const mw = middleware[i]!;\n await mw(ctx, () => dispatch(i + 1));\n } else {\n await handler(ctx);\n }\n };\n\n await dispatch(0);\n };\n }\n\n /**\n * Advanced: Analyze middleware for sync/async and inline accordingly\n * TODO: Use this for future optimizations to inline sync middleware\n */\n // @ts-expect-error - Reserved for future use\n private analyzeMiddleware(middleware: Middleware[]): {\n sync: Middleware[];\n async: Middleware[];\n } {\n const sync: Middleware[] = [];\n const async: Middleware[] = [];\n\n for (const mw of middleware) {\n // Check if middleware is async (returns Promise)\n const isAsync =\n mw.constructor.name === 'AsyncFunction' ||\n mw.toString().includes('async');\n\n if (isAsync) {\n async.push(mw);\n } else {\n sync.push(mw);\n }\n }\n\n return { sync, async };\n }\n}\n\n/**\n * Global route compiler instance\n */\nexport const globalRouteCompiler = new RouteCompiler();\n\n/**\n * Create a new route compiler\n */\nexport function createRouteCompiler(): RouteCompiler {\n return new RouteCompiler();\n}\n","/**\n * Application Compiler for NextRush v2\n *\n * Orchestrates pre-compilation of routes, middleware, and dependencies\n * during app.listen() for maximum runtime performance.\n *\n * @packageDocumentation\n */\n\nimport type { DIContainer } from '../di/container.js';\nimport type { OptimizedRouter } from '../router/optimized-router.js';\nimport { DIPreloader } from './di-preloader.js';\nimport { RouteCompiler } from './route-compiler.js';\n\n/**\n * Overall compilation statistics\n */\nexport interface CompilerStats {\n routes: {\n total: number;\n compiled: number;\n inlinedMiddleware: number;\n };\n dependencies: {\n preloaded: number;\n resolutionTime: number;\n };\n compilation: {\n totalTime: number;\n startedAt: number;\n completedAt: number;\n };\n performance: {\n estimatedSpeedup: string;\n optimizationLevel: 'none' | 'basic' | 'aggressive' | 'maximum';\n };\n}\n\n/**\n * Application Compiler - Pre-compiles entire app for production\n */\nexport class ApplicationCompiler {\n private routeCompiler: RouteCompiler;\n private diPreloader: DIPreloader;\n private isCompiled = false;\n private stats: CompilerStats | null = null;\n\n constructor() {\n this.routeCompiler = new RouteCompiler();\n this.diPreloader = new DIPreloader();\n }\n\n /**\n * Compile the entire application\n */\n public async compile(\n router: OptimizedRouter,\n container?: DIContainer\n ): Promise<CompilerStats> {\n if (this.isCompiled) {\n return this.stats!;\n }\n\n const startTime = Date.now();\n\n // Step 1: Compile routes\n const routeStats = await this.compileRoutes(router);\n\n // Step 2: Pre-load dependencies\n let diStats = { preloaded: 0, resolutionTime: 0 };\n if (container) {\n diStats = await this.preloadDependencies(container);\n }\n\n const totalTime = Date.now() - startTime;\n\n // Calculate optimization level\n const optimizationLevel = this.calculateOptimizationLevel(\n routeStats.compiled,\n routeStats.inlinedMiddleware,\n diStats.preloaded\n );\n\n // Estimate performance improvement\n const estimatedSpeedup = this.estimateSpeedup(optimizationLevel);\n\n this.stats = {\n routes: routeStats,\n dependencies: diStats,\n compilation: {\n totalTime,\n startedAt: startTime,\n completedAt: Date.now(),\n },\n performance: {\n estimatedSpeedup,\n optimizationLevel,\n },\n };\n\n this.isCompiled = true;\n\n return this.stats;\n }\n\n /**\n * Compile all routes from router\n */\n private async compileRoutes(router: OptimizedRouter): Promise<{\n total: number;\n compiled: number;\n inlinedMiddleware: number;\n }> {\n const routes = router.getRoutes();\n let compiled = 0;\n let inlinedMiddleware = 0;\n\n for (const [routeKey, routeData] of routes) {\n const [method, pattern] = routeKey.split(':');\n if (!method || !pattern) continue;\n\n const middleware = routeData.middleware || [];\n\n // Compile the route\n const compiledRoute = this.routeCompiler.compileRoute(\n method,\n pattern,\n routeData.handler,\n middleware\n );\n\n // 🔥 INJECT compiled handler into router!\n router.setCompiledHandler(method, pattern, compiledRoute.execute);\n\n compiled++;\n inlinedMiddleware += middleware.length;\n }\n\n return {\n total: routes.size,\n compiled,\n inlinedMiddleware,\n };\n }\n\n /**\n * Pre-load all dependencies\n */\n private async preloadDependencies(container: DIContainer): Promise<{\n preloaded: number;\n resolutionTime: number;\n }> {\n const startTime = Date.now();\n await this.diPreloader.preloadContainer(container);\n\n const stats = this.diPreloader.getStats();\n return {\n preloaded: stats.totalPreloaded,\n resolutionTime: Date.now() - startTime,\n };\n }\n\n /**\n * Calculate optimization level based on compilation results\n */\n private calculateOptimizationLevel(\n compiledRoutes: number,\n inlinedMiddleware: number,\n preloadedDeps: number\n ): 'none' | 'basic' | 'aggressive' | 'maximum' {\n const score = compiledRoutes * 2 + inlinedMiddleware + preloadedDeps;\n\n if (score === 0) return 'none';\n if (score < 10) return 'basic';\n if (score < 50) return 'aggressive';\n return 'maximum';\n }\n\n /**\n * Estimate performance speedup based on optimization level\n */\n private estimateSpeedup(\n level: 'none' | 'basic' | 'aggressive' | 'maximum'\n ): string {\n const speedups = {\n none: '1x (no optimization)',\n basic: '1.3-1.5x faster',\n aggressive: '1.8-2.2x faster',\n maximum: '2.5-3x faster',\n };\n\n return speedups[level];\n }\n\n /**\n * Get compiled route\n */\n public getCompiledRoute(method: string, pattern: string) {\n return this.routeCompiler.getCompiledRoute(method, pattern);\n }\n\n /**\n * Get pre-loaded dependency\n */\n public getPreloadedDependency<T>(token: string | symbol): T | undefined {\n return this.diPreloader.get<T>(token);\n }\n\n /**\n * Check if application is compiled\n */\n public isApplicationCompiled(): boolean {\n return this.isCompiled;\n }\n\n /**\n * Get compilation statistics\n */\n public getStats(): CompilerStats | null {\n return this.stats;\n }\n\n /**\n * Reset compilation state\n */\n public reset(): void {\n this.routeCompiler.clear();\n this.diPreloader.clear();\n this.isCompiled = false;\n this.stats = null;\n }\n}\n\n/**\n * Create a new application compiler\n */\nexport function createApplicationCompiler(): ApplicationCompiler {\n return new ApplicationCompiler();\n}\n","/**\n * NextRush v2 - Main Entry Point\n *\n * @packageDocumentation\n */\n\n// Core exports\nexport { createApp } from '@/core/app/application';\nexport { createContext } from '@/core/app/context';\n\n// Type exports\nexport type {\n Application,\n Context,\n DotfilesPolicy,\n Middleware,\n Next,\n RouteConfig,\n RouteHandler,\n Router,\n StaticFilesOptions,\n StatsLike,\n TemplateHelper,\n TemplatePluginOptions,\n TemplateRenderOptions,\n WebSocketPluginOptions,\n WSConnection,\n WSHandler,\n WSMiddleware,\n} from '@/types/context';\n\nexport type { NextRushRequest, NextRushResponse } from '@/types/http';\n\n// Error exports\nexport {\n AuthenticationError,\n AuthenticationExceptionFilter,\n AuthorizationError,\n AuthorizationExceptionFilter,\n BadRequestError,\n ConflictError,\n DatabaseError,\n ErrorFactory,\n ForbiddenError,\n GlobalExceptionFilter,\n InternalServerError,\n MethodNotAllowedError,\n NetworkError,\n NextRushError,\n NotFoundError,\n NotFoundExceptionFilter,\n RateLimitError,\n RateLimitExceptionFilter,\n ServiceUnavailableError,\n TimeoutError,\n TooManyRequestsError,\n UnauthorizedError,\n UnprocessableEntityError,\n ValidationError,\n ValidationExceptionFilter,\n type ExceptionFilter,\n} from '@/errors/custom-errors';\n\n// Logger Plugin exports\nexport {\n ConsoleTransport,\n createDevLogger,\n createMinimalLogger,\n createProdLogger,\n FileTransport,\n HttpTransport,\n LoggerPlugin,\n LogLevel,\n StreamTransport,\n type LogEntry,\n type LoggerConfig,\n type Transport,\n} from '@/plugins/logger';\n\n// Static Files Plugin\nexport { StaticFilesPlugin } from '@/plugins/static-files/static-files.plugin';\n\n// Template Plugin\nexport { TemplatePlugin } from '@/plugins/template/template.plugin';\n\n// WebSocket Plugin\nexport {\n hasWebSocketSupport,\n WebSocketPlugin,\n withWebSocket,\n type WebSocketApplication,\n type WSContext,\n} from '@/plugins/websocket';\n\n// Middleware exports\nexport { smartBodyParser as bodyParser } from '@/core/middleware/body-parser';\nexport { compression } from '@/core/middleware/compression';\nexport { cors } from '@/core/middleware/cors';\nexport { helmet } from '@/core/middleware/helmet';\nexport { logger } from '@/core/middleware/logger';\nexport { rateLimit } from '@/core/middleware/rate-limiter';\nexport { requestId } from '@/core/middleware/request-id';\nexport { timer } from '@/core/middleware/timer';\n\n// Utility exports\nexport { RequestEnhancer } from '@/core/enhancers/request-enhancer';\nexport { ResponseEnhancer } from '@/core/enhancers/response-enhancer';\nexport { createRouter } from '@/core/router';\n\n// Version info\nexport const VERSION = '2.0.0-alpha.1';\nexport const NODE_VERSION = '>=18.0.0';\n\n// Import createApp for default export\nimport { createApp } from '@/core/app/application';\n\n// Default export for convenience\nexport default {\n createApp,\n VERSION,\n NODE_VERSION,\n} as const;\n","import { createReadStream, promises as fsp } from 'node:fs';\nimport { extname, normalize, resolve, sep } from 'node:path';\nimport type { Context } from '../../types/context';\nimport type { StaticFilesPlugin } from './static-files.plugin';\n\nexport interface StatsLike {\n size: number;\n mtime: Date;\n isFile(): boolean;\n isDirectory(): boolean;\n}\n\nexport function stripPrefix(pathname: string, prefix: string): string {\n if (!prefix) return pathname;\n return pathname === prefix ? '/' : pathname.slice(prefix.length);\n}\n\nexport function safeJoin(root: string, urlPath: string): string | null {\n const cleaned = normalize(urlPath).replace(/^\\/+/, '');\n const abs = resolve(root, cleaned);\n if (cleaned.startsWith('..') || cleaned.includes(`..${sep}`)) {\n return null;\n }\n if (!abs.startsWith(root + sep) && abs !== root) {\n return null;\n }\n return abs;\n}\n\nexport async function statSafe(path: string): Promise<StatsLike | null> {\n try {\n const s = await fsp.stat(path);\n return {\n size: s.size,\n mtime: s.mtime,\n isFile: () => s.isFile(),\n isDirectory: () => s.isDirectory(),\n } satisfies StatsLike;\n } catch {\n return null;\n }\n}\n\nexport function generateETag(stat: StatsLike): string {\n const base = `${stat.size}-${stat.mtime.getTime()}`;\n let hash = 2166136261;\n for (let i = 0; i < base.length; i++) {\n hash ^= base.charCodeAt(i);\n hash = (hash * 16777619) >>> 0;\n }\n return `\"${hash.toString(16)}\"`;\n}\n\nexport function isFresh(ctx: Context, stat: StatsLike): boolean {\n const ifNoneMatch = ctx.headers['if-none-match'];\n const ifModifiedSince = ctx.headers['if-modified-since'];\n const etag = generateETag(stat);\n if (typeof ifNoneMatch === 'string' && ifNoneMatch === etag) return true;\n if (typeof ifModifiedSince === 'string') {\n const since = Date.parse(ifModifiedSince);\n if (!Number.isNaN(since) && stat.mtime.getTime() <= since) return true;\n }\n return false;\n}\n\nexport function fallbackMime(ext: string): string {\n switch (ext) {\n case '.html':\n return 'text/html';\n case '.css':\n return 'text/css';\n case '.js':\n return 'application/javascript';\n case '.json':\n return 'application/json';\n case '.txt':\n return 'text/plain';\n case '.png':\n return 'image/png';\n case '.jpg':\n case '.jpeg':\n return 'image/jpeg';\n case '.gif':\n return 'image/gif';\n case '.svg':\n return 'image/svg+xml';\n default:\n return 'application/octet-stream';\n }\n}\n\nexport function setCommonHeaders(\n ctx: Context,\n absolutePath: string,\n stat: StatsLike,\n options: StaticFilesPlugin['options']\n): void {\n const ext = extname(absolutePath).toLowerCase();\n const contentType = (ctx.res as any).getContentTypeFromExtension\n ? (ctx.res as any).getContentTypeFromExtension(ext)\n : fallbackMime(ext);\n if (contentType) ctx.res.setHeader('Content-Type', contentType);\n ctx.res.setHeader('Content-Length', String(stat.size));\n ctx.res.setHeader('Last-Modified', stat.mtime.toUTCString());\n const etag = generateETag(stat);\n ctx.res.setHeader('ETag', etag);\n if (options.maxAge > 0) {\n const parts = [\n 'public',\n `max-age=${Math.floor(options.maxAge)}`,\n options.immutable ? 'immutable' : undefined,\n ].filter(Boolean) as string[];\n ctx.res.setHeader('Cache-Control', parts.join(', '));\n }\n options.setHeaders?.(ctx, absolutePath, stat);\n}\n\nexport function parseRange(\n range: string,\n size: number\n): { start: number; end: number } {\n const spec = range.replace(/^bytes=/, '');\n const [startStr, endStr] = spec.split('-');\n let start = startStr ? parseInt(startStr, 10) : NaN;\n let end = endStr ? parseInt(endStr, 10) : NaN;\n if (Number.isNaN(start)) {\n const suffix = Number.isNaN(end) ? 0 : end;\n start = Math.max(0, size - suffix);\n end = size - 1;\n } else if (Number.isNaN(end)) {\n end = size - 1;\n }\n if (start < 0) start = 0;\n if (end >= size) end = size - 1;\n return { start, end };\n}\n\nexport async function sendFile(\n ctx: Context,\n absolutePath: string,\n stat: StatsLike,\n options: StaticFilesPlugin['options']\n): Promise<void> {\n if (isFresh(ctx, stat)) {\n setCommonHeaders(ctx, absolutePath, stat, options);\n ctx.res.statusCode = 304;\n ctx.res.end();\n return;\n }\n const range =\n typeof ctx.headers['range'] === 'string' ? ctx.headers['range'] : undefined;\n if (range && range.startsWith('bytes=')) {\n const { start, end } = parseRange(range, stat.size);\n if (start >= 0 && end >= start && end < stat.size) {\n setCommonHeaders(ctx, absolutePath, stat, options);\n ctx.res.setHeader('Accept-Ranges', 'bytes');\n ctx.res.setHeader('Content-Range', `bytes ${start}-${end}/${stat.size}`);\n ctx.res.setHeader('Content-Length', String(end - start + 1));\n ctx.res.statusCode = 206;\n (ctx.res as any).flushHeaders?.();\n if (ctx.method === 'HEAD') {\n ctx.res.end();\n return;\n }\n const stream = createReadStream(absolutePath, { start, end });\n stream.on('error', () =>\n ctx.res.statusCode === 200 ? ctx.res.status(500).end() : ctx.res.end()\n );\n stream.pipe(ctx.res);\n return;\n }\n ctx.res.statusCode = 416;\n ctx.res.setHeader('Content-Range', `bytes */${stat.size}`);\n ctx.res.end();\n return;\n }\n setCommonHeaders(ctx, absolutePath, stat, options);\n (ctx.res as any).flushHeaders?.();\n if (ctx.method === 'HEAD') {\n ctx.res.end();\n return;\n }\n const stream = createReadStream(absolutePath);\n stream.on('error', () =>\n ctx.res.statusCode === 200 ? ctx.res.status(500).end() : ctx.res.end()\n );\n stream.pipe(ctx.res);\n}\n","/**\n * Static Files Plugin for NextRush v2\n *\n * Express/Koa/Fastify-inspired static file serving with strong DX and security.\n *\n * - Prefix-based mounting (virtual path)\n * - Safe path resolution (prevents traversal)\n * - ETag/Last-Modified + 304 handling\n * - Range requests (single range)\n * - Cache-Control with maxAge/immutable\n * - HEAD support\n * - Optional index.html serving and directory redirect\n * - Dotfiles policy (ignore/deny/allow)\n * - Optional custom header hook\n *\n * @packageDocumentation\n */\n\nimport { BasePlugin } from '@/plugins/core/base-plugin';\nimport type {\n Application,\n Context,\n DotfilesPolicy,\n Middleware,\n StaticFilesOptions,\n StatsLike,\n} from '@/types/context';\nimport { join, resolve, sep } from 'node:path';\nimport { safeJoin, sendFile, statSafe, stripPrefix } from './static-utils';\n\ntype NormalizedStaticFilesOptions = {\n root: string;\n prefix: `/${string}` | '';\n index: string | false;\n fallthrough: boolean;\n redirect: boolean;\n maxAge: number;\n immutable: boolean;\n dotfiles: DotfilesPolicy;\n extensions: string[];\n setHeaders?: (ctx: Context, absolutePath: string, stat: StatsLike) => void;\n};\n\n/**\n * StaticFilesPlugin\n */\nexport class StaticFilesPlugin extends BasePlugin {\n public override name = 'StaticFilesPlugin';\n public override version = '2.0.0-alpha.1';\n public override description =\n 'High-performance static assets server with strong DX';\n\n private options!: NormalizedStaticFilesOptions;\n\n constructor(private readonly userOptions: StaticFilesOptions) {\n super();\n }\n\n public override onInstall(app: Application): void {\n this.options = this.normalizeOptions(this.userOptions);\n const middleware = this.createStaticMiddleware(this.options);\n app.use(middleware);\n }\n\n private normalizeOptions(\n options: StaticFilesOptions\n ): NormalizedStaticFilesOptions {\n if (!options.root) {\n throw new Error('[StaticFilesPlugin] \"root\" directory is required');\n }\n const rootResolved = resolve(options.root);\n const normalized: NormalizedStaticFilesOptions = {\n root: rootResolved,\n prefix: options.prefix === '/' ? '' : (options.prefix ?? ''),\n index: options.index === undefined ? 'index.html' : options.index,\n fallthrough: options.fallthrough ?? false,\n redirect: options.redirect ?? true,\n maxAge: Math.max(0, options.maxAge ?? 0),\n immutable: options.immutable ?? false,\n dotfiles: options.dotfiles ?? 'ignore',\n extensions: options.extensions ?? [],\n };\n if (typeof options.setHeaders === 'function') {\n normalized.setHeaders = options.setHeaders;\n }\n return normalized;\n }\n\n private createStaticMiddleware(\n options: StaticFilesPlugin['options']\n ): Middleware {\n const { root, prefix } = options;\n\n return async (ctx, next) => {\n // Only handle GET/HEAD\n if (ctx.method !== 'GET' && ctx.method !== 'HEAD') {\n return next();\n }\n\n // Prefix check\n if (\n prefix &&\n !ctx.path.startsWith(prefix + (prefix.endsWith('/') ? '' : '/')) &&\n ctx.path !== prefix\n ) {\n return next();\n }\n\n // Map URL path to filesystem path\n const urlPath = stripPrefix(ctx.path, prefix);\n const decodedPath = decodeURIComponent(urlPath);\n\n // Early traversal guard (defense-in-depth)\n if (\n decodedPath.includes('/..') ||\n decodedPath.startsWith('..') ||\n decodedPath.includes('..' + sep)\n ) {\n return this.failOrNext(ctx, next, 403, 'Forbidden');\n }\n\n const joined = safeJoin(root, decodedPath);\n if (!joined) {\n return this.failOrNext(ctx, next, 403, 'Forbidden');\n }\n let candidate: string = joined;\n\n // Initial stat attempt\n let stat: StatsLike | null = await statSafe(candidate);\n\n // If not found, try extension fallbacks (e.g. request for \"/test\" -> test.html)\n if (!stat && options.extensions.length > 0) {\n for (const ext of options.extensions) {\n const withExt = candidate + ext;\n const extStat = await statSafe(withExt);\n if (extStat) {\n stat = extStat;\n candidate = withExt;\n break;\n }\n }\n }\n\n // Directory handling\n if (stat?.isDirectory()) {\n // Redirect to add trailing slash if enabled and missing\n if (options.redirect && !ctx.path.endsWith('/')) {\n const location = ctx.path + '/';\n ctx.res.status(301).setHeader('Location', location);\n ctx.res.end();\n return;\n }\n\n if (options.index) {\n const indexPath = join(candidate, options.index);\n const indexStat = await statSafe(indexPath);\n if (indexStat?.isFile()) {\n return sendFile(ctx, indexPath, indexStat, options);\n }\n }\n\n return this.failOrNext(ctx, next, 403, 'Forbidden');\n }\n\n // Not found\n if (!stat) {\n return this.failOrNext(ctx, next, 404, 'Not Found');\n }\n\n // Dotfiles policy\n const baseName = candidate.split(sep).pop() || '';\n if (baseName.startsWith('.')) {\n if (options.dotfiles === 'deny') {\n return this.failOrNext(ctx, next, 403, 'Forbidden');\n }\n if (options.dotfiles === 'ignore') {\n return this.failOrNext(ctx, next, 404, 'Not Found');\n }\n }\n\n // Serve file\n return sendFile(ctx, candidate, stat, options);\n };\n }\n\n private async failOrNext(\n ctx: Context,\n next: () => Promise<void>,\n status: number,\n message: string\n ): Promise<void> {\n if (this.options.fallthrough) {\n return next();\n }\n ctx.res.status(status).json({ error: message });\n }\n}\n","import type { TemplatePluginOptions } from '@/types/context';\nimport { promises as fsp, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\ntype CompiledTemplate = (data: Record<string, unknown>) => string;\n\ntype ASTNode =\n | { type: 'text'; value: string }\n | { type: 'var'; expr: string; unescaped: boolean }\n | { type: 'if'; expr: string; consequent: ASTNode[]; alternate: ASTNode[] }\n | { type: 'each'; expr: string; body: ASTNode[] }\n | { type: 'with'; expr: string; body: ASTNode[] };\n\nexport class SimpleTemplateEngine {\n private helpers = new Map<\n string,\n (value: unknown, ...args: unknown[]) => unknown\n >();\n private partials = new Map<string, string>();\n private cache = new Map<string, CompiledTemplate>();\n private viewsDir?: string;\n private cacheEnabled: boolean;\n private enableFilePartials: boolean;\n private partialExt: string;\n\n constructor(options: TemplatePluginOptions = {}) {\n this.viewsDir = options.viewsDir ?? '';\n this.cacheEnabled = options.cache !== false;\n this.enableFilePartials = options.enableFilePartials !== false;\n this.partialExt = options.partialExt ?? '.html';\n\n this.registerHelper('stripHTML', (value: unknown): string =>\n String(value ?? '').replace(/<[^>]*>/g, '')\n );\n this.registerHelper(\n 'json',\n (value: unknown): { __safe: true; value: string } => ({\n __safe: true,\n value: JSON.stringify(value, null, 2),\n })\n );\n this.registerHelper('upper', (value: unknown): string =>\n String(value ?? '').toUpperCase()\n );\n this.registerHelper('lower', (value: unknown): string =>\n String(value ?? '').toLowerCase()\n );\n this.registerHelper('date', (value: unknown, fmt?: unknown): string => {\n const d = value instanceof Date ? value : new Date(String(value ?? ''));\n if (Number.isNaN(d.getTime())) return '';\n const iso = d.toISOString();\n if (!fmt || typeof fmt !== 'string') return iso;\n return fmt\n .replace(/YYYY/g, String(d.getUTCFullYear()))\n .replace(/MM/g, String(d.getUTCMonth() + 1).padStart(2, '0'))\n .replace(/DD/g, String(d.getUTCDate()).padStart(2, '0'))\n .replace(/hh/g, String(d.getUTCHours()).padStart(2, '0'))\n .replace(/mm/g, String(d.getUTCMinutes()).padStart(2, '0'))\n .replace(/ss/g, String(d.getUTCSeconds()).padStart(2, '0'));\n });\n this.registerHelper(\n 'safe',\n (value: unknown): { __safe: true; value: string } => ({\n __safe: true,\n value: this.toString(value),\n })\n );\n\n if (options.helpers) {\n for (const [name, fn] of Object.entries(options.helpers))\n this.registerHelper(name, fn);\n }\n if (options.partials) {\n for (const [name, tpl] of Object.entries(options.partials))\n this.partials.set(name, tpl);\n }\n }\n\n public registerHelper(\n name: string,\n fn: (value: unknown, ...args: unknown[]) => unknown\n ): void {\n this.helpers.set(name, fn);\n }\n public registerPartial(name: string, template: string): void {\n this.partials.set(name, template);\n }\n\n public async render(\n templateOrName: string,\n data: Record<string, unknown> = {},\n options?: { layout?: string }\n ): Promise<string> {\n let html: string;\n if (\n this.viewsDir &&\n !templateOrName.includes('\\n') &&\n !templateOrName.includes('<') &&\n !templateOrName.includes('{{')\n ) {\n const filename = join(this.viewsDir, templateOrName);\n html = await this.renderFile(filename, data);\n } else {\n html = this.renderString(templateOrName, data);\n }\n if (options?.layout && this.viewsDir) {\n const layoutPath = join(this.viewsDir, options.layout);\n const layoutHtml = await fsp.readFile(layoutPath, 'utf8');\n return layoutHtml.replace(/{{{\\s*body\\s*}}}|{{\\s*body\\s*}}/g, () => html);\n }\n return html;\n }\n\n public async renderFile(\n filePath: string,\n data: Record<string, unknown> = {}\n ): Promise<string> {\n const key = `file:${filePath}`;\n let compiled = this.cache.get(key);\n if (!compiled || !this.cacheEnabled) {\n const source = await fsp.readFile(filePath, 'utf8');\n compiled = this.compile(source);\n if (this.cacheEnabled) this.cache.set(key, compiled);\n }\n return compiled(data);\n }\n\n public renderString(\n source: string,\n data: Record<string, unknown> = {}\n ): string {\n const key = `str:${source}`;\n let compiled = this.cache.get(key);\n if (!compiled || !this.cacheEnabled) {\n compiled = this.compile(source);\n if (this.cacheEnabled) this.cache.set(key, compiled);\n }\n return compiled(data);\n }\n\n private compile(source: string): CompiledTemplate {\n let tpl = source;\n const partialRe = /{{>\\s*([\\w-]+)\\s*}}/g;\n let guard = 0;\n while (partialRe.test(tpl) && guard++ < 10) {\n tpl = tpl.replace(partialRe, (_m, p1) => {\n const fromMap = this.partials.get(p1);\n if (fromMap) return fromMap;\n if (this.viewsDir && this.enableFilePartials) {\n try {\n const path = join(this.viewsDir!, `${p1}${this.partialExt}`);\n const content = readFileSync(path, 'utf8');\n return content;\n } catch {\n return '';\n }\n }\n return '';\n });\n }\n const ast = this.parse(tpl);\n return (ctx: Record<string, unknown>) => this.renderAST(ast, ctx).join('');\n }\n\n private parse(tpl: string): ASTNode[] {\n const nodes: ASTNode[] = [];\n let i = 0;\n const len = tpl.length;\n const parseBlock = (\n endMatcher: (tag: string) => boolean,\n allowElse = false\n ): { body: ASTNode[]; alternate: ASTNode[] } => {\n const body: ASTNode[] = [];\n const alternate: ASTNode[] = [];\n let active = body;\n while (i < len) {\n const open = tpl.indexOf('{{', i);\n if (open === -1) {\n active.push({ type: 'text', value: tpl.slice(i) });\n i = len;\n break;\n }\n if (open > i) active.push({ type: 'text', value: tpl.slice(i, open) });\n i = open;\n const isTriple = tpl[i + 2] === '{';\n const endDelim = isTriple ? '}}}' : '}}';\n const close = tpl.indexOf(endDelim, i + (isTriple ? 3 : 2));\n if (close === -1) {\n active.push({ type: 'text', value: tpl.slice(i) });\n i = len;\n break;\n }\n const tag = tpl.slice(i + (isTriple ? 3 : 2), close).trim();\n i = close + endDelim.length;\n if (tag.startsWith('/')) {\n if (endMatcher(tag.slice(1).trim())) break;\n active.push({ type: 'text', value: `{{${tag}}}` });\n continue;\n }\n if (allowElse && tag === 'else') {\n active = alternate;\n continue;\n }\n if (tag.startsWith('#')) {\n const [name, ...rest] = tag.slice(1).trim().split(/\\s+/);\n const expr = rest.join(' ');\n if (name === 'if') {\n const inner = parseBlock(t => t === 'if', true);\n active.push({\n type: 'if',\n expr,\n consequent: inner.body,\n alternate: inner.alternate,\n });\n continue;\n }\n if (name === 'each') {\n const inner = parseBlock(t => t === 'each');\n active.push({ type: 'each', expr, body: inner.body });\n continue;\n }\n if (name === 'with') {\n const inner = parseBlock(t => t === 'with');\n active.push({ type: 'with', expr, body: inner.body });\n continue;\n }\n active.push({ type: 'text', value: `{{#${name} ${expr}}}` });\n continue;\n }\n const unescaped = isTriple;\n active.push({ type: 'var', expr: tag, unescaped });\n }\n return { body, alternate };\n };\n while (i < len) {\n const open = tpl.indexOf('{{', i);\n if (open === -1) {\n nodes.push({ type: 'text', value: tpl.slice(i) });\n break;\n }\n if (open > i) nodes.push({ type: 'text', value: tpl.slice(i, open) });\n i = open;\n const isTriple = tpl[i + 2] === '{';\n const endDelim = isTriple ? '}}}' : '}}';\n const close = tpl.indexOf(endDelim, i + (isTriple ? 3 : 2));\n if (close === -1) {\n nodes.push({ type: 'text', value: tpl.slice(i) });\n break;\n }\n const tag = tpl.slice(i + (isTriple ? 3 : 2), close).trim();\n i = close + endDelim.length;\n if (tag.startsWith('#')) {\n const [name, ...rest] = tag.slice(1).trim().split(/\\s+/);\n const expr = rest.join(' ');\n if (name === 'if') {\n const inner = parseBlock(t => t === 'if', true);\n nodes.push({\n type: 'if',\n expr,\n consequent: inner.body,\n alternate: inner.alternate,\n });\n continue;\n }\n if (name === 'each') {\n const inner = parseBlock(t => t === 'each');\n nodes.push({ type: 'each', expr, body: inner.body });\n continue;\n }\n if (name === 'with') {\n const inner = parseBlock(t => t === 'with');\n nodes.push({ type: 'with', expr, body: inner.body });\n continue;\n }\n nodes.push({ type: 'text', value: `{{#${name} ${expr}}}` });\n continue;\n }\n if (tag.startsWith('/')) {\n nodes.push({ type: 'text', value: `{{${tag}}}` });\n continue;\n }\n const unescaped = isTriple;\n nodes.push({ type: 'var', expr: tag, unescaped });\n }\n return nodes;\n }\n\n private renderAST(nodes: ASTNode[], ctx: Record<string, unknown>): string[] {\n const out: string[] = [];\n for (const node of nodes) {\n switch (node.type) {\n case 'text':\n out.push(node.value);\n break;\n case 'var': {\n const s = this.evaluateExpression(node.expr, ctx, node.unescaped);\n out.push(s);\n break;\n }\n case 'if': {\n const cond = this.truthy(this.literalOrPath(ctx, node.expr));\n const chosen = cond ? node.consequent : node.alternate;\n out.push(...this.renderAST(chosen, ctx));\n break;\n }\n case 'each': {\n const iter = this.literalOrPath(ctx, node.expr) as unknown;\n if (Array.isArray(iter)) {\n for (let i = 0; i < iter.length; i++) {\n const item = iter[i];\n const child = this.childScope(ctx);\n (child as any)['this'] = item;\n (child as any)['@index'] = i;\n if (item && typeof item === 'object') {\n for (const k of Object.keys(item))\n (child as any)[k] = (item as any)[k];\n }\n out.push(...this.renderAST((node as any).body, child));\n }\n } else if (iter && typeof iter === 'object') {\n const dict = iter as Record<string, unknown>;\n const keys = Object.keys(dict);\n for (let i = 0; i < keys.length; i++) {\n const key: string = keys[i] as string;\n const item = dict[key];\n const child = this.childScope(ctx);\n (child as any)['this'] = item;\n (child as any)['@index'] = i;\n (child as any)['@key'] = key;\n if (item && typeof item === 'object') {\n for (const k of Object.keys(item))\n (child as any)[k] = (item as any)[k];\n }\n out.push(...this.renderAST((node as any).body, child));\n }\n }\n break;\n }\n case 'with': {\n const obj = this.literalOrPath(ctx, node.expr) as any;\n if (obj && typeof obj === 'object') {\n const child = this.childScope(ctx);\n for (const k of Object.keys(obj)) (child as any)[k] = obj[k];\n (child as any)['this'] = obj;\n out.push(...this.renderAST((node as any).body, child));\n }\n break;\n }\n }\n }\n return out;\n }\n\n private childScope(parent: Record<string, unknown>): Record<string, unknown> {\n return Object.create(parent);\n }\n\n private evaluateExpression(\n expr: string,\n ctx: Record<string, unknown>,\n unescaped: boolean\n ): string {\n const parts = this.tokenize(expr);\n if (parts.length === 0) return '';\n if (expr.includes('|')) {\n const [head, ...filters] = expr.split('|').map(s => s.trim());\n const headStr = (head ?? '') as string;\n let val = this.resolvePath(ctx, headStr);\n for (const f of filters) {\n const helper = this.helpers.get(f);\n if (helper) val = helper(val);\n }\n if (val && typeof val === 'object' && (val as any).__safe)\n return this.toString((val as any).value);\n return unescaped\n ? this.toString(val)\n : this.escapeHTML(this.toString(val));\n }\n const first = parts[0];\n if (!first) return '';\n if (this.helpers.has(first)) {\n const helper = this.helpers.get(first)!;\n const args = parts.slice(1).map(p => this.literalOrPath(ctx, p));\n const out = helper(args[0], ...args.slice(1));\n if (out && typeof out === 'object' && (out as any).__safe)\n return this.toString((out as any).value);\n return unescaped\n ? this.toString(out)\n : this.escapeHTML(this.toString(out));\n }\n const val = this.resolvePath(ctx, first as string);\n return unescaped ? this.toString(val) : this.escapeHTML(this.toString(val));\n }\n\n private tokenize(expr: string): string[] {\n const tokens: string[] = [];\n let cur = '';\n let inQuote: '\"' | \"'\" | null = null;\n for (let i = 0; i < expr.length; i++) {\n const ch = expr.charAt(i);\n if (inQuote) {\n if (ch === inQuote) {\n inQuote = null;\n } else {\n cur += ch;\n }\n continue;\n }\n if (ch === '\"' || ch === \"'\") {\n inQuote = ch as '\"' | \"'\";\n continue;\n }\n if (/\\s/.test(ch)) {\n if (cur) {\n tokens.push(cur);\n cur = '';\n }\n } else {\n cur += ch;\n }\n }\n if (cur) tokens.push(cur);\n return tokens;\n }\n\n private literalOrPath(ctx: Record<string, unknown>, token: string): unknown {\n if (token.startsWith('\"') && token.endsWith('\"')) return token.slice(1, -1);\n if (token.startsWith(\"'\") && token.endsWith(\"'\")) return token.slice(1, -1);\n if (token === 'true') return true;\n if (token === 'false') return false;\n if (token === 'null') return null;\n if (!Number.isNaN(Number(token))) return Number(token);\n return this.resolvePath(ctx, token);\n }\n\n private truthy(v: unknown): boolean {\n return !!(Array.isArray(v) ? v.length : v);\n }\n\n private resolvePath(ctx: Record<string, unknown>, path: string): unknown {\n if (!path) return '';\n const parts = path.split('.');\n let cur: any = ctx;\n for (const p of parts) {\n if (cur == null) return '';\n cur = cur[p];\n }\n return cur ?? '';\n }\n\n private toString(value: unknown): string {\n if (value == null) return '';\n return typeof value === 'string' ? value : String(value);\n }\n\n private escapeHTML(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n }\n}\n","/**\n * Template Plugin for NextRush v2\n *\n * Safe, minimal, helper-based HTML templating with auto-escaping.\n *\n * Features:\n * - Auto-escape by default; triple mustache {{{expr}}} to output raw\n * - Helpers: stripHTML, json, upper, lower, date, safe\n * - Partials: {{> partialName}} (inline or file-based when viewsDir is set)\n * - Nested path access: {{user.name}}, {{profile.bio}}\n * - File-based rendering when viewsDir provided; otherwise inline templates\n * - Simple cache of compiled templates (in-memory)\n * - Block syntax:\n * - Conditionals: {{#if cond}}...{{else}}...{{/if}}\n * - Loops: {{#each items}}...{{/each}} with {{this}}, {{@index}}, {{@key}}\n * - With: {{#with obj}}...{{/with}}\n * - Layouts (when viewsDir provided): render(template, data, { layout: 'layout.html' })\n */\nimport { BasePlugin } from '@/plugins/core/base-plugin';\nimport type {\n Application,\n Middleware,\n TemplatePluginOptions,\n} from '@/types/context';\nimport { SimpleTemplateEngine } from './engine/simple-engine';\n\nexport class TemplatePlugin extends BasePlugin {\n public override name = 'TemplatePlugin';\n public override version = '2.0.0-alpha.1';\n public override description =\n 'Safe, minimal HTML templating with helpers and partials';\n\n private engine: SimpleTemplateEngine;\n\n constructor(options: TemplatePluginOptions = {}) {\n super();\n this.engine = new SimpleTemplateEngine(options);\n }\n\n public override onInstall(app: Application): void {\n const middleware: Middleware = async (ctx, next) => {\n const boundRender = async (\n templateOrName: string,\n data?: Record<string, unknown>,\n options?: { layout?: string }\n ) => {\n const html = await this.engine.render(\n templateOrName,\n (data || {}) as Record<string, unknown>,\n options\n );\n ctx.res.setHeader('Content-Type', 'text/html');\n ctx.res.end(html);\n };\n (ctx.res as any).render = boundRender;\n (ctx as any).render = boundRender;\n await next();\n };\n\n app.use(middleware);\n }\n}\n","import type { WSConnection } from '@/types/context';\nimport { randomUUID } from 'node:crypto';\nimport { EventEmitter } from 'node:events';\nimport type { IncomingMessage } from 'node:http';\nimport type { Socket } from 'node:net';\nimport { WSRoomManager } from './room-manager';\n\nexport class RawWSConnection extends EventEmitter implements WSConnection {\n public id = randomUUID();\n public url: string;\n public isAlive = true;\n public lastPong = Date.now();\n private readonly socket: Socket;\n private readonly maxMessageSize: number;\n private readonly roomManager: WSRoomManager;\n\n constructor(\n socket: Socket,\n req: IncomingMessage,\n roomManager: WSRoomManager,\n maxMessageSize: number\n ) {\n super();\n this.socket = socket;\n this.url = req.url || '/';\n this.maxMessageSize = maxMessageSize;\n this.roomManager = roomManager;\n this.setupListeners();\n }\n\n send(data: string | Buffer): void {\n const frame = frameText(\n typeof data === 'string' ? Buffer.from(data) : data\n );\n this.socket.write(frame);\n }\n\n close(code = 1000, reason = 'Normal Closure'): void {\n try {\n const payload = Buffer.concat([\n Buffer.from([(code >> 8) & 0xff, code & 0xff]),\n Buffer.from(reason),\n ]);\n this.socket.write(frameClose(payload));\n } finally {\n this.isAlive = false;\n try {\n this.socket.destroy();\n } catch {\n /* noop */\n }\n this.emit('close', code, reason);\n }\n }\n\n join(room: string): void {\n this.roomManager.add(this, room);\n }\n leave(room: string): void {\n this.roomManager.remove(this, room);\n }\n\n onMessage(listener: (data: string | Buffer) => void): void {\n this.on('message', listener);\n }\n onClose(listener: (code: number, reason: string) => void): void {\n this.on('close', listener as any);\n }\n\n ping(): void {\n this.socket.write(framePing());\n }\n\n markAlive(): void {\n this.isAlive = true;\n this.lastPong = Date.now();\n }\n\n private setupListeners(): void {\n // Use ArrayBufferLike so both ArrayBuffer and SharedArrayBuffer backed Buffers are assignable\n let buffer: Buffer<ArrayBufferLike> = Buffer.alloc(\n 0\n ) as Buffer<ArrayBufferLike>;\n\n this.socket.on('data', chunk => {\n buffer = Buffer.concat([buffer, chunk]);\n while (true) {\n let parsed: { opcode: number; payload: Buffer; rest: Buffer } | null;\n try {\n parsed = parseFrame(buffer, this.maxMessageSize);\n } catch {\n // Message too large or malformed\n this.close(1009, 'Message too big');\n return;\n }\n if (!parsed) break;\n buffer = parsed.rest;\n const { opcode, payload } = parsed;\n // 0x1 text, 0x2 binary, 0x8 close, 0x9 ping, 0xA pong\n if (opcode === 0x1 || opcode === 0x2) {\n this.emit(\n 'message',\n opcode === 0x1 ? payload.toString('utf8') : payload\n );\n } else if (opcode === 0x9) {\n // ping -> pong\n this.socket.write(framePong(payload));\n } else if (opcode === 0xa) {\n this.markAlive();\n } else if (opcode === 0x8) {\n this.close(1000, 'Client close');\n }\n }\n });\n\n this.socket.on('close', () => {\n this.roomManager.leaveAll(this);\n this.emit('close', 1006, 'Abnormal Closure');\n });\n\n this.socket.on('error', () => {\n this.close(1011, 'Internal Error');\n });\n }\n}\n\n// Minimal framing helpers\nfunction frameHeader(finOpcode: number, payloadLen: number): Buffer {\n const header: number[] = [finOpcode, 0]; // server to client not masked\n if (payloadLen < 126) {\n header[1] = payloadLen;\n return Buffer.from(header);\n } else if (payloadLen < 65536) {\n header[1] = 126;\n const ext = Buffer.alloc(2);\n ext.writeUInt16BE(payloadLen, 0);\n return Buffer.concat([Buffer.from(header), ext]);\n } else {\n header[1] = 127;\n const ext = Buffer.alloc(8);\n ext.writeUInt32BE(0, 0);\n ext.writeUInt32BE(payloadLen, 4);\n return Buffer.concat([Buffer.from(header), ext]);\n }\n}\n\nfunction frameText(data: Buffer): Buffer {\n const header = frameHeader(0x80 | 0x1, data.length);\n return Buffer.concat([header, data]);\n}\nfunction framePing(): Buffer {\n return frameHeader(0x80 | 0x9, 0);\n}\nfunction framePong(data: Buffer): Buffer {\n return Buffer.concat([frameHeader(0x80 | 0xa, data.length), data]);\n}\nfunction frameClose(data: Buffer): Buffer {\n return Buffer.concat([frameHeader(0x80 | 0x8, data.length), data]);\n}\n\nfunction parseFrame(\n buf: Buffer,\n max: number\n): { opcode: number; payload: Buffer; rest: Buffer } | null {\n if (buf.length < 2) return null;\n const b0 = buf.readUInt8(0);\n const b1 = buf.readUInt8(1);\n const opcode = b0 & 0x0f;\n const masked = (b1 & 0x80) !== 0;\n let len = b1 & 0x7f;\n let off = 2;\n if (len === 126) {\n if (buf.length < off + 2) return null;\n len = buf.readUInt16BE(off);\n off += 2;\n } else if (len === 127) {\n if (buf.length < off + 8) return null;\n const hi = buf.readUInt32BE(off);\n const lo = buf.readUInt32BE(off + 4);\n off += 8;\n if (hi !== 0) throw new Error('payload too large');\n len = lo;\n }\n if (masked) {\n if (buf.length < off + 4) return null;\n }\n if (buf.length < off + (masked ? 4 : 0) + len) return null;\n const mask: Buffer | null = masked\n ? Buffer.from(buf.subarray(off, off + 4))\n : null;\n off += masked ? 4 : 0;\n const payload: Buffer = buf.subarray(off, off + len);\n if (masked && mask) {\n const m = mask as Buffer;\n for (let i = 0; i < payload.length; i++) {\n const mi = m.readUInt8(i & 3);\n const b = payload.readUInt8(i);\n payload.writeUInt8(b ^ mi, i);\n }\n }\n if (payload.length > max) throw new Error('Message too large');\n const rest: Buffer = buf.subarray(off + len);\n return { opcode, payload, rest };\n}\n","import type { WSConnection } from '@/types/context';\nimport { EventEmitter } from 'node:events';\n\nexport class WSRoomManager extends EventEmitter {\n private rooms = new Map<string, Set<WSConnection>>();\n\n add(socket: WSConnection, room: string): void {\n let set = this.rooms.get(room);\n if (!set) {\n set = new Set();\n this.rooms.set(room, set);\n this.emit('room:created', room);\n }\n set.add(socket);\n }\n\n remove(socket: WSConnection, room: string): void {\n const set = this.rooms.get(room);\n if (!set) return;\n set.delete(socket);\n if (set.size === 0) {\n this.rooms.delete(room);\n this.emit('room:destroyed', room);\n }\n }\n\n leaveAll(socket: WSConnection): void {\n for (const [room, set] of this.rooms) {\n if (set.delete(socket) && set.size === 0) {\n this.rooms.delete(room);\n this.emit('room:destroyed', room);\n }\n }\n }\n\n broadcast(room: string, data: string | Buffer, exclude?: WSConnection): void {\n const set = this.rooms.get(room);\n if (!set) return;\n for (const s of set) {\n if (exclude && s === exclude) continue;\n try {\n s.send(data);\n } catch {\n // Ignore send errors for individual connections\n }\n }\n }\n\n getRooms(): string[] {\n return Array.from(this.rooms.keys());\n }\n}\n","/**\n * WebSocket Plugin Type Augmentation\n *\n * This file provides type-safe WebSocket functionality through smart type casting\n * and utility types for perfect TypeScript intelligence.\n */\n\nimport type { Application, WSHandler, WSMiddleware } from '@/types/context';\n\n// Export a type that represents an Application with WebSocket capabilities guaranteed\nexport interface WebSocketApplication extends Application {\n // Override optional methods to be required\n ws: (path: string, handler: WSHandler) => WebSocketApplication;\n wsUse: (middleware: WSMiddleware) => WebSocketApplication;\n wsBroadcast: (message: string, room?: string) => WebSocketApplication;\n}\n\n// Type guard to check if WebSocket plugin is installed\nexport function hasWebSocketSupport(\n app: Application\n): app is WebSocketApplication {\n return 'ws' in app && typeof (app as any).ws === 'function';\n}\n\n// Smart type casting function for better DX\nexport function withWebSocket(app: Application): WebSocketApplication {\n if (!hasWebSocketSupport(app)) {\n throw new Error(\n 'WebSocket plugin not installed. Install WebSocketPlugin first.'\n );\n }\n return app;\n}\n","/**\n * Koa-style context types for NextRush v2\n *\n * @packageDocumentation\n */\n\nimport type { EnhancedBodyParserOptions } from '@/core/middleware/body-parser/types';\nimport type {\n CompressionOptions,\n CorsOptions,\n HelmetOptions,\n LoggerOptions,\n RateLimiterOptions,\n RequestIdOptions,\n TimerOptions,\n} from '@/core/middleware/types';\nimport type { ExceptionFilter } from '@/errors/custom-errors';\nimport type { CookieOptions } from '@/utils/cookies';\nimport { IncomingMessage, ServerResponse } from 'node:http';\nimport { ParsedUrlQuery } from 'node:querystring';\nimport { NextRushRequest } from './http';\n\n// ============================================================================\n// WebSocket Types - Centralized here for better IntelliSense\n// ============================================================================\n\n/**\n * WebSocket connection interface\n */\nexport interface WSConnection {\n /** Unique connection ID */\n id: string;\n /** WebSocket request URL */\n url: string;\n /** Connection alive status */\n isAlive: boolean;\n /** Last pong timestamp */\n lastPong: number;\n /** Send message to client */\n send(data: string | Buffer): void;\n /** Close connection */\n close(code?: number, reason?: string): void;\n /** Join a room */\n join(room: string): void;\n /** Leave a room */\n leave(room: string): void;\n /** Listen for incoming messages */\n onMessage(listener: (data: string | Buffer) => void): void;\n /** Listen for connection close */\n onClose(listener: (code: number, reason: string) => void): void;\n}\n\n/**\n * WebSocket route handler type\n */\nexport type WSHandler = (\n socket: WSConnection,\n req: IncomingMessage\n) => void | Promise<void>;\n\n/**\n * WebSocket middleware type\n */\nexport type WSMiddleware = (\n socket: WSConnection,\n req: IncomingMessage,\n next: () => void\n) => void | Promise<void>;\n\n/**\n * WebSocket plugin options\n */\nexport interface WebSocketPluginOptions {\n /** Accepted paths (exact or wildcard *) */\n path?: string | string[];\n /** Ping interval in milliseconds */\n heartbeatMs?: number;\n /** Close if no pong within this timeout */\n pongTimeoutMs?: number;\n /** Maximum concurrent connections */\n maxConnections?: number;\n /** Maximum message size in bytes */\n maxMessageSize?: number;\n /** Allowed origins for CORS */\n allowOrigins?: (string | RegExp)[];\n /** Custom client verification */\n verifyClient?: (req: IncomingMessage) => Promise<boolean> | boolean;\n /** Debug mode */\n debug?: boolean;\n}\n\n/**\n * Default WebSocket plugin options\n */\nexport const DEFAULT_WS_OPTIONS: Required<WebSocketPluginOptions> = {\n path: '/ws',\n heartbeatMs: 30000,\n pongTimeoutMs: 45000,\n maxConnections: 10000,\n maxMessageSize: 1 << 20, // 1MB\n allowOrigins: [],\n verifyClient: () => true,\n debug: false,\n};\n\n/**\n * Enhanced response object with Express-like methods\n */\nexport interface NextRushResponse extends ServerResponse {\n /** Send JSON response */\n json(data: unknown): NextRushResponse;\n /** Send HTML response */\n html(data: string): NextRushResponse;\n /** Send text response */\n text(data: string): NextRushResponse;\n /** Send CSV response */\n csv(data: string): NextRushResponse;\n /** Send XML response */\n xml(data: string): NextRushResponse;\n /** Send any data type response */\n send(data: string | Buffer | object): void;\n /** Stream response */\n stream(stream: NodeJS.ReadableStream, contentType?: string): void;\n /** Render HTML from a template string or a template name under viewsDir */\n render(\n templateOrName: string,\n data?: Record<string, unknown>,\n options?: { layout?: string }\n ): Promise<void>;\n /** Send file response (alias) */\n file(\n path: string,\n options?: { root?: string; etag?: boolean }\n ): NextRushResponse;\n /** Send file response */\n sendFile(\n path: string,\n options?: { root?: string; etag?: boolean }\n ): NextRushResponse;\n /** Send download response */\n download(path: string, filename?: string): NextRushResponse;\n /** Redirect response */\n redirect(url: string, status?: number): NextRushResponse;\n /** Permanent redirect (301) */\n redirectPermanent(url: string): NextRushResponse;\n /** Temporary redirect (307) */\n redirectTemporary(url: string): NextRushResponse;\n /** Set response status */\n status(code: number): NextRushResponse;\n /** Set response header */\n set(name: string, value: string | number | string[]): NextRushResponse;\n /** Set response header (alias) */\n header(field: string, value: string): NextRushResponse;\n /** Get response header */\n get(name: string): string | number | string[] | undefined;\n /** Remove response header */\n remove(name: string): NextRushResponse;\n /** Remove response header (implementation method) */\n removeHeader(field: string): NextRushResponse;\n /** Set response type */\n type(type: string): NextRushResponse;\n /** Set response length */\n length(length: number): NextRushResponse;\n /** Set response etag */\n etag(etag: string): NextRushResponse;\n /** Set response last modified */\n lastModified(date: Date): NextRushResponse;\n /** Set cookie */\n cookie(\n name: string,\n value: string,\n options?: CookieOptions\n ): NextRushResponse;\n /** Clear cookie */\n clearCookie(name: string, options?: CookieOptions): NextRushResponse;\n /** Set cache headers */\n cache(seconds: number): NextRushResponse;\n /** Disable caching */\n noCache(): NextRushResponse;\n /** Set CORS headers */\n cors(origin?: string): NextRushResponse;\n /** Set security headers */\n security(): NextRushResponse;\n /** Enable compression hint */\n compress(): NextRushResponse;\n /** Send success response */\n success(data: unknown, message?: string): void;\n /** Send error response */\n error(message: string, code?: number, details?: unknown): void;\n /** Send paginated response */\n paginate(data: unknown[], page: number, limit: number, total: number): void;\n /** Get content type from file extension */\n getContentTypeFromExtension(ext: string): string;\n /** Get smart content type from file path */\n getSmartContentType(filePath: string): string;\n /** Generate ETag from stats */\n generateETag(stats: unknown): string;\n /** Convert data to CSV */\n convertToCSV(data: unknown[]): string;\n /** Add timing header */\n time(label?: string): NextRushResponse;\n /** Get nested value from object */\n getNestedValue(obj: unknown, path: string): unknown;\n /** Check if value is truthy */\n isTruthy(value: unknown): boolean;\n}\n\n/**\n * Koa-style context interface\n */\nexport interface Context {\n /** Request object (Express-like) */\n req: NextRushRequest;\n /** Response object (Express-like) */\n res: NextRushResponse;\n /** Request body (Express-like) */\n body: unknown;\n /** Request method */\n method: string;\n /** Request URL */\n url: string;\n /** Request path */\n path: string;\n /** Request headers */\n headers: IncomingMessage['headers'];\n /** Query parameters */\n query: ParsedUrlQuery;\n /** Route parameters */\n params: Record<string, string>;\n /** Request ID for tracing */\n id: string | undefined;\n /** Request ID for logging (alternative to id) */\n requestId?: string;\n /** Request-specific logger */\n logger?: {\n log: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n };\n /** State object for middleware communication */\n state: Record<string, unknown>;\n /** Request start time */\n startTime: number;\n /** Get client IP */\n ip: string;\n /** Check if request is secure */\n secure: boolean;\n /** Request protocol */\n protocol: string;\n /** Request hostname */\n hostname: string;\n /** Request host */\n host: string;\n /** Request origin */\n origin: string;\n /** Request href */\n href: string;\n /** Request search */\n search: string;\n /** Request search params */\n searchParams: URLSearchParams;\n /** Response status */\n status: number;\n /** Response headers */\n responseHeaders: Record<string, string | number | string[]>;\n\n // Context methods (Koa-style)\n /** Throw an error */\n throw(status: number, message?: string): never;\n /** Assert a condition */\n assert(\n condition: unknown,\n status: number,\n message?: string\n ): asserts condition;\n /** Check if response is fresh */\n fresh(): boolean;\n /** Check if response is stale */\n stale(): boolean;\n /** Check if request is idempotent */\n idempotent(): boolean;\n /** Check if request is cacheable */\n cacheable(): boolean;\n /** Set response header (Koa-style) */\n set(name: string, value: string | number | string[]): void;\n /** Send a file using the enhanced response */\n sendFile(path: string, options?: { root?: string; etag?: boolean }): void;\n /** Render HTML from a template string or a template name under viewsDir */\n render(\n templateOrName: string,\n data?: Record<string, unknown>,\n options?: { layout?: string }\n ): Promise<void>;\n\n // Convenience methods for better DX (most popular response methods)\n /** Send JSON response (convenience for ctx.res.json) */\n json(data: unknown): void;\n /** Send response data (convenience for ctx.res.send) */\n send(data: string | Buffer | object): void;\n /** Redirect response (convenience for ctx.res.redirect) */\n redirect(url: string, statusCode?: number): void;\n /** Set cookie (convenience for ctx.res.cookie) */\n cookie(\n name: string,\n value: string,\n options?: CookieOptions\n ): NextRushResponse;\n}\n\n/**\n * Next function for middleware\n */\nexport type Next = () => Promise<void>;\n\n/**\n * Middleware function type\n */\nexport type Middleware = (ctx: Context, next: Next) => Promise<void>;\n\n/**\n * Route handler function type\n */\nexport type RouteHandler = (ctx: Context) => Promise<void> | void;\n\n/**\n * Error handler function type\n */\nexport type ErrorHandler = (error: Error, ctx: Context) => Promise<void> | void;\n\n// ============================================================================\n// Plugin Types - Static Files\n// ============================================================================\n\n/** Dotfiles policy for static files */\nexport type DotfilesPolicy = 'ignore' | 'deny' | 'allow';\n\n/** Options for StaticFilesPlugin */\nexport interface StaticFilesOptions {\n /** Absolute directory to serve files from */\n root: string;\n /** URL prefix to mount under, e.g., \"/static\"; default: '' (root) */\n prefix?: `/${string}` | '';\n /** Default index file to serve for directories; set false to disable */\n index?: string | false;\n /** If true, call next() on 404 instead of sending 404; default: false */\n fallthrough?: boolean;\n /** If true, redirect directory request without trailing slash to slash; default: true */\n redirect?: boolean;\n /** Send Cache-Control max-age seconds; default: 0 (no explicit caching) */\n maxAge?: number;\n /** Add immutable directive to Cache-Control when maxAge > 0; default: false */\n immutable?: boolean;\n /** Control dotfiles serving; default: 'ignore' (404) */\n dotfiles?: DotfilesPolicy;\n /** Additional extensions to try when file not found (e.g., ['.html']); default: [] */\n extensions?: string[];\n /** Hook to customize headers */\n setHeaders?: (ctx: Context, absolutePath: string, stat: StatsLike) => void;\n}\n\n/** Stats-like interface for static files */\nexport interface StatsLike {\n isFile(): boolean;\n isDirectory(): boolean;\n size: number;\n mtime: Date;\n}\n\n// ============================================================================\n// Plugin Types - Template Engine\n// ============================================================================\n\n/** Options for TemplatePlugin */\nexport interface TemplatePluginOptions {\n /** Directory containing template files */\n viewsDir?: string;\n /** Enable template caching; default: true */\n cache?: boolean;\n /** Custom helper functions */\n helpers?: Record<string, (value: unknown, ...args: unknown[]) => unknown>;\n /** Preloaded partial templates */\n partials?: Record<string, string>;\n /** Enable loading partials from viewsDir; default: true */\n enableFilePartials?: boolean;\n /** File extension for partials; default: '.html' */\n partialExt?: string;\n}\n\n/** Template helper function type */\nexport type TemplateHelper = (value: unknown, ...args: unknown[]) => unknown;\n\n/** Template render options */\nexport interface TemplateRenderOptions {\n /** Layout template to wrap content in */\n layout?: string;\n}\n\n// ============================================================================\n// Plugin Types - END\n// ============================================================================\n\n/**\n * Route configuration object (Fastify-style)\n */\nexport interface RouteConfig {\n /** Route handler */\n handler: RouteHandler;\n /** Route middleware */\n middleware?: Middleware[];\n /** Route schema validation */\n schema?: {\n body?: Record<string, unknown>;\n query?: Record<string, unknown>;\n params?: Record<string, unknown>;\n response?: Record<string, unknown>;\n };\n /** Route options */\n options?: {\n /** Route name */\n name?: string;\n /** Route description */\n description?: string;\n /** Route tags */\n tags?: string[];\n /** Route version */\n version?: string;\n /** Route deprecated */\n deprecated?: boolean;\n /** Route summary */\n summary?: string;\n /** Route external docs */\n externalDocs?: {\n description: string;\n url: string;\n };\n };\n}\n\n/**\n * Route data with handler and middleware\n */\nexport interface RouteData {\n handler: RouteHandler;\n middleware: Middleware[];\n}\n\n/**\n * Router interface for modular routing\n */\nexport interface Router {\n /** Register GET route */\n get(path: string, handler: RouteHandler | RouteConfig): Router;\n /** Register POST route */\n post(path: string, handler: RouteHandler | RouteConfig): Router;\n /** Register PUT route */\n put(path: string, handler: RouteHandler | RouteConfig): Router;\n /** Register DELETE route */\n delete(path: string, handler: RouteHandler | RouteConfig): Router;\n /** Register PATCH route */\n patch(path: string, handler: RouteHandler | RouteConfig): Router;\n /** Register middleware */\n use(middleware: Middleware): Router;\n /** Register sub-router */\n use(prefix: string, router: Router): Router;\n /** Get router middleware */\n getMiddleware(): Middleware[];\n /** Get router routes */\n getRoutes(): Map<string, RouteData>;\n}\n\n/**\n * Application context interface\n */\nexport interface AppContext {\n /** Application instance */\n app: Application;\n /** Request context */\n ctx: Context;\n /** Error if any */\n error?: Error;\n}\n\n/**\n * Application interface (forward declaration)\n */\nexport interface Application {\n /** Register GET route */\n get(path: string, handler: RouteHandler | RouteConfig): Application;\n /** Register POST route */\n post(path: string, handler: RouteHandler | RouteConfig): Application;\n /** Register PUT route */\n put(path: string, handler: RouteHandler | RouteConfig): Application;\n /** Register DELETE route */\n delete(path: string, handler: RouteHandler | RouteConfig): Application;\n /** Register PATCH route */\n patch(path: string, handler: RouteHandler | RouteConfig): Application;\n /** Register middleware */\n use(middleware: Middleware): Application;\n /** Register router */\n use(prefix: string, router: Router): Application;\n /** Create router */\n router(): Router;\n /** Start the server */\n listen(port?: number, callback?: () => void): unknown;\n listen(port?: number, host?: string, callback?: () => void): unknown;\n /** Get the underlying HTTP server */\n getServer(): unknown;\n /** Gracefully shutdown the application */\n shutdown(): Promise<void>;\n\n // Middleware factory methods\n /** Create CORS middleware */\n cors(options?: CorsOptions): Middleware;\n /** Create helmet middleware */\n helmet(options?: HelmetOptions): Middleware;\n /** Create JSON body parser middleware */\n json(options?: EnhancedBodyParserOptions): Middleware;\n /** Create URL-encoded body parser middleware */\n urlencoded(options?: EnhancedBodyParserOptions): Middleware;\n /** Create text body parser middleware */\n text(options?: EnhancedBodyParserOptions): Middleware;\n /** Create rate limiter middleware */\n rateLimit(options?: RateLimiterOptions): Middleware;\n /** Create logger middleware */\n logger(options?: LoggerOptions): Middleware;\n /** Create compression middleware */\n compression(options?: CompressionOptions): Middleware;\n /** Create request ID middleware */\n requestId(options?: RequestIdOptions): Middleware;\n /** Create timer middleware */\n timer(options?: TimerOptions): Middleware;\n /** Create smart body parser middleware */\n smartBodyParser(options?: EnhancedBodyParserOptions): Middleware;\n /** Create exception filter middleware */\n exceptionFilter(filters?: ExceptionFilter[]): Middleware;\n\n // ============================================================================\n // Event System - Built-in core functionality\n // ============================================================================\n\n /** Simple Events API for Express-style event handling */\n events: {\n /** Emit a simple string-based event */\n emit(eventName: string, data?: any): Promise<void>;\n /** Listen for a simple string-based event */\n on(\n eventName: string,\n handler: (data: any) => void | Promise<void>\n ): () => void;\n /** Listen for a simple string-based event (once) */\n once(\n eventName: string,\n handler?: (data: any) => void | Promise<void>\n ): Promise<any>;\n /** Remove all listeners for an event */\n off(eventName: string): void;\n /** Remove all listeners */\n removeAllListeners(): void;\n /** Get list of event names that have listeners */\n eventNames(): string[];\n /** Get number of listeners for an event */\n listenerCount(eventName: string): number;\n /** Get maximum number of listeners */\n getMaxListeners(): number;\n /** Set maximum number of listeners */\n setMaxListeners(n: number): any;\n };\n\n /** Advanced Event System for CQRS and Event Sourcing */\n eventSystem: {\n /** Emit events */\n emit(event: any): Promise<void>;\n /** Subscribe to events */\n subscribe(\n eventType: string,\n handler: (event: any) => void | Promise<void>\n ): { unsubscribe(): void };\n /** Additional advanced methods available but not typed here for brevity */\n [key: string]: any;\n };\n\n /** Logger instance (set by LoggerPlugin) - overrides logger method when plugin is installed */\n loggerInstance?: {\n error: (message: string, context?: Record<string, unknown>) => void;\n warn: (message: string, context?: Record<string, unknown>) => void;\n info: (message: string, context?: Record<string, unknown>) => void;\n debug: (message: string, context?: Record<string, unknown>) => void;\n trace: (message: string, context?: Record<string, unknown>) => void;\n log: (message: string, context?: Record<string, unknown>) => void;\n };\n\n // ============================================================================\n // WebSocket Methods - Available when WebSocketPlugin is installed\n // ============================================================================\n\n /** Register a WebSocket route (exact path or with trailing * wildcard) */\n ws?: (path: string, handler: WSHandler) => Application;\n /** Register a WebSocket middleware executed before the handler */\n wsUse?: (middleware: WSMiddleware) => Application;\n /** Broadcast a message to all sockets or a specific room */\n wsBroadcast?: (message: string, room?: string) => Application;\n\n // ============================================================================\n // Static Files Methods - Available when StaticFilesPlugin is installed\n // ============================================================================\n\n /** Register a static files route */\n static?: (\n prefix: string,\n root: string,\n options?: StaticFilesOptions\n ) => Application;\n\n // ============================================================================\n // Template Methods - Available when TemplatePlugin is installed\n // ============================================================================\n\n /** Register template engine and view directory */\n setViewEngine?: (\n engine: string,\n viewsDir?: string,\n options?: TemplatePluginOptions\n ) => Application;\n /** Add template helper */\n helper?: (\n name: string,\n fn: (value: unknown, ...args: unknown[]) => unknown\n ) => Application;\n /** Add template partial */\n partial?: (name: string, template: string) => Application;\n}\n","import { createHash } from 'node:crypto';\nimport type { IncomingMessage } from 'node:http';\nimport type { Socket } from 'node:net';\n\nexport function verifyOrigin(\n req: IncomingMessage,\n allow: (string | RegExp)[]\n): boolean {\n if (!allow || allow.length === 0) return true;\n const origin = req.headers.origin;\n if (!origin) return false; // No origin header = reject when origins are specified\n return allow.some(rule =>\n typeof rule === 'string' ? rule === origin : rule.test(origin)\n );\n}\n\nexport function reject(socket: Socket, code: number, reason: string): void {\n const response =\n `HTTP/1.1 ${code} ${reason}\\r\\n` +\n 'Connection: close\\r\\n' +\n 'Content-Length: 0\\r\\n' +\n '\\r\\n';\n\n try {\n // Write response synchronously for immediate feedback\n socket.write(response);\n\n // Schedule cleanup after giving time for data to be sent\n // This ensures the response reaches the client before socket closes\n setImmediate(() => {\n try {\n socket.end();\n } catch {\n // Ignore errors\n }\n // Give a tiny bit more time before destroy\n setTimeout(() => {\n try {\n socket.destroy();\n } catch {\n // Ignore errors when destroying socket\n }\n }, 10);\n });\n } catch (error) {\n // If write fails, just destroy the socket\n console.error('Failed to reject WebSocket handshake:', error);\n try {\n socket.destroy();\n } catch {\n // Ignore errors\n }\n }\n}\n\nexport function performHandshake(\n req: IncomingMessage,\n socket: Socket,\n protocols?: string[]\n): boolean {\n const key = req.headers['sec-websocket-key'];\n if (!key || Array.isArray(key)) {\n reject(socket, 400, 'Bad Request');\n return false;\n }\n const accept = createHash('sha1')\n .update(key + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')\n .digest('base64');\n\n const protoHeader =\n protocols && protocols.length > 0\n ? `Sec-WebSocket-Protocol: ${protocols[0]}\\r\\n`\n : '';\n\n socket.write(\n 'HTTP/1.1 101 Switching Protocols\\r\\n' +\n 'Upgrade: websocket\\r\\n' +\n 'Connection: Upgrade\\r\\n' +\n `Sec-WebSocket-Accept: ${accept}\\r\\n` +\n protoHeader +\n '\\r\\n'\n );\n\n return true;\n}\n","/**\n * WebSocket Plugin for NextRush v2 - Context-based Architecture\n * Provides WebSocket functionality through context enhancement\n */\n\nimport { BasePlugin } from '@/plugins/core/base-plugin';\nimport type {\n Application,\n Context,\n Middleware,\n Next,\n WSConnection,\n WSHandler,\n WSMiddleware,\n WebSocketPluginOptions,\n} from '@/types/context';\nimport { DEFAULT_WS_OPTIONS } from '@/types/context';\nimport { createHash } from 'node:crypto';\nimport { IncomingMessage, Server } from 'node:http';\nimport { Socket } from 'node:net';\nimport { RawWSConnection } from './connection';\nimport { reject, verifyOrigin } from './handshake';\nimport { WSRoomManager } from './room-manager';\n\n/**\n * Enhanced Context with WebSocket functionality\n */\nexport interface WSContext extends Context {\n /** WebSocket connection (available when request is upgraded) */\n ws?: WSConnection;\n /** Check if request is WebSocket upgrade request */\n isWebSocket: boolean;\n /** WebSocket room manager */\n wsRooms: WSRoomManager;\n}\n\n/**\n * WebSocket Context for handlers\n */\nexport interface WebSocketContext {\n connection: WSConnection;\n path: string;\n query: Record<string, string>;\n headers: IncomingMessage['headers'];\n rooms: WSRoomManager;\n}\n\n/**\n * WebSocket Plugin for NextRush v2\n *\n * Enhances context with WebSocket functionality following v2 architecture patterns\n */\nexport class WebSocketPlugin extends BasePlugin {\n public override name = 'WebSocketPlugin';\n public override version = '2.0.0-alpha.1';\n public override description = 'WebSocket server with context integration';\n\n private options: Required<WebSocketPluginOptions>;\n private roomManager: WSRoomManager;\n private connections = new Set<WSConnection>();\n private routes = new Map<string, WSHandler>(); // Use routes for compatibility\n private middlewares: WSMiddleware[] = []; // Add middlewares for compatibility\n private heartbeatTimer: NodeJS.Timeout | null = null;\n\n constructor(options: WebSocketPluginOptions = {}) {\n super();\n\n this.options = {\n ...DEFAULT_WS_OPTIONS,\n ...options,\n } as Required<WebSocketPluginOptions>;\n\n this.roomManager = new WSRoomManager();\n }\n\n /**\n * Install WebSocket plugin - adds WebSocket middleware to app\n */\n public override onInstall(app: Application): void {\n // Add WebSocket middleware that enhances every context\n const websocketMiddleware: Middleware = async (\n ctx: Context,\n next: Next\n ) => {\n const wsCtx = ctx as WSContext;\n\n // Enhance context with WebSocket functionality\n wsCtx.isWebSocket = this.isWebSocketRequest(ctx.req);\n wsCtx.wsRooms = this.roomManager;\n\n // If this is a WebSocket upgrade request, handle it\n if (wsCtx.isWebSocket && this.matchPath(ctx.path)) {\n await this.handleWebSocketUpgrade(wsCtx);\n return; // Don't call next() for WebSocket upgrades\n }\n\n await next();\n };\n\n app.use(websocketMiddleware);\n\n // Add WebSocket methods to application (TypeScript will understand these as required after plugin install)\n (app as any).ws = (path: string, handler: WSHandler): Application => {\n this.routes.set(path, handler);\n return app;\n };\n\n (app as any).wsUse = (middleware: WSMiddleware): Application => {\n this.middlewares.push(middleware);\n return app;\n };\n\n (app as any).wsBroadcast = (\n message: string,\n room?: string\n ): Application => {\n this.broadcast(message, room);\n return app;\n };\n\n // Setup HTTP upgrade handling\n this.setupUpgradeHandler(app);\n\n // Start heartbeat timer\n this.startHeartbeat();\n }\n\n /**\n * Start heartbeat timer for connection cleanup\n */\n private startHeartbeat(): void {\n this.heartbeatTimer = setInterval(() => {\n const now = Date.now();\n const timeout = this.options.pongTimeoutMs;\n const toRemove: WSConnection[] = [];\n\n for (const connection of this.connections) {\n if (!connection.isAlive || now - connection.lastPong > timeout) {\n connection.close(1001, 'Ping timeout');\n toRemove.push(connection);\n this.roomManager.leaveAll(connection);\n }\n }\n\n // Remove dead connections\n for (const connection of toRemove) {\n this.connections.delete(connection);\n }\n }, this.options.heartbeatMs);\n }\n\n /**\n * Cleanup plugin resources\n */\n public cleanup(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n\n // Close all connections\n for (const connection of this.connections) {\n connection.close(1000, 'Server shutdown');\n }\n this.connections.clear();\n\n // Clear routes and middlewares\n this.routes.clear();\n this.middlewares.length = 0;\n }\n\n /**\n * Setup HTTP upgrade event handler\n */\n private setupUpgradeHandler(app: Application): void {\n const httpServer =\n (app as any).getServer?.() ?? (app as any).server ?? null;\n if (!httpServer) return;\n\n const server = httpServer as Server;\n server.on(\n 'upgrade',\n (req: IncomingMessage, socket: Socket, _head: Buffer) => {\n this.handleUpgrade(req, socket).catch(error => {\n console.error('WebSocket upgrade error:', error);\n this.rejectConnection(socket, 500, 'Internal Server Error');\n });\n }\n );\n }\n\n /**\n * Handle HTTP to WebSocket upgrade\n */\n private async handleUpgrade(\n req: IncomingMessage,\n socket: Socket\n ): Promise<void> {\n const url = new URL(req.url || '/', `http://${req.headers.host}`);\n const path = url.pathname;\n\n // Check if path matches registered WebSocket routes\n if (!this.matchPath(path)) {\n this.rejectConnection(socket, 404, 'WebSocket route not found');\n return;\n }\n\n // Verify WebSocket upgrade request\n if (!this.verifyUpgrade(req)) {\n this.rejectConnection(socket, 400, 'Bad WebSocket Request');\n return;\n }\n\n // Verify origin if configured\n if (!verifyOrigin(req, this.options.allowOrigins)) {\n this.rejectConnection(socket, 403, 'Origin Not Allowed');\n return;\n }\n\n // Verify client using custom verification if provided\n const verificationResult = await Promise.resolve(\n this.options.verifyClient(req)\n );\n if (!verificationResult) {\n this.rejectConnection(socket, 401, 'Unauthorized');\n return;\n }\n\n // Check connection limit\n if (this.connections.size >= this.options.maxConnections) {\n this.rejectConnection(socket, 503, 'Too Many Connections');\n return;\n }\n\n // Perform WebSocket handshake\n if (!this.performHandshake(req, socket)) {\n return; // Handshake handles rejection\n }\n\n // Create WebSocket connection\n const connection = new RawWSConnection(\n socket,\n req,\n this.roomManager,\n this.options.maxMessageSize\n );\n\n this.connections.add(connection);\n\n // Setup connection cleanup\n connection.on('close', () => {\n this.connections.delete(connection);\n this.roomManager.leaveAll(connection);\n });\n\n // Get WebSocket handler for this path\n let handler: WSHandler | undefined;\n\n // First try exact match\n if (this.routes.has(path)) {\n handler = this.routes.get(path);\n } else {\n // Try wildcard matches\n for (const [routePath, routeHandler] of this.routes.entries()) {\n if (routePath.endsWith('*')) {\n const prefix = routePath.slice(0, -1);\n if (path.startsWith(prefix)) {\n handler = routeHandler;\n break;\n }\n }\n }\n }\n\n if (handler) {\n // Execute middlewares before calling handler\n try {\n await this.executeMiddlewares(connection, req);\n // Call the WebSocket handler\n await handler(connection, req);\n } catch (error) {\n console.error('WebSocket handler/middleware error:', error);\n connection.close(1011, 'Internal Error');\n }\n }\n }\n\n /**\n * Execute WebSocket middlewares\n */\n private async executeMiddlewares(\n connection: WSConnection,\n req: IncomingMessage\n ): Promise<void> {\n for (const middleware of this.middlewares) {\n let nextCalled = false;\n const next = () => {\n nextCalled = true;\n };\n\n await Promise.resolve(middleware(connection, req, next));\n\n if (!nextCalled) {\n throw new Error('Middleware did not call next()');\n }\n }\n }\n\n /**\n * Handle WebSocket upgrade in middleware context\n */\n private async handleWebSocketUpgrade(ctx: WSContext): Promise<void> {\n // This method is called when a WebSocket upgrade is detected in middleware\n // The actual upgrade handling is done in the 'upgrade' event handler\n\n // Set appropriate headers to indicate upgrade will happen\n ctx.res.status(101);\n ctx.res.setHeader('Upgrade', 'websocket');\n ctx.res.setHeader('Connection', 'Upgrade');\n }\n\n /**\n * Verify WebSocket upgrade request\n */\n private verifyUpgrade(req: IncomingMessage): boolean {\n const upgrade = req.headers.upgrade;\n const connection = req.headers.connection;\n const key = req.headers['sec-websocket-key'];\n const version = req.headers['sec-websocket-version'];\n\n return !!(\n upgrade?.toLowerCase() === 'websocket' &&\n connection?.toLowerCase().includes('upgrade') &&\n key &&\n version === '13'\n );\n }\n\n /**\n * Perform WebSocket handshake\n */\n private performHandshake(req: IncomingMessage, socket: Socket): boolean {\n const key = req.headers['sec-websocket-key'];\n if (!key) return false;\n\n const acceptKey = this.generateAcceptKey(key);\n\n const responseHeaders = [\n 'HTTP/1.1 101 Switching Protocols',\n 'Upgrade: websocket',\n 'Connection: Upgrade',\n `Sec-WebSocket-Accept: ${acceptKey}`,\n '\\r\\n',\n ].join('\\r\\n');\n\n try {\n socket.write(responseHeaders);\n return true;\n } catch (error) {\n console.error('WebSocket handshake error:', error);\n return false;\n }\n }\n\n /**\n * Generate WebSocket accept key\n */\n private generateAcceptKey(key: string): string {\n const WEBSOCKET_MAGIC_STRING = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';\n return createHash('sha1')\n .update(key + WEBSOCKET_MAGIC_STRING)\n .digest('base64');\n }\n\n /**\n * Check if request is WebSocket upgrade request\n */\n private isWebSocketRequest(req: IncomingMessage): boolean {\n const upgrade = req.headers.upgrade;\n const connection = req.headers.connection;\n\n return !!(\n upgrade?.toLowerCase() === 'websocket' &&\n connection?.toLowerCase().includes('upgrade')\n );\n }\n\n /**\n * Check if path matches registered WebSocket routes\n */\n private matchPath(requestPath: string): boolean {\n // Check exact matches first\n if (this.routes.has(requestPath)) {\n return true;\n }\n\n // Handle both string and string array paths\n const paths = Array.isArray(this.options.path)\n ? this.options.path\n : [this.options.path];\n\n return paths.some((path: string) => {\n if (path === requestPath) return true;\n // Simple wildcard matching\n if (path.endsWith('*')) {\n const prefix = path.slice(0, -1);\n return requestPath.startsWith(prefix);\n }\n return false;\n });\n }\n\n /**\n * Reject WebSocket connection\n */\n private rejectConnection(\n socket: Socket,\n status: number,\n message: string\n ): void {\n reject(socket, status, message);\n }\n\n /**\n * Get all active connections\n */\n public getConnections(): WSConnection[] {\n return Array.from(this.connections);\n }\n\n /**\n * Broadcast message to all connections\n */\n public broadcast(message: string, room?: string): void {\n if (room) {\n this.roomManager.broadcast(room, message);\n } else {\n for (const connection of this.connections) {\n connection.send(message);\n }\n }\n }\n\n /**\n * Get connection statistics\n */\n public getStats() {\n return {\n totalConnections: this.connections.size,\n rooms: this.roomManager.getRooms(),\n handlers: this.routes.size,\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * NextRush - Minimal, Modular, Blazing Fast Node.js Framework\n *\n * This meta package provides the **functional** API for building Node.js APIs:\n * - Application creation (createApp)\n * - Routing (createRouter)\n * - Server start (listen)\n * - HTTP errors\n * - Essential types\n *\n * For the class-based paradigm (DI, decorators, controllers),\n * import from `nextrush/class` instead.\n *\n * For middleware, install separately:\n * - @nextrush/cors\n * - @nextrush/helmet\n * - @nextrush/body-parser\n * - @nextrush/rate-limit\n * - @nextrush/logger\n *\n * For other runtimes, install the appropriate adapter:\n * - @nextrush/adapter-bun\n * - @nextrush/adapter-deno\n * - @nextrush/adapter-edge\n *\n * @packageDocumentation\n * @module nextrush\n *\n * @example Quick Start (Functional)\n * ```typescript\n * import { createApp, createRouter, listen } from 'nextrush';\n *\n * const app = createApp();\n * const router = createRouter();\n *\n * router.get('/', (ctx) => {\n * ctx.json({ message: 'Hello NextRush!' });\n * });\n *\n * app.route('/', router);\n * listen(app, 3000);\n * ```\n *\n * @example With Middleware (install separately)\n * ```typescript\n * import { createApp, listen } from 'nextrush';\n * import { cors } from '@nextrush/cors';\n * import { json } from '@nextrush/body-parser';\n *\n * const app = createApp();\n * app.use(cors());\n * app.use(json());\n *\n * listen(app, 3000);\n * ```\n *\n * @example Class-Based (import from nextrush/class)\n * ```typescript\n * import { createApp, listen } from 'nextrush';\n * import { Controller, Get, Service, controllersPlugin } from 'nextrush/class';\n *\n * @Service()\n * class UserService {\n * findAll() { return [{ id: 1, name: 'Alice' }]; }\n * }\n *\n * @Controller('/users')\n * class UserController {\n * constructor(private users: UserService) {}\n *\n * @Get()\n * findAll() { return this.users.findAll(); }\n * }\n *\n * const app = createApp();\n * app.plugin(controllersPlugin({ root: './src' }));\n * listen(app, 3000);\n * ```\n */\n\n// ============================================\n// CORE: Application & Middleware Composition\n// ============================================\nexport { Application, compose, createApp } from '@nextrush/core';\nexport type { ApplicationOptions, ComposedMiddleware } from '@nextrush/core';\n\n// ============================================\n// ROUTER: Radix Tree Routing\n// ============================================\nexport { Router, createRouter } from '@nextrush/router';\nexport type { RouterOptions } from '@nextrush/router';\n\n// ============================================\n// ADAPTER: Node.js HTTP (Default Runtime)\n// ============================================\nexport { createHandler, listen, serve } from '@nextrush/adapter-node';\nexport type { ServeOptions, ServerInstance } from '@nextrush/adapter-node';\n\n// ============================================\n// ERRORS: HTTP Error Classes & Factory\n// ============================================\nexport {\n BadGatewayError,\n // 4xx Client Errors\n BadRequestError,\n ConflictError,\n ForbiddenError,\n GatewayTimeoutError,\n // Base\n HttpError,\n // 5xx Server Errors\n InternalServerError,\n MethodNotAllowedError,\n NextRushError,\n NotFoundError,\n NotImplementedError,\n ServiceUnavailableError,\n TooManyRequestsError,\n UnauthorizedError,\n UnprocessableEntityError,\n catchAsync,\n // Factory functions\n createError,\n // Error handling middleware\n errorHandler,\n isHttpError,\n notFoundHandler,\n} from '@nextrush/errors';\n\nexport type { ErrorHandlerOptions, HttpErrorOptions } from '@nextrush/errors';\n\n// ============================================\n// TYPES: Essential TypeScript Types\n// ============================================\nexport type {\n // Core types\n Context,\n // HTTP types\n HttpMethod,\n HttpStatusCode,\n Middleware,\n Next,\n Plugin,\n RouteHandler,\n // Runtime\n Runtime,\n} from '@nextrush/types';\n\n// HTTP constants\nexport { ContentType, HttpStatus } from '@nextrush/types';\n\n// ============================================\n// VERSION\n// ============================================\nexport const VERSION = '3.0.0';\n"],"mappings":";AAmFA,SAASA,aAAaC,SAASC,iBAAiB;AAMhD,SAASC,QAAQC,oBAAoB;AAMrC,SAASC,eAAeC,QAAQC,aAAa;AAM7C;EACEC;EAEAC;EACAC;EACAC;EACAC;EAEAC;EAEAC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EAEAC;EAEAC;EACAC;EACAC;OACK;AAsBP,SAASC,aAAaC,kBAAkB;AAKjC,IAAMC,UAAU;","names":["Application","compose","createApp","Router","createRouter","createHandler","listen","serve","BadGatewayError","BadRequestError","ConflictError","ForbiddenError","GatewayTimeoutError","HttpError","InternalServerError","MethodNotAllowedError","NextRushError","NotFoundError","NotImplementedError","ServiceUnavailableError","TooManyRequestsError","UnauthorizedError","UnprocessableEntityError","catchAsync","createError","errorHandler","isHttpError","notFoundHandler","ContentType","HttpStatus","VERSION"]}
|