azurajs 2.7.0 → 2.7.1

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/plugins/CORSPlugin.ts","../src/shared/plugins/RateLimitPlugin.ts","../src/types/utils/colors.type.ts","../src/types/utils/icons.type.ts","../src/utils/Logger.ts","../src/shared/plugins/ProxyPlugin.ts","../src/shared/plugins/SSEPlugin.ts","../src/shared/plugins/CompressionPlugin.ts","../src/shared/plugins/StaticPlugin.ts","../src/shared/plugins/HelmetPlugin.ts","../src/shared/plugins/CSRFPlugin.ts","../src/shared/plugins/MultipartPlugin.ts","../src/shared/plugins/TimeoutPlugin.ts","../src/shared/plugins/ETagPlugin.ts","../src/shared/plugins/SessionPlugin.ts","../src/shared/plugins/JWTPlugin.ts","../src/shared/plugins/BodyLimitPlugin.ts","../src/shared/plugins/HealthCheckPlugin.ts","../src/shared/plugins/RequestIdPlugin.ts","../src/shared/plugins/CircuitBreakerPlugin.ts"],"names":["timeout","https","http","createBrotliCompress","createGzip","createDeflate","resolve","join","stat","extname","etag","readFile","createHash","randomBytes","mkdir","createWriteStream","store","createHmac","timingSafeEqual"],"mappings":"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","file":"plugins.cjs","sourcesContent":["import type { HttpContext } from \"../../types/common.type\";\nimport type { CorsOptions } from \"../../types/plugins/cors.type\";\n\nexport function cors(opts: CorsOptions) {\n const { origin, methods, allowedHeaders } = opts;\n\n return (ctx: HttpContext, next: () => Promise<void>) => {\n ctx.response.setHeader(\n \"Access-Control-Allow-Origin\",\n Array.isArray(origin) ? origin.join(\",\") : origin,\n );\n ctx.response.setHeader(\n \"Access-Control-Allow-Methods\",\n Array.isArray(methods) ? methods.join(\",\") : methods,\n );\n ctx.response.setHeader(\n \"Access-Control-Allow-Headers\",\n Array.isArray(allowedHeaders) ? allowedHeaders.join(\",\") : allowedHeaders,\n );\n\n if (ctx.request.method === \"OPTIONS\") {\n ctx.response.writeHead(204);\n return ctx.response.end();\n }\n\n return next();\n };\n}\n","import type { HttpContext } from \"../../types/common.type\";\n\ninterface Entry {\n count: number;\n ts: number;\n}\n\nconst store = new Map<string, Entry>();\n\nexport function rateLimit(limit: number, ttl: number) {\n return async (ctx: HttpContext, next: () => Promise<void>) => {\n const ip = ctx.request.socket.remoteAddress;\n const now = Date.now();\n const entry = store.get(ip!) ?? { count: 0, ts: now };\n\n if (now - entry.ts > ttl) {\n entry.count = 1;\n entry.ts = now;\n } else {\n entry.count++;\n }\n\n store.set(ip!, entry);\n\n if (entry.count > limit) {\n ctx.response.status(429).send(\"Too many requests\");\n return;\n }\n\n await next();\n };\n}\n","/**\n * ANSI escape codes for text styling\n * These codes control text formatting in terminal output\n */\nexport const RESET = \"\\x1b[0m\"; // Reset all styles\nexport const BOLD = \"\\x1b[1m\"; // Bold/bright text\nexport const DIM = \"\\x1b[2m\"; // Dim/faded text\n\n/**\n * Predefined ANSI foreground colors\n * Includes standard and bright color variants\n */\nexport const ANSI_COLORS = {\n black: \"\\x1b[30m\",\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 gray: \"\\x1b[90m\",\n brightRed: \"\\x1b[91m\",\n brightGreen: \"\\x1b[92m\",\n brightYellow: \"\\x1b[93m\",\n brightBlue: \"\\x1b[94m\",\n brightMagenta: \"\\x1b[95m\",\n brightCyan: \"\\x1b[96m\",\n brightWhite: \"\\x1b[97m\",\n};\n\n/**\n * ANSI background color codes\n * Used for highlighting text with colored backgrounds\n */\nexport const BG_COLORS = {\n bgBlack: \"\\x1b[40m\",\n bgRed: \"\\x1b[41m\",\n bgGreen: \"\\x1b[42m\",\n bgYellow: \"\\x1b[43m\",\n bgBlue: \"\\x1b[44m\",\n bgMagenta: \"\\x1b[45m\",\n bgCyan: \"\\x1b[46m\",\n bgWhite: \"\\x1b[47m\",\n};\n\n/**\n * Default color mapping for each log level\n * Provides semantic color coding for different message types\n */\nexport const DEFAULT_COLORS = {\n debug: ANSI_COLORS.gray,\n info: ANSI_COLORS.cyan,\n success: ANSI_COLORS.brightGreen,\n warn: ANSI_COLORS.yellow,\n error: ANSI_COLORS.red,\n fatal: ANSI_COLORS.brightRed,\n trace: ANSI_COLORS.magenta,\n log: ANSI_COLORS.white,\n};\n","/**\n * Default emoji icons for each log level\n * Provides visual indicators to quickly identify message severity\n */\nexport const DEFAULT_ICONS = {\n debug: \"🐛\",\n info: \"ℹ️\",\n success: \"✅\",\n warn: \"⚠️\",\n error: \"❌\",\n fatal: \"💀\",\n trace: \"🔍\",\n log: \"📝\",\n arrow: \"➡️\",\n};\n","import type { LoggerConfig } from \"../types/logger.types\";\nimport {\n ANSI_COLORS,\n BG_COLORS,\n BOLD,\n DEFAULT_COLORS,\n DIM,\n RESET,\n} from \"../types/utils/colors.type\";\nimport { DEFAULT_ICONS } from \"../types/utils/icons.type\";\n\n/**\n * Global logger configuration\n * These settings apply to all logger calls unless overridden by instance-specific options\n */\nlet globalConfig: LoggerConfig = {\n showTimestamp: false,\n showIcon: true,\n timestampFormat: \"time\",\n prefix: \"Azura\",\n uppercase: true,\n bold: false,\n dim: false,\n};\n\n/**\n * Configure the logger globally\n * Updates default settings that apply to all subsequent log calls\n * @param config - Logger configuration options\n * @example\n * configureLogger({\n * showTimestamp: true,\n * timestampFormat: 'datetime',\n * bold: true,\n * prefix: 'MyApp'\n * });\n */\nexport function configureLogger(config: LoggerConfig): void {\n globalConfig = { ...globalConfig, ...config };\n}\n\n/**\n * Convert hexadecimal color code to ANSI escape sequence\n * @param hex - Hexadecimal color string (e.g., '#ff5733')\n * @returns ANSI color escape sequence for 24-bit RGB color\n * @example hexToAnsi('#00ff00') // Returns ANSI code for green\n */\nfunction hexToAnsi(hex: string): string {\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n return `\\x1b[38;2;${r};${g};${b}m`;\n}\n\n/**\n * Convert RGB color values to ANSI escape sequence\n * @param r - Red component (0-255)\n * @param g - Green component (0-255)\n * @param b - Blue component (0-255)\n * @returns ANSI color escape sequence for 24-bit RGB color\n * @example rgbToAnsi(255, 0, 128) // Returns ANSI code for custom pink\n */\nfunction rgbToAnsi(r: number, g: number, b: number): string {\n return `\\x1b[38;2;${r};${g};${b}m`;\n}\n\n/**\n * Resolve color string to ANSI escape sequence\n * Supports hex (#rrggbb), rgb (rgb(r,g,b)), and predefined color names\n * @param color - Color specification string\n * @returns ANSI escape sequence for the specified color\n * @example\n * getColorCode('#ff0000') // Hex color\n * getColorCode('rgb(255,0,0)') // RGB color\n * getColorCode('brightRed') // Predefined color\n */\nfunction getColorCode(color: string): string {\n if (color.startsWith(\"#\")) {\n return hexToAnsi(color);\n }\n if (color.startsWith(\"rgb(\")) {\n const match = color.match(/rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/);\n if (match) {\n return rgbToAnsi(Number(match[1]), Number(match[2]), Number(match[3]));\n }\n }\n return (ANSI_COLORS as any)[color] || color;\n}\n\n/**\n * Format current timestamp according to specified format\n * @param format - Timestamp format: 'time' (HH:MM:SS), 'datetime' (locale string), or 'iso' (ISO 8601)\n * @returns Formatted timestamp string\n * @example\n * formatTimestamp('time') // '14:23:45'\n * formatTimestamp('datetime') // '1/11/2026, 2:23:45 PM'\n * formatTimestamp('iso') // '2026-01-11T14:23:45.123Z'\n */\nfunction formatTimestamp(format: \"time\" | \"datetime\" | \"iso\"): string {\n const now = new Date();\n switch (format) {\n case \"time\":\n return now.toLocaleTimeString();\n case \"datetime\":\n return now.toLocaleString();\n case \"iso\":\n return now.toISOString();\n default:\n return now.toLocaleTimeString();\n }\n}\n\n/**\n * Main logger function - outputs formatted log messages to console\n * Supports multiple log levels, custom colors, icons, timestamps, and styling options\n * @param level - Log level (debug, info, success, warn, error, fatal, trace, log)\n * @param msg - Message to log\n * @param options - Optional configuration to override global settings for this log call\n * @example\n * logger('info', 'Server started on port 3000');\n * logger('error', 'Connection failed', { showTimestamp: true });\n * logger('success', 'Task completed', { colors: { success: '#00ff00' } });\n */\nexport function logger(\n level: keyof typeof DEFAULT_COLORS,\n msg: string,\n options?: LoggerConfig\n): void {\n const config = { ...globalConfig, ...options };\n\n const colors = { ...DEFAULT_COLORS, ...config.colors };\n const icons = { ...DEFAULT_ICONS, ...config.icons };\n\n const color = getColorCode(colors[level] || ANSI_COLORS.white);\n const icon = config.showIcon !== false ? icons[level] || \"\" : \"\";\n const levelLabel = config.uppercase ? level.toUpperCase() : level;\n\n let style = color;\n if (config.bold) style += BOLD;\n if (config.dim) style += DIM;\n if (config.backgroundColor) {\n style += getColorCode(config.backgroundColor);\n }\n\n const parts: string[] = [];\n\n // Add timestamp if enabled\n if (config.showTimestamp) {\n const timestamp = formatTimestamp(config.timestampFormat || \"time\");\n parts.push(`${DIM}${timestamp}${RESET}`);\n }\n\n // Add icon\n if (icon) {\n parts.push(icon);\n }\n\n // Add prefix and level\n const prefix = config.prefix\n ? `${style}[${config.prefix}:${levelLabel}]${RESET}`\n : `${style}[${levelLabel}]${RESET}`;\n parts.push(prefix);\n\n // Add message\n parts.push(msg);\n\n const output = parts.join(\" \");\n\n // Use appropriate console method\n const consoleMethod =\n level === \"error\" || level === \"fatal\"\n ? console.error\n : level === \"warn\"\n ? console.warn\n : level === \"debug\" || level === \"trace\"\n ? console.debug\n : console.log;\n\n consoleMethod(output);\n}\n\n/**\n * Convenience methods for each log level\n * Provides a cleaner API for common logging operations\n * @example\n * log.info('Server started');\n * log.error('Connection failed');\n * log.success('Task completed successfully');\n */\nexport const log = {\n debug: (msg: string, options?: LoggerConfig) => logger(\"debug\", msg, options),\n info: (msg: string, options?: LoggerConfig) => logger(\"info\", msg, options),\n success: (msg: string, options?: LoggerConfig) => logger(\"success\", msg, options),\n warn: (msg: string, options?: LoggerConfig) => logger(\"warn\", msg, options),\n error: (msg: string, options?: LoggerConfig) => logger(\"error\", msg, options),\n fatal: (msg: string, options?: LoggerConfig) => logger(\"fatal\", msg, options),\n trace: (msg: string, options?: LoggerConfig) => logger(\"trace\", msg, options),\n log: (msg: string, options?: LoggerConfig) => logger(\"log\", msg, options),\n};\n\n/**\n * Color utility functions and constants for advanced customization\n * Provides direct access to color conversion functions and ANSI codes\n * @example\n * colors.hex('#ff5733') // Convert hex to ANSI\n * colors.rgb(255, 87, 51) // Convert RGB to ANSI\n * colors.ansi.brightGreen // Access predefined colors\n * colors.bg.bgRed // Access background colors\n */\nexport const colors = {\n hex: hexToAnsi,\n rgb: rgbToAnsi,\n ansi: ANSI_COLORS,\n bg: BG_COLORS,\n reset: RESET,\n bold: BOLD,\n dim: DIM,\n};\n","import http from \"node:http\";\nimport https from \"node:https\";\nimport type { RequestServer } from \"../../types/http/request.type\";\nimport type { ResponseServer } from \"../../types/http/response.type\";\nimport { logger } from \"../../utils/Logger\";\nimport type { ProxyOptions } from \"../../types/plugins/proxy.type\";\n\nexport function createProxyMiddleware(options: ProxyOptions) {\n const {\n target,\n pathRewrite = {},\n headers = {},\n timeout = 30000,\n followRedirects = false,\n preserveHost = false,\n logLevel = \"info\",\n onProxyReq,\n onProxyRes,\n onError,\n } = options;\n\n return async (req: RequestServer, res: ResponseServer, next?: Function) => {\n try {\n // Parse target URL\n const targetUrl = new URL(target);\n const isHttps = targetUrl.protocol === \"https:\";\n const client = isHttps ? https : http;\n\n // Construir o path\n let path = req.path || \"/\";\n\n // Aplicar path rewrites\n for (const [pattern, replacement] of Object.entries(pathRewrite)) {\n const regex = new RegExp(pattern);\n path = path.replace(regex, replacement);\n }\n\n // Adicionar query string\n if (req.url && req.url.includes(\"?\")) {\n const queryString = req.url.split(\"?\")[1];\n path += `?${queryString}`;\n }\n\n if (logLevel !== \"none\") {\n logger(\n logLevel === \"debug\" ? \"info\" : \"info\",\n `[Proxy] ${req.method} ${req.url} → ${target}${path}`\n );\n }\n\n // Configurar headers\n const proxyHeaders: http.OutgoingHttpHeaders = {\n ...req.headers,\n ...headers,\n };\n\n // Remover headers problemáticos\n delete proxyHeaders[\"host\"];\n delete proxyHeaders[\"connection\"];\n delete proxyHeaders[\"transfer-encoding\"];\n\n if (preserveHost && req.headers.host) {\n proxyHeaders[\"host\"] = req.headers.host;\n } else {\n proxyHeaders[\"host\"] = targetUrl.host;\n }\n\n // Adicionar headers de forwarding\n if (req.ip) {\n proxyHeaders[\"x-forwarded-for\"] = req.ip;\n }\n proxyHeaders[\"x-forwarded-proto\"] = req.protocol || \"http\";\n proxyHeaders[\"x-forwarded-host\"] = req.headers.host || \"\";\n\n // Criar requisição proxy\n const proxyReqOptions: http.RequestOptions = {\n hostname: targetUrl.hostname,\n port: targetUrl.port || (isHttps ? 443 : 80),\n path,\n method: req.method,\n headers: proxyHeaders,\n timeout,\n };\n\n const proxyReq = client.request(proxyReqOptions, (proxyRes) => {\n // Callback customizado\n if (onProxyRes) {\n onProxyRes(proxyRes, req, res);\n }\n\n // Copiar status code\n res.statusCode = proxyRes.statusCode || 200;\n\n // Copiar headers (exceto alguns problemáticos)\n if (proxyRes.headers) {\n for (const [key, value] of Object.entries(proxyRes.headers)) {\n if (key.toLowerCase() !== \"transfer-encoding\" && value) {\n res.setHeader(key, value);\n }\n }\n }\n\n // Fazer pipe da resposta diretamente\n proxyRes.pipe(res as any);\n });\n\n // Callback customizado antes de enviar\n if (onProxyReq) {\n onProxyReq(proxyReq, req);\n }\n\n // Lidar com erros\n proxyReq.on(\"error\", (err) => {\n if (onError) {\n onError(err, req, res);\n } else {\n logger(\"error\", `[Proxy] Error: ${err.message}`);\n if (!res.headersSent) {\n res.statusCode = 502;\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify({\n error: \"Bad Gateway\",\n message: \"Failed to connect to upstream server\",\n }));\n }\n }\n });\n\n proxyReq.on(\"timeout\", () => {\n proxyReq.destroy();\n if (!res.headersSent) {\n res.statusCode = 504;\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify({\n error: \"Gateway Timeout\",\n message: \"Upstream server took too long to respond\",\n }));\n }\n });\n\n // Enviar body se existir\n if (req.body && [\"POST\", \"PUT\", \"PATCH\"].includes(req.method || \"\")) {\n const bodyStr = typeof req.body === \"string\" ? req.body : JSON.stringify(req.body);\n proxyReq.write(bodyStr);\n }\n\n proxyReq.end();\n } catch (err: any) {\n logger(\"error\", `[Proxy] Setup error: ${err.message}`);\n if (!res.headersSent) {\n res.statusCode = 500;\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify({\n error: \"Internal Server Error\",\n message: \"Failed to setup proxy\",\n }));\n }\n }\n };\n}\n\n/**\n * Middleware de proxy simples - apenas passa o target\n */\nexport function proxyPlugin(target: string, options: Partial<ProxyOptions> = {}) {\n return createProxyMiddleware({ target, ...options });\n}\n","import type { ResponseServer } from \"../../types/http/response.type\";\n\ntype ConnectionId = string;\ntype ChannelName = string;\ntype EventName = string;\ntype EventData = unknown;\n\nexport interface SSEConnection {\n readonly id: ConnectionId;\n readonly res: ResponseServer;\n readonly lastEventId?: string;\n}\n\nclass ConnectionIdGenerator {\n public generate(): ConnectionId {\n const random = Math.random().toString(36).substring(2);\n const timestamp = Date.now().toString(36);\n return `${random}${timestamp}`;\n }\n}\n\nclass SSEMessage {\n constructor(\n private readonly event: EventName,\n private readonly data: EventData,\n private readonly id?: string\n ) {}\n\n public format(): string {\n let message = \"\";\n \n if (this.id) {\n message += `id: ${this.id}\\n`;\n }\n \n message += `event: ${this.event}\\n`;\n message += `data: ${JSON.stringify(this.data)}\\n\\n`;\n \n return message;\n }\n}\n\nclass ConnectionRegistry {\n private readonly connections: Map<ConnectionId, SSEConnection>;\n\n constructor() {\n this.connections = new Map();\n }\n\n public add(connection: SSEConnection): void {\n this.connections.set(connection.id, connection);\n }\n\n public remove(id: ConnectionId): void {\n this.connections.delete(id);\n }\n\n public get(id: ConnectionId): SSEConnection | undefined {\n return this.connections.get(id);\n }\n\n public getAll(): ReadonlyArray<SSEConnection> {\n return Array.from(this.connections.values());\n }\n\n public has(id: ConnectionId): boolean {\n return this.connections.has(id);\n }\n}\n\nclass ChannelRegistry {\n private readonly channels: Map<ChannelName, Set<ConnectionId>>;\n\n constructor() {\n this.channels = new Map();\n }\n\n public subscribe(channel: ChannelName, connectionId: ConnectionId): void {\n this.ensureChannelExists(channel);\n this.channels.get(channel)!.add(connectionId);\n }\n\n public unsubscribe(channel: ChannelName, connectionId: ConnectionId): void {\n const connections = this.channels.get(channel);\n if (!connections) {\n return;\n }\n\n connections.delete(connectionId);\n this.removeEmptyChannel(channel, connections);\n }\n\n public getConnections(channel: ChannelName): ReadonlySet<ConnectionId> | undefined {\n return this.channels.get(channel);\n }\n\n public getAllChannelsForConnection(connectionId: ConnectionId): ReadonlyArray<ChannelName> {\n const channels: ChannelName[] = [];\n \n for (const [channel, connections] of this.channels) {\n if (connections.has(connectionId)) {\n channels.push(channel);\n }\n }\n \n return channels;\n }\n\n private ensureChannelExists(channel: ChannelName): void {\n if (this.channels.has(channel)) {\n return;\n }\n this.channels.set(channel, new Set());\n }\n\n private removeEmptyChannel(channel: ChannelName, connections: Set<ConnectionId>): void {\n if (connections.size === 0) {\n this.channels.delete(channel);\n }\n }\n}\n\nclass SSEHeaders {\n private static readonly HEADERS = {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n \"Connection\": \"keep-alive\",\n \"X-Accel-Buffering\": \"no\",\n } as const;\n\n public static write(res: ResponseServer): void {\n res.writeHead(200, this.HEADERS);\n }\n}\n\nexport class SSEManager {\n private readonly connectionRegistry: ConnectionRegistry;\n private readonly channelRegistry: ChannelRegistry;\n private readonly idGenerator: ConnectionIdGenerator;\n\n constructor() {\n this.connectionRegistry = new ConnectionRegistry();\n this.channelRegistry = new ChannelRegistry();\n this.idGenerator = new ConnectionIdGenerator();\n }\n\n public connect(res: ResponseServer, lastEventId?: string): ConnectionId {\n const id = this.idGenerator.generate();\n SSEHeaders.write(res);\n\n const connection: SSEConnection = { id, res, lastEventId };\n this.connectionRegistry.add(connection);\n\n this.setupConnectionClose(res, id);\n this.sendWelcomeMessage(res, id);\n\n return id;\n }\n\n private setupConnectionClose(res: ResponseServer, id: ConnectionId): void {\n res.on(\"close\", () => {\n this.disconnect(id);\n });\n }\n\n private sendWelcomeMessage(res: ResponseServer, id: ConnectionId): void {\n res.write(`id: ${id}\\n\\n`);\n }\n\n public send(connectionId: ConnectionId, event: EventName, data: EventData, id?: string): void {\n const connection = this.connectionRegistry.get(connectionId);\n if (!connection) {\n return;\n }\n\n const message = new SSEMessage(event, data, id);\n connection.res.write(message.format());\n }\n\n public sendToAll(event: EventName, data: EventData, id?: string): void {\n const connections = this.connectionRegistry.getAll();\n \n for (const connection of connections) {\n this.send(connection.id, event, data, id);\n }\n }\n\n public sendToChannel(channel: ChannelName, event: EventName, data: EventData, id?: string): void {\n const connectionIds = this.channelRegistry.getConnections(channel);\n if (!connectionIds) {\n return;\n }\n\n for (const connectionId of connectionIds) {\n this.send(connectionId, event, data, id);\n }\n }\n\n public subscribe(connectionId: ConnectionId, channel: ChannelName): void {\n this.channelRegistry.subscribe(channel, connectionId);\n }\n\n public unsubscribe(connectionId: ConnectionId, channel: ChannelName): void {\n this.channelRegistry.unsubscribe(channel, connectionId);\n }\n\n public disconnect(connectionId: ConnectionId): void {\n const connection = this.connectionRegistry.get(connectionId);\n if (!connection) {\n return;\n }\n\n this.unsubscribeFromAllChannels(connectionId);\n connection.res.end();\n this.connectionRegistry.remove(connectionId);\n }\n\n private unsubscribeFromAllChannels(connectionId: ConnectionId): void {\n const channels = this.channelRegistry.getAllChannelsForConnection(connectionId);\n \n for (const channel of channels) {\n this.unsubscribe(connectionId, channel);\n }\n }\n\n public getConnection(connectionId: ConnectionId): SSEConnection | undefined {\n return this.connectionRegistry.get(connectionId);\n }\n\n public getConnections(): ReadonlyArray<SSEConnection> {\n return this.connectionRegistry.getAll();\n }\n}\n\nexport function createSSEHandler(): SSEManager {\n return new SSEManager();\n}\n","import { createGzip, createDeflate, createBrotliCompress } from \"node:zlib\";\nimport type { RequestHandler } from \"../../types/common.type\";\n\ntype ContentType = string;\ntype EncodingType = \"br\" | \"gzip\" | \"deflate\";\n\ninterface CompressionOptions {\n readonly threshold?: number;\n readonly level?: number;\n readonly filter?: ContentTypeFilter;\n}\n\ntype ContentTypeFilter = (contentType: ContentType) => boolean;\n\nclass DefaultContentTypeFilter {\n private static readonly COMPRESSIBLE_PATTERN = /text|json|javascript|css|xml|svg|wasm/;\n\n public static test(contentType: ContentType): boolean {\n return this.COMPRESSIBLE_PATTERN.test(contentType);\n }\n}\n\nclass CompressionThreshold {\n constructor(private readonly value: number) {}\n\n public exceeds(size: number): boolean {\n return size >= this.value;\n }\n}\n\nclass BodySize {\n constructor(private readonly body: unknown) {}\n\n public calculate(): number {\n if (Buffer.isBuffer(this.body)) {\n return this.body.length;\n }\n return Buffer.byteLength(String(this.body));\n }\n}\n\nclass CompressionEligibility {\n constructor(\n private readonly threshold: CompressionThreshold,\n private readonly filter: ContentTypeFilter,\n ) {}\n\n public check(body: unknown, contentType: ContentType): boolean {\n if (!body) {\n return false;\n }\n\n const size = new BodySize(body).calculate();\n return this.threshold.exceeds(size) && this.filter(contentType);\n }\n}\n\nclass EncodingMatcher {\n private readonly patterns: ReadonlyMap<EncodingType, RegExp>;\n\n constructor() {\n this.patterns = new Map([\n [\"br\", /\\bbr\\b/],\n [\"gzip\", /\\bgzip\\b/],\n [\"deflate\", /\\bdeflate\\b/],\n ]);\n }\n\n public match(acceptEncoding: string): EncodingType | null {\n for (const [encoding, pattern] of this.patterns) {\n if (pattern.test(acceptEncoding)) {\n return encoding;\n }\n }\n return null;\n }\n}\n\nclass CompressionStreamFactory {\n constructor(private readonly level: number) {}\n\n public create(encoding: EncodingType) {\n if (encoding === \"br\") {\n return createBrotliCompress();\n }\n\n if (encoding === \"gzip\") {\n return createGzip({ level: this.level });\n }\n\n return createDeflate({ level: this.level });\n }\n}\n\nclass BodyTransformer {\n public toBuffer(body: unknown): Buffer {\n return Buffer.isBuffer(body) ? body : Buffer.from(String(body));\n }\n}\n\nclass CompressionHeaders {\n constructor(private readonly encoding: EncodingType) {}\n\n public apply(res: any): void {\n res.set(\"Content-Encoding\", this.encoding);\n res.set(\"Vary\", \"Accept-Encoding\");\n res.removeHeader(\"Content-Length\");\n }\n}\n\nclass StreamCompressor {\n constructor(\n private readonly streamFactory: CompressionStreamFactory,\n private readonly transformer: BodyTransformer,\n ) {}\n\n public compress(res: any, body: unknown, encoding: EncodingType): void {\n const buffer = this.transformer.toBuffer(body);\n new CompressionHeaders(encoding).apply(res);\n\n const stream = this.streamFactory.create(encoding);\n stream.pipe(res);\n stream.end(buffer);\n }\n}\n\nclass CompressibleResponse {\n constructor(\n private readonly eligibility: CompressionEligibility,\n private readonly matcher: EncodingMatcher,\n private readonly compressor: StreamCompressor,\n ) {}\n\n public process(res: any, body: unknown, acceptEncoding: string): boolean {\n const contentType = res.get(\"Content-Type\") ?? \"\";\n\n if (!this.eligibility.check(body, contentType)) {\n return false;\n }\n\n const encoding = this.matcher.match(acceptEncoding);\n if (!encoding) {\n return false;\n }\n\n this.compressor.compress(res, body, encoding);\n return true;\n }\n}\n\nclass SendMethodInterceptor {\n constructor(\n private readonly originalMethod: any,\n private readonly processor: CompressibleResponse,\n private readonly acceptEncoding: string,\n ) {}\n\n public intercept(res: any): (body: unknown) => any {\n return (body: unknown) => {\n const compressed = this.processor.process(res, body, this.acceptEncoding);\n if (compressed) {\n return res;\n }\n return this.originalMethod.call(res, body);\n };\n }\n}\n\nclass JsonMethodInterceptor {\n constructor(\n private readonly originalMethod: any,\n private readonly processor: CompressibleResponse,\n private readonly acceptEncoding: string,\n ) {}\n\n public intercept(res: any): (body: unknown) => any {\n return (body: unknown) => {\n res.set(\"Content-Type\", \"application/json\");\n const jsonString = JSON.stringify(body);\n\n const compressed = this.processor.process(res, jsonString, this.acceptEncoding);\n if (compressed) {\n return res;\n }\n return this.originalMethod.call(res, body);\n };\n }\n}\n\nexport function compression(options: CompressionOptions = {}): RequestHandler {\n const threshold = new CompressionThreshold(options.threshold ?? 1024);\n const filter = options.filter ?? DefaultContentTypeFilter.test;\n const level = options.level ?? 6;\n\n const eligibility = new CompressionEligibility(threshold, filter);\n const matcher = new EncodingMatcher();\n const streamFactory = new CompressionStreamFactory(level);\n const transformer = new BodyTransformer();\n const compressor = new StreamCompressor(streamFactory, transformer);\n const processor = new CompressibleResponse(eligibility, matcher, compressor);\n\n return (req, res, next) => {\n const acceptEncoding = req.headers?.[\"accept-encoding\"] ?? \"\";\n\n const sendInterceptor = new SendMethodInterceptor(res.send, processor, acceptEncoding);\n const jsonInterceptor = new JsonMethodInterceptor(res.json, processor, acceptEncoding);\n\n res.send = sendInterceptor.intercept(res);\n res.json = jsonInterceptor.intercept(res);\n\n return next ? next() : Promise.resolve();\n };\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport { createReadStream } from \"node:fs\";\nimport { join, extname, resolve } from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport type { RequestHandler } from \"../../types/common.type\";\n\ninterface StaticOptions {\n maxAge?: number;\n immutable?: boolean;\n etag?: boolean;\n extensions?: string[];\n index?: string[];\n dotfiles?: \"allow\" | \"deny\" | \"ignore\";\n}\n\nconst mimeTypes: Record<string, string> = {\n \".html\": \"text/html\",\n \".css\": \"text/css\",\n \".js\": \"application/javascript\",\n \".json\": \"application/json\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n \".ico\": \"image/x-icon\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".otf\": \"font/otf\",\n \".mp4\": \"video/mp4\",\n \".webm\": \"video/webm\",\n \".mp3\": \"audio/mpeg\",\n \".wav\": \"audio/wav\",\n \".pdf\": \"application/pdf\",\n \".txt\": \"text/plain\",\n \".xml\": \"application/xml\",\n \".zip\": \"application/zip\",\n \".wasm\": \"application/wasm\",\n};\n\nconst cache = new Map<string, { etag: string; data: Buffer; mtime: number }>();\n\nexport function serveStatic(root: string, options: StaticOptions = {}): RequestHandler {\n const maxAge = options.maxAge ?? 0;\n const immutable = options.immutable ?? false;\n const useEtag = options.etag ?? true;\n const extensions = options.extensions ?? [\".html\"];\n const indexFiles = options.index ?? [\"index.html\"];\n const dotfiles = options.dotfiles ?? \"ignore\";\n\n const rootPath = resolve(root);\n\n return async (req, res, next) => {\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n return next ? next() : Promise.resolve();\n }\n\n let filePath = decodeURIComponent(req.path || \"/\");\n filePath = filePath.replace(/\\\\/g, \"/\").replace(/\\.\\.+/g, \"\");\n\n if (dotfiles === \"deny\" && /(^|\\/)\\.[^\\/]+/.test(filePath)) {\n res.status(403).send(\"Forbidden\");\n return;\n }\n\n if (dotfiles === \"ignore\" && /(^|\\/)\\.[^\\/]+/.test(filePath)) {\n return next ? next() : Promise.resolve();\n }\n\n const fullPath = join(rootPath, filePath);\n\n if (!fullPath.startsWith(rootPath)) {\n res.status(403).send(\"Forbidden\");\n return;\n }\n\n try {\n const stats = await stat(fullPath);\n\n let targetPath = fullPath;\n let targetStats = stats;\n\n if (stats.isDirectory()) {\n let found = false;\n for (const indexFile of indexFiles) {\n const indexPath = join(fullPath, indexFile);\n try {\n const indexStats = await stat(indexPath);\n if (indexStats.isFile()) {\n targetPath = indexPath;\n targetStats = indexStats;\n found = true;\n break;\n }\n } catch {}\n }\n if (!found) {\n return next ? next() : Promise.resolve();\n }\n } else if (!stats.isFile()) {\n return next ? next() : Promise.resolve();\n }\n\n const ext = extname(targetPath);\n const mimeType = mimeTypes[ext] || \"application/octet-stream\";\n\n res.set(\"Content-Type\", mimeType);\n\n const cacheControl = [];\n if (maxAge > 0) {\n cacheControl.push(`max-age=${maxAge}`);\n }\n if (immutable) {\n cacheControl.push(\"immutable\");\n }\n if (cacheControl.length > 0) {\n res.set(\"Cache-Control\", cacheControl.join(\", \"));\n }\n\n const mtime = targetStats.mtimeMs;\n let etag: string | undefined;\n let fileData: Buffer | undefined;\n\n const cached = cache.get(targetPath);\n if (cached && cached.mtime === mtime) {\n etag = cached.etag;\n fileData = cached.data;\n } else {\n fileData = await readFile(targetPath);\n if (useEtag) {\n etag = `\"${createHash(\"md5\").update(fileData).digest(\"hex\")}\"`;\n cache.set(targetPath, { etag, data: fileData, mtime });\n }\n }\n\n if (useEtag && etag) {\n res.set(\"ETag\", etag);\n const ifNoneMatch = req.headers?.[\"if-none-match\"];\n if (ifNoneMatch === etag) {\n res.status(304).send(\"\");\n return;\n }\n }\n\n const lastModified = new Date(targetStats.mtime).toUTCString();\n res.set(\"Last-Modified\", lastModified);\n\n const ifModifiedSince = req.headers?.[\"if-modified-since\"];\n if (ifModifiedSince && new Date(ifModifiedSince) >= targetStats.mtime) {\n res.status(304).send(\"\");\n return;\n }\n\n if (req.method === \"HEAD\") {\n res.set(\"Content-Length\", String(targetStats.size));\n res.send(\"\");\n return;\n }\n\n res.send(fileData);\n } catch (err: any) {\n if (err.code === \"ENOENT\") {\n return next ? next() : Promise.resolve();\n }\n res.status(500).send(\"Internal Server Error\");\n }\n };\n}\n","import type { RequestHandler } from \"../../types/common.type\";\n\ninterface HelmetOptions {\n contentSecurityPolicy?: boolean | Record<string, string[]>;\n dnsPrefetchControl?: boolean | { allow?: boolean };\n frameguard?: boolean | { action?: \"deny\" | \"sameorigin\" };\n hidePoweredBy?: boolean;\n hsts?: boolean | { maxAge?: number; includeSubDomains?: boolean; preload?: boolean };\n ieNoOpen?: boolean;\n noSniff?: boolean;\n referrerPolicy?: boolean | { policy?: string };\n xssFilter?: boolean;\n}\n\nexport function helmet(options: HelmetOptions = {}): RequestHandler {\n return (req, res, next) => {\n if (options.hidePoweredBy !== false) {\n res.removeHeader(\"X-Powered-By\");\n }\n\n if (options.noSniff !== false) {\n res.set(\"X-Content-Type-Options\", \"nosniff\");\n }\n\n if (options.xssFilter !== false) {\n res.set(\"X-XSS-Protection\", \"1; mode=block\");\n }\n\n if (options.ieNoOpen !== false) {\n res.set(\"X-Download-Options\", \"noopen\");\n }\n\n const frameguard = options.frameguard !== false;\n if (frameguard) {\n const action =\n typeof options.frameguard === \"object\" ? options.frameguard.action : \"sameorigin\";\n res.set(\"X-Frame-Options\", action === \"deny\" ? \"DENY\" : \"SAMEORIGIN\");\n }\n\n const dnsPrefetchControl = options.dnsPrefetchControl !== false;\n if (dnsPrefetchControl) {\n const allow =\n typeof options.dnsPrefetchControl === \"object\" ? options.dnsPrefetchControl.allow : false;\n res.set(\"X-DNS-Prefetch-Control\", allow ? \"on\" : \"off\");\n }\n\n const hsts = options.hsts !== false;\n if (hsts) {\n const maxAge = typeof options.hsts === \"object\" ? options.hsts.maxAge || 15552000 : 15552000;\n const includeSubDomains =\n typeof options.hsts === \"object\" ? options.hsts.includeSubDomains : true;\n const preload = typeof options.hsts === \"object\" ? options.hsts.preload : false;\n\n let value = `max-age=${maxAge}`;\n if (includeSubDomains) value += \"; includeSubDomains\";\n if (preload) value += \"; preload\";\n\n res.set(\"Strict-Transport-Security\", value);\n }\n\n const referrerPolicy = options.referrerPolicy !== false;\n if (referrerPolicy) {\n const policy =\n typeof options.referrerPolicy === \"object\" ? options.referrerPolicy.policy : \"no-referrer\";\n res.set(\"Referrer-Policy\", policy || \"no-referrer\");\n }\n\n const csp = options.contentSecurityPolicy !== false;\n if (csp) {\n const directives =\n typeof options.contentSecurityPolicy === \"object\"\n ? options.contentSecurityPolicy\n : {\n \"default-src\": [\"'self'\"],\n \"base-uri\": [\"'self'\"],\n \"font-src\": [\"'self'\", \"https:\", \"data:\"],\n \"form-action\": [\"'self'\"],\n \"frame-ancestors\": [\"'self'\"],\n \"img-src\": [\"'self'\", \"data:\"],\n \"object-src\": [\"'none'\"],\n \"script-src\": [\"'self'\"],\n \"script-src-attr\": [\"'none'\"],\n \"style-src\": [\"'self'\", \"https:\", \"'unsafe-inline'\"],\n \"upgrade-insecure-requests\": [],\n };\n\n const cspString = Object.entries(directives)\n .map(([key, values]) => {\n if (values.length === 0) return key;\n return `${key} ${values.join(\" \")}`;\n })\n .join(\"; \");\n\n res.set(\"Content-Security-Policy\", cspString);\n }\n\n return next ? next() : Promise.resolve();\n };\n}\n","import { randomBytes, createHash } from \"node:crypto\";\nimport type { RequestHandler } from \"../../types/common.type\";\n\ninterface CSRFOptions {\n cookieName?: string;\n headerName?: string;\n ignoreMethods?: string[];\n ignorePaths?: string[];\n saltLength?: number;\n secretLength?: number;\n}\n\nconst tokenCache = new Map<string, { token: string; expires: number }>();\n\nexport function csrf(options: CSRFOptions = {}): RequestHandler {\n const cookieName = options.cookieName || \"_csrf\";\n const headerName = options.headerName || \"x-csrf-token\";\n const ignoreMethods = options.ignoreMethods || [\"GET\", \"HEAD\", \"OPTIONS\"];\n const ignorePaths = options.ignorePaths || [];\n const saltLength = options.saltLength || 8;\n const secretLength = options.secretLength || 18;\n\n const generateSecret = (): string => {\n return randomBytes(secretLength).toString(\"base64\");\n };\n\n const generateToken = (secret: string): string => {\n const salt = randomBytes(saltLength).toString(\"base64\");\n const hash = createHash(\"sha256\")\n .update(salt + secret)\n .digest(\"base64\");\n return `${salt}.${hash}`;\n };\n\n const verifyToken = (token: string, secret: string): boolean => {\n const parts = token.split(\".\");\n if (parts.length !== 2) return false;\n\n const [salt, hash] = parts;\n const expectedHash = createHash(\"sha256\")\n .update(salt + secret)\n .digest(\"base64\");\n\n return hash === expectedHash;\n };\n\n return (req, res, next) => {\n let secret = req.cookies?.[cookieName];\n\n if (!secret) {\n secret = generateSecret();\n res.cookie(cookieName, secret, {\n httpOnly: true,\n sameSite: \"strict\",\n secure: req.protocol === \"https\",\n maxAge: 3600000,\n });\n }\n\n const token = generateToken(secret);\n\n (req as any).csrfToken = () => token;\n\n if (ignoreMethods.includes(req.method || \"GET\")) {\n return next ? next() : Promise.resolve();\n }\n\n // Check if path should be ignored\n if (ignorePaths.some(path => req.path?.startsWith(path))) {\n return next ? next() : Promise.resolve();\n }\n\n const submittedToken =\n (req.headers?.[headerName] as string | undefined) ||\n (req.body && typeof req.body === \"object\" && \"_csrf\" in req.body\n ? ((req.body as Record<string, unknown>)._csrf as string)\n : undefined) ||\n (req.query && typeof req.query === \"object\" && \"_csrf\" in req.query\n ? ((req.query as Record<string, unknown>)._csrf as string)\n : undefined);\n\n if (!submittedToken || !verifyToken(submittedToken as string, secret)) {\n res.status(403).json({ error: \"Invalid CSRF token\" });\n return;\n }\n\n return next ? next() : Promise.resolve();\n };\n}\n","import { createWriteStream } from \"node:fs\";\nimport { mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport type { RequestHandler } from \"../../types/common.type\";\n\ninterface UploadedFile {\n fieldname: string;\n originalname: string;\n encoding: string;\n mimetype: string;\n size: number;\n path?: string;\n buffer?: Buffer;\n}\n\ninterface MultipartOptions {\n uploadDir?: string;\n maxFileSize?: number;\n maxFiles?: number;\n allowedMimeTypes?: string[];\n storeInMemory?: boolean;\n}\n\nexport function multipart(options: MultipartOptions = {}): RequestHandler {\n const uploadDir = options.uploadDir || \"./uploads\";\n const maxFileSize = options.maxFileSize || 10 * 1024 * 1024;\n const maxFiles = options.maxFiles || 10;\n const allowedMimeTypes = options.allowedMimeTypes;\n const storeInMemory = options.storeInMemory || false;\n\n return async (req, res, next) => {\n const contentType = req.headers?.[\"content-type\"] || \"\";\n\n if (!contentType.includes(\"multipart/form-data\")) {\n return next ? next() : Promise.resolve();\n }\n\n const boundaryMatch = contentType.match(/boundary=([^;]+)/);\n if (!boundaryMatch) {\n res.status(400).json({ error: \"Invalid multipart boundary\" });\n return;\n }\n\n const boundary = `--${boundaryMatch[1]}`;\n const files: UploadedFile[] = [];\n const fields: Record<string, string> = {};\n\n try {\n if (!storeInMemory) {\n await mkdir(uploadDir, { recursive: true });\n }\n\n const chunks: Buffer[] = [];\n await new Promise<void>((resolve, reject) => {\n req.on(\"data\", (chunk) => chunks.push(chunk));\n req.on(\"end\", () => resolve());\n req.on(\"error\", reject);\n });\n\n const buffer = Buffer.concat(chunks);\n const parts = buffer.toString(\"binary\").split(boundary);\n\n for (const part of parts) {\n if (!part.trim() || part === \"--\\r\\n\" || part === \"--\") continue;\n\n const headerEndIndex = part.indexOf(\"\\r\\n\\r\\n\");\n if (headerEndIndex === -1) continue;\n\n const headerSection = part.substring(0, headerEndIndex);\n const bodySection = part.substring(headerEndIndex + 4);\n\n const nameMatch = headerSection.match(/name=\"([^\"]+)\"/);\n if (!nameMatch) continue;\n\n const fieldname = nameMatch[1];\n const filenameMatch = headerSection.match(/filename=\"([^\"]+)\"/);\n const contentTypeMatch = headerSection.match(/Content-Type: ([^\\r\\n]+)/);\n\n if (filenameMatch) {\n if (files.length >= maxFiles) {\n res.status(400).json({ error: `Maximum ${maxFiles} files allowed` });\n return;\n }\n\n const originalname = filenameMatch[1];\n const mimetype = contentTypeMatch\n ? contentTypeMatch[1]?.trim()\n : \"application/octet-stream\";\n\n if (allowedMimeTypes && !allowedMimeTypes.includes(mimetype as string)) {\n res.status(400).json({ error: `MIME type ${mimetype} not allowed` });\n return;\n }\n\n const fileData = bodySection.substring(0, bodySection.lastIndexOf(\"\\r\\n\"));\n const fileBuffer = Buffer.from(fileData, \"binary\");\n\n if (fileBuffer.length > maxFileSize) {\n res.status(400).json({ error: `File size exceeds ${maxFileSize} bytes` });\n return;\n }\n\n const file: UploadedFile = {\n fieldname: fieldname || \"file\",\n originalname: originalname || \"unknown\",\n encoding: \"binary\",\n mimetype: mimetype || \"application/octet-stream\",\n size: fileBuffer.length,\n };\n\n if (storeInMemory) {\n file.buffer = fileBuffer;\n } else {\n const filename = `${Date.now()}-${randomBytes(8).toString(\"hex\")}-${originalname || \"file\"}`;\n const filepath = join(uploadDir, filename);\n\n await new Promise<void>((resolve, reject) => {\n const writeStream = createWriteStream(filepath);\n writeStream.write(fileBuffer);\n writeStream.end();\n writeStream.on(\"finish\", resolve);\n writeStream.on(\"error\", reject);\n });\n\n file.path = filepath;\n }\n\n files.push(file);\n } else {\n const value = bodySection.substring(0, bodySection.lastIndexOf(\"\\r\\n\"));\n if (fieldname) {\n fields[fieldname] = value;\n }\n }\n }\n\n (req as any).files = files;\n (req as any).body = { ...fields, ...(req.body || {}) };\n\n return next ? next() : Promise.resolve();\n } catch (err: any) {\n res.status(500).json({ error: \"File upload failed\", message: err.message });\n }\n };\n}\n","import type { RequestHandler } from \"../../types/common.type\";\n\ninterface TimeoutOptions {\n timeout?: number;\n message?: string;\n statusCode?: number;\n}\n\nexport function timeout(options: TimeoutOptions = {}): RequestHandler {\n const timeoutMs = options.timeout || 30000;\n const message = options.message || \"Request timeout\";\n const statusCode = options.statusCode || 408;\n\n return (req, res, next) => {\n let timedOut = false;\n\n const timer = setTimeout(() => {\n timedOut = true;\n if (!res.writableEnded && !res.headersSent) {\n res.status(statusCode).json({ error: message });\n }\n }, timeoutMs);\n\n const originalEnd = res.end;\n (res as any).end = function (...args: any[]) {\n clearTimeout(timer);\n if (!timedOut && !res.headersSent) {\n return originalEnd.call(this, args[0], args[1] as BufferEncoding, args[2] as (() => void) | undefined);\n }\n };\n\n return next ? next() : Promise.resolve();\n };\n}\n","import { createHash } from \"node:crypto\";\nimport type { RequestHandler } from \"../../types/common.type\";\n\ninterface ETagOptions {\n weak?: boolean;\n algorithm?: \"md5\" | \"sha1\" | \"sha256\";\n}\n\nexport function etag(options: ETagOptions = {}): RequestHandler {\n const weak = options.weak ?? true;\n const algorithm = options.algorithm || \"md5\";\n\n return (req, res, next) => {\n const originalSend = res.send;\n const originalJson = res.json;\n\n const generateETag = (body: any): string => {\n const content = Buffer.isBuffer(body) ? body : Buffer.from(String(body));\n const hash = createHash(algorithm).update(content).digest(\"hex\");\n return weak ? `W/\"${hash}\"` : `\"${hash}\"`;\n };\n\n const checkETag = (etag: string): boolean => {\n const ifNoneMatch = req.headers?.[\"if-none-match\"];\n if (!ifNoneMatch) return false;\n\n const tags = ifNoneMatch.split(\",\").map((tag) => tag.trim());\n return tags.includes(etag) || tags.includes(\"*\");\n };\n\n res.send = function (body: any) {\n if (body === undefined || body === null) {\n return originalSend.call(this, body);\n }\n\n // Não adicionar ETag se a resposta já foi finalizada\n if (res.writableEnded || res.headersSent) {\n return originalSend.call(this, body);\n }\n\n const etag = generateETag(body);\n res.set(\"ETag\", etag);\n\n if (checkETag(etag)) {\n res.status(304);\n res.removeHeader(\"Content-Type\");\n res.removeHeader(\"Content-Length\");\n return originalSend.call(this, \"\");\n }\n\n return originalSend.call(this, body);\n };\n\n res.json = function (body: any) {\n // Não adicionar ETag se a resposta já foi finalizada\n if (res.writableEnded || res.headersSent) {\n return originalJson.call(this, body);\n }\n\n const jsonString = JSON.stringify(body);\n const etag = generateETag(jsonString);\n res.set(\"ETag\", etag);\n\n if (checkETag(etag)) {\n res.status(304);\n res.removeHeader(\"Content-Type\");\n res.removeHeader(\"Content-Length\");\n return originalSend.call(this, \"\");\n }\n\n return originalJson.call(this, body);\n };\n\n return next ? next() : Promise.resolve();\n };\n}\n","import type { RequestHandler } from \"../../types/common.type\";\n\ninterface SessionData {\n [key: string]: any;\n}\n\ninterface SessionStore {\n get: (id: string) => Promise<SessionData | null>;\n set: (id: string, data: SessionData) => Promise<void>;\n destroy: (id: string) => Promise<void>;\n}\n\nclass MemoryStore implements SessionStore {\n private store = new Map<string, { data: SessionData; expires: number }>();\n\n async get(id: string): Promise<SessionData | null> {\n const entry = this.store.get(id);\n if (!entry) return null;\n if (entry.expires < Date.now()) {\n this.store.delete(id);\n return null;\n }\n return entry.data;\n }\n\n async set(id: string, data: SessionData): Promise<void> {\n const expires = Date.now() + 86400000;\n this.store.set(id, { data, expires });\n }\n\n async destroy(id: string): Promise<void> {\n this.store.delete(id);\n }\n}\n\ninterface SessionOptions {\n secret: string;\n name?: string;\n cookie?: {\n maxAge?: number;\n httpOnly?: boolean;\n secure?: boolean;\n sameSite?: \"strict\" | \"lax\" | \"none\";\n };\n store?: SessionStore;\n rolling?: boolean;\n resave?: boolean;\n saveUninitialized?: boolean;\n}\n\nexport function session(options: SessionOptions): RequestHandler {\n const name = options.name || \"sid\";\n const store = options.store || new MemoryStore();\n const maxAge = options.cookie?.maxAge || 86400000;\n const httpOnly = options.cookie?.httpOnly ?? true;\n const secure = options.cookie?.secure ?? false;\n const sameSite = options.cookie?.sameSite || \"lax\";\n const rolling = options.rolling ?? false;\n const resave = options.resave ?? true;\n const saveUninitialized = options.saveUninitialized ?? true;\n\n const generateId = (): string => {\n return Math.random().toString(36).substring(2) + Date.now().toString(36);\n };\n\n return async (req, res, next) => {\n let sessionId = req.cookies?.[name];\n let sessionData: SessionData | null = null;\n\n if (sessionId) {\n sessionData = await store.get(sessionId);\n }\n\n if (!sessionData) {\n sessionId = generateId();\n sessionData = {};\n }\n\n const sessionProxy = new Proxy(sessionData, {\n set: (target, prop, value) => {\n (target as any)[prop] = value;\n return true;\n },\n deleteProperty: (target, prop) => {\n delete (target as any)[prop];\n return true;\n },\n });\n\n (req as any).session = sessionProxy;\n (req as any).sessionID = sessionId;\n\n const originalEnd = res.end;\n (res as any).end = async function (...args: any[]) {\n const shouldSave = saveUninitialized || Object.keys(sessionData!).length > 0;\n\n if (shouldSave && (resave || Object.keys(sessionData!).length > 0)) {\n await store.set(sessionId!, sessionData!);\n\n // Só definir cookie se os headers ainda não foram enviados\n if (!res.headersSent) {\n res.cookie(name, sessionId!, {\n maxAge,\n httpOnly,\n secure,\n sameSite,\n });\n }\n }\n\n if (!res.headersSent) {\n return originalEnd.call(this, args[0], args[1] as BufferEncoding, args[2] as (() => void) | undefined);\n }\n };\n\n (req as any).session.destroy = async () => {\n await store.destroy(sessionId!);\n if (!res.headersSent) {\n res.clearCookie(name);\n }\n };\n\n (req as any).session.regenerate = async () => {\n await store.destroy(sessionId!);\n sessionId = generateId();\n (req as any).sessionID = sessionId;\n sessionData = {};\n (req as any).session = sessionProxy;\n };\n\n return next ? next() : Promise.resolve();\n };\n}\n","import { createHmac, timingSafeEqual } from \"node:crypto\";\nimport type { RequestHandler } from \"../../types/common.type\";\n\ninterface JWTPayload {\n [key: string]: any;\n exp?: number;\n iat?: number;\n nbf?: number;\n}\n\ninterface JWTOptions {\n secret: string;\n algorithm?: \"HS256\" | \"HS384\" | \"HS512\";\n expiresIn?: number;\n issuer?: string;\n audience?: string;\n}\n\ninterface JWTMiddlewareOptions extends JWTOptions {\n credentialsRequired?: boolean;\n getToken?: (req: any) => string | null;\n}\n\nfunction base64UrlEncode(str: Buffer | string): string {\n return Buffer.from(str)\n .toString(\"base64\")\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=/g, \"\");\n}\n\nfunction base64UrlDecode(str: string): string {\n str = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n while (str.length % 4) str += \"=\";\n return Buffer.from(str, \"base64\").toString();\n}\n\nfunction sign(payload: string, secret: string, algorithm: string): string {\n const alg = algorithm.replace(\"HS\", \"sha\");\n return createHmac(alg, secret).update(payload).digest(\"base64url\");\n}\n\nfunction verify(token: string, signature: string, secret: string, algorithm: string): boolean {\n const alg = algorithm.replace(\"HS\", \"sha\");\n const expected = createHmac(alg, secret).update(token).digest(\"base64url\");\n\n if (expected.length !== signature.length) return false;\n\n try {\n return timingSafeEqual(Buffer.from(expected), Buffer.from(signature));\n } catch {\n return false;\n }\n}\n\nexport function createJWT(payload: JWTPayload, options: JWTOptions): string {\n const algorithm = options.algorithm || \"HS256\";\n const header = { alg: algorithm, typ: \"JWT\" };\n\n const now = Math.floor(Date.now() / 1000);\n const finalPayload = { ...payload };\n\n if (options.expiresIn) {\n finalPayload.exp = now + options.expiresIn;\n }\n\n if (options.issuer) {\n finalPayload.iss = options.issuer;\n }\n\n if (options.audience) {\n finalPayload.aud = options.audience;\n }\n\n if (!finalPayload.iat) {\n finalPayload.iat = now;\n }\n\n const encodedHeader = base64UrlEncode(JSON.stringify(header));\n const encodedPayload = base64UrlEncode(JSON.stringify(finalPayload));\n const token = `${encodedHeader}.${encodedPayload}`;\n const signature = sign(token, options.secret, algorithm);\n\n return `${token}.${signature}`;\n}\n\nexport function verifyJWT(\n token: string,\n secret: string,\n algorithm: string = \"HS256\",\n): JWTPayload | null {\n const parts = token.split(\".\");\n if (parts.length !== 3) return null;\n\n const [encodedHeader, encodedPayload, signature] = parts;\n\n if (!encodedHeader || !encodedPayload || !signature) {\n return null;\n }\n\n if (!verify(`${encodedHeader}.${encodedPayload}`, signature, secret, algorithm)) {\n return null;\n }\n\n try {\n const payload = JSON.parse(base64UrlDecode(encodedPayload));\n\n const now = Math.floor(Date.now() / 1000);\n\n if (payload.exp && payload.exp < now) {\n return null;\n }\n\n if (payload.nbf && payload.nbf > now) {\n return null;\n }\n\n return payload;\n } catch {\n return null;\n }\n}\n\nexport function jwtMiddleware(options: JWTMiddlewareOptions): RequestHandler {\n const credentialsRequired = options.credentialsRequired ?? true;\n const getToken =\n options.getToken ||\n ((req: any) => {\n const auth = req.headers?.authorization;\n if (auth && auth.startsWith(\"Bearer \")) {\n return auth.substring(7);\n }\n return null;\n });\n\n return (req, res, next) => {\n const token = getToken(req);\n\n if (!token) {\n if (credentialsRequired) {\n res.status(401).json({ error: \"No token provided\" });\n return;\n }\n (req as any).user = null;\n return next ? next() : Promise.resolve();\n }\n\n const payload = verifyJWT(token, options.secret, options.algorithm);\n\n if (!payload) {\n res.status(401).json({ error: \"Invalid token\" });\n return;\n }\n\n if (options.issuer && payload.iss !== options.issuer) {\n res.status(401).json({ error: \"Invalid issuer\" });\n return;\n }\n\n if (options.audience && payload.aud !== options.audience) {\n res.status(401).json({ error: \"Invalid audience\" });\n return;\n }\n\n (req as any).user = payload;\n (req as any).token = token;\n\n return next ? next() : Promise.resolve();\n };\n}\n","import type { RequestHandler } from \"../../types/common.type\";\n\ninterface BodyLimitOptions {\n limit?: number;\n type?: string | string[];\n}\n\nexport function bodyLimit(options: BodyLimitOptions = {}): RequestHandler {\n const limit = options.limit || 1024 * 1024;\n const types = Array.isArray(options.type)\n ? options.type\n : options.type\n ? [options.type]\n : [\"application/json\", \"application/x-www-form-urlencoded\", \"text/plain\"];\n\n return (req, res, next) => {\n const contentType = req.headers?.[\"content-type\"] || \"\";\n const contentLength = parseInt(req.headers?.[\"content-length\"] || \"0\", 10);\n\n const shouldCheck = types.some((type) => contentType.includes(type));\n\n if (shouldCheck && contentLength > limit) {\n res.status(413).json({\n error: \"Payload too large\",\n limit,\n received: contentLength,\n });\n return;\n }\n\n return next ? next() : Promise.resolve();\n };\n}\n","import type { RequestHandler } from \"../../types/common.type\";\n\ninterface HealthCheckOptions {\n path?: string;\n healthChecks?: Record<string, () => Promise<boolean>>;\n}\n\nexport function healthCheck(options: HealthCheckOptions = {}): RequestHandler {\n const path = options.path || \"/health\";\n const checks = options.healthChecks || {};\n\n return async (req, res, next) => {\n if (req.path !== path) {\n return next ? next() : Promise.resolve();\n }\n\n const results: Record<string, { status: string; error?: string }> = {};\n let allHealthy = true;\n\n for (const [name, check] of Object.entries(checks)) {\n try {\n const healthy = await check();\n results[name] = { status: healthy ? \"healthy\" : \"unhealthy\" };\n if (!healthy) allHealthy = false;\n } catch (error: any) {\n results[name] = { status: \"unhealthy\", error: error.message };\n allHealthy = false;\n }\n }\n\n const status = allHealthy ? 200 : 503;\n res.status(status).json({\n status: allHealthy ? \"healthy\" : \"unhealthy\",\n timestamp: new Date().toISOString(),\n checks: results,\n });\n };\n}\n","import type { RequestHandler } from \"../../types/common.type\";\n\ninterface RequestIdOptions {\n header?: string;\n generator?: () => string;\n}\n\nexport function requestId(options: RequestIdOptions = {}): RequestHandler {\n const header = options.header || \"x-request-id\";\n const generator = options.generator || (() => {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`;\n });\n\n return (req, res, next) => {\n let id = req.headers?.[header];\n\n if (!id) {\n id = generator();\n }\n\n (req as any).id = id;\n res.set(header, id as string);\n\n return next ? next() : Promise.resolve();\n };\n}\n","import type { RequestHandler } from \"../../types/common.type\";\n\ntype CircuitState = \"closed\" | \"open\" | \"half-open\";\n\ninterface CircuitBreakerOptions {\n threshold?: number;\n timeout?: number;\n resetTimeout?: number;\n onStateChange?: (oldState: CircuitState, newState: CircuitState) => void;\n}\n\nclass CircuitBreaker {\n private state: CircuitState = \"closed\";\n private failureCount = 0;\n private nextAttempt = 0;\n\n constructor(private options: CircuitBreakerOptions) {}\n\n async execute<T>(fn: () => Promise<T>): Promise<T> {\n if (this.state === \"open\") {\n if (Date.now() < this.nextAttempt) {\n throw new Error(\"Circuit breaker is open\");\n }\n this.setState(\"half-open\");\n }\n\n try {\n const result = await Promise.race([\n fn(),\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error(\"Timeout\")), this.options.timeout || 5000),\n ),\n ]);\n\n if (this.state === \"half-open\") {\n this.setState(\"closed\");\n }\n\n this.failureCount = 0;\n return result;\n } catch (error) {\n this.failureCount++;\n\n if (this.failureCount >= (this.options.threshold || 5)) {\n this.setState(\"open\");\n this.nextAttempt = Date.now() + (this.options.resetTimeout || 60000);\n }\n\n throw error;\n }\n }\n\n private setState(newState: CircuitState) {\n const oldState = this.state;\n this.state = newState;\n if (this.options.onStateChange) {\n this.options.onStateChange(oldState, newState);\n }\n }\n\n getState(): CircuitState {\n return this.state;\n }\n}\n\nexport function circuitBreaker(options: CircuitBreakerOptions = {}): RequestHandler {\n const breaker = new CircuitBreaker(options);\n\n return async (req, res, next) => {\n try {\n await breaker.execute(async () => {\n if (next) {\n await next();\n }\n });\n } catch (error: any) {\n if (error.message === \"Circuit breaker is open\") {\n res.status(503).json({ error: \"Service unavailable\" });\n } else {\n res.status(500).json({ error: error.message });\n }\n }\n };\n}\n\nexport { CircuitBreaker };\n"]}
1
+ {"version":3,"sources":["../src/shared/plugins/CORSPlugin.ts","../src/shared/plugins/RateLimitPlugin.ts","../src/types/utils/colors.type.ts","../src/types/utils/icons.type.ts","../src/utils/Logger.ts","../src/shared/plugins/ProxyPlugin.ts","../src/shared/plugins/SSEPlugin.ts","../src/shared/plugins/CompressionPlugin.ts","../src/shared/plugins/StaticPlugin.ts","../src/shared/plugins/HelmetPlugin.ts","../src/shared/plugins/CSRFPlugin.ts","../src/shared/plugins/MultipartPlugin.ts","../src/shared/plugins/TimeoutPlugin.ts","../src/shared/plugins/ETagPlugin.ts","../src/shared/plugins/SessionPlugin.ts","../src/shared/plugins/JWTPlugin.ts","../src/shared/plugins/BodyLimitPlugin.ts","../src/shared/plugins/HealthCheckPlugin.ts","../src/shared/plugins/RequestIdPlugin.ts","../src/shared/plugins/CircuitBreakerPlugin.ts"],"names":["timeout","https","http","createBrotliCompress","createGzip","createDeflate","resolve","join","stat","extname","etag","readFile","createHash","randomBytes","mkdir","createWriteStream","store","createHmac","timingSafeEqual"],"mappings":"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","file":"plugins.cjs","sourcesContent":["import type { HttpContext } from \"../../types/common.type\";\nimport type { CorsOptions } from \"../../types/plugins/cors.type\";\n\nexport function cors(opts: CorsOptions) {\n const allowedOrigin = opts.origin ?? \"*\";\n const methods = opts.methods ?? \"GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS\";\n const allowedHeaders =\n opts.allowedHeaders ?? \"Content-Type,Authorization,Cookie,X-Requested-With,Accept\";\n const credentials = opts.credentials === true;\n\n return async (ctx: HttpContext, next: () => Promise<void>) => {\n const requestOrigin = ctx.request.headers[\"origin\"] as string;\n\n if (allowedOrigin === \"*\") {\n if (credentials && requestOrigin) {\n ctx.response.setHeader(\"Access-Control-Allow-Origin\", requestOrigin);\n } else {\n ctx.response.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n }\n } else if (Array.isArray(allowedOrigin)) {\n if (requestOrigin && allowedOrigin.includes(requestOrigin)) {\n ctx.response.setHeader(\"Access-Control-Allow-Origin\", requestOrigin);\n }\n } else if (allowedOrigin) {\n ctx.response.setHeader(\"Access-Control-Allow-Origin\", allowedOrigin as string);\n }\n\n if (credentials) {\n ctx.response.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\n }\n\n ctx.response.setHeader(\n \"Access-Control-Allow-Methods\",\n Array.isArray(methods) ? methods.join(\",\") : methods,\n );\n\n ctx.response.setHeader(\n \"Access-Control-Allow-Headers\",\n Array.isArray(allowedHeaders) ? allowedHeaders.join(\",\") : allowedHeaders,\n );\n\n ctx.response.setHeader(\"Vary\", \"Origin\");\n\n if (ctx.request.method === \"OPTIONS\") {\n ctx.response.statusCode = 204;\n ctx.response.setHeader(\"Content-Length\", \"0\");\n ctx.response.end();\n return;\n }\n\n return next();\n };\n}\n","import type { HttpContext } from \"../../types/common.type\";\n\ninterface Entry {\n count: number;\n ts: number;\n}\n\nconst store = new Map<string, Entry>();\n\nexport function rateLimit(limit: number, ttl: number) {\n return async (ctx: HttpContext, next: () => Promise<void>) => {\n const ip = ctx.request.socket.remoteAddress;\n const now = Date.now();\n const entry = store.get(ip!) ?? { count: 0, ts: now };\n\n if (now - entry.ts > ttl) {\n entry.count = 1;\n entry.ts = now;\n } else {\n entry.count++;\n }\n\n store.set(ip!, entry);\n\n if (entry.count > limit) {\n ctx.response.status(429).send(\"Too many requests\");\n return;\n }\n\n await next();\n };\n}\n","/**\n * ANSI escape codes for text styling\n * These codes control text formatting in terminal output\n */\nexport const RESET = \"\\x1b[0m\"; // Reset all styles\nexport const BOLD = \"\\x1b[1m\"; // Bold/bright text\nexport const DIM = \"\\x1b[2m\"; // Dim/faded text\n\n/**\n * Predefined ANSI foreground colors\n * Includes standard and bright color variants\n */\nexport const ANSI_COLORS = {\n black: \"\\x1b[30m\",\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 gray: \"\\x1b[90m\",\n brightRed: \"\\x1b[91m\",\n brightGreen: \"\\x1b[92m\",\n brightYellow: \"\\x1b[93m\",\n brightBlue: \"\\x1b[94m\",\n brightMagenta: \"\\x1b[95m\",\n brightCyan: \"\\x1b[96m\",\n brightWhite: \"\\x1b[97m\",\n};\n\n/**\n * ANSI background color codes\n * Used for highlighting text with colored backgrounds\n */\nexport const BG_COLORS = {\n bgBlack: \"\\x1b[40m\",\n bgRed: \"\\x1b[41m\",\n bgGreen: \"\\x1b[42m\",\n bgYellow: \"\\x1b[43m\",\n bgBlue: \"\\x1b[44m\",\n bgMagenta: \"\\x1b[45m\",\n bgCyan: \"\\x1b[46m\",\n bgWhite: \"\\x1b[47m\",\n};\n\n/**\n * Default color mapping for each log level\n * Provides semantic color coding for different message types\n */\nexport const DEFAULT_COLORS = {\n debug: ANSI_COLORS.gray,\n info: ANSI_COLORS.cyan,\n success: ANSI_COLORS.brightGreen,\n warn: ANSI_COLORS.yellow,\n error: ANSI_COLORS.red,\n fatal: ANSI_COLORS.brightRed,\n trace: ANSI_COLORS.magenta,\n log: ANSI_COLORS.white,\n};\n","/**\n * Default emoji icons for each log level\n * Provides visual indicators to quickly identify message severity\n */\nexport const DEFAULT_ICONS = {\n debug: \"🐛\",\n info: \"ℹ️\",\n success: \"✅\",\n warn: \"⚠️\",\n error: \"❌\",\n fatal: \"💀\",\n trace: \"🔍\",\n log: \"📝\",\n arrow: \"➡️\",\n};\n","import type { LoggerConfig } from \"../types/logger.types\";\nimport {\n ANSI_COLORS,\n BG_COLORS,\n BOLD,\n DEFAULT_COLORS,\n DIM,\n RESET,\n} from \"../types/utils/colors.type\";\nimport { DEFAULT_ICONS } from \"../types/utils/icons.type\";\n\n/**\n * Global logger configuration\n * These settings apply to all logger calls unless overridden by instance-specific options\n */\nlet globalConfig: LoggerConfig = {\n showTimestamp: false,\n showIcon: true,\n timestampFormat: \"time\",\n prefix: \"Azura\",\n uppercase: true,\n bold: false,\n dim: false,\n};\n\n/**\n * Configure the logger globally\n * Updates default settings that apply to all subsequent log calls\n * @param config - Logger configuration options\n * @example\n * configureLogger({\n * showTimestamp: true,\n * timestampFormat: 'datetime',\n * bold: true,\n * prefix: 'MyApp'\n * });\n */\nexport function configureLogger(config: LoggerConfig): void {\n globalConfig = { ...globalConfig, ...config };\n}\n\n/**\n * Convert hexadecimal color code to ANSI escape sequence\n * @param hex - Hexadecimal color string (e.g., '#ff5733')\n * @returns ANSI color escape sequence for 24-bit RGB color\n * @example hexToAnsi('#00ff00') // Returns ANSI code for green\n */\nfunction hexToAnsi(hex: string): string {\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n return `\\x1b[38;2;${r};${g};${b}m`;\n}\n\n/**\n * Convert RGB color values to ANSI escape sequence\n * @param r - Red component (0-255)\n * @param g - Green component (0-255)\n * @param b - Blue component (0-255)\n * @returns ANSI color escape sequence for 24-bit RGB color\n * @example rgbToAnsi(255, 0, 128) // Returns ANSI code for custom pink\n */\nfunction rgbToAnsi(r: number, g: number, b: number): string {\n return `\\x1b[38;2;${r};${g};${b}m`;\n}\n\n/**\n * Resolve color string to ANSI escape sequence\n * Supports hex (#rrggbb), rgb (rgb(r,g,b)), and predefined color names\n * @param color - Color specification string\n * @returns ANSI escape sequence for the specified color\n * @example\n * getColorCode('#ff0000') // Hex color\n * getColorCode('rgb(255,0,0)') // RGB color\n * getColorCode('brightRed') // Predefined color\n */\nfunction getColorCode(color: string): string {\n if (color.startsWith(\"#\")) {\n return hexToAnsi(color);\n }\n if (color.startsWith(\"rgb(\")) {\n const match = color.match(/rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/);\n if (match) {\n return rgbToAnsi(Number(match[1]), Number(match[2]), Number(match[3]));\n }\n }\n return (ANSI_COLORS as any)[color] || color;\n}\n\n/**\n * Format current timestamp according to specified format\n * @param format - Timestamp format: 'time' (HH:MM:SS), 'datetime' (locale string), or 'iso' (ISO 8601)\n * @returns Formatted timestamp string\n * @example\n * formatTimestamp('time') // '14:23:45'\n * formatTimestamp('datetime') // '1/11/2026, 2:23:45 PM'\n * formatTimestamp('iso') // '2026-01-11T14:23:45.123Z'\n */\nfunction formatTimestamp(format: \"time\" | \"datetime\" | \"iso\"): string {\n const now = new Date();\n switch (format) {\n case \"time\":\n return now.toLocaleTimeString();\n case \"datetime\":\n return now.toLocaleString();\n case \"iso\":\n return now.toISOString();\n default:\n return now.toLocaleTimeString();\n }\n}\n\n/**\n * Main logger function - outputs formatted log messages to console\n * Supports multiple log levels, custom colors, icons, timestamps, and styling options\n * @param level - Log level (debug, info, success, warn, error, fatal, trace, log)\n * @param msg - Message to log\n * @param options - Optional configuration to override global settings for this log call\n * @example\n * logger('info', 'Server started on port 3000');\n * logger('error', 'Connection failed', { showTimestamp: true });\n * logger('success', 'Task completed', { colors: { success: '#00ff00' } });\n */\nexport function logger(\n level: keyof typeof DEFAULT_COLORS,\n msg: string,\n options?: LoggerConfig\n): void {\n const config = { ...globalConfig, ...options };\n\n const colors = { ...DEFAULT_COLORS, ...config.colors };\n const icons = { ...DEFAULT_ICONS, ...config.icons };\n\n const color = getColorCode(colors[level] || ANSI_COLORS.white);\n const icon = config.showIcon !== false ? icons[level] || \"\" : \"\";\n const levelLabel = config.uppercase ? level.toUpperCase() : level;\n\n let style = color;\n if (config.bold) style += BOLD;\n if (config.dim) style += DIM;\n if (config.backgroundColor) {\n style += getColorCode(config.backgroundColor);\n }\n\n const parts: string[] = [];\n\n // Add timestamp if enabled\n if (config.showTimestamp) {\n const timestamp = formatTimestamp(config.timestampFormat || \"time\");\n parts.push(`${DIM}${timestamp}${RESET}`);\n }\n\n // Add icon\n if (icon) {\n parts.push(icon);\n }\n\n // Add prefix and level\n const prefix = config.prefix\n ? `${style}[${config.prefix}:${levelLabel}]${RESET}`\n : `${style}[${levelLabel}]${RESET}`;\n parts.push(prefix);\n\n // Add message\n parts.push(msg);\n\n const output = parts.join(\" \");\n\n // Use appropriate console method\n const consoleMethod =\n level === \"error\" || level === \"fatal\"\n ? console.error\n : level === \"warn\"\n ? console.warn\n : level === \"debug\" || level === \"trace\"\n ? console.debug\n : console.log;\n\n consoleMethod(output);\n}\n\n/**\n * Convenience methods for each log level\n * Provides a cleaner API for common logging operations\n * @example\n * log.info('Server started');\n * log.error('Connection failed');\n * log.success('Task completed successfully');\n */\nexport const log = {\n debug: (msg: string, options?: LoggerConfig) => logger(\"debug\", msg, options),\n info: (msg: string, options?: LoggerConfig) => logger(\"info\", msg, options),\n success: (msg: string, options?: LoggerConfig) => logger(\"success\", msg, options),\n warn: (msg: string, options?: LoggerConfig) => logger(\"warn\", msg, options),\n error: (msg: string, options?: LoggerConfig) => logger(\"error\", msg, options),\n fatal: (msg: string, options?: LoggerConfig) => logger(\"fatal\", msg, options),\n trace: (msg: string, options?: LoggerConfig) => logger(\"trace\", msg, options),\n log: (msg: string, options?: LoggerConfig) => logger(\"log\", msg, options),\n};\n\n/**\n * Color utility functions and constants for advanced customization\n * Provides direct access to color conversion functions and ANSI codes\n * @example\n * colors.hex('#ff5733') // Convert hex to ANSI\n * colors.rgb(255, 87, 51) // Convert RGB to ANSI\n * colors.ansi.brightGreen // Access predefined colors\n * colors.bg.bgRed // Access background colors\n */\nexport const colors = {\n hex: hexToAnsi,\n rgb: rgbToAnsi,\n ansi: ANSI_COLORS,\n bg: BG_COLORS,\n reset: RESET,\n bold: BOLD,\n dim: DIM,\n};\n","import http from \"node:http\";\nimport https from \"node:https\";\nimport type { RequestServer } from \"../../types/http/request.type\";\nimport type { ResponseServer } from \"../../types/http/response.type\";\nimport { logger } from \"../../utils/Logger\";\nimport type { ProxyOptions } from \"../../types/plugins/proxy.type\";\n\nexport function createProxyMiddleware(options: ProxyOptions) {\n const {\n target,\n pathRewrite = {},\n headers = {},\n timeout = 30000,\n followRedirects = false,\n preserveHost = false,\n logLevel = \"info\",\n onProxyReq,\n onProxyRes,\n onError,\n } = options;\n\n return async (req: RequestServer, res: ResponseServer, next?: Function) => {\n try {\n // Parse target URL\n const targetUrl = new URL(target);\n const isHttps = targetUrl.protocol === \"https:\";\n const client = isHttps ? https : http;\n\n // Construir o path\n let path = req.path || \"/\";\n\n // Aplicar path rewrites\n for (const [pattern, replacement] of Object.entries(pathRewrite)) {\n const regex = new RegExp(pattern);\n path = path.replace(regex, replacement);\n }\n\n // Adicionar query string\n if (req.url && req.url.includes(\"?\")) {\n const queryString = req.url.split(\"?\")[1];\n path += `?${queryString}`;\n }\n\n if (logLevel !== \"none\") {\n logger(\n logLevel === \"debug\" ? \"info\" : \"info\",\n `[Proxy] ${req.method} ${req.url} → ${target}${path}`\n );\n }\n\n // Configurar headers\n const proxyHeaders: http.OutgoingHttpHeaders = {\n ...req.headers,\n ...headers,\n };\n\n // Remover headers problemáticos\n delete proxyHeaders[\"host\"];\n delete proxyHeaders[\"connection\"];\n delete proxyHeaders[\"transfer-encoding\"];\n\n if (preserveHost && req.headers.host) {\n proxyHeaders[\"host\"] = req.headers.host;\n } else {\n proxyHeaders[\"host\"] = targetUrl.host;\n }\n\n // Adicionar headers de forwarding\n if (req.ip) {\n proxyHeaders[\"x-forwarded-for\"] = req.ip;\n }\n proxyHeaders[\"x-forwarded-proto\"] = req.protocol || \"http\";\n proxyHeaders[\"x-forwarded-host\"] = req.headers.host || \"\";\n\n // Criar requisição proxy\n const proxyReqOptions: http.RequestOptions = {\n hostname: targetUrl.hostname,\n port: targetUrl.port || (isHttps ? 443 : 80),\n path,\n method: req.method,\n headers: proxyHeaders,\n timeout,\n };\n\n const proxyReq = client.request(proxyReqOptions, (proxyRes) => {\n // Callback customizado\n if (onProxyRes) {\n onProxyRes(proxyRes, req, res);\n }\n\n // Copiar status code\n res.statusCode = proxyRes.statusCode || 200;\n\n // Copiar headers (exceto alguns problemáticos)\n if (proxyRes.headers) {\n for (const [key, value] of Object.entries(proxyRes.headers)) {\n if (key.toLowerCase() !== \"transfer-encoding\" && value) {\n res.setHeader(key, value);\n }\n }\n }\n\n // Fazer pipe da resposta diretamente\n proxyRes.pipe(res as any);\n });\n\n // Callback customizado antes de enviar\n if (onProxyReq) {\n onProxyReq(proxyReq, req);\n }\n\n // Lidar com erros\n proxyReq.on(\"error\", (err) => {\n if (onError) {\n onError(err, req, res);\n } else {\n logger(\"error\", `[Proxy] Error: ${err.message}`);\n if (!res.headersSent) {\n res.statusCode = 502;\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify({\n error: \"Bad Gateway\",\n message: \"Failed to connect to upstream server\",\n }));\n }\n }\n });\n\n proxyReq.on(\"timeout\", () => {\n proxyReq.destroy();\n if (!res.headersSent) {\n res.statusCode = 504;\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify({\n error: \"Gateway Timeout\",\n message: \"Upstream server took too long to respond\",\n }));\n }\n });\n\n // Enviar body se existir\n if (req.body && [\"POST\", \"PUT\", \"PATCH\"].includes(req.method || \"\")) {\n const bodyStr = typeof req.body === \"string\" ? req.body : JSON.stringify(req.body);\n proxyReq.write(bodyStr);\n }\n\n proxyReq.end();\n } catch (err: any) {\n logger(\"error\", `[Proxy] Setup error: ${err.message}`);\n if (!res.headersSent) {\n res.statusCode = 500;\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify({\n error: \"Internal Server Error\",\n message: \"Failed to setup proxy\",\n }));\n }\n }\n };\n}\n\n/**\n * Middleware de proxy simples - apenas passa o target\n */\nexport function proxyPlugin(target: string, options: Partial<ProxyOptions> = {}) {\n return createProxyMiddleware({ target, ...options });\n}\n","import type { ResponseServer } from \"../../types/http/response.type\";\n\ntype ConnectionId = string;\ntype ChannelName = string;\ntype EventName = string;\ntype EventData = unknown;\n\nexport interface SSEConnection {\n readonly id: ConnectionId;\n readonly res: ResponseServer;\n readonly lastEventId?: string;\n}\n\nclass ConnectionIdGenerator {\n public generate(): ConnectionId {\n const random = Math.random().toString(36).substring(2);\n const timestamp = Date.now().toString(36);\n return `${random}${timestamp}`;\n }\n}\n\nclass SSEMessage {\n constructor(\n private readonly event: EventName,\n private readonly data: EventData,\n private readonly id?: string\n ) {}\n\n public format(): string {\n let message = \"\";\n \n if (this.id) {\n message += `id: ${this.id}\\n`;\n }\n \n message += `event: ${this.event}\\n`;\n message += `data: ${JSON.stringify(this.data)}\\n\\n`;\n \n return message;\n }\n}\n\nclass ConnectionRegistry {\n private readonly connections: Map<ConnectionId, SSEConnection>;\n\n constructor() {\n this.connections = new Map();\n }\n\n public add(connection: SSEConnection): void {\n this.connections.set(connection.id, connection);\n }\n\n public remove(id: ConnectionId): void {\n this.connections.delete(id);\n }\n\n public get(id: ConnectionId): SSEConnection | undefined {\n return this.connections.get(id);\n }\n\n public getAll(): ReadonlyArray<SSEConnection> {\n return Array.from(this.connections.values());\n }\n\n public has(id: ConnectionId): boolean {\n return this.connections.has(id);\n }\n}\n\nclass ChannelRegistry {\n private readonly channels: Map<ChannelName, Set<ConnectionId>>;\n\n constructor() {\n this.channels = new Map();\n }\n\n public subscribe(channel: ChannelName, connectionId: ConnectionId): void {\n this.ensureChannelExists(channel);\n this.channels.get(channel)!.add(connectionId);\n }\n\n public unsubscribe(channel: ChannelName, connectionId: ConnectionId): void {\n const connections = this.channels.get(channel);\n if (!connections) {\n return;\n }\n\n connections.delete(connectionId);\n this.removeEmptyChannel(channel, connections);\n }\n\n public getConnections(channel: ChannelName): ReadonlySet<ConnectionId> | undefined {\n return this.channels.get(channel);\n }\n\n public getAllChannelsForConnection(connectionId: ConnectionId): ReadonlyArray<ChannelName> {\n const channels: ChannelName[] = [];\n \n for (const [channel, connections] of this.channels) {\n if (connections.has(connectionId)) {\n channels.push(channel);\n }\n }\n \n return channels;\n }\n\n private ensureChannelExists(channel: ChannelName): void {\n if (this.channels.has(channel)) {\n return;\n }\n this.channels.set(channel, new Set());\n }\n\n private removeEmptyChannel(channel: ChannelName, connections: Set<ConnectionId>): void {\n if (connections.size === 0) {\n this.channels.delete(channel);\n }\n }\n}\n\nclass SSEHeaders {\n private static readonly HEADERS = {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n \"Connection\": \"keep-alive\",\n \"X-Accel-Buffering\": \"no\",\n } as const;\n\n public static write(res: ResponseServer): void {\n res.writeHead(200, this.HEADERS);\n }\n}\n\nexport class SSEManager {\n private readonly connectionRegistry: ConnectionRegistry;\n private readonly channelRegistry: ChannelRegistry;\n private readonly idGenerator: ConnectionIdGenerator;\n\n constructor() {\n this.connectionRegistry = new ConnectionRegistry();\n this.channelRegistry = new ChannelRegistry();\n this.idGenerator = new ConnectionIdGenerator();\n }\n\n public connect(res: ResponseServer, lastEventId?: string): ConnectionId {\n const id = this.idGenerator.generate();\n SSEHeaders.write(res);\n\n const connection: SSEConnection = { id, res, lastEventId };\n this.connectionRegistry.add(connection);\n\n this.setupConnectionClose(res, id);\n this.sendWelcomeMessage(res, id);\n\n return id;\n }\n\n private setupConnectionClose(res: ResponseServer, id: ConnectionId): void {\n res.on(\"close\", () => {\n this.disconnect(id);\n });\n }\n\n private sendWelcomeMessage(res: ResponseServer, id: ConnectionId): void {\n res.write(`id: ${id}\\n\\n`);\n }\n\n public send(connectionId: ConnectionId, event: EventName, data: EventData, id?: string): void {\n const connection = this.connectionRegistry.get(connectionId);\n if (!connection) {\n return;\n }\n\n const message = new SSEMessage(event, data, id);\n connection.res.write(message.format());\n }\n\n public sendToAll(event: EventName, data: EventData, id?: string): void {\n const connections = this.connectionRegistry.getAll();\n \n for (const connection of connections) {\n this.send(connection.id, event, data, id);\n }\n }\n\n public sendToChannel(channel: ChannelName, event: EventName, data: EventData, id?: string): void {\n const connectionIds = this.channelRegistry.getConnections(channel);\n if (!connectionIds) {\n return;\n }\n\n for (const connectionId of connectionIds) {\n this.send(connectionId, event, data, id);\n }\n }\n\n public subscribe(connectionId: ConnectionId, channel: ChannelName): void {\n this.channelRegistry.subscribe(channel, connectionId);\n }\n\n public unsubscribe(connectionId: ConnectionId, channel: ChannelName): void {\n this.channelRegistry.unsubscribe(channel, connectionId);\n }\n\n public disconnect(connectionId: ConnectionId): void {\n const connection = this.connectionRegistry.get(connectionId);\n if (!connection) {\n return;\n }\n\n this.unsubscribeFromAllChannels(connectionId);\n connection.res.end();\n this.connectionRegistry.remove(connectionId);\n }\n\n private unsubscribeFromAllChannels(connectionId: ConnectionId): void {\n const channels = this.channelRegistry.getAllChannelsForConnection(connectionId);\n \n for (const channel of channels) {\n this.unsubscribe(connectionId, channel);\n }\n }\n\n public getConnection(connectionId: ConnectionId): SSEConnection | undefined {\n return this.connectionRegistry.get(connectionId);\n }\n\n public getConnections(): ReadonlyArray<SSEConnection> {\n return this.connectionRegistry.getAll();\n }\n}\n\nexport function createSSEHandler(): SSEManager {\n return new SSEManager();\n}\n","import { createGzip, createDeflate, createBrotliCompress } from \"node:zlib\";\nimport type { RequestHandler } from \"../../types/common.type\";\n\ntype ContentType = string;\ntype EncodingType = \"br\" | \"gzip\" | \"deflate\";\n\ninterface CompressionOptions {\n readonly threshold?: number;\n readonly level?: number;\n readonly filter?: ContentTypeFilter;\n}\n\ntype ContentTypeFilter = (contentType: ContentType) => boolean;\n\nclass DefaultContentTypeFilter {\n private static readonly COMPRESSIBLE_PATTERN = /text|json|javascript|css|xml|svg|wasm/;\n\n public static test(contentType: ContentType): boolean {\n return this.COMPRESSIBLE_PATTERN.test(contentType);\n }\n}\n\nclass CompressionThreshold {\n constructor(private readonly value: number) {}\n\n public exceeds(size: number): boolean {\n return size >= this.value;\n }\n}\n\nclass BodySize {\n constructor(private readonly body: unknown) {}\n\n public calculate(): number {\n if (Buffer.isBuffer(this.body)) {\n return this.body.length;\n }\n return Buffer.byteLength(String(this.body));\n }\n}\n\nclass CompressionEligibility {\n constructor(\n private readonly threshold: CompressionThreshold,\n private readonly filter: ContentTypeFilter,\n ) {}\n\n public check(body: unknown, contentType: ContentType): boolean {\n if (!body) {\n return false;\n }\n\n const size = new BodySize(body).calculate();\n return this.threshold.exceeds(size) && this.filter(contentType);\n }\n}\n\nclass EncodingMatcher {\n private readonly patterns: ReadonlyMap<EncodingType, RegExp>;\n\n constructor() {\n this.patterns = new Map([\n [\"br\", /\\bbr\\b/],\n [\"gzip\", /\\bgzip\\b/],\n [\"deflate\", /\\bdeflate\\b/],\n ]);\n }\n\n public match(acceptEncoding: string): EncodingType | null {\n for (const [encoding, pattern] of this.patterns) {\n if (pattern.test(acceptEncoding)) {\n return encoding;\n }\n }\n return null;\n }\n}\n\nclass CompressionStreamFactory {\n constructor(private readonly level: number) {}\n\n public create(encoding: EncodingType) {\n if (encoding === \"br\") {\n return createBrotliCompress();\n }\n\n if (encoding === \"gzip\") {\n return createGzip({ level: this.level });\n }\n\n return createDeflate({ level: this.level });\n }\n}\n\nclass BodyTransformer {\n public toBuffer(body: unknown): Buffer {\n return Buffer.isBuffer(body) ? body : Buffer.from(String(body));\n }\n}\n\nclass CompressionHeaders {\n constructor(private readonly encoding: EncodingType) {}\n\n public apply(res: any): void {\n res.set(\"Content-Encoding\", this.encoding);\n res.set(\"Vary\", \"Accept-Encoding\");\n res.removeHeader(\"Content-Length\");\n }\n}\n\nclass StreamCompressor {\n constructor(\n private readonly streamFactory: CompressionStreamFactory,\n private readonly transformer: BodyTransformer,\n ) {}\n\n public compress(res: any, body: unknown, encoding: EncodingType): void {\n const buffer = this.transformer.toBuffer(body);\n new CompressionHeaders(encoding).apply(res);\n\n const stream = this.streamFactory.create(encoding);\n stream.pipe(res);\n stream.end(buffer);\n }\n}\n\nclass CompressibleResponse {\n constructor(\n private readonly eligibility: CompressionEligibility,\n private readonly matcher: EncodingMatcher,\n private readonly compressor: StreamCompressor,\n ) {}\n\n public process(res: any, body: unknown, acceptEncoding: string): boolean {\n const contentType = res.get(\"Content-Type\") ?? \"\";\n\n if (!this.eligibility.check(body, contentType)) {\n return false;\n }\n\n const encoding = this.matcher.match(acceptEncoding);\n if (!encoding) {\n return false;\n }\n\n this.compressor.compress(res, body, encoding);\n return true;\n }\n}\n\nclass SendMethodInterceptor {\n constructor(\n private readonly originalMethod: any,\n private readonly processor: CompressibleResponse,\n private readonly acceptEncoding: string,\n ) {}\n\n public intercept(res: any): (body: unknown) => any {\n return (body: unknown) => {\n const compressed = this.processor.process(res, body, this.acceptEncoding);\n if (compressed) {\n return res;\n }\n return this.originalMethod.call(res, body);\n };\n }\n}\n\nclass JsonMethodInterceptor {\n constructor(\n private readonly originalMethod: any,\n private readonly processor: CompressibleResponse,\n private readonly acceptEncoding: string,\n ) {}\n\n public intercept(res: any): (body: unknown) => any {\n return (body: unknown) => {\n res.set(\"Content-Type\", \"application/json\");\n const jsonString = JSON.stringify(body);\n\n const compressed = this.processor.process(res, jsonString, this.acceptEncoding);\n if (compressed) {\n return res;\n }\n return this.originalMethod.call(res, body);\n };\n }\n}\n\nexport function compression(options: CompressionOptions = {}): RequestHandler {\n const threshold = new CompressionThreshold(options.threshold ?? 1024);\n const filter = options.filter ?? DefaultContentTypeFilter.test;\n const level = options.level ?? 6;\n\n const eligibility = new CompressionEligibility(threshold, filter);\n const matcher = new EncodingMatcher();\n const streamFactory = new CompressionStreamFactory(level);\n const transformer = new BodyTransformer();\n const compressor = new StreamCompressor(streamFactory, transformer);\n const processor = new CompressibleResponse(eligibility, matcher, compressor);\n\n return (req, res, next) => {\n const acceptEncoding = req.headers?.[\"accept-encoding\"] ?? \"\";\n\n const sendInterceptor = new SendMethodInterceptor(res.send, processor, acceptEncoding);\n const jsonInterceptor = new JsonMethodInterceptor(res.json, processor, acceptEncoding);\n\n res.send = sendInterceptor.intercept(res);\n res.json = jsonInterceptor.intercept(res);\n\n return next ? next() : Promise.resolve();\n };\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport { createReadStream } from \"node:fs\";\nimport { join, extname, resolve } from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport type { RequestHandler } from \"../../types/common.type\";\n\ninterface StaticOptions {\n maxAge?: number;\n immutable?: boolean;\n etag?: boolean;\n extensions?: string[];\n index?: string[];\n dotfiles?: \"allow\" | \"deny\" | \"ignore\";\n}\n\nconst mimeTypes: Record<string, string> = {\n \".html\": \"text/html\",\n \".css\": \"text/css\",\n \".js\": \"application/javascript\",\n \".json\": \"application/json\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n \".ico\": \"image/x-icon\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".otf\": \"font/otf\",\n \".mp4\": \"video/mp4\",\n \".webm\": \"video/webm\",\n \".mp3\": \"audio/mpeg\",\n \".wav\": \"audio/wav\",\n \".pdf\": \"application/pdf\",\n \".txt\": \"text/plain\",\n \".xml\": \"application/xml\",\n \".zip\": \"application/zip\",\n \".wasm\": \"application/wasm\",\n};\n\nconst cache = new Map<string, { etag: string; data: Buffer; mtime: number }>();\n\nexport function serveStatic(root: string, options: StaticOptions = {}): RequestHandler {\n const maxAge = options.maxAge ?? 0;\n const immutable = options.immutable ?? false;\n const useEtag = options.etag ?? true;\n const extensions = options.extensions ?? [\".html\"];\n const indexFiles = options.index ?? [\"index.html\"];\n const dotfiles = options.dotfiles ?? \"ignore\";\n\n const rootPath = resolve(root);\n\n return async (req, res, next) => {\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n return next ? next() : Promise.resolve();\n }\n\n let filePath = decodeURIComponent(req.path || \"/\");\n filePath = filePath.replace(/\\\\/g, \"/\").replace(/\\.\\.+/g, \"\");\n\n if (dotfiles === \"deny\" && /(^|\\/)\\.[^\\/]+/.test(filePath)) {\n res.status(403).send(\"Forbidden\");\n return;\n }\n\n if (dotfiles === \"ignore\" && /(^|\\/)\\.[^\\/]+/.test(filePath)) {\n return next ? next() : Promise.resolve();\n }\n\n const fullPath = join(rootPath, filePath);\n\n if (!fullPath.startsWith(rootPath)) {\n res.status(403).send(\"Forbidden\");\n return;\n }\n\n try {\n const stats = await stat(fullPath);\n\n let targetPath = fullPath;\n let targetStats = stats;\n\n if (stats.isDirectory()) {\n let found = false;\n for (const indexFile of indexFiles) {\n const indexPath = join(fullPath, indexFile);\n try {\n const indexStats = await stat(indexPath);\n if (indexStats.isFile()) {\n targetPath = indexPath;\n targetStats = indexStats;\n found = true;\n break;\n }\n } catch {}\n }\n if (!found) {\n return next ? next() : Promise.resolve();\n }\n } else if (!stats.isFile()) {\n return next ? next() : Promise.resolve();\n }\n\n const ext = extname(targetPath);\n const mimeType = mimeTypes[ext] || \"application/octet-stream\";\n\n res.set(\"Content-Type\", mimeType);\n\n const cacheControl = [];\n if (maxAge > 0) {\n cacheControl.push(`max-age=${maxAge}`);\n }\n if (immutable) {\n cacheControl.push(\"immutable\");\n }\n if (cacheControl.length > 0) {\n res.set(\"Cache-Control\", cacheControl.join(\", \"));\n }\n\n const mtime = targetStats.mtimeMs;\n let etag: string | undefined;\n let fileData: Buffer | undefined;\n\n const cached = cache.get(targetPath);\n if (cached && cached.mtime === mtime) {\n etag = cached.etag;\n fileData = cached.data;\n } else {\n fileData = await readFile(targetPath);\n if (useEtag) {\n etag = `\"${createHash(\"md5\").update(fileData).digest(\"hex\")}\"`;\n cache.set(targetPath, { etag, data: fileData, mtime });\n }\n }\n\n if (useEtag && etag) {\n res.set(\"ETag\", etag);\n const ifNoneMatch = req.headers?.[\"if-none-match\"];\n if (ifNoneMatch === etag) {\n res.status(304).send(\"\");\n return;\n }\n }\n\n const lastModified = new Date(targetStats.mtime).toUTCString();\n res.set(\"Last-Modified\", lastModified);\n\n const ifModifiedSince = req.headers?.[\"if-modified-since\"];\n if (ifModifiedSince && new Date(ifModifiedSince) >= targetStats.mtime) {\n res.status(304).send(\"\");\n return;\n }\n\n if (req.method === \"HEAD\") {\n res.set(\"Content-Length\", String(targetStats.size));\n res.send(\"\");\n return;\n }\n\n res.send(fileData);\n } catch (err: any) {\n if (err.code === \"ENOENT\") {\n return next ? next() : Promise.resolve();\n }\n res.status(500).send(\"Internal Server Error\");\n }\n };\n}\n","import type { RequestHandler } from \"../../types/common.type\";\n\ninterface HelmetOptions {\n contentSecurityPolicy?: boolean | Record<string, string[]>;\n dnsPrefetchControl?: boolean | { allow?: boolean };\n frameguard?: boolean | { action?: \"deny\" | \"sameorigin\" };\n hidePoweredBy?: boolean;\n hsts?: boolean | { maxAge?: number; includeSubDomains?: boolean; preload?: boolean };\n ieNoOpen?: boolean;\n noSniff?: boolean;\n referrerPolicy?: boolean | { policy?: string };\n xssFilter?: boolean;\n}\n\nexport function helmet(options: HelmetOptions = {}): RequestHandler {\n return (req, res, next) => {\n if (options.hidePoweredBy !== false) {\n res.removeHeader(\"X-Powered-By\");\n }\n\n if (options.noSniff !== false) {\n res.set(\"X-Content-Type-Options\", \"nosniff\");\n }\n\n if (options.xssFilter !== false) {\n res.set(\"X-XSS-Protection\", \"1; mode=block\");\n }\n\n if (options.ieNoOpen !== false) {\n res.set(\"X-Download-Options\", \"noopen\");\n }\n\n const frameguard = options.frameguard !== false;\n if (frameguard) {\n const action =\n typeof options.frameguard === \"object\" ? options.frameguard.action : \"sameorigin\";\n res.set(\"X-Frame-Options\", action === \"deny\" ? \"DENY\" : \"SAMEORIGIN\");\n }\n\n const dnsPrefetchControl = options.dnsPrefetchControl !== false;\n if (dnsPrefetchControl) {\n const allow =\n typeof options.dnsPrefetchControl === \"object\" ? options.dnsPrefetchControl.allow : false;\n res.set(\"X-DNS-Prefetch-Control\", allow ? \"on\" : \"off\");\n }\n\n const hsts = options.hsts !== false;\n if (hsts) {\n const maxAge = typeof options.hsts === \"object\" ? options.hsts.maxAge || 15552000 : 15552000;\n const includeSubDomains =\n typeof options.hsts === \"object\" ? options.hsts.includeSubDomains : true;\n const preload = typeof options.hsts === \"object\" ? options.hsts.preload : false;\n\n let value = `max-age=${maxAge}`;\n if (includeSubDomains) value += \"; includeSubDomains\";\n if (preload) value += \"; preload\";\n\n res.set(\"Strict-Transport-Security\", value);\n }\n\n const referrerPolicy = options.referrerPolicy !== false;\n if (referrerPolicy) {\n const policy =\n typeof options.referrerPolicy === \"object\" ? options.referrerPolicy.policy : \"no-referrer\";\n res.set(\"Referrer-Policy\", policy || \"no-referrer\");\n }\n\n const csp = options.contentSecurityPolicy !== false;\n if (csp) {\n const directives =\n typeof options.contentSecurityPolicy === \"object\"\n ? options.contentSecurityPolicy\n : {\n \"default-src\": [\"'self'\"],\n \"base-uri\": [\"'self'\"],\n \"font-src\": [\"'self'\", \"https:\", \"data:\"],\n \"form-action\": [\"'self'\"],\n \"frame-ancestors\": [\"'self'\"],\n \"img-src\": [\"'self'\", \"data:\"],\n \"object-src\": [\"'none'\"],\n \"script-src\": [\"'self'\"],\n \"script-src-attr\": [\"'none'\"],\n \"style-src\": [\"'self'\", \"https:\", \"'unsafe-inline'\"],\n \"upgrade-insecure-requests\": [],\n };\n\n const cspString = Object.entries(directives)\n .map(([key, values]) => {\n if (values.length === 0) return key;\n return `${key} ${values.join(\" \")}`;\n })\n .join(\"; \");\n\n res.set(\"Content-Security-Policy\", cspString);\n }\n\n return next ? next() : Promise.resolve();\n };\n}\n","import { randomBytes, createHash } from \"node:crypto\";\nimport type { RequestHandler } from \"../../types/common.type\";\n\ninterface CSRFOptions {\n cookieName?: string;\n headerName?: string;\n ignoreMethods?: string[];\n ignorePaths?: string[];\n saltLength?: number;\n secretLength?: number;\n}\n\nconst tokenCache = new Map<string, { token: string; expires: number }>();\n\nexport function csrf(options: CSRFOptions = {}): RequestHandler {\n const cookieName = options.cookieName || \"_csrf\";\n const headerName = options.headerName || \"x-csrf-token\";\n const ignoreMethods = options.ignoreMethods || [\"GET\", \"HEAD\", \"OPTIONS\"];\n const ignorePaths = options.ignorePaths || [];\n const saltLength = options.saltLength || 8;\n const secretLength = options.secretLength || 18;\n\n const generateSecret = (): string => {\n return randomBytes(secretLength).toString(\"base64\");\n };\n\n const generateToken = (secret: string): string => {\n const salt = randomBytes(saltLength).toString(\"base64\");\n const hash = createHash(\"sha256\")\n .update(salt + secret)\n .digest(\"base64\");\n return `${salt}.${hash}`;\n };\n\n const verifyToken = (token: string, secret: string): boolean => {\n const parts = token.split(\".\");\n if (parts.length !== 2) return false;\n\n const [salt, hash] = parts;\n const expectedHash = createHash(\"sha256\")\n .update(salt + secret)\n .digest(\"base64\");\n\n return hash === expectedHash;\n };\n\n return (req, res, next) => {\n let secret = req.cookies?.[cookieName];\n\n if (!secret) {\n secret = generateSecret();\n res.cookie(cookieName, secret, {\n httpOnly: true,\n sameSite: \"strict\",\n secure: req.protocol === \"https\",\n maxAge: 3600000,\n });\n }\n\n const token = generateToken(secret);\n\n (req as any).csrfToken = () => token;\n\n if (ignoreMethods.includes(req.method || \"GET\")) {\n return next ? next() : Promise.resolve();\n }\n\n // Check if path should be ignored\n if (ignorePaths.some(path => req.path?.startsWith(path))) {\n return next ? next() : Promise.resolve();\n }\n\n const submittedToken =\n (req.headers?.[headerName] as string | undefined) ||\n (req.body && typeof req.body === \"object\" && \"_csrf\" in req.body\n ? ((req.body as Record<string, unknown>)._csrf as string)\n : undefined) ||\n (req.query && typeof req.query === \"object\" && \"_csrf\" in req.query\n ? ((req.query as Record<string, unknown>)._csrf as string)\n : undefined);\n\n if (!submittedToken || !verifyToken(submittedToken as string, secret)) {\n res.status(403).json({ error: \"Invalid CSRF token\" });\n return;\n }\n\n return next ? next() : Promise.resolve();\n };\n}\n","import { createWriteStream } from \"node:fs\";\nimport { mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport type { RequestHandler } from \"../../types/common.type\";\n\ninterface UploadedFile {\n fieldname: string;\n originalname: string;\n encoding: string;\n mimetype: string;\n size: number;\n path?: string;\n buffer?: Buffer;\n}\n\ninterface MultipartOptions {\n uploadDir?: string;\n maxFileSize?: number;\n maxFiles?: number;\n allowedMimeTypes?: string[];\n storeInMemory?: boolean;\n}\n\nexport function multipart(options: MultipartOptions = {}): RequestHandler {\n const uploadDir = options.uploadDir || \"./uploads\";\n const maxFileSize = options.maxFileSize || 10 * 1024 * 1024;\n const maxFiles = options.maxFiles || 10;\n const allowedMimeTypes = options.allowedMimeTypes;\n const storeInMemory = options.storeInMemory || false;\n\n return async (req, res, next) => {\n const contentType = req.headers?.[\"content-type\"] || \"\";\n\n if (!contentType.includes(\"multipart/form-data\")) {\n return next ? next() : Promise.resolve();\n }\n\n const boundaryMatch = contentType.match(/boundary=([^;]+)/);\n if (!boundaryMatch) {\n res.status(400).json({ error: \"Invalid multipart boundary\" });\n return;\n }\n\n const boundary = `--${boundaryMatch[1]}`;\n const files: UploadedFile[] = [];\n const fields: Record<string, string> = {};\n\n try {\n if (!storeInMemory) {\n await mkdir(uploadDir, { recursive: true });\n }\n\n const chunks: Buffer[] = [];\n await new Promise<void>((resolve, reject) => {\n req.on(\"data\", (chunk) => chunks.push(chunk));\n req.on(\"end\", () => resolve());\n req.on(\"error\", reject);\n });\n\n const buffer = Buffer.concat(chunks);\n const parts = buffer.toString(\"binary\").split(boundary);\n\n for (const part of parts) {\n if (!part.trim() || part === \"--\\r\\n\" || part === \"--\") continue;\n\n const headerEndIndex = part.indexOf(\"\\r\\n\\r\\n\");\n if (headerEndIndex === -1) continue;\n\n const headerSection = part.substring(0, headerEndIndex);\n const bodySection = part.substring(headerEndIndex + 4);\n\n const nameMatch = headerSection.match(/name=\"([^\"]+)\"/);\n if (!nameMatch) continue;\n\n const fieldname = nameMatch[1];\n const filenameMatch = headerSection.match(/filename=\"([^\"]+)\"/);\n const contentTypeMatch = headerSection.match(/Content-Type: ([^\\r\\n]+)/);\n\n if (filenameMatch) {\n if (files.length >= maxFiles) {\n res.status(400).json({ error: `Maximum ${maxFiles} files allowed` });\n return;\n }\n\n const originalname = filenameMatch[1];\n const mimetype = contentTypeMatch\n ? contentTypeMatch[1]?.trim()\n : \"application/octet-stream\";\n\n if (allowedMimeTypes && !allowedMimeTypes.includes(mimetype as string)) {\n res.status(400).json({ error: `MIME type ${mimetype} not allowed` });\n return;\n }\n\n const fileData = bodySection.substring(0, bodySection.lastIndexOf(\"\\r\\n\"));\n const fileBuffer = Buffer.from(fileData, \"binary\");\n\n if (fileBuffer.length > maxFileSize) {\n res.status(400).json({ error: `File size exceeds ${maxFileSize} bytes` });\n return;\n }\n\n const file: UploadedFile = {\n fieldname: fieldname || \"file\",\n originalname: originalname || \"unknown\",\n encoding: \"binary\",\n mimetype: mimetype || \"application/octet-stream\",\n size: fileBuffer.length,\n };\n\n if (storeInMemory) {\n file.buffer = fileBuffer;\n } else {\n const filename = `${Date.now()}-${randomBytes(8).toString(\"hex\")}-${originalname || \"file\"}`;\n const filepath = join(uploadDir, filename);\n\n await new Promise<void>((resolve, reject) => {\n const writeStream = createWriteStream(filepath);\n writeStream.write(fileBuffer);\n writeStream.end();\n writeStream.on(\"finish\", resolve);\n writeStream.on(\"error\", reject);\n });\n\n file.path = filepath;\n }\n\n files.push(file);\n } else {\n const value = bodySection.substring(0, bodySection.lastIndexOf(\"\\r\\n\"));\n if (fieldname) {\n fields[fieldname] = value;\n }\n }\n }\n\n (req as any).files = files;\n (req as any).body = { ...fields, ...(req.body || {}) };\n\n return next ? next() : Promise.resolve();\n } catch (err: any) {\n res.status(500).json({ error: \"File upload failed\", message: err.message });\n }\n };\n}\n","import type { RequestHandler } from \"../../types/common.type\";\n\ninterface TimeoutOptions {\n timeout?: number;\n message?: string;\n statusCode?: number;\n}\n\nexport function timeout(options: TimeoutOptions = {}): RequestHandler {\n const timeoutMs = options.timeout || 30000;\n const message = options.message || \"Request timeout\";\n const statusCode = options.statusCode || 408;\n\n return (req, res, next) => {\n let timedOut = false;\n\n const timer = setTimeout(() => {\n timedOut = true;\n if (!res.writableEnded && !res.headersSent) {\n res.status(statusCode).json({ error: message });\n }\n }, timeoutMs);\n\n const originalEnd = res.end;\n (res as any).end = function (...args: any[]) {\n clearTimeout(timer);\n if (!timedOut && !res.headersSent) {\n return originalEnd.call(this, args[0], args[1] as BufferEncoding, args[2] as (() => void) | undefined);\n }\n };\n\n return next ? next() : Promise.resolve();\n };\n}\n","import { createHash } from \"node:crypto\";\nimport type { RequestHandler } from \"../../types/common.type\";\n\ninterface ETagOptions {\n weak?: boolean;\n algorithm?: \"md5\" | \"sha1\" | \"sha256\";\n}\n\nexport function etag(options: ETagOptions = {}): RequestHandler {\n const weak = options.weak ?? true;\n const algorithm = options.algorithm || \"md5\";\n\n return (req, res, next) => {\n const originalSend = res.send;\n const originalJson = res.json;\n\n const generateETag = (body: any): string => {\n const content = Buffer.isBuffer(body) ? body : Buffer.from(String(body));\n const hash = createHash(algorithm).update(content).digest(\"hex\");\n return weak ? `W/\"${hash}\"` : `\"${hash}\"`;\n };\n\n const checkETag = (etag: string): boolean => {\n const ifNoneMatch = req.headers?.[\"if-none-match\"];\n if (!ifNoneMatch) return false;\n\n const tags = ifNoneMatch.split(\",\").map((tag) => tag.trim());\n return tags.includes(etag) || tags.includes(\"*\");\n };\n\n res.send = function (body: any) {\n if (body === undefined || body === null) {\n return originalSend.call(this, body);\n }\n\n // Não adicionar ETag se a resposta já foi finalizada\n if (res.writableEnded || res.headersSent) {\n return originalSend.call(this, body);\n }\n\n const etag = generateETag(body);\n res.set(\"ETag\", etag);\n\n if (checkETag(etag)) {\n res.status(304);\n res.removeHeader(\"Content-Type\");\n res.removeHeader(\"Content-Length\");\n return originalSend.call(this, \"\");\n }\n\n return originalSend.call(this, body);\n };\n\n res.json = function (body: any) {\n // Não adicionar ETag se a resposta já foi finalizada\n if (res.writableEnded || res.headersSent) {\n return originalJson.call(this, body);\n }\n\n const jsonString = JSON.stringify(body);\n const etag = generateETag(jsonString);\n res.set(\"ETag\", etag);\n\n if (checkETag(etag)) {\n res.status(304);\n res.removeHeader(\"Content-Type\");\n res.removeHeader(\"Content-Length\");\n return originalSend.call(this, \"\");\n }\n\n return originalJson.call(this, body);\n };\n\n return next ? next() : Promise.resolve();\n };\n}\n","import type { RequestHandler } from \"../../types/common.type\";\n\ninterface SessionData {\n [key: string]: any;\n}\n\ninterface SessionStore {\n get: (id: string) => Promise<SessionData | null>;\n set: (id: string, data: SessionData) => Promise<void>;\n destroy: (id: string) => Promise<void>;\n}\n\nclass MemoryStore implements SessionStore {\n private store = new Map<string, { data: SessionData; expires: number }>();\n\n async get(id: string): Promise<SessionData | null> {\n const entry = this.store.get(id);\n if (!entry) return null;\n if (entry.expires < Date.now()) {\n this.store.delete(id);\n return null;\n }\n return entry.data;\n }\n\n async set(id: string, data: SessionData): Promise<void> {\n const expires = Date.now() + 86400000;\n this.store.set(id, { data, expires });\n }\n\n async destroy(id: string): Promise<void> {\n this.store.delete(id);\n }\n}\n\ninterface SessionOptions {\n secret: string;\n name?: string;\n cookie?: {\n maxAge?: number;\n httpOnly?: boolean;\n secure?: boolean;\n sameSite?: \"strict\" | \"lax\" | \"none\";\n };\n store?: SessionStore;\n rolling?: boolean;\n resave?: boolean;\n saveUninitialized?: boolean;\n}\n\nexport function session(options: SessionOptions): RequestHandler {\n const name = options.name || \"sid\";\n const store = options.store || new MemoryStore();\n const maxAge = options.cookie?.maxAge || 86400000;\n const httpOnly = options.cookie?.httpOnly ?? true;\n const secure = options.cookie?.secure ?? false;\n const sameSite = options.cookie?.sameSite || \"lax\";\n const rolling = options.rolling ?? false;\n const resave = options.resave ?? true;\n const saveUninitialized = options.saveUninitialized ?? true;\n\n const generateId = (): string => {\n return Math.random().toString(36).substring(2) + Date.now().toString(36);\n };\n\n return async (req, res, next) => {\n let sessionId = req.cookies?.[name];\n let sessionData: SessionData | null = null;\n\n if (sessionId) {\n sessionData = await store.get(sessionId);\n }\n\n if (!sessionData) {\n sessionId = generateId();\n sessionData = {};\n }\n\n const sessionProxy = new Proxy(sessionData, {\n set: (target, prop, value) => {\n (target as any)[prop] = value;\n return true;\n },\n deleteProperty: (target, prop) => {\n delete (target as any)[prop];\n return true;\n },\n });\n\n (req as any).session = sessionProxy;\n (req as any).sessionID = sessionId;\n\n const originalEnd = res.end;\n (res as any).end = async function (...args: any[]) {\n const shouldSave = saveUninitialized || Object.keys(sessionData!).length > 0;\n\n if (shouldSave && (resave || Object.keys(sessionData!).length > 0)) {\n await store.set(sessionId!, sessionData!);\n\n // Só definir cookie se os headers ainda não foram enviados\n if (!res.headersSent) {\n res.cookie(name, sessionId!, {\n maxAge,\n httpOnly,\n secure,\n sameSite,\n });\n }\n }\n\n if (!res.headersSent) {\n return originalEnd.call(this, args[0], args[1] as BufferEncoding, args[2] as (() => void) | undefined);\n }\n };\n\n (req as any).session.destroy = async () => {\n await store.destroy(sessionId!);\n if (!res.headersSent) {\n res.clearCookie(name);\n }\n };\n\n (req as any).session.regenerate = async () => {\n await store.destroy(sessionId!);\n sessionId = generateId();\n (req as any).sessionID = sessionId;\n sessionData = {};\n (req as any).session = sessionProxy;\n };\n\n return next ? next() : Promise.resolve();\n };\n}\n","import { createHmac, timingSafeEqual } from \"node:crypto\";\nimport type { RequestHandler } from \"../../types/common.type\";\n\ninterface JWTPayload {\n [key: string]: any;\n exp?: number;\n iat?: number;\n nbf?: number;\n}\n\ninterface JWTOptions {\n secret: string;\n algorithm?: \"HS256\" | \"HS384\" | \"HS512\";\n expiresIn?: number;\n issuer?: string;\n audience?: string;\n}\n\ninterface JWTMiddlewareOptions extends JWTOptions {\n credentialsRequired?: boolean;\n getToken?: (req: any) => string | null;\n}\n\nfunction base64UrlEncode(str: Buffer | string): string {\n return Buffer.from(str)\n .toString(\"base64\")\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=/g, \"\");\n}\n\nfunction base64UrlDecode(str: string): string {\n str = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n while (str.length % 4) str += \"=\";\n return Buffer.from(str, \"base64\").toString();\n}\n\nfunction sign(payload: string, secret: string, algorithm: string): string {\n const alg = algorithm.replace(\"HS\", \"sha\");\n return createHmac(alg, secret).update(payload).digest(\"base64url\");\n}\n\nfunction verify(token: string, signature: string, secret: string, algorithm: string): boolean {\n const alg = algorithm.replace(\"HS\", \"sha\");\n const expected = createHmac(alg, secret).update(token).digest(\"base64url\");\n\n if (expected.length !== signature.length) return false;\n\n try {\n return timingSafeEqual(Buffer.from(expected), Buffer.from(signature));\n } catch {\n return false;\n }\n}\n\nexport function createJWT(payload: JWTPayload, options: JWTOptions): string {\n const algorithm = options.algorithm || \"HS256\";\n const header = { alg: algorithm, typ: \"JWT\" };\n\n const now = Math.floor(Date.now() / 1000);\n const finalPayload = { ...payload };\n\n if (options.expiresIn) {\n finalPayload.exp = now + options.expiresIn;\n }\n\n if (options.issuer) {\n finalPayload.iss = options.issuer;\n }\n\n if (options.audience) {\n finalPayload.aud = options.audience;\n }\n\n if (!finalPayload.iat) {\n finalPayload.iat = now;\n }\n\n const encodedHeader = base64UrlEncode(JSON.stringify(header));\n const encodedPayload = base64UrlEncode(JSON.stringify(finalPayload));\n const token = `${encodedHeader}.${encodedPayload}`;\n const signature = sign(token, options.secret, algorithm);\n\n return `${token}.${signature}`;\n}\n\nexport function verifyJWT(\n token: string,\n secret: string,\n algorithm: string = \"HS256\",\n): JWTPayload | null {\n const parts = token.split(\".\");\n if (parts.length !== 3) return null;\n\n const [encodedHeader, encodedPayload, signature] = parts;\n\n if (!encodedHeader || !encodedPayload || !signature) {\n return null;\n }\n\n if (!verify(`${encodedHeader}.${encodedPayload}`, signature, secret, algorithm)) {\n return null;\n }\n\n try {\n const payload = JSON.parse(base64UrlDecode(encodedPayload));\n\n const now = Math.floor(Date.now() / 1000);\n\n if (payload.exp && payload.exp < now) {\n return null;\n }\n\n if (payload.nbf && payload.nbf > now) {\n return null;\n }\n\n return payload;\n } catch {\n return null;\n }\n}\n\nexport function jwtMiddleware(options: JWTMiddlewareOptions): RequestHandler {\n const credentialsRequired = options.credentialsRequired ?? true;\n const getToken =\n options.getToken ||\n ((req: any) => {\n const auth = req.headers?.authorization;\n if (auth && auth.startsWith(\"Bearer \")) {\n return auth.substring(7);\n }\n return null;\n });\n\n return (req, res, next) => {\n const token = getToken(req);\n\n if (!token) {\n if (credentialsRequired) {\n res.status(401).json({ error: \"No token provided\" });\n return;\n }\n (req as any).user = null;\n return next ? next() : Promise.resolve();\n }\n\n const payload = verifyJWT(token, options.secret, options.algorithm);\n\n if (!payload) {\n res.status(401).json({ error: \"Invalid token\" });\n return;\n }\n\n if (options.issuer && payload.iss !== options.issuer) {\n res.status(401).json({ error: \"Invalid issuer\" });\n return;\n }\n\n if (options.audience && payload.aud !== options.audience) {\n res.status(401).json({ error: \"Invalid audience\" });\n return;\n }\n\n (req as any).user = payload;\n (req as any).token = token;\n\n return next ? next() : Promise.resolve();\n };\n}\n","import type { RequestHandler } from \"../../types/common.type\";\n\ninterface BodyLimitOptions {\n limit?: number;\n type?: string | string[];\n}\n\nexport function bodyLimit(options: BodyLimitOptions = {}): RequestHandler {\n const limit = options.limit || 1024 * 1024;\n const types = Array.isArray(options.type)\n ? options.type\n : options.type\n ? [options.type]\n : [\"application/json\", \"application/x-www-form-urlencoded\", \"text/plain\"];\n\n return (req, res, next) => {\n const contentType = req.headers?.[\"content-type\"] || \"\";\n const contentLength = parseInt(req.headers?.[\"content-length\"] || \"0\", 10);\n\n const shouldCheck = types.some((type) => contentType.includes(type));\n\n if (shouldCheck && contentLength > limit) {\n res.status(413).json({\n error: \"Payload too large\",\n limit,\n received: contentLength,\n });\n return;\n }\n\n return next ? next() : Promise.resolve();\n };\n}\n","import type { RequestHandler } from \"../../types/common.type\";\n\ninterface HealthCheckOptions {\n path?: string;\n healthChecks?: Record<string, () => Promise<boolean>>;\n}\n\nexport function healthCheck(options: HealthCheckOptions = {}): RequestHandler {\n const path = options.path || \"/health\";\n const checks = options.healthChecks || {};\n\n return async (req, res, next) => {\n if (req.path !== path) {\n return next ? next() : Promise.resolve();\n }\n\n const results: Record<string, { status: string; error?: string }> = {};\n let allHealthy = true;\n\n for (const [name, check] of Object.entries(checks)) {\n try {\n const healthy = await check();\n results[name] = { status: healthy ? \"healthy\" : \"unhealthy\" };\n if (!healthy) allHealthy = false;\n } catch (error: any) {\n results[name] = { status: \"unhealthy\", error: error.message };\n allHealthy = false;\n }\n }\n\n const status = allHealthy ? 200 : 503;\n res.status(status).json({\n status: allHealthy ? \"healthy\" : \"unhealthy\",\n timestamp: new Date().toISOString(),\n checks: results,\n });\n };\n}\n","import type { RequestHandler } from \"../../types/common.type\";\n\ninterface RequestIdOptions {\n header?: string;\n generator?: () => string;\n}\n\nexport function requestId(options: RequestIdOptions = {}): RequestHandler {\n const header = options.header || \"x-request-id\";\n const generator = options.generator || (() => {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`;\n });\n\n return (req, res, next) => {\n let id = req.headers?.[header];\n\n if (!id) {\n id = generator();\n }\n\n (req as any).id = id;\n res.set(header, id as string);\n\n return next ? next() : Promise.resolve();\n };\n}\n","import type { RequestHandler } from \"../../types/common.type\";\n\ntype CircuitState = \"closed\" | \"open\" | \"half-open\";\n\ninterface CircuitBreakerOptions {\n threshold?: number;\n timeout?: number;\n resetTimeout?: number;\n onStateChange?: (oldState: CircuitState, newState: CircuitState) => void;\n}\n\nclass CircuitBreaker {\n private state: CircuitState = \"closed\";\n private failureCount = 0;\n private nextAttempt = 0;\n\n constructor(private options: CircuitBreakerOptions) {}\n\n async execute<T>(fn: () => Promise<T>): Promise<T> {\n if (this.state === \"open\") {\n if (Date.now() < this.nextAttempt) {\n throw new Error(\"Circuit breaker is open\");\n }\n this.setState(\"half-open\");\n }\n\n try {\n const result = await Promise.race([\n fn(),\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error(\"Timeout\")), this.options.timeout || 5000),\n ),\n ]);\n\n if (this.state === \"half-open\") {\n this.setState(\"closed\");\n }\n\n this.failureCount = 0;\n return result;\n } catch (error) {\n this.failureCount++;\n\n if (this.failureCount >= (this.options.threshold || 5)) {\n this.setState(\"open\");\n this.nextAttempt = Date.now() + (this.options.resetTimeout || 60000);\n }\n\n throw error;\n }\n }\n\n private setState(newState: CircuitState) {\n const oldState = this.state;\n this.state = newState;\n if (this.options.onStateChange) {\n this.options.onStateChange(oldState, newState);\n }\n }\n\n getState(): CircuitState {\n return this.state;\n }\n}\n\nexport function circuitBreaker(options: CircuitBreakerOptions = {}): RequestHandler {\n const breaker = new CircuitBreaker(options);\n\n return async (req, res, next) => {\n try {\n await breaker.execute(async () => {\n if (next) {\n await next();\n }\n });\n } catch (error: any) {\n if (error.message === \"Circuit breaker is open\") {\n res.status(503).json({ error: \"Service unavailable\" });\n } else {\n res.status(500).json({ error: error.message });\n }\n }\n };\n}\n\nexport { CircuitBreaker };\n"]}