@morojs/moro 1.8.7 → 1.8.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/http/http-server.js +4 -0
- package/dist/core/http/http-server.js.map +1 -1
- package/dist/core/http/http2-server.js +4 -0
- package/dist/core/http/http2-server.js.map +1 -1
- package/dist/core/http/moro-engine-server.d.ts +1 -0
- package/dist/core/http/moro-engine-server.js +108 -35
- package/dist/core/http/moro-engine-server.js.map +1 -1
- package/dist/core/http/uws-http-server.d.ts +1 -0
- package/dist/core/http/uws-http-server.js +106 -20
- package/dist/core/http/uws-http-server.js.map +1 -1
- package/dist/core/middleware/built-in/cookie/core.d.ts +26 -1
- package/dist/core/middleware/built-in/cookie/core.js +70 -2
- package/dist/core/middleware/built-in/cookie/core.js.map +1 -1
- package/dist/core/middleware/built-in/cookie/hook.d.ts +3 -1
- package/dist/core/middleware/built-in/cookie/hook.js +17 -5
- package/dist/core/middleware/built-in/cookie/hook.js.map +1 -1
- package/dist/core/middleware/built-in/cookie/index.d.ts +1 -1
- package/dist/core/middleware/built-in/cookie/index.js +1 -1
- package/dist/core/middleware/built-in/cookie/index.js.map +1 -1
- package/dist/core/middleware/built-in/cookie/middleware.d.ts +1 -1
- package/dist/core/middleware/built-in/cookie/middleware.js +6 -4
- package/dist/core/middleware/built-in/cookie/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/index.d.ts +4 -12
- package/dist/core/middleware/built-in/rate-limit/core.d.ts +24 -0
- package/dist/core/middleware/built-in/rate-limit/core.js +47 -0
- package/dist/core/middleware/built-in/rate-limit/core.js.map +1 -1
- package/dist/core/middleware/built-in/rate-limit/hook.d.ts +24 -9
- package/dist/core/middleware/built-in/rate-limit/hook.js +34 -12
- package/dist/core/middleware/built-in/rate-limit/hook.js.map +1 -1
- package/dist/core/middleware/built-in/rate-limit/middleware.js +9 -1
- package/dist/core/middleware/built-in/rate-limit/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/session/core.d.ts +8 -0
- package/dist/core/middleware/built-in/session/core.js +29 -2
- package/dist/core/middleware/built-in/session/core.js.map +1 -1
- package/dist/core/middleware/built-in/session/hook.js +2 -3
- package/dist/core/middleware/built-in/session/hook.js.map +1 -1
- package/dist/core/middleware/built-in/session/middleware.js +2 -3
- package/dist/core/middleware/built-in/session/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/static/core.d.ts +56 -0
- package/dist/core/middleware/built-in/static/core.js +214 -13
- package/dist/core/middleware/built-in/static/core.js.map +1 -1
- package/dist/core/middleware/built-in/static/middleware.d.ts +5 -0
- package/dist/core/middleware/built-in/static/middleware.js +5 -0
- package/dist/core/middleware/built-in/static/middleware.js.map +1 -1
- package/dist/core/middleware/built-in/upload/core.d.ts +17 -0
- package/dist/core/middleware/built-in/upload/core.js +30 -1
- package/dist/core/middleware/built-in/upload/core.js.map +1 -1
- package/dist/core/middleware/built-in/upload/middleware.js +12 -1
- package/dist/core/middleware/built-in/upload/middleware.js.map +1 -1
- package/dist/core/routing/index.d.ts +1 -0
- package/dist/core/routing/index.js.map +1 -1
- package/dist/core/routing/unified-router.js +60 -29
- package/dist/core/routing/unified-router.js.map +1 -1
- package/dist/index.d.ts +2 -6
- package/dist/types/http.d.ts +3 -0
- package/dist/types/http.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uws-http-server.js","sourceRoot":"","sources":["../../../src/core/http/uws-http-server.ts"],"names":[],"mappings":"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","sourcesContent":["// uWebSockets.js HTTP Server Implementation for Moro Framework\n// Provides high-performance HTTP and WebSocket server using uWebSockets.js\n\nimport cluster from 'cluster';\nimport { randomUUID } from 'crypto';\nimport { createFrameworkLogger } from '../logger/index.js';\nimport { HttpRequest, HttpResponse, Middleware } from '../../types/http.js';\nimport { loadNativeEngine, getNativeEngineLoadErrors } from '../utilities/package-utils.js';\nimport {\n parseMultipart as parseMultipartBuffer,\n type MultipartLimits,\n} from './utils/multipart-parser.js';\nimport { LazyEventEmitter } from './utils/lazy-event-emitter.js';\nimport { parseRawQueryString } from './utils/query-parser.js';\nimport type { HttpRuntimeLimits } from './utils/size.js';\nimport {\n resolveCompressionSettings,\n compressBuffer,\n isCompressible,\n negotiateEncoding,\n type CompressionSettings,\n} from './utils/compression.js';\n\n// Back-compat alias (this parser is now the transport-neutral one in utils/)\nconst parseUwsQueryString = parseRawQueryString;\n\n/**\n * Prototype-based request object for the uWS adapter.\n *\n * Headers/query/cookies/requestId are lazy: a synchronous handler that never\n * reads them pays nothing (no header copy, no UUID). The underlying uWS\n * request is only valid until the route callback returns to the event loop,\n * so `materialize()` MUST be called before any `await` - it snapshots the\n * headers and detaches the native reference.\n */\nexport class UwsRequest extends LazyEventEmitter {\n method: string;\n path: string;\n url: string;\n params: Record<string, string> = {};\n body: any = null;\n ip = '';\n\n _server: UWebSocketsHttpServer;\n _uwsReq: any; // valid ONLY synchronously inside the uWS route callback\n _queryString: string | null;\n _query: Record<string, string> | undefined = undefined;\n _headers: Record<string, string> | undefined = undefined;\n _cookies: Record<string, string> | undefined = undefined;\n _context: Record<string, any> | undefined = undefined;\n _requestId: string | undefined = undefined;\n _socket: any = undefined;\n\n constructor(\n server: UWebSocketsHttpServer,\n uwsReq: any,\n method: string,\n url: string,\n queryString: string\n ) {\n super();\n this._server = server;\n this._uwsReq = uwsReq;\n this.method = method;\n this.path = url;\n this.url = url;\n this._queryString = queryString || null;\n }\n\n // net.Socket-shaped shim so Node-style middleware (CSRF's req.socket.encrypted,\n // rate-limiters' req.connection.remoteAddress) doesn't throw on this transport.\n // uWS terminates plaintext HTTP here (TLS via its own listen options or a\n // proxy); scheme detection should use x-forwarded-proto.\n get socket(): any {\n let s = this._socket;\n if (s === undefined) {\n const getIp = () => this.ip; // arrow captures this lexically (no this-alias)\n s = {\n get remoteAddress() {\n return getIp() || undefined;\n },\n remotePort: undefined,\n encrypted: false,\n destroyed: false,\n };\n this._socket = s;\n }\n return s;\n }\n set socket(value: any) {\n this._socket = value;\n }\n\n get connection(): any {\n return this.socket;\n }\n set connection(value: any) {\n this._socket = value;\n }\n\n /** Snapshot uWS-backed data and detach the native request. Idempotent.\n * Must be called before returning control to the event loop if the\n * request object outlives the synchronous route callback. */\n materialize(): void {\n if (this._headers === undefined) {\n // Force the headers snapshot while the native request is still valid\n void this.headers;\n }\n this._uwsReq = null;\n }\n\n get headers(): Record<string, string> {\n let h = this._headers;\n if (h === undefined) {\n h = {};\n const r = this._uwsReq;\n if (r) {\n try {\n r.forEach((key: string, value: string) => {\n (h as Record<string, string>)[key] = value;\n });\n } catch {\n // Native request no longer valid - snapshot window was missed\n }\n }\n this._headers = h;\n }\n return h;\n }\n set headers(value: Record<string, string>) {\n this._headers = value;\n }\n\n get query(): Record<string, string> {\n let q = this._query;\n if (q === undefined) {\n const qs = this._queryString;\n q = qs ? parseUwsQueryString(qs) : {};\n this._query = q;\n }\n return q;\n }\n set query(value: Record<string, string>) {\n this._query = value;\n }\n\n get cookies(): Record<string, string> {\n let c = this._cookies;\n if (c === undefined) {\n c = {};\n const header = this.headers.cookie;\n if (header) {\n const parts = header.split(';');\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === undefined) continue;\n const eq = part.indexOf('=');\n if (eq > 0) {\n const name = part.substring(0, eq).trim();\n const value = part.substring(eq + 1);\n if (name && value) {\n try {\n c[name] = decodeURIComponent(value);\n } catch {\n c[name] = value;\n }\n }\n }\n }\n }\n this._cookies = c;\n }\n return c;\n }\n set cookies(value: Record<string, string>) {\n this._cookies = value;\n }\n\n get context(): Record<string, any> {\n let ctx = this._context;\n if (ctx === undefined) {\n ctx = {};\n this._context = ctx;\n }\n return ctx;\n }\n set context(value: Record<string, any>) {\n this._context = value;\n }\n\n get requestId(): string {\n let id = this._requestId;\n if (id === undefined) {\n const server = this._server;\n id = server && (server as any).requestTrackingEnabled ? randomUUID() : '';\n this._requestId = id;\n }\n return id;\n }\n set requestId(value: string) {\n this._requestId = value;\n }\n\n // ==== Express-compatible request helpers (parity with the Node adapter) ====\n\n get hostname(): string {\n const host = this.headers.host || '';\n return host ? (host.split(':')[0] ?? '') : '';\n }\n\n get protocol(): string {\n const forwardedProto = this.headers['x-forwarded-proto'];\n if (forwardedProto) return (forwardedProto.split(',')[0] ?? '').trim();\n return this._server && (this._server as any).isSsl ? 'https' : 'http';\n }\n\n get secure(): boolean {\n return this.protocol === 'https';\n }\n\n get xhr(): boolean {\n const xrw = this.headers['x-requested-with'];\n return !!xrw && xrw.toLowerCase() === 'xmlhttprequest';\n }\n\n get originalUrl(): string {\n const qs = this._queryString;\n return qs ? `${this.url}?${qs}` : this.url;\n }\n\n get ips(): string[] {\n const forwardedFor = this.headers['x-forwarded-for'];\n return forwardedFor\n ? forwardedFor\n .split(',')\n .map(s => s.trim())\n .filter(Boolean)\n : [];\n }\n\n get subdomains(): string[] {\n const hostnameParts = this.hostname.split('.');\n return hostnameParts.length > 2 ? hostnameParts.slice(0, -2).reverse() : [];\n }\n\n get(name: string): string | undefined {\n const lower = name.toLowerCase();\n if (lower === 'referer' || lower === 'referrer') {\n return this.headers.referer || (this.headers as any).referrer;\n }\n return this.headers[lower];\n }\n\n header(name: string): string | undefined {\n return this.get(name);\n }\n\n is(type: string): boolean {\n const ct = this.headers['content-type'] || '';\n if (!ct) return false;\n const mime = (ct.split(';')[0] ?? '').trim().toLowerCase();\n const t = type.toLowerCase();\n if (t.indexOf('/') === -1) {\n return mime.endsWith(`/${t}`) || mime.endsWith(`+${t}`);\n }\n if (t.endsWith('/*')) {\n return mime.startsWith(t.slice(0, -1));\n }\n return mime === t;\n }\n\n accepts(types?: string | string[]): string | false {\n const accept = this.headers.accept || '*/*';\n if (!types) return accept;\n const wanted = Array.isArray(types) ? types : [types];\n if (accept === '*/*' || accept === '') return wanted[0] || false;\n const acceptTypes = accept.split(',').map(s => (s.split(';')[0] ?? '').trim().toLowerCase());\n for (const w of wanted) {\n const wl = w.toLowerCase();\n const wMime = wl.indexOf('/') === -1 ? `application/${wl}` : wl;\n for (const at of acceptTypes) {\n if (at === '*/*') return w;\n if (at === wMime) return w;\n if (at.endsWith('/*') && wMime.startsWith(at.slice(0, -1))) return w;\n }\n }\n return false;\n }\n\n acceptsLanguages(langs?: string | string[]): string | false {\n const acceptLang = this.headers['accept-language'] || '';\n if (!langs) return acceptLang || false;\n const wanted = Array.isArray(langs) ? langs : [langs];\n if (!acceptLang) return wanted[0] || false;\n const accepted = acceptLang\n .split(',')\n .map(s => {\n const parts = s.trim().split(';');\n const tag = (parts[0] ?? '').toLowerCase();\n const qPart = parts.find(p => p.trim().startsWith('q='));\n const q = qPart ? parseFloat(qPart.trim().slice(2)) : 1;\n return { tag, q: isNaN(q) ? 0 : q };\n })\n .filter(a => a.q > 0)\n .sort((a, b) => b.q - a.q);\n for (const { tag } of accepted) {\n for (const w of wanted) {\n const wl = w.toLowerCase();\n if (tag === '*' || tag === wl || tag.split('-')[0] === wl.split('-')[0]) return w;\n }\n }\n return false;\n }\n}\n\n/**\n * uWebSockets HTTP Server Adapter\n * Bridges uWebSockets.js with Moro's HTTP abstractions\n */\nexport class UWebSocketsHttpServer {\n private app: any; // uWebSockets app instance\n private uws: any; // uWebSockets module reference (stored to avoid re-importing)\n private _limits?: HttpRuntimeLimits;\n private multipartLimits?: MultipartLimits;\n private listenSocket: any; // uWebSockets listen socket\n private globalMiddleware: Middleware[] = [];\n private logger = createFrameworkLogger('UWSHttpServer');\n private hookManager: any;\n private requestCounter = 0;\n private requestTrackingEnabled = true; // Generate request IDs (read lazily by UwsRequest)\n private isListening = false;\n private port?: number;\n private host?: string;\n private initPromise: Promise<void>;\n /** @internal read by UwsRequest#protocol */\n isSsl = false;\n\n // Body size limits (bytes) - configured from server.bodySizeLimit/maxUploadSize\n private maxBodySize: number = 10 * 1024 * 1024;\n private maxUploadSize: number = 100 * 1024 * 1024;\n\n // Direct router dispatch (set from Moro.listen via setRouterHandler)\n private routerHandler?: (req: HttpRequest, res: HttpResponse) => boolean | Promise<boolean>;\n\n // Provider of fast-path routes to register on uWS's native router at listen()\n private nativeRouteProvider?: () => Array<{\n method: string;\n path: string;\n paramNames: string[] | null;\n handler: (req: HttpRequest, res: HttpResponse) => any;\n }>;\n\n // Shared error handling for native fast-path routes (unified router semantics)\n private nativeErrorHandler?: (req: HttpRequest, res: HttpResponse, err: any) => Promise<boolean>;\n\n // String interning for common values\n private static readonly INTERNED_METHODS = new Map([\n ['get', 'GET'],\n ['post', 'POST'],\n ['put', 'PUT'],\n ['delete', 'DELETE'],\n ['patch', 'PATCH'],\n ['head', 'HEAD'],\n ['options', 'OPTIONS'],\n ]);\n\n // Pre-compiled response buffers\n private static readonly RESPONSE_BUFFERS = {\n notFound: Buffer.from('{\"success\":false,\"error\":\"Not found\"}'),\n serverError: Buffer.from('{\"success\":false,\"error\":\"Internal server error\"}'),\n };\n\n // Pre-cached status strings for common codes (performance optimization)\n private static readonly STATUS_STRINGS = new Map([\n [200, '200 OK'],\n [201, '201 Created'],\n [204, '204 No Content'],\n [301, '301 Moved Permanently'],\n [302, '302 Found'],\n [304, '304 Not Modified'],\n [400, '400 Bad Request'],\n [401, '401 Unauthorized'],\n [403, '403 Forbidden'],\n [404, '404 Not Found'],\n [500, '500 Internal Server Error'],\n [502, '502 Bad Gateway'],\n [503, '503 Service Unavailable'],\n ]);\n\n constructor(\n options: {\n ssl?: {\n key_file_name?: string;\n cert_file_name?: string;\n ca_file_name?: string;\n passphrase?: string;\n } | null;\n /** True when a TLS config was given but only as inline PEM (uWS needs\n * file paths); triggers a clear error instead of a silent plain boot. */\n sslInlineOnly?: boolean;\n limits?: HttpRuntimeLimits;\n maxBodySize?: number;\n maxUploadSize?: number;\n /** Preloaded native engine module (from loadNativeEngine) - avoids a\n * second resolution and keeps load failures at the framework's\n * synchronous preflight instead of surfacing at listen() */\n engineModule?: any;\n } = {}\n ) {\n if (options.maxBodySize) this.maxBodySize = options.maxBodySize;\n if (options.maxUploadSize) this.maxUploadSize = options.maxUploadSize;\n if (options.limits) this._limits = options.limits;\n if (options.limits?.multipart) this.multipartLimits = options.limits.multipart;\n this.initPromise = this.initialize(options);\n }\n\n // Direct router dispatch - called after global middleware without the\n // per-middleware promise machinery (mirrors MoroHttpServer.setRouterHandler)\n setRouterHandler(fn: (req: HttpRequest, res: HttpResponse) => boolean | Promise<boolean>): void {\n this.routerHandler = fn;\n }\n\n // Fast-path routes get registered directly on uWS's native C++ router at\n // listen() - zero middleware machinery, lazy headers, no promise for sync\n // handlers. The provider is evaluated at listen time so file-based/late\n // routes are included.\n setNativeRouteProvider(\n provider: () => Array<{\n method: string;\n path: string;\n paramNames: string[] | null;\n handler: (req: HttpRequest, res: HttpResponse) => any;\n }>,\n onError?: (req: HttpRequest, res: HttpResponse, err: any) => Promise<boolean>\n ): void {\n this.nativeRouteProvider = provider;\n if (onError) this.nativeErrorHandler = onError;\n }\n\n private async initialize(options: {\n ssl?: {\n key_file_name?: string;\n cert_file_name?: string;\n ca_file_name?: string;\n passphrase?: string;\n } | null;\n sslInlineOnly?: boolean;\n limits?: HttpRuntimeLimits;\n engineModule?: any;\n }): Promise<void> {\n try {\n // The framework preloads the engine synchronously (loadNativeEngine) and\n // injects it; loading here directly covers standalone construction.\n // This server is uWS-shaped only: never probe @morojs/engine, whose\n // Moro-shaped module would pass a generic load but has no App().\n const uwsModule =\n options.engineModule ?? loadNativeEngine({ candidates: ['uWebSockets.js'] })?.module;\n if (!uwsModule) {\n throw new Error(\n 'uWebSockets.js is not available: ' +\n (getNativeEngineLoadErrors().join('; ') || 'not installed')\n );\n }\n this.uws = uwsModule.default || uwsModule;\n\n // A TLS config that was given only as inline PEM cannot be honored by\n // uWS (it requires on-disk file paths). Surface it loudly rather than\n // silently booting plain HTTP (the historical footgun).\n if (options.sslInlineOnly) {\n this.logger.error(\n 'uWebSockets.js requires TLS key/cert as FILE PATHS (keyFile/certFile ' +\n 'or key_file_name/cert_file_name); inline PEM is not supported. ' +\n 'Booting WITHOUT TLS - provide file paths or use engine: \"moro\"/\"node\".',\n 'Init'\n );\n }\n\n if (options.ssl && options.ssl.key_file_name && options.ssl.cert_file_name) {\n this.app = this.uws.SSLApp({\n key_file_name: options.ssl.key_file_name,\n cert_file_name: options.ssl.cert_file_name,\n ...(options.ssl.ca_file_name && { ca_file_name: options.ssl.ca_file_name }),\n passphrase: options.ssl.passphrase,\n });\n this.isSsl = true;\n this.logger.info('uWebSockets SSL/TLS HTTP server created', 'Init');\n } else {\n this.app = this.uws.App();\n this.logger.info('uWebSockets HTTP server created', 'Init');\n }\n\n // uWS has no knobs for TCP timeouts/backlog/maxConnections/maxHeaderSize;\n // if the user set any, say so once at startup rather than silently\n // ignoring them (the \"no arbitrary caps\" contract cuts both ways).\n const ignored: string[] = [];\n const t = options.limits?.timeouts ?? {};\n if (t.request || t.idle || t.keepAlive || t.headers) ignored.push('timeouts');\n if (options.limits?.maxConnections) ignored.push('maxConnections');\n if (options.limits?.backlog) ignored.push('backlog');\n if (options.limits?.maxHeaderSize || options.limits?.maxHeaders)\n ignored.push('header limits');\n if (ignored.length) {\n this.logger.info(\n `uWebSockets.js does not support these server options; they are ignored: ${ignored.join(', ')}`,\n 'Init'\n );\n }\n\n // Setup generic route handler for all HTTP methods and paths\n this.setupRouteHandlers();\n } catch (error) {\n // Log helpful error message with installation instructions\n this.logger.error(\n 'Failed to load the native HTTP engine\\n' +\n 'Install it with:\\n' +\n ' npm install @morojs/engine\\n' +\n '(or the legacy engine: npm install --save-dev github:uNetworking/uWebSockets.js#v20.52.0)\\n' +\n \"Or set engine: 'node' in your server config to use the standard HTTP server.\\n\" +\n 'Error: ' +\n (error instanceof Error ? error.message : String(error)),\n 'Init'\n );\n throw error; // Re-throw so framework.ts can catch and fallback\n }\n }\n\n private setupRouteHandlers(): void {\n // Catchall fallback for everything that isn't a native fast-path route:\n // middleware chains, hooks, non-fast-path routes, 404s. Native\n // method-specific routes registered later take priority in uWS's router\n // (static > parameter > wildcard).\n this.app.any('/*', (res: any, req: any) => {\n void this.handleRequest(req, res);\n });\n }\n\n // Register fast-path routes (no middleware/auth/validation) directly on\n // uWS's native router. A sync GET handler completes with zero header copies,\n // zero promises and a single corked write. Each wrapper carries a cheap\n // dynamic guard: the moment global middleware or request hooks exist, it\n // falls back to the full pipeline so no feature is ever bypassed.\n private registerNativeFastPathRoutes(): void {\n const provider = this.nativeRouteProvider;\n if (!provider || !this.app) return;\n\n let count = 0;\n for (const route of provider()) {\n const methodFn = route.method.toLowerCase();\n if (typeof this.app[methodFn] !== 'function') continue;\n // Only plain paths - uWS shares the :param syntax; anything exotic\n // (wildcards etc.) stays on the catchall/unified-router path\n if (!/^[A-Za-z0-9/_\\-.:]*$/.test(route.path) || route.path.indexOf('*') !== -1) continue;\n\n const handler = route.handler;\n const paramNames = route.paramNames;\n const methodInterned = route.method;\n const needsBody =\n methodInterned === 'POST' || methodInterned === 'PUT' || methodInterned === 'PATCH';\n\n this.app[methodFn](route.path, (res: any, req: any) => {\n // Dynamic feature guard - anything registered at runtime sends the\n // request through the full pipeline instead\n if (\n this.globalMiddleware.length !== 0 ||\n (this.hookManager &&\n (this.hookManager.hasHooks === undefined ||\n this.hookManager.hasHooks('request') ||\n this.hookManager.hasHooks('response')))\n ) {\n void this.handleRequest(req, res);\n return;\n }\n this.handleNativeRoute(req, res, handler, methodInterned, paramNames, needsBody);\n });\n count++;\n }\n\n if (count > 0) {\n this.logger.info(`${count} fast-path routes registered on native uWS router`, 'NativeRoutes');\n }\n }\n\n private handleNativeRoute(\n req: any,\n res: any,\n handler: (req: HttpRequest, res: HttpResponse) => any,\n method: string,\n paramNames: string[] | null,\n needsBody: boolean\n ): void {\n res.aborted = false;\n\n const httpReq = new UwsRequest(this, req, method, req.getUrl(), req.getQuery());\n if (paramNames) {\n const params: Record<string, string> = {};\n for (let i = 0; i < paramNames.length; i++) {\n const paramName = paramNames[i];\n if (paramName === undefined) continue;\n params[paramName] = req.getParameter(i);\n }\n httpReq.params = params;\n }\n const httpRes = new UWebSocketsHttpServer.ResponsePrototype().init(\n res,\n req,\n this.logger,\n this._compression\n ) as any as HttpResponse;\n (httpRes as any)._moroReq = httpReq;\n\n if (needsBody) {\n // Body routes always go async: snapshot headers, arm the abort hook,\n // read the body, then run the handler\n httpReq.materialize();\n res._abortArmed = true;\n res.onAborted(() => {\n res.aborted = true;\n const hook = res._abortHook;\n if (hook) hook();\n const moroRes = res._moroRes;\n if (moroRes) moroRes._handleAbort();\n });\n const contentLength = req.getHeader('content-length');\n const bodyPromise =\n contentLength && parseInt(contentLength) > 0\n ? this.readBody(res, httpReq as any as HttpRequest)\n : Promise.resolve();\n bodyPromise\n .then(() => {\n if (res.aborted) return;\n const result = handler(httpReq as any as HttpRequest, httpRes);\n if (result && typeof (result as any).then === 'function') {\n return (result as Promise<any>).then(r => {\n if (r !== undefined && !httpRes.headersSent) httpRes.json(r);\n });\n }\n if (result !== undefined && !httpRes.headersSent) httpRes.json(result);\n return;\n })\n .catch(err => this.handleNativeRouteError(err, httpReq, httpRes, res));\n return;\n }\n\n try {\n const result = handler(httpReq as any as HttpRequest, httpRes);\n\n if (result && typeof (result as any).then === 'function') {\n // Async handler: it is suspended at its first await - snapshot\n // uWS-backed data and arm abort tracking before returning to the loop\n httpReq.materialize();\n res._abortArmed = true;\n res.onAborted(() => {\n res.aborted = true;\n const hook = res._abortHook;\n if (hook) hook();\n const moroRes = res._moroRes;\n if (moroRes) moroRes._handleAbort();\n });\n (result as Promise<any>).then(\n r => {\n if (r !== undefined && !httpRes.headersSent && !res.aborted) httpRes.json(r);\n },\n err => this.handleNativeRouteError(err, httpReq, httpRes, res)\n );\n } else if (result !== undefined && !httpRes.headersSent) {\n // Fully synchronous: single corked write, no header copy, no promise\n httpRes.json(result);\n }\n\n // A synchronous handler that returned with the response still open\n // (e.g. SSE: writeHead + periodic write) is about to hand an unfinished\n // uWS response back to the event loop - uWS forbids that without an\n // abort handler, and without one client disconnects are never noticed.\n if (!(httpRes as any).finished && !res.aborted && !res._abortArmed) {\n res._abortArmed = true;\n httpReq.materialize();\n res.onAborted(() => {\n res.aborted = true;\n const hook = res._abortHook;\n if (hook) hook();\n const moroRes = res._moroRes;\n if (moroRes) moroRes._handleAbort();\n });\n }\n } catch (err) {\n this.handleNativeRouteError(err, httpReq, httpRes, res);\n }\n }\n\n private handleNativeRouteError(\n err: any,\n httpReq: UwsRequest,\n httpRes: HttpResponse,\n res: any\n ): void {\n if (err?.statusCode === 413 && !res.aborted && !httpRes.headersSent) {\n httpRes.statusCode = 413;\n httpRes.setHeader('Content-Type', 'application/json');\n httpRes.end('{\"success\":false,\"error\":\"Request entity too large\"}');\n return;\n }\n\n if (err?.statusCode === 400 && !res.aborted && !httpRes.headersSent) {\n httpRes.statusCode = 400;\n httpRes.setHeader('Content-Type', 'application/json');\n httpRes.end('{\"success\":false,\"error\":\"Invalid request body\"}');\n return;\n }\n\n const sendFallback = () => {\n if (!res.aborted && !httpRes.headersSent) {\n // Same shape as the unified router's fast-path error response\n (httpRes as any).status(500).json({ error: 'Internal server error' });\n }\n };\n\n const errorHandler = this.nativeErrorHandler;\n if (errorHandler) {\n errorHandler(httpReq as any as HttpRequest, httpRes, err).then(\n handled => {\n if (!handled) sendFallback();\n },\n () => sendFallback()\n );\n } else {\n this.logger.error(\n `Route handler error: ${err instanceof Error ? err.message : String(err)}`,\n 'NativeRouteError'\n );\n sendFallback();\n }\n }\n\n private async handleRequest(req: any, res: any): Promise<void> {\n this.requestCounter++;\n\n // Single abort hook for the whole request lifecycle. uWS requires\n // onAborted for any response finished after returning to the event loop;\n // readBody chains onto res._abortHook rather than replacing this handler.\n res.aborted = false;\n res.onAborted(() => {\n res.aborted = true;\n const hook = res._abortHook;\n if (hook) hook();\n // Fire 'close'/'aborted' on the moro wrappers (SSE/monitor cleanup)\n const moroRes = res._moroRes;\n if (moroRes) moroRes._handleAbort();\n });\n\n let httpReq: any;\n let httpRes: any;\n\n try {\n // Create Moro-compatible request/response objects\n httpReq = this.createMoroRequest(req, res);\n httpRes = this.createMoroResponse(req, res);\n httpRes._moroReq = httpReq;\n\n const method = httpReq.method;\n\n // Parse body only if there's actually a body (check content-length).\n // Check first char for early exit (all body methods start with 'P')\n if (\n method.charCodeAt(0) === 80 && // 'P' char code\n (method === 'POST' || method === 'PUT' || method === 'PATCH')\n ) {\n const contentLength = req.getHeader('content-length');\n if (contentLength && parseInt(contentLength) > 0) {\n // readBody awaits - snapshot uWS-backed data first\n httpReq.materialize();\n await this.readBody(res, httpReq);\n // A client that disconnects mid-upload resolves readBody with a\n // null/partial body; do not run hooks, middleware or the handler for\n // a dead request (matches the native fast-path guard at ~line 625 and\n // the Node backend, whose aborted stream rejects parseBody).\n if (res.aborted) return;\n }\n }\n\n // Execute hooks before request processing - skipped entirely when none registered\n const hookManager = this.hookManager;\n if (hookManager && (hookManager.hasHooks === undefined || hookManager.hasHooks('request'))) {\n httpReq.materialize();\n await hookManager.execute('request', {\n request: httpReq,\n response: httpRes,\n });\n }\n\n // Post-response hooks (session persistence, auth session refresh, CDN\n // invalidation) run after the response is flushed, off the critical path.\n if (hookManager && (hookManager.hasHooks === undefined || hookManager.hasHooks('response'))) {\n httpRes.once('finish', () => {\n void Promise.resolve(\n hookManager.execute('response', { request: httpReq, response: httpRes })\n ).catch((error: any) =>\n this.logger?.error?.(`Response hook error: ${error?.message || error}`, 'Hooks')\n );\n });\n }\n\n // Execute global middleware chain\n if (this.globalMiddleware.length > 0) {\n httpReq.materialize();\n await this.executeMiddleware(this.globalMiddleware, httpReq, httpRes);\n if (httpRes.headersSent) return;\n }\n\n // Unified router direct dispatch\n const routerHandler = this.routerHandler;\n if (routerHandler) {\n const handled = routerHandler(httpReq, httpRes);\n if (handled) {\n if (typeof (handled as any).then === 'function') {\n // Async route: the handler is suspended at its first await - snapshot\n // uWS-backed data now, while the native request is still valid\n httpReq.materialize();\n if (await handled) return;\n } else {\n return;\n }\n }\n }\n\n // No route matched\n if (!httpRes.headersSent && !res.aborted) {\n httpRes.statusCode = 404;\n httpRes.setHeader('Content-Type', 'application/json');\n httpRes.end('{\"success\":false,\"error\":\"Not found\"}');\n }\n } catch (error) {\n // Payload-too-large: respond 413 rather than a generic 500\n if ((error as any)?.statusCode === 413 && !res.aborted && httpRes && !httpRes.headersSent) {\n httpRes.statusCode = 413;\n httpRes.setHeader('Content-Type', 'application/json');\n httpRes.end('{\"success\":false,\"error\":\"Request entity too large\"}');\n return;\n }\n\n // Malformed body: a client error (400), not a server error (500)\n if ((error as any)?.statusCode === 400 && !res.aborted && httpRes && !httpRes.headersSent) {\n httpRes.statusCode = 400;\n httpRes.setHeader('Content-Type', 'application/json');\n httpRes.end('{\"success\":false,\"error\":\"Invalid request body\"}');\n return;\n }\n\n this.logger.error(\n `Request handling error: ${error instanceof Error ? error.message : String(error)}`,\n 'RequestError'\n );\n\n // Error hooks are observational: fire-and-forget so a slow or throwing\n // observer can never delay or alter the error response.\n const errorHooks = this.hookManager;\n if (errorHooks && (errorHooks.hasHooks === undefined || errorHooks.hasHooks('error'))) {\n void Promise.resolve(\n errorHooks.execute('error', { request: httpReq, response: httpRes, error })\n ).catch((hookError: any) =>\n this.logger?.error?.(`Error hook error: ${hookError?.message || hookError}`, 'Hooks')\n );\n }\n\n // Send error response if not already sent\n if (!res.aborted) {\n try {\n res.cork(() => {\n res.writeStatus('500 Internal Server Error');\n res.writeHeader('Content-Type', 'application/json');\n res.end('{\"success\":false,\"error\":\"Internal server error\"}');\n });\n } catch {\n this.logger.error('Failed to send error response', 'ResponseError');\n }\n }\n }\n }\n\n private createMoroRequest(req: any, _res: any): HttpRequest {\n const url = req.getUrl();\n const queryString = req.getQuery();\n const methodRaw = req.getMethod();\n\n // Use interned method string if available\n const method = UWebSocketsHttpServer.INTERNED_METHODS.get(methodRaw) || methodRaw.toUpperCase();\n\n // Headers/query/cookies/requestId are lazy on the UwsRequest prototype -\n // materialize() snapshots them before the first await\n return new UwsRequest(this, req, method, url, queryString) as unknown as HttpRequest;\n }\n\n // Strip CR/LF from a header value to prevent response-splitting / header\n // injection, matching Node's setHeader ERR_INVALID_CHAR guarantee. Guarded\n // with indexOf so the common (clean) path allocates nothing on the hot path.\n private static sanitizeHeaderValue(value: string): string {\n return value.indexOf('\\r') === -1 && value.indexOf('\\n') === -1\n ? value\n : value.replace(/[\\r\\n]/g, '');\n }\n\n // Optimized helper to write headers\n private static writeHeaders(res: any, headers: Record<string, string | string[]>): void {\n // Performance: for...in is the fastest way to iterate response headers\n for (const key in headers) {\n const value = headers[key];\n if (Array.isArray(value)) {\n // Emit one header line per element instead of comma-joining. RFC 6265\n // forbids folding Set-Cookie, and browsers parse a folded\n // `a=1; Path=/, b=2` as a single cookie, silently dropping the second\n // (session + CSRF is the canonical breakage). uWS writes a separate\n // line per writeHeader call with the same key.\n for (let i = 0; i < value.length; i++) {\n res.writeHeader(key, UWebSocketsHttpServer.sanitizeHeaderValue(String(value[i])));\n }\n continue;\n }\n res.writeHeader(key, UWebSocketsHttpServer.sanitizeHeaderValue(String(value)));\n }\n }\n\n // Helper to get status string (cached for performance)\n private static getStatusString(code: number): string {\n return UWebSocketsHttpServer.STATUS_STRINGS.get(code) || `${code} OK`;\n }\n\n // Pre-define methods on prototype instead of creating new closures for each request\n private static readonly ResponsePrototype = class extends LazyEventEmitter {\n public headersSent = false;\n public statusCode = 200;\n public responseHeaders: Record<string, string | string[]> = {};\n private _res: any;\n private _req: any;\n private _logger: any;\n // Terminal-write latch: headersSent means \"head flushed\" (true mid-stream\n // after writeHead/write), _ended means the body is complete\n private _ended = false;\n private _drainArmed = false;\n // Accept-Encoding captured eagerly (uWS req is valid only synchronously)\n // and the server's compression settings, for buffered-response compression.\n private _acceptEncoding: string | undefined = undefined;\n private _compression: CompressionSettings | undefined = undefined;\n // The UwsRequest wrapper, linked by the server so lifecycle events reach\n // req.on('close') listeners (SSE cleanup, monitors)\n public _moroReq: any = null;\n\n init(res: any, req: any, logger: any, compression?: CompressionSettings) {\n this.headersSent = false;\n this.statusCode = 200;\n // Fresh object (a delete-loop reset would push the object into V8\n // dictionary mode, slowing every later header access)\n this.responseHeaders = {};\n this._res = res;\n this._req = req;\n this._logger = logger;\n this._ended = false;\n this._drainArmed = false;\n this._compression = compression;\n // Capture Accept-Encoding now: the native req is valid only during the\n // synchronous handler entry, but compression resolves asynchronously.\n this._acceptEncoding =\n compression?.enabled && req ? req.getHeader('accept-encoding') || undefined : undefined;\n // Route client aborts to the wrapper so 'close' fires (see onAborted)\n res._moroRes = this;\n return this;\n }\n\n // Buffered-response compression for uWS (parity with the engine/Node\n // paths). Returns true when it took over the write (async), false when the\n // caller should proceed with its normal synchronous cork+end.\n private _tryCompressedEnd(body: string | Buffer, contentType: string | undefined): boolean {\n const s = this._compression;\n if (!s || !s.enabled) return false;\n const bytes = typeof body === 'string' ? Buffer.byteLength(body) : body.length;\n if (bytes < s.threshold) return false;\n if ('content-encoding' in this.responseHeaders) return false;\n if (this.statusCode === 204 || this.statusCode === 304) return false;\n const ctHeader = this.responseHeaders['content-type'];\n const ct = contentType ?? (Array.isArray(ctHeader) ? ctHeader[0] : (ctHeader as string));\n if (!isCompressible(ct)) return false;\n const encoding = negotiateEncoding(this._acceptEncoding, s.encodings);\n if (!encoding) return false;\n\n void compressBuffer(body, encoding, s.level)\n .then(compressed => {\n if (this._ended || this._res.aborted) return;\n this.responseHeaders['content-encoding'] = encoding;\n const vary = this.responseHeaders['vary'];\n this.responseHeaders['vary'] = vary ? `${vary}, Accept-Encoding` : 'Accept-Encoding';\n this._res.cork(() => {\n this._res.writeStatus(UWebSocketsHttpServer.getStatusString(this.statusCode));\n UWebSocketsHttpServer.writeHeaders(this._res, this.responseHeaders);\n this._res.end(compressed);\n });\n this.headersSent = true;\n this._ended = true;\n this._emitDone();\n })\n .catch((err: unknown) => {\n this._logger?.error?.(\n `uWS response compression failed: ${err instanceof Error ? err.message : String(err)}`,\n 'Response'\n );\n if (this._ended || this._res.aborted) return;\n this._res.cork(() => {\n this._res.writeStatus(UWebSocketsHttpServer.getStatusString(this.statusCode));\n UWebSocketsHttpServer.writeHeaders(this._res, this.responseHeaders);\n this._res.end(body);\n });\n this.headersSent = true;\n this._ended = true;\n this._emitDone();\n });\n return true;\n }\n\n get writableEnded() {\n return this._ended;\n }\n\n get writableFinished() {\n return this._ended;\n }\n\n get finished() {\n return this._ended;\n }\n\n // Node ServerResponse lifecycle: 'finish' then 'close' after the terminal\n // write; the request wrapper's 'close' fires too (IncomingMessage parity).\n // No listeners -> two null checks, nothing else.\n private _emitDone() {\n this._ended = true;\n if (this._events) {\n this.emit('finish');\n this.emit('close');\n }\n const req = this._moroReq;\n if (req && req._events) req.emit('close');\n }\n\n // Client aborted: 'close' without 'finish' (Node semantics), plus\n // 'aborted'/'close' on the request wrapper\n _handleAbort() {\n if (this._ended) return;\n this._ended = true;\n if (this._events) this.emit('close');\n const req = this._moroReq;\n if (req && req._events) {\n req.emit('aborted');\n req.emit('close');\n }\n }\n\n // Backpressure: surface uWS's onWritable as the 'drain' event pipe()\n // and manual streaming loops wait on\n private _armDrain() {\n if (this._drainArmed) return;\n this._drainArmed = true;\n try {\n this._res.onWritable(() => {\n this._drainArmed = false;\n this.emit('drain');\n return true;\n });\n } catch {\n this._drainArmed = false;\n }\n }\n\n status(code: number) {\n this.statusCode = code;\n return this;\n }\n\n setHeader(name: string, value: string | string[]) {\n // Cache toLowerCase result to avoid repeated calls\n const lowerName = name.toLowerCase();\n this.responseHeaders[lowerName] = value;\n return this;\n }\n\n getHeader(name: string) {\n // Cache toLowerCase result\n const lowerName = name.toLowerCase();\n return this.responseHeaders[lowerName];\n }\n\n removeHeader(name: string) {\n const lowerName = name.toLowerCase();\n if (lowerName in this.responseHeaders) {\n delete this.responseHeaders[lowerName];\n }\n return this;\n }\n\n json(data: any) {\n if (this.headersSent || this._res.aborted) return;\n\n // Fast-path JSON serialization for common API patterns\n let body: string;\n\n // The interpolated fast path is only valid when `success` is a real\n // boolean (a string/number would produce invalid JSON like\n // {\"success\":yes,...}), and each interpolated field must be defined\n // (JSON.stringify(undefined) yields the literal token \"undefined\", which\n // would corrupt the body). Otherwise fall through to JSON.stringify.\n if (data && typeof data === 'object' && typeof data.success === 'boolean') {\n let keyCount = 0;\n let hasData = false;\n let hasError = false;\n let hasTotal = false;\n\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n keyCount++;\n if (key === 'data') hasData = true;\n else if (key === 'error') hasError = true;\n else if (key === 'total') hasTotal = true;\n }\n }\n\n if (\n keyCount === 3 &&\n hasData &&\n hasError &&\n data.data !== undefined &&\n data.error !== undefined\n ) {\n body = `{\"success\":${data.success},\"data\":${JSON.stringify(data.data)},\"error\":${JSON.stringify(data.error)}}`;\n } else if (\n keyCount === 3 &&\n hasData &&\n hasTotal &&\n data.data !== undefined &&\n typeof data.total === 'number'\n ) {\n body = `{\"success\":${data.success},\"data\":${JSON.stringify(data.data)},\"total\":${data.total}}`;\n } else if (keyCount === 2 && hasData && data.data !== undefined) {\n body = `{\"success\":${data.success},\"data\":${JSON.stringify(data.data)}}`;\n } else if (keyCount === 2 && hasError && data.error !== undefined) {\n body = `{\"success\":${data.success},\"error\":${JSON.stringify(data.error)}}`;\n } else {\n body = JSON.stringify(data);\n }\n } else {\n body = JSON.stringify(data);\n }\n\n if (!('content-type' in this.responseHeaders)) {\n this.responseHeaders['content-type'] = 'application/json';\n }\n\n try {\n // Compression (when enabled + compressible + accepted) takes over the\n // write asynchronously; otherwise the synchronous corked path runs.\n if (this._tryCompressedEnd(body, 'application/json')) return;\n this._res.cork(() => {\n this._res.writeStatus(UWebSocketsHttpServer.getStatusString(this.statusCode));\n UWebSocketsHttpServer.writeHeaders(this._res, this.responseHeaders);\n this._res.end(body);\n });\n this.headersSent = true;\n this._emitDone();\n } catch {\n this._logger.error('Failed to send JSON response', 'ResponseError');\n }\n }\n\n send(data: string | Buffer) {\n if (this.headersSent || this._res.aborted) return;\n\n const body = typeof data === 'string' ? data : data.toString();\n\n try {\n if (this._tryCompressedEnd(body, undefined)) return;\n this._res.cork(() => {\n this._res.writeStatus(UWebSocketsHttpServer.getStatusString(this.statusCode));\n UWebSocketsHttpServer.writeHeaders(this._res, this.responseHeaders);\n this._res.end(body);\n });\n this.headersSent = true;\n this._emitDone();\n } catch {\n this._logger.error('Failed to send response', 'ResponseError');\n }\n }\n\n // Flush status + headers without ending the response (Node streaming\n // entry point - SSE and manual chunked responses start here). Supports\n // both (code, headers) and (code, statusMessage, headers) signatures;\n // uWS derives the reason phrase from the status string, so a custom\n // message is folded into it.\n writeHead(statusCode: number, reasonOrHeaders?: any, maybeHeaders?: any) {\n if (this.headersSent || this._res.aborted) return this;\n\n this.statusCode = statusCode;\n const headers =\n reasonOrHeaders && typeof reasonOrHeaders === 'object' ? reasonOrHeaders : maybeHeaders;\n if (headers) {\n for (const key of Object.keys(headers)) {\n this.setHeader(key, headers[key]);\n }\n }\n\n try {\n this._res.cork(() => {\n const status =\n typeof reasonOrHeaders === 'string'\n ? `${statusCode} ${reasonOrHeaders}`\n : UWebSocketsHttpServer.getStatusString(statusCode);\n this._res.writeStatus(status);\n UWebSocketsHttpServer.writeHeaders(this._res, this.responseHeaders);\n });\n this.headersSent = true;\n } catch {\n this._logger.error('Failed to write response head', 'ResponseError');\n }\n\n return this;\n }\n\n // Stream a body chunk, flushing the head first if needed. Returns uWS's\n // backpressure signal like Node's Writable.write; 'drain' fires when the\n // socket can accept more.\n write(chunk: any, encoding?: any, callback?: any): boolean {\n if (typeof encoding === 'function') {\n callback = encoding;\n encoding = undefined;\n }\n if (this._ended || this._res.aborted) return false;\n\n let ok = true;\n try {\n this._res.cork(() => {\n if (!this.headersSent) {\n this._res.writeStatus(UWebSocketsHttpServer.getStatusString(this.statusCode));\n UWebSocketsHttpServer.writeHeaders(this._res, this.responseHeaders);\n this.headersSent = true;\n }\n ok = this._res.write(chunk);\n });\n } catch {\n this._logger.error('Failed to write response chunk', 'ResponseError');\n return false;\n }\n\n if (!ok) this._armDrain();\n if (typeof callback === 'function') callback();\n return ok;\n }\n\n end(data?: any, encoding?: any, callback?: any) {\n if (typeof encoding === 'function') {\n callback = encoding;\n encoding = undefined;\n }\n // Guard on _ended, not headersSent: in streaming mode (writeHead/write)\n // the head is already flushed and end() must still complete the body\n if (this._ended || this._res.aborted) {\n if (typeof callback === 'function') callback();\n return this;\n }\n\n try {\n this._res.cork(() => {\n if (!this.headersSent) {\n this._res.writeStatus(UWebSocketsHttpServer.getStatusString(this.statusCode));\n UWebSocketsHttpServer.writeHeaders(this._res, this.responseHeaders);\n this.headersSent = true;\n }\n this._res.end(data || '');\n });\n this._emitDone();\n if (typeof callback === 'function') callback();\n } catch {\n this._logger.error('Failed to end response', 'ResponseError');\n if (typeof callback === 'function') callback();\n }\n\n return this;\n }\n\n redirect(url: string, code?: number) {\n if (this.headersSent || this._res.aborted) return;\n\n const redirectCode = code || 302;\n this.statusCode = redirectCode;\n\n try {\n this._res.cork(() => {\n this._res.writeStatus(UWebSocketsHttpServer.getStatusString(redirectCode));\n this._res.writeHeader('Location', UWebSocketsHttpServer.sanitizeHeaderValue(url));\n UWebSocketsHttpServer.writeHeaders(this._res, this.responseHeaders);\n this._res.end();\n });\n this.headersSent = true;\n this._emitDone();\n } catch {\n this._logger.error('Failed to send redirect', 'ResponseError');\n }\n }\n\n // Standardized response helpers\n success<T = any>(data: T, message?: string) {\n const response: any = {\n success: true,\n data,\n };\n if (message !== undefined) {\n response.message = message;\n }\n this.json(response);\n }\n\n error(error: string, code?: string, message?: string) {\n const response: any = {\n success: false,\n error,\n };\n if (code !== undefined) {\n response.code = code;\n }\n if (message !== undefined) {\n response.message = message;\n }\n this.json(response);\n }\n\n // Common HTTP error helpers (automatically set status code)\n unauthorized(message: string = 'Authentication required') {\n this.statusCode = 401;\n this.json({\n success: false,\n error: 'Unauthorized',\n code: 'UNAUTHORIZED',\n message,\n });\n }\n\n forbidden(message: string = 'Insufficient permissions') {\n this.statusCode = 403;\n this.json({\n success: false,\n error: 'Forbidden',\n code: 'FORBIDDEN',\n message,\n });\n }\n\n notFound(resource: string = 'Resource') {\n this.statusCode = 404;\n this.json({\n success: false,\n error: 'Not Found',\n code: 'NOT_FOUND',\n message: `${resource} not found`,\n });\n }\n\n badRequest(message: string = 'Invalid request') {\n this.statusCode = 400;\n this.json({\n success: false,\n error: 'Bad Request',\n code: 'BAD_REQUEST',\n message,\n });\n }\n\n conflict(message: string) {\n this.statusCode = 409;\n this.json({\n success: false,\n error: 'Conflict',\n code: 'CONFLICT',\n message,\n });\n }\n\n internalError(message: string = 'Internal server error') {\n this.statusCode = 500;\n this.json({\n success: false,\n error: 'Internal Server Error',\n code: 'INTERNAL_ERROR',\n message,\n });\n }\n\n validationError(errors: Array<{ field: string; message: string; code?: string }>) {\n this.statusCode = 422;\n this.json({\n success: false,\n error: 'Validation Failed',\n code: 'VALIDATION_ERROR',\n errors,\n });\n }\n\n rateLimited(retryAfter?: number) {\n this.statusCode = 429;\n if (retryAfter) {\n this.setHeader('Retry-After', retryAfter.toString());\n }\n this.json({\n success: false,\n error: 'Rate Limit Exceeded',\n code: 'RATE_LIMITED',\n message: retryAfter\n ? `Too many requests. Retry after ${retryAfter} seconds.`\n : 'Too many requests',\n retryAfter,\n });\n }\n\n // Common success patterns\n created<T = any>(data: T, location?: string) {\n this.statusCode = 201;\n if (location) {\n this.setHeader('Location', location);\n }\n this.json({\n success: true,\n data,\n });\n }\n\n noContent() {\n this.statusCode = 204;\n this.end();\n }\n\n paginated<T = any>(data: T[], pagination: { page: number; limit: number; total: number }) {\n const totalPages = Math.ceil(pagination.total / pagination.limit);\n this.json({\n success: true,\n data,\n pagination: {\n page: pagination.page,\n limit: pagination.limit,\n total: pagination.total,\n totalPages,\n hasNext: pagination.page < totalPages,\n hasPrev: pagination.page > 1,\n },\n });\n }\n\n cookie(name: string, value: string, options?: any) {\n // Percent-encode the value (matches the Node path and Express) so a value\n // containing ';'/',' can't inject cookie attributes and control chars\n // don't corrupt the Set-Cookie header.\n const parts = [name, '=', encodeURIComponent(value)];\n\n if (options) {\n // maxAge: 0 is meaningful (immediate expiry - clearCookie relies on it)\n if (options.maxAge !== undefined && options.maxAge !== null) {\n parts.push('; Max-Age=', String(options.maxAge));\n }\n if (options.expires) {\n const expires =\n options.expires instanceof Date\n ? options.expires.toUTCString()\n : String(options.expires);\n parts.push('; Expires=', expires);\n }\n if (options.domain) {\n parts.push('; Domain=', options.domain);\n }\n if (options.secure) {\n parts.push('; Secure');\n }\n if (options.httpOnly) {\n parts.push('; HttpOnly');\n }\n if (options.sameSite) {\n parts.push('; SameSite=', options.sameSite);\n }\n }\n // Path defaults to '/' (Express behavior) so clearCookie() from a nested\n // route can clear a cookie originally set at the site root.\n parts.push('; Path=', options?.path ?? '/');\n\n const cookie = parts.join('');\n const lowerKey = 'set-cookie';\n const existing = this.responseHeaders[lowerKey];\n if (existing) {\n if (Array.isArray(existing)) {\n existing.push(cookie);\n } else {\n this.responseHeaders[lowerKey] = [existing as string, cookie];\n }\n } else {\n this.responseHeaders[lowerKey] = cookie;\n }\n\n return this;\n }\n\n clearCookie(name: string, options: any = {}) {\n const clearOptions: any = { expires: new Date(0), maxAge: 0 };\n if (options.path !== undefined) clearOptions.path = options.path;\n if (options.domain !== undefined) clearOptions.domain = options.domain;\n if (options.httpOnly !== undefined) clearOptions.httpOnly = options.httpOnly;\n if (options.secure !== undefined) clearOptions.secure = options.secure;\n if (options.sameSite !== undefined) clearOptions.sameSite = options.sameSite;\n return this.cookie(name, '', clearOptions);\n }\n\n // ==== Express-compatible response helpers (parity with the Node adapter) ====\n\n public locals: Record<string, any> = {};\n\n set(field: string | Record<string, any>, value?: any) {\n if (this.headersSent) return this;\n if (typeof field === 'string') {\n if (value !== undefined) this.setHeader(field, value);\n } else {\n for (const key in field) {\n this.setHeader(key, field[key]);\n }\n }\n return this;\n }\n\n get(field: string) {\n return this.getHeader(field);\n }\n\n hasHeader(name: string): boolean {\n return this.getHeader(name) !== undefined;\n }\n\n setBulkHeaders(headers: Record<string, string | number>) {\n if (this.headersSent) return this;\n for (const key in headers) {\n this.setHeader(key, String(headers[key]));\n }\n return this;\n }\n\n appendHeader(name: string, value: string | string[]) {\n if (this.headersSent) return this;\n const lower = name.toLowerCase();\n const existing = this.responseHeaders[lower];\n if (existing) {\n const values = Array.isArray(existing) ? existing : [existing as string];\n const incoming = Array.isArray(value) ? value : [value];\n this.responseHeaders[lower] = values.concat(incoming);\n } else {\n this.responseHeaders[lower] = value;\n }\n return this;\n }\n\n append(field: string, value: string | string[]) {\n return this.appendHeader(field, value);\n }\n\n type(contentType: string) {\n if (this.headersSent) return this;\n let ct = contentType;\n if (ct.indexOf('/') === -1) {\n const shorthands: Record<string, string> = {\n json: 'application/json; charset=utf-8',\n html: 'text/html; charset=utf-8',\n text: 'text/plain; charset=utf-8',\n txt: 'text/plain; charset=utf-8',\n xml: 'application/xml',\n js: 'application/javascript',\n css: 'text/css; charset=utf-8',\n form: 'application/x-www-form-urlencoded',\n };\n ct = shorthands[ct.toLowerCase()] || `application/${ct}`;\n }\n this.setHeader('Content-Type', ct);\n return this;\n }\n\n sendStatus(code: number) {\n if (this.headersSent) return;\n this.statusCode = code;\n const statusString = UWebSocketsHttpServer.getStatusString(code);\n const body = statusString.slice(String(code).length + 1) || String(code);\n this.setHeader('Content-Type', 'text/plain; charset=utf-8');\n this.end(body);\n }\n\n location(url: string) {\n if (this.headersSent) return this;\n this.setHeader('Location', url.replace(/[\\r\\n]/g, ''));\n return this;\n }\n\n vary(field: string | string[]) {\n if (this.headersSent) return this;\n const existing = this.responseHeaders['vary'];\n const existingList = existing\n ? String(existing)\n .split(',')\n .map(s => s.trim())\n .filter(Boolean)\n : [];\n const incoming = Array.isArray(field) ? field : [field];\n for (const f of incoming) {\n if (!existingList.some(e => e.toLowerCase() === f.toLowerCase())) {\n existingList.push(f);\n }\n }\n this.responseHeaders['vary'] = existingList.join(', ');\n return this;\n }\n\n links(links: Record<string, string>) {\n if (this.headersSent) return this;\n const parts: string[] = [];\n for (const rel in links) {\n parts.push(`<${links[rel]}>; rel=\"${rel}\"`);\n }\n if (parts.length > 0) {\n const existing = this.responseHeaders['link'];\n this.responseHeaders['link'] = existing\n ? `${existing}, ${parts.join(', ')}`\n : parts.join(', ');\n }\n return this;\n }\n\n canSetHeaders(): boolean {\n return !this.headersSent;\n }\n\n getResponseState() {\n return {\n headersSent: this.headersSent,\n statusCode: this.statusCode,\n headers: this.responseHeaders,\n finished: this._ended,\n writable: !this._ended,\n };\n }\n };\n\n private createMoroResponse(req: any, res: any): HttpResponse {\n // Fresh instance per request. Pooling these was a correctness hazard: a\n // handler that responds after returning (timers, streams) would write into\n // a recycled object already serving another request.\n const httpRes = new UWebSocketsHttpServer.ResponsePrototype();\n httpRes.init(res, req, this.logger);\n return httpRes as any as HttpResponse;\n }\n\n private async readBody(res: any, httpReq: HttpRequest): Promise<void> {\n const contentType = httpReq.headers['content-type'] || '';\n const isMultipart = contentType.includes('multipart/form-data');\n const maxSize = isMultipart ? this.maxUploadSize : this.maxBodySize;\n\n return new Promise((resolve, reject) => {\n // Collect chunks in array, concat once at end (faster than repeated Buffer.concat)\n const chunks: Buffer[] = [];\n let totalLength = 0;\n let settled = false;\n\n const finish = (fn: () => void) => {\n if (settled) return;\n settled = true;\n res._abortHook = null;\n fn();\n };\n\n res.onData((chunk: ArrayBuffer, isLast: boolean) => {\n if (settled) return;\n\n // Buffer.from(ArrayBuffer) is a zero-copy VIEW of uWS-owned memory,\n // which uWS recycles after this callback returns. The final chunk is\n // consumed synchronously below, so the view is safe; earlier chunks\n // must be copied or they alias reused memory (silent body corruption).\n const view = Buffer.from(chunk);\n totalLength += view.length;\n\n if (totalLength > maxSize) {\n const error: any = new Error(\n isMultipart ? 'File upload too large' : 'Request body too large'\n );\n error.statusCode = 413;\n finish(() => reject(error));\n return;\n }\n\n if (!isLast) {\n const copy = Buffer.allocUnsafe(view.length);\n view.copy(copy);\n chunks.push(copy);\n return;\n }\n\n // Final chunk: single-chunk bodies (the common case) parse straight\n // from the view with zero copies\n let buffer: Buffer;\n if (chunks.length === 0) {\n buffer = view;\n } else {\n chunks.push(view);\n buffer = Buffer.concat(chunks, totalLength);\n }\n\n try {\n if (contentType.includes('application/json')) {\n httpReq.body = totalLength === 0 ? null : JSON.parse(buffer.toString('utf-8'));\n } else if (contentType.includes('application/x-www-form-urlencoded')) {\n const params = new URLSearchParams(buffer.toString('utf-8'));\n const body: Record<string, any> = {};\n params.forEach((value, key) => {\n body[key] = value;\n });\n httpReq.body = body;\n } else if (isMultipart) {\n // Shared parser (same as the Node http server) - stringifying\n // multipart would corrupt binary uploads and lose fields/files.\n // parseMultipart retains slices of the payload as file Buffers;\n // the single-chunk fast path (buffer === view) aliases uWS-owned\n // memory that is recycled after this callback returns, so copy\n // it first. Concatenated multi-chunk buffers are already stable.\n const stable = buffer === view ? Buffer.from(buffer) : buffer;\n httpReq.body = parseMultipartBuffer(stable, contentType, this.multipartLimits);\n } else {\n httpReq.body = buffer.toString('utf-8');\n }\n\n finish(resolve);\n } catch (parseError) {\n // A limit error (multipart maxParts/maxFiles/maxFileSize) carries its\n // own 413 - preserve it rather than masking it as a generic 400.\n if (parseError && typeof (parseError as any).statusCode === 'number') {\n finish(() => reject(parseError));\n return;\n }\n // A malformed body is a client error: reject with 400 (parity with\n // the engine and Node transports) rather than silently handing the\n // handler a null body it may treat as \"no input\".\n const error: any = new Error(\n `Invalid request body: ${parseError instanceof Error ? parseError.message : String(parseError)}`\n );\n error.statusCode = 400;\n finish(() => reject(error));\n }\n });\n\n // Chain onto the request-lifetime abort hook (registered in handleRequest\n // or the native route wrapper) instead of replacing it\n res._abortHook = () => {\n this.logger.debug('Request aborted', 'RequestAborted');\n finish(resolve);\n };\n\n // If the client already disconnected before we attached the hook\n if (res.aborted) {\n finish(resolve);\n }\n });\n }\n\n private async executeMiddleware(\n middleware: Middleware[],\n req: HttpRequest,\n res: HttpResponse\n ): Promise<void> {\n for (const mw of middleware) {\n if (res.headersSent) break;\n\n await new Promise<void>((resolve, reject) => {\n try {\n const result = mw(req, res, (err?: Error) => {\n if (err) reject(err);\n else resolve();\n });\n\n // Handle async middleware\n if (result && typeof result.then === 'function') {\n result.then(() => resolve()).catch(reject);\n }\n } catch (error) {\n reject(error);\n }\n });\n }\n }\n\n // Public API - matches MoroHttpServer interface\n\n use(middleware: Middleware): void {\n // Defensive check: Don't add MiddlewareInterface objects to globalMiddleware\n // MiddlewareInterface objects should only be handled by MiddlewareManager\n if (\n middleware &&\n typeof middleware === 'object' &&\n (middleware as any).install &&\n (middleware as any).metadata\n ) {\n this.logger?.warn?.(\n `Attempted to add MiddlewareInterface \"${(middleware as any).metadata?.name}\" to HTTP server globalMiddleware. ` +\n `This should be handled by MiddlewareManager instead. Skipping.`,\n 'Middleware'\n );\n return;\n }\n\n this.globalMiddleware.push(middleware);\n }\n\n // Configure request tracking (ID generation)\n setRequestTracking(enabled: boolean): void {\n this.requestTrackingEnabled = enabled;\n }\n\n // Note: Route registration methods (get, post, etc.) are not used by uWebSockets adapter\n // All routing is handled by UnifiedRouter through the middleware chain\n\n setHookManager(hookManager: any): void {\n this.hookManager = hookManager;\n }\n\n /** @internal buffered-response compression settings (read at init). */\n _compression: CompressionSettings = resolveCompressionSettings();\n\n configurePerformance(config: any): void {\n // uWS batches the request hot path natively; response compression is the\n // one thing it doesn't do itself, so wire that here (parity with Node/\n // engine). Buffered responses only - streaming stays raw.\n this._compression = resolveCompressionSettings(config);\n this.logger.debug(\n `Performance configured (compression ${this._compression.enabled ? 'on' : 'off'})`,\n 'Config'\n );\n }\n\n listen(port: number, callback?: () => void): void;\n listen(port: number, host: string, callback?: () => void): void;\n listen(port: number, hostOrCallback?: string | (() => void), callback?: () => void): void {\n // Wrap in async to await init\n this.initPromise\n .then(() => {\n if (this.isListening) {\n this.logger.warn('Server is already listening', 'Listen');\n return;\n }\n\n const host = typeof hostOrCallback === 'string' ? hostOrCallback : '0.0.0.0';\n const cb = typeof hostOrCallback === 'function' ? hostOrCallback : callback;\n\n this.port = port;\n this.host = host;\n\n // Register fast-path routes on the native router now that all routes\n // (including file-based/auto-discovered ones) are loaded\n try {\n this.registerNativeFastPathRoutes();\n } catch (error) {\n this.logger.warn(\n `Native fast-path route registration failed, falling back to catchall: ${\n error instanceof Error ? error.message : String(error)\n }`,\n 'NativeRoutes'\n );\n }\n\n // Check if we're in a cluster environment\n const isClusterWorker = cluster.isWorker;\n\n // uWebSockets.js automatically enables SO_REUSEPORT when in cluster mode\n // Do NOT pass listenOptions in cluster mode - let uWS handle it automatically\n // In non-cluster mode, we don't need SO_REUSEPORT\n\n const onListen = (token: any) => {\n if (token) {\n this.listenSocket = token;\n this.isListening = true;\n const clusterInfo = isClusterWorker ? ` (worker ${process.pid})` : '';\n this.logger.info(\n `uWebSockets HTTP server listening on ${host}:${port}${clusterInfo}`,\n 'Listen'\n );\n if (cb) cb();\n } else {\n const clusterInfo = isClusterWorker ? ` (worker ${process.pid})` : '';\n this.logger.error(`Failed to listen on ${host}:${port}${clusterInfo}`, 'Listen');\n // Don't throw in cluster workers - let them fail gracefully\n if (!isClusterWorker) {\n throw new Error(`Failed to bind to ${host}:${port}`);\n }\n }\n };\n\n // Honor the requested bind host. For the all-interfaces default (and\n // cluster mode, where uWS auto-enables SO_REUSEPORT) keep the 2-arg\n // form so that behavior is unchanged; when a specific host is given\n // (e.g. 127.0.0.1 for an internal/admin service behind a proxy) use\n // uWS's (host, port, cb) overload so we don't silently bind 0.0.0.0.\n const bindAllInterfaces = host === '0.0.0.0' || host === '::';\n if (bindAllInterfaces) {\n this.app.listen(port, onListen);\n } else {\n this.app.listen(host, port, onListen);\n }\n })\n .catch(error => {\n this.logger.error('Failed to initialize server before listen', 'Listen', {\n error: error instanceof Error ? error.message : String(error),\n });\n });\n }\n\n close(callback?: (error?: Error) => void): void {\n if (!this.isListening) {\n if (callback) callback();\n return;\n }\n\n try {\n // Close the listen socket first\n if (this.listenSocket && this.uws) {\n this.uws.us_listen_socket_close(this.listenSocket);\n this.listenSocket = null;\n this.isListening = false;\n this.logger.info('uWebSockets listen socket closed', 'Close');\n }\n\n // Clear middleware to break references\n this.globalMiddleware = [];\n\n // Clear the app reference to release uWebSockets resources\n // This is critical for worker thread cleanup\n if (this.app) {\n // Remove any route handlers\n this.app = null;\n }\n\n if (callback) {\n // Give the event loop time to process any pending uWebSockets events\n // before invoking the callback. This ensures handles are properly closed.\n setTimeout(() => {\n callback();\n }, 50);\n }\n } catch (error) {\n this.logger.error('Error closing server', 'Close', {\n error: error instanceof Error ? error.message : String(error),\n });\n if (callback) callback(error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n getServer(): any {\n // Return the uWebSockets app for direct access if needed\n return this.app;\n }\n\n getApp(): any {\n return this.app;\n }\n\n // Get app descriptor for worker thread clustering\n getDescriptor(): any {\n if (!this.app || typeof this.app.getDescriptor !== 'function') {\n throw new Error('uWebSockets app does not support getDescriptor()');\n }\n return this.app.getDescriptor();\n }\n\n // Add child app descriptor for acceptor pattern\n addChildAppDescriptor(descriptor: any): void {\n if (!this.app || typeof this.app.addChildAppDescriptor !== 'function') {\n throw new Error('uWebSockets app does not support addChildAppDescriptor()');\n }\n this.app.addChildAppDescriptor(descriptor);\n }\n\n forceCleanup(): void {\n // Cleanup method for compatibility\n this.logger.debug('Force cleanup called', 'Cleanup');\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"uws-http-server.js","sourceRoot":"","sources":["../../../src/core/http/uws-http-server.ts"],"names":[],"mappings":"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","sourcesContent":["// uWebSockets.js HTTP Server Implementation for Moro Framework\n// Provides high-performance HTTP and WebSocket server using uWebSockets.js\n\nimport cluster from 'cluster';\nimport { randomUUID } from 'crypto';\nimport { createFrameworkLogger } from '../logger/index.js';\nimport { HttpRequest, HttpResponse, Middleware } from '../../types/http.js';\nimport { loadNativeEngine, getNativeEngineLoadErrors } from '../utilities/package-utils.js';\nimport {\n parseMultipart as parseMultipartBuffer,\n type MultipartLimits,\n} from './utils/multipart-parser.js';\nimport { LazyEventEmitter } from './utils/lazy-event-emitter.js';\nimport { parseRawQueryString } from './utils/query-parser.js';\nimport type { HttpRuntimeLimits } from './utils/size.js';\nimport {\n resolveCompressionSettings,\n compressBuffer,\n isCompressible,\n negotiateEncoding,\n type CompressionSettings,\n} from './utils/compression.js';\n\n// Back-compat alias (this parser is now the transport-neutral one in utils/)\nconst parseUwsQueryString = parseRawQueryString;\n\n/**\n * Prototype-based request object for the uWS adapter.\n *\n * Headers/query/cookies/requestId are lazy: a synchronous handler that never\n * reads them pays nothing (no header copy, no UUID). The underlying uWS\n * request is only valid until the route callback returns to the event loop,\n * so `materialize()` MUST be called before any `await` - it snapshots the\n * headers and detaches the native reference.\n */\nexport class UwsRequest extends LazyEventEmitter {\n method: string;\n path: string;\n url: string;\n params: Record<string, string> = {};\n body: any = null;\n ip = '';\n\n _server: UWebSocketsHttpServer;\n _uwsReq: any; // valid ONLY synchronously inside the uWS route callback\n _queryString: string | null;\n _query: Record<string, string> | undefined = undefined;\n _headers: Record<string, string> | undefined = undefined;\n _cookies: Record<string, string> | undefined = undefined;\n _context: Record<string, any> | undefined = undefined;\n _requestId: string | undefined = undefined;\n _socket: any = undefined;\n\n constructor(\n server: UWebSocketsHttpServer,\n uwsReq: any,\n method: string,\n url: string,\n queryString: string\n ) {\n super();\n this._server = server;\n this._uwsReq = uwsReq;\n this.method = method;\n this.path = url;\n this.url = url;\n this._queryString = queryString || null;\n }\n\n // net.Socket-shaped shim so Node-style middleware (CSRF's req.socket.encrypted,\n // rate-limiters' req.connection.remoteAddress) doesn't throw on this transport.\n // uWS terminates plaintext HTTP here (TLS via its own listen options or a\n // proxy); scheme detection should use x-forwarded-proto.\n get socket(): any {\n let s = this._socket;\n if (s === undefined) {\n const getIp = () => this.ip; // arrow captures this lexically (no this-alias)\n s = {\n get remoteAddress() {\n return getIp() || undefined;\n },\n remotePort: undefined,\n encrypted: false,\n destroyed: false,\n };\n this._socket = s;\n }\n return s;\n }\n set socket(value: any) {\n this._socket = value;\n }\n\n get connection(): any {\n return this.socket;\n }\n set connection(value: any) {\n this._socket = value;\n }\n\n /** Snapshot uWS-backed data and detach the native request. Idempotent.\n * Must be called before returning control to the event loop if the\n * request object outlives the synchronous route callback. */\n materialize(): void {\n if (this._headers === undefined) {\n // Force the headers snapshot while the native request is still valid\n void this.headers;\n }\n this._uwsReq = null;\n }\n\n get headers(): Record<string, string> {\n let h = this._headers;\n if (h === undefined) {\n h = {};\n const r = this._uwsReq;\n if (r) {\n try {\n r.forEach((key: string, value: string) => {\n (h as Record<string, string>)[key] = value;\n });\n } catch {\n // Native request no longer valid - snapshot window was missed\n }\n }\n this._headers = h;\n }\n return h;\n }\n set headers(value: Record<string, string>) {\n this._headers = value;\n }\n\n get query(): Record<string, string> {\n let q = this._query;\n if (q === undefined) {\n const qs = this._queryString;\n q = qs ? parseUwsQueryString(qs) : {};\n this._query = q;\n }\n return q;\n }\n set query(value: Record<string, string>) {\n this._query = value;\n }\n\n get cookies(): Record<string, string> {\n let c = this._cookies;\n if (c === undefined) {\n c = {};\n const header = this.headers.cookie;\n if (header) {\n const parts = header.split(';');\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === undefined) continue;\n const eq = part.indexOf('=');\n if (eq > 0) {\n const name = part.substring(0, eq).trim();\n const value = part.substring(eq + 1);\n if (name && value) {\n try {\n c[name] = decodeURIComponent(value);\n } catch {\n c[name] = value;\n }\n }\n }\n }\n }\n this._cookies = c;\n }\n return c;\n }\n set cookies(value: Record<string, string>) {\n this._cookies = value;\n }\n\n get context(): Record<string, any> {\n let ctx = this._context;\n if (ctx === undefined) {\n ctx = {};\n this._context = ctx;\n }\n return ctx;\n }\n set context(value: Record<string, any>) {\n this._context = value;\n }\n\n get requestId(): string {\n let id = this._requestId;\n if (id === undefined) {\n const server = this._server;\n id = server && (server as any).requestTrackingEnabled ? randomUUID() : '';\n this._requestId = id;\n }\n return id;\n }\n set requestId(value: string) {\n this._requestId = value;\n }\n\n // ==== Express-compatible request helpers (parity with the Node adapter) ====\n\n get hostname(): string {\n const host = this.headers.host || '';\n return host ? (host.split(':')[0] ?? '') : '';\n }\n\n get protocol(): string {\n const forwardedProto = this.headers['x-forwarded-proto'];\n if (forwardedProto) return (forwardedProto.split(',')[0] ?? '').trim();\n return this._server && (this._server as any).isSsl ? 'https' : 'http';\n }\n\n get secure(): boolean {\n return this.protocol === 'https';\n }\n\n get xhr(): boolean {\n const xrw = this.headers['x-requested-with'];\n return !!xrw && xrw.toLowerCase() === 'xmlhttprequest';\n }\n\n get originalUrl(): string {\n const qs = this._queryString;\n return qs ? `${this.url}?${qs}` : this.url;\n }\n\n get ips(): string[] {\n const forwardedFor = this.headers['x-forwarded-for'];\n return forwardedFor\n ? forwardedFor\n .split(',')\n .map(s => s.trim())\n .filter(Boolean)\n : [];\n }\n\n get subdomains(): string[] {\n const hostnameParts = this.hostname.split('.');\n return hostnameParts.length > 2 ? hostnameParts.slice(0, -2).reverse() : [];\n }\n\n get(name: string): string | undefined {\n const lower = name.toLowerCase();\n if (lower === 'referer' || lower === 'referrer') {\n return this.headers.referer || (this.headers as any).referrer;\n }\n return this.headers[lower];\n }\n\n header(name: string): string | undefined {\n return this.get(name);\n }\n\n is(type: string): boolean {\n const ct = this.headers['content-type'] || '';\n if (!ct) return false;\n const mime = (ct.split(';')[0] ?? '').trim().toLowerCase();\n const t = type.toLowerCase();\n if (t.indexOf('/') === -1) {\n return mime.endsWith(`/${t}`) || mime.endsWith(`+${t}`);\n }\n if (t.endsWith('/*')) {\n return mime.startsWith(t.slice(0, -1));\n }\n return mime === t;\n }\n\n accepts(types?: string | string[]): string | false {\n const accept = this.headers.accept || '*/*';\n if (!types) return accept;\n const wanted = Array.isArray(types) ? types : [types];\n if (accept === '*/*' || accept === '') return wanted[0] || false;\n const acceptTypes = accept.split(',').map(s => (s.split(';')[0] ?? '').trim().toLowerCase());\n for (const w of wanted) {\n const wl = w.toLowerCase();\n const wMime = wl.indexOf('/') === -1 ? `application/${wl}` : wl;\n for (const at of acceptTypes) {\n if (at === '*/*') return w;\n if (at === wMime) return w;\n if (at.endsWith('/*') && wMime.startsWith(at.slice(0, -1))) return w;\n }\n }\n return false;\n }\n\n acceptsLanguages(langs?: string | string[]): string | false {\n const acceptLang = this.headers['accept-language'] || '';\n if (!langs) return acceptLang || false;\n const wanted = Array.isArray(langs) ? langs : [langs];\n if (!acceptLang) return wanted[0] || false;\n const accepted = acceptLang\n .split(',')\n .map(s => {\n const parts = s.trim().split(';');\n const tag = (parts[0] ?? '').toLowerCase();\n const qPart = parts.find(p => p.trim().startsWith('q='));\n const q = qPart ? parseFloat(qPart.trim().slice(2)) : 1;\n return { tag, q: isNaN(q) ? 0 : q };\n })\n .filter(a => a.q > 0)\n .sort((a, b) => b.q - a.q);\n for (const { tag } of accepted) {\n for (const w of wanted) {\n const wl = w.toLowerCase();\n if (tag === '*' || tag === wl || tag.split('-')[0] === wl.split('-')[0]) return w;\n }\n }\n return false;\n }\n}\n\n/**\n * uWebSockets HTTP Server Adapter\n * Bridges uWebSockets.js with Moro's HTTP abstractions\n */\nexport class UWebSocketsHttpServer {\n private app: any; // uWebSockets app instance\n private uws: any; // uWebSockets module reference (stored to avoid re-importing)\n private _limits?: HttpRuntimeLimits;\n private multipartLimits?: MultipartLimits;\n private listenSocket: any; // uWebSockets listen socket\n private globalMiddleware: Middleware[] = [];\n private logger = createFrameworkLogger('UWSHttpServer');\n private hookManager: any;\n private requestCounter = 0;\n private requestTrackingEnabled = true; // Generate request IDs (read lazily by UwsRequest)\n private isListening = false;\n private port?: number;\n private host?: string;\n private initPromise: Promise<void>;\n /** @internal read by UwsRequest#protocol */\n isSsl = false;\n\n // Body size limits (bytes) - configured from server.bodySizeLimit/maxUploadSize\n private maxBodySize: number = 10 * 1024 * 1024;\n private maxUploadSize: number = 100 * 1024 * 1024;\n\n // Direct router dispatch (set from Moro.listen via setRouterHandler)\n private routerHandler?: (req: HttpRequest, res: HttpResponse) => boolean | Promise<boolean>;\n\n // Provider of fast-path routes to register on uWS's native router at listen()\n private nativeRouteProvider?: () => Array<{\n method: string;\n path: string;\n paramNames: string[] | null;\n handler: (req: HttpRequest, res: HttpResponse) => any;\n }>;\n\n // Shared error handling for native fast-path routes (unified router semantics)\n private nativeErrorHandler?: (req: HttpRequest, res: HttpResponse, err: any) => Promise<boolean>;\n\n // String interning for common values\n private static readonly INTERNED_METHODS = new Map([\n ['get', 'GET'],\n ['post', 'POST'],\n ['put', 'PUT'],\n ['delete', 'DELETE'],\n ['patch', 'PATCH'],\n ['head', 'HEAD'],\n ['options', 'OPTIONS'],\n ]);\n\n // Pre-compiled response buffers\n private static readonly RESPONSE_BUFFERS = {\n notFound: Buffer.from('{\"success\":false,\"error\":\"Not found\"}'),\n serverError: Buffer.from('{\"success\":false,\"error\":\"Internal server error\"}'),\n };\n\n // Pre-cached status strings for common codes (performance optimization)\n private static readonly STATUS_STRINGS = new Map([\n [200, '200 OK'],\n [201, '201 Created'],\n [204, '204 No Content'],\n [301, '301 Moved Permanently'],\n [302, '302 Found'],\n [304, '304 Not Modified'],\n [400, '400 Bad Request'],\n [401, '401 Unauthorized'],\n [403, '403 Forbidden'],\n [404, '404 Not Found'],\n [500, '500 Internal Server Error'],\n [502, '502 Bad Gateway'],\n [503, '503 Service Unavailable'],\n ]);\n\n constructor(\n options: {\n ssl?: {\n key_file_name?: string;\n cert_file_name?: string;\n ca_file_name?: string;\n passphrase?: string;\n } | null;\n /** True when a TLS config was given but only as inline PEM (uWS needs\n * file paths); triggers a clear error instead of a silent plain boot. */\n sslInlineOnly?: boolean;\n limits?: HttpRuntimeLimits;\n maxBodySize?: number;\n maxUploadSize?: number;\n /** Preloaded native engine module (from loadNativeEngine) - avoids a\n * second resolution and keeps load failures at the framework's\n * synchronous preflight instead of surfacing at listen() */\n engineModule?: any;\n } = {}\n ) {\n if (options.maxBodySize) this.maxBodySize = options.maxBodySize;\n if (options.maxUploadSize) this.maxUploadSize = options.maxUploadSize;\n if (options.limits) this._limits = options.limits;\n if (options.limits?.multipart) this.multipartLimits = options.limits.multipart;\n this.initPromise = this.initialize(options);\n }\n\n // Direct router dispatch - called after global middleware without the\n // per-middleware promise machinery (mirrors MoroHttpServer.setRouterHandler)\n setRouterHandler(fn: (req: HttpRequest, res: HttpResponse) => boolean | Promise<boolean>): void {\n this.routerHandler = fn;\n }\n\n // Fast-path routes get registered directly on uWS's native C++ router at\n // listen() - zero middleware machinery, lazy headers, no promise for sync\n // handlers. The provider is evaluated at listen time so file-based/late\n // routes are included.\n setNativeRouteProvider(\n provider: () => Array<{\n method: string;\n path: string;\n paramNames: string[] | null;\n handler: (req: HttpRequest, res: HttpResponse) => any;\n }>,\n onError?: (req: HttpRequest, res: HttpResponse, err: any) => Promise<boolean>\n ): void {\n this.nativeRouteProvider = provider;\n if (onError) this.nativeErrorHandler = onError;\n }\n\n private async initialize(options: {\n ssl?: {\n key_file_name?: string;\n cert_file_name?: string;\n ca_file_name?: string;\n passphrase?: string;\n } | null;\n sslInlineOnly?: boolean;\n limits?: HttpRuntimeLimits;\n engineModule?: any;\n }): Promise<void> {\n try {\n // The framework preloads the engine synchronously (loadNativeEngine) and\n // injects it; loading here directly covers standalone construction.\n // This server is uWS-shaped only: never probe @morojs/engine, whose\n // Moro-shaped module would pass a generic load but has no App().\n const uwsModule =\n options.engineModule ?? loadNativeEngine({ candidates: ['uWebSockets.js'] })?.module;\n if (!uwsModule) {\n throw new Error(\n 'uWebSockets.js is not available: ' +\n (getNativeEngineLoadErrors().join('; ') || 'not installed')\n );\n }\n this.uws = uwsModule.default || uwsModule;\n\n // A TLS config that was given only as inline PEM cannot be honored by\n // uWS (it requires on-disk file paths). Surface it loudly rather than\n // silently booting plain HTTP (the historical footgun).\n if (options.sslInlineOnly) {\n this.logger.error(\n 'uWebSockets.js requires TLS key/cert as FILE PATHS (keyFile/certFile ' +\n 'or key_file_name/cert_file_name); inline PEM is not supported. ' +\n 'Booting WITHOUT TLS - provide file paths or use engine: \"moro\"/\"node\".',\n 'Init'\n );\n }\n\n if (options.ssl && options.ssl.key_file_name && options.ssl.cert_file_name) {\n this.app = this.uws.SSLApp({\n key_file_name: options.ssl.key_file_name,\n cert_file_name: options.ssl.cert_file_name,\n ...(options.ssl.ca_file_name && { ca_file_name: options.ssl.ca_file_name }),\n passphrase: options.ssl.passphrase,\n });\n this.isSsl = true;\n this.logger.info('uWebSockets SSL/TLS HTTP server created', 'Init');\n } else {\n this.app = this.uws.App();\n this.logger.info('uWebSockets HTTP server created', 'Init');\n }\n\n // uWS has no knobs for TCP timeouts/backlog/maxConnections/maxHeaderSize;\n // if the user set any, say so once at startup rather than silently\n // ignoring them (the \"no arbitrary caps\" contract cuts both ways).\n const ignored: string[] = [];\n const t = options.limits?.timeouts ?? {};\n if (t.request || t.idle || t.keepAlive || t.headers) ignored.push('timeouts');\n if (options.limits?.maxConnections) ignored.push('maxConnections');\n if (options.limits?.backlog) ignored.push('backlog');\n if (options.limits?.maxHeaderSize || options.limits?.maxHeaders)\n ignored.push('header limits');\n if (ignored.length) {\n this.logger.info(\n `uWebSockets.js does not support these server options; they are ignored: ${ignored.join(', ')}`,\n 'Init'\n );\n }\n\n // Setup generic route handler for all HTTP methods and paths\n this.setupRouteHandlers();\n } catch (error) {\n // Log helpful error message with installation instructions\n this.logger.error(\n 'Failed to load the native HTTP engine\\n' +\n 'Install it with:\\n' +\n ' npm install @morojs/engine\\n' +\n '(or the legacy engine: npm install --save-dev github:uNetworking/uWebSockets.js#v20.52.0)\\n' +\n \"Or set engine: 'node' in your server config to use the standard HTTP server.\\n\" +\n 'Error: ' +\n (error instanceof Error ? error.message : String(error)),\n 'Init'\n );\n throw error; // Re-throw so framework.ts can catch and fallback\n }\n }\n\n private setupRouteHandlers(): void {\n // Catchall fallback for everything that isn't a native fast-path route:\n // middleware chains, hooks, non-fast-path routes, 404s. Native\n // method-specific routes registered later take priority in uWS's router\n // (static > parameter > wildcard).\n this.app.any('/*', (res: any, req: any) => {\n void this.handleRequest(req, res);\n });\n }\n\n // Register fast-path routes (no middleware/auth/validation) directly on\n // uWS's native router. A sync GET handler completes with zero header copies,\n // zero promises and a single corked write. Each wrapper carries a cheap\n // dynamic guard: the moment global middleware or request hooks exist, it\n // falls back to the full pipeline so no feature is ever bypassed.\n private registerNativeFastPathRoutes(): void {\n const provider = this.nativeRouteProvider;\n if (!provider || !this.app) return;\n\n let count = 0;\n for (const route of provider()) {\n const methodFn = route.method.toLowerCase();\n if (typeof this.app[methodFn] !== 'function') continue;\n // Only plain paths - uWS shares the :param syntax; anything exotic\n // (wildcards etc.) stays on the catchall/unified-router path\n if (!/^[A-Za-z0-9/_\\-.:]*$/.test(route.path) || route.path.indexOf('*') !== -1) continue;\n\n const handler = route.handler;\n const paramNames = route.paramNames;\n const methodInterned = route.method;\n const needsBody =\n methodInterned === 'POST' || methodInterned === 'PUT' || methodInterned === 'PATCH';\n\n this.app[methodFn](route.path, (res: any, req: any) => {\n // Dynamic feature guard - anything registered at runtime sends the\n // request through the full pipeline instead\n if (\n this.globalMiddleware.length !== 0 ||\n (this.hookManager &&\n (this.hookManager.hasHooks === undefined ||\n this.hookManager.hasHooks('request') ||\n this.hookManager.hasHooks('response')))\n ) {\n void this.handleRequest(req, res);\n return;\n }\n this.handleNativeRoute(req, res, handler, methodInterned, paramNames, needsBody);\n });\n count++;\n }\n\n if (count > 0) {\n this.logger.info(`${count} fast-path routes registered on native uWS router`, 'NativeRoutes');\n }\n }\n\n private handleNativeRoute(\n req: any,\n res: any,\n handler: (req: HttpRequest, res: HttpResponse) => any,\n method: string,\n paramNames: string[] | null,\n needsBody: boolean\n ): void {\n res.aborted = false;\n\n const httpReq = new UwsRequest(this, req, method, req.getUrl(), req.getQuery());\n if (paramNames) {\n const params: Record<string, string> = {};\n for (let i = 0; i < paramNames.length; i++) {\n const paramName = paramNames[i];\n if (paramName === undefined) continue;\n params[paramName] = req.getParameter(i);\n }\n httpReq.params = params;\n }\n const httpRes = new UWebSocketsHttpServer.ResponsePrototype().init(\n res,\n req,\n this.logger,\n this._compression\n ) as any as HttpResponse;\n (httpRes as any)._moroReq = httpReq;\n\n if (needsBody) {\n // Body routes always go async: snapshot headers, arm the abort hook,\n // read the body, then run the handler\n httpReq.materialize();\n res._abortArmed = true;\n res.onAborted(() => {\n res.aborted = true;\n const hook = res._abortHook;\n if (hook) hook();\n const moroRes = res._moroRes;\n if (moroRes) moroRes._handleAbort();\n });\n const contentLength = req.getHeader('content-length');\n const bodyPromise =\n contentLength && parseInt(contentLength) > 0\n ? this.readBody(res, httpReq as any as HttpRequest)\n : Promise.resolve();\n bodyPromise\n .then(() => {\n if (res.aborted) return;\n const result = handler(httpReq as any as HttpRequest, httpRes);\n if (result && typeof (result as any).then === 'function') {\n return (result as Promise<any>).then(r => {\n if (r !== undefined && !httpRes.headersSent) httpRes.json(r);\n });\n }\n if (result !== undefined && !httpRes.headersSent) httpRes.json(result);\n return;\n })\n .catch(err => this.handleNativeRouteError(err, httpReq, httpRes, res));\n return;\n }\n\n try {\n const result = handler(httpReq as any as HttpRequest, httpRes);\n\n if (result && typeof (result as any).then === 'function') {\n // Async handler: it is suspended at its first await - snapshot\n // uWS-backed data and arm abort tracking before returning to the loop\n httpReq.materialize();\n res._abortArmed = true;\n res.onAborted(() => {\n res.aborted = true;\n const hook = res._abortHook;\n if (hook) hook();\n const moroRes = res._moroRes;\n if (moroRes) moroRes._handleAbort();\n });\n (result as Promise<any>).then(\n r => {\n if (r !== undefined && !httpRes.headersSent && !res.aborted) httpRes.json(r);\n },\n err => this.handleNativeRouteError(err, httpReq, httpRes, res)\n );\n } else if (result !== undefined && !httpRes.headersSent) {\n // Fully synchronous: single corked write, no header copy, no promise\n httpRes.json(result);\n }\n\n // A synchronous handler that returned with the response still open\n // (e.g. SSE: writeHead + periodic write) is about to hand an unfinished\n // uWS response back to the event loop - uWS forbids that without an\n // abort handler, and without one client disconnects are never noticed.\n if (!(httpRes as any).finished && !res.aborted && !res._abortArmed) {\n res._abortArmed = true;\n httpReq.materialize();\n res.onAborted(() => {\n res.aborted = true;\n const hook = res._abortHook;\n if (hook) hook();\n const moroRes = res._moroRes;\n if (moroRes) moroRes._handleAbort();\n });\n }\n } catch (err) {\n this.handleNativeRouteError(err, httpReq, httpRes, res);\n }\n }\n\n private handleNativeRouteError(\n err: any,\n httpReq: UwsRequest,\n httpRes: HttpResponse,\n res: any\n ): void {\n if (err?.statusCode === 413 && !res.aborted && !httpRes.headersSent) {\n httpRes.statusCode = 413;\n httpRes.setHeader('Content-Type', 'application/json');\n httpRes.end('{\"success\":false,\"error\":\"Request entity too large\"}');\n return;\n }\n\n if (err?.statusCode === 400 && !res.aborted && !httpRes.headersSent) {\n httpRes.statusCode = 400;\n httpRes.setHeader('Content-Type', 'application/json');\n httpRes.end('{\"success\":false,\"error\":\"Invalid request body\"}');\n return;\n }\n\n const sendFallback = () => {\n if (!res.aborted && !httpRes.headersSent) {\n // Same shape as the unified router's fast-path error response\n (httpRes as any).status(500).json({ error: 'Internal server error' });\n }\n };\n\n const errorHandler = this.nativeErrorHandler;\n if (errorHandler) {\n errorHandler(httpReq as any as HttpRequest, httpRes, err).then(\n handled => {\n if (!handled) sendFallback();\n },\n () => sendFallback()\n );\n } else {\n this.logger.error(\n `Route handler error: ${err instanceof Error ? err.message : String(err)}`,\n 'NativeRouteError'\n );\n sendFallback();\n }\n }\n\n private async handleRequest(req: any, res: any): Promise<void> {\n this.requestCounter++;\n\n // Single abort hook for the whole request lifecycle. uWS requires\n // onAborted for any response finished after returning to the event loop;\n // readBody chains onto res._abortHook rather than replacing this handler.\n res.aborted = false;\n res.onAborted(() => {\n res.aborted = true;\n const hook = res._abortHook;\n if (hook) hook();\n // Fire 'close'/'aborted' on the moro wrappers (SSE/monitor cleanup)\n const moroRes = res._moroRes;\n if (moroRes) moroRes._handleAbort();\n });\n\n let httpReq: any;\n let httpRes: any;\n\n try {\n // Create Moro-compatible request/response objects\n httpReq = this.createMoroRequest(req, res);\n httpRes = this.createMoroResponse(req, res);\n httpRes._moroReq = httpReq;\n\n const method = httpReq.method;\n\n // Parse body only if there's actually a body (check content-length).\n // Check first char for early exit (all body methods start with 'P')\n if (\n method.charCodeAt(0) === 80 && // 'P' char code\n (method === 'POST' || method === 'PUT' || method === 'PATCH')\n ) {\n const contentLength = req.getHeader('content-length');\n if (contentLength && parseInt(contentLength) > 0) {\n // readBody awaits - snapshot uWS-backed data first\n httpReq.materialize();\n await this.readBody(res, httpReq);\n // A client that disconnects mid-upload resolves readBody with a\n // null/partial body; do not run hooks, middleware or the handler for\n // a dead request (matches the native fast-path guard at ~line 625 and\n // the Node backend, whose aborted stream rejects parseBody).\n if (res.aborted) return;\n }\n }\n\n // Execute hooks before request processing - skipped entirely when none registered\n const hookManager = this.hookManager;\n if (hookManager && (hookManager.hasHooks === undefined || hookManager.hasHooks('request'))) {\n httpReq.materialize();\n await hookManager.execute('request', {\n request: httpReq,\n response: httpRes,\n });\n }\n\n // Post-response hooks (session persistence, auth session refresh, CDN\n // invalidation) run after the response is flushed, off the critical path.\n if (hookManager && (hookManager.hasHooks === undefined || hookManager.hasHooks('response'))) {\n httpRes.once('finish', () => {\n void Promise.resolve(\n hookManager.execute('response', { request: httpReq, response: httpRes })\n ).catch((error: any) =>\n this.logger?.error?.(`Response hook error: ${error?.message || error}`, 'Hooks')\n );\n });\n }\n\n // A request hook may answer the request itself (rate limiting, auth\n // rejection). Registration of the response hooks above still stands.\n if (httpRes.headersSent) return;\n\n // Execute global middleware chain. executeMiddleware returns undefined\n // when the whole chain completed synchronously, so a sync chain costs\n // zero promise allocations.\n if (this.globalMiddleware.length > 0) {\n httpReq.materialize();\n const mwResult = this.executeMiddleware(this.globalMiddleware, httpReq, httpRes);\n if (mwResult) await mwResult;\n if (httpRes.headersSent) return;\n }\n\n // Unified router direct dispatch\n const routerHandler = this.routerHandler;\n if (routerHandler) {\n const handled = routerHandler(httpReq, httpRes);\n if (handled) {\n if (typeof (handled as any).then === 'function') {\n // Async route: the handler is suspended at its first await - snapshot\n // uWS-backed data now, while the native request is still valid\n httpReq.materialize();\n if (await handled) return;\n } else {\n return;\n }\n }\n }\n\n // No route matched\n if (!httpRes.headersSent && !res.aborted) {\n httpRes.statusCode = 404;\n httpRes.setHeader('Content-Type', 'application/json');\n httpRes.end('{\"success\":false,\"error\":\"Not found\"}');\n }\n } catch (error) {\n // Payload-too-large: respond 413 rather than a generic 500\n if ((error as any)?.statusCode === 413 && !res.aborted && httpRes && !httpRes.headersSent) {\n httpRes.statusCode = 413;\n httpRes.setHeader('Content-Type', 'application/json');\n httpRes.end('{\"success\":false,\"error\":\"Request entity too large\"}');\n return;\n }\n\n // Malformed body: a client error (400), not a server error (500)\n if ((error as any)?.statusCode === 400 && !res.aborted && httpRes && !httpRes.headersSent) {\n httpRes.statusCode = 400;\n httpRes.setHeader('Content-Type', 'application/json');\n httpRes.end('{\"success\":false,\"error\":\"Invalid request body\"}');\n return;\n }\n\n this.logger.error(\n `Request handling error: ${error instanceof Error ? error.message : String(error)}`,\n 'RequestError'\n );\n\n // Error hooks are observational: fire-and-forget so a slow or throwing\n // observer can never delay or alter the error response.\n const errorHooks = this.hookManager;\n if (errorHooks && (errorHooks.hasHooks === undefined || errorHooks.hasHooks('error'))) {\n void Promise.resolve(\n errorHooks.execute('error', { request: httpReq, response: httpRes, error })\n ).catch((hookError: any) =>\n this.logger?.error?.(`Error hook error: ${hookError?.message || hookError}`, 'Hooks')\n );\n }\n\n // Send error response if not already sent\n if (!res.aborted) {\n try {\n res.cork(() => {\n res.writeStatus('500 Internal Server Error');\n res.writeHeader('Content-Type', 'application/json');\n res.end('{\"success\":false,\"error\":\"Internal server error\"}');\n });\n } catch {\n this.logger.error('Failed to send error response', 'ResponseError');\n }\n }\n }\n }\n\n private createMoroRequest(req: any, _res: any): HttpRequest {\n const url = req.getUrl();\n const queryString = req.getQuery();\n const methodRaw = req.getMethod();\n\n // Use interned method string if available\n const method = UWebSocketsHttpServer.INTERNED_METHODS.get(methodRaw) || methodRaw.toUpperCase();\n\n // Headers/query/cookies/requestId are lazy on the UwsRequest prototype -\n // materialize() snapshots them before the first await\n return new UwsRequest(this, req, method, url, queryString) as unknown as HttpRequest;\n }\n\n // Strip CR/LF from a header value to prevent response-splitting / header\n // injection, matching Node's setHeader ERR_INVALID_CHAR guarantee. Guarded\n // with indexOf so the common (clean) path allocates nothing on the hot path.\n private static sanitizeHeaderValue(value: string): string {\n return value.indexOf('\\r') === -1 && value.indexOf('\\n') === -1\n ? value\n : value.replace(/[\\r\\n]/g, '');\n }\n\n // Optimized helper to write headers\n private static writeHeaders(res: any, headers: Record<string, string | string[]>): void {\n // Performance: for...in is the fastest way to iterate response headers\n for (const key in headers) {\n const value = headers[key];\n if (Array.isArray(value)) {\n // Emit one header line per element instead of comma-joining. RFC 6265\n // forbids folding Set-Cookie, and browsers parse a folded\n // `a=1; Path=/, b=2` as a single cookie, silently dropping the second\n // (session + CSRF is the canonical breakage). uWS writes a separate\n // line per writeHeader call with the same key.\n for (let i = 0; i < value.length; i++) {\n res.writeHeader(key, UWebSocketsHttpServer.sanitizeHeaderValue(String(value[i])));\n }\n continue;\n }\n res.writeHeader(key, UWebSocketsHttpServer.sanitizeHeaderValue(String(value)));\n }\n }\n\n // Helper to get status string (cached for performance)\n private static getStatusString(code: number): string {\n return UWebSocketsHttpServer.STATUS_STRINGS.get(code) || `${code} OK`;\n }\n\n // Pre-define methods on prototype instead of creating new closures for each request\n private static readonly ResponsePrototype = class extends LazyEventEmitter {\n public headersSent = false;\n public statusCode = 200;\n public responseHeaders: Record<string, string | string[]> = {};\n private _res: any;\n private _req: any;\n private _logger: any;\n // Terminal-write latch: headersSent means \"head flushed\" (true mid-stream\n // after writeHead/write), _ended means the body is complete\n private _ended = false;\n private _drainArmed = false;\n // Accept-Encoding captured eagerly (uWS req is valid only synchronously)\n // and the server's compression settings, for buffered-response compression.\n private _acceptEncoding: string | undefined = undefined;\n private _compression: CompressionSettings | undefined = undefined;\n // The UwsRequest wrapper, linked by the server so lifecycle events reach\n // req.on('close') listeners (SSE cleanup, monitors)\n public _moroReq: any = null;\n\n init(res: any, req: any, logger: any, compression?: CompressionSettings) {\n this.headersSent = false;\n this.statusCode = 200;\n // Fresh object (a delete-loop reset would push the object into V8\n // dictionary mode, slowing every later header access)\n this.responseHeaders = {};\n this._res = res;\n this._req = req;\n this._logger = logger;\n this._ended = false;\n this._drainArmed = false;\n this._compression = compression;\n // Capture Accept-Encoding now: the native req is valid only during the\n // synchronous handler entry, but compression resolves asynchronously.\n this._acceptEncoding =\n compression?.enabled && req ? req.getHeader('accept-encoding') || undefined : undefined;\n // Route client aborts to the wrapper so 'close' fires (see onAborted)\n res._moroRes = this;\n return this;\n }\n\n // Buffered-response compression for uWS (parity with the engine/Node\n // paths). Returns true when it took over the write (async), false when the\n // caller should proceed with its normal synchronous cork+end.\n private _tryCompressedEnd(body: string | Buffer, contentType: string | undefined): boolean {\n const s = this._compression;\n if (!s || !s.enabled) return false;\n const bytes = typeof body === 'string' ? Buffer.byteLength(body) : body.length;\n if (bytes < s.threshold) return false;\n if ('content-encoding' in this.responseHeaders) return false;\n if (this.statusCode === 204 || this.statusCode === 304) return false;\n const ctHeader = this.responseHeaders['content-type'];\n const ct = contentType ?? (Array.isArray(ctHeader) ? ctHeader[0] : (ctHeader as string));\n if (!isCompressible(ct)) return false;\n const encoding = negotiateEncoding(this._acceptEncoding, s.encodings);\n if (!encoding) return false;\n\n void compressBuffer(body, encoding, s.level)\n .then(compressed => {\n if (this._ended || this._res.aborted) return;\n this.responseHeaders['content-encoding'] = encoding;\n const vary = this.responseHeaders['vary'];\n this.responseHeaders['vary'] = vary ? `${vary}, Accept-Encoding` : 'Accept-Encoding';\n this._res.cork(() => {\n this._res.writeStatus(UWebSocketsHttpServer.getStatusString(this.statusCode));\n UWebSocketsHttpServer.writeHeaders(this._res, this.responseHeaders);\n this._res.end(compressed);\n });\n this.headersSent = true;\n this._ended = true;\n this._emitDone();\n })\n .catch((err: unknown) => {\n this._logger?.error?.(\n `uWS response compression failed: ${err instanceof Error ? err.message : String(err)}`,\n 'Response'\n );\n if (this._ended || this._res.aborted) return;\n this._res.cork(() => {\n this._res.writeStatus(UWebSocketsHttpServer.getStatusString(this.statusCode));\n UWebSocketsHttpServer.writeHeaders(this._res, this.responseHeaders);\n this._res.end(body);\n });\n this.headersSent = true;\n this._ended = true;\n this._emitDone();\n });\n return true;\n }\n\n get writableEnded() {\n return this._ended;\n }\n\n get writableFinished() {\n return this._ended;\n }\n\n get finished() {\n return this._ended;\n }\n\n // Node ServerResponse lifecycle: 'finish' then 'close' after the terminal\n // write; the request wrapper's 'close' fires too (IncomingMessage parity).\n // No listeners -> two null checks, nothing else.\n private _emitDone() {\n this._ended = true;\n if (this._events) {\n this.emit('finish');\n this.emit('close');\n }\n const req = this._moroReq;\n if (req && req._events) req.emit('close');\n }\n\n // Client aborted: 'close' without 'finish' (Node semantics), plus\n // 'aborted'/'close' on the request wrapper\n _handleAbort() {\n if (this._ended) return;\n this._ended = true;\n if (this._events) this.emit('close');\n const req = this._moroReq;\n if (req && req._events) {\n req.emit('aborted');\n req.emit('close');\n }\n }\n\n // Backpressure: surface uWS's onWritable as the 'drain' event pipe()\n // and manual streaming loops wait on\n private _armDrain() {\n if (this._drainArmed) return;\n this._drainArmed = true;\n try {\n this._res.onWritable(() => {\n this._drainArmed = false;\n this.emit('drain');\n return true;\n });\n } catch {\n this._drainArmed = false;\n }\n }\n\n status(code: number) {\n this.statusCode = code;\n return this;\n }\n\n setHeader(name: string, value: string | string[]) {\n // Cache toLowerCase result to avoid repeated calls\n const lowerName = name.toLowerCase();\n this.responseHeaders[lowerName] = value;\n return this;\n }\n\n getHeader(name: string) {\n // Cache toLowerCase result\n const lowerName = name.toLowerCase();\n return this.responseHeaders[lowerName];\n }\n\n removeHeader(name: string) {\n const lowerName = name.toLowerCase();\n if (lowerName in this.responseHeaders) {\n delete this.responseHeaders[lowerName];\n }\n return this;\n }\n\n json(data: any) {\n if (this.headersSent || this._res.aborted) return;\n\n // Fast-path JSON serialization for common API patterns\n let body: string;\n\n // The interpolated fast path is only valid when `success` is a real\n // boolean (a string/number would produce invalid JSON like\n // {\"success\":yes,...}), and each interpolated field must be defined\n // (JSON.stringify(undefined) yields the literal token \"undefined\", which\n // would corrupt the body). Otherwise fall through to JSON.stringify.\n if (data && typeof data === 'object' && typeof data.success === 'boolean') {\n let keyCount = 0;\n let hasData = false;\n let hasError = false;\n let hasTotal = false;\n\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n keyCount++;\n if (key === 'data') hasData = true;\n else if (key === 'error') hasError = true;\n else if (key === 'total') hasTotal = true;\n }\n }\n\n if (\n keyCount === 3 &&\n hasData &&\n hasError &&\n data.data !== undefined &&\n data.error !== undefined\n ) {\n body = `{\"success\":${data.success},\"data\":${JSON.stringify(data.data)},\"error\":${JSON.stringify(data.error)}}`;\n } else if (\n keyCount === 3 &&\n hasData &&\n hasTotal &&\n data.data !== undefined &&\n typeof data.total === 'number'\n ) {\n body = `{\"success\":${data.success},\"data\":${JSON.stringify(data.data)},\"total\":${data.total}}`;\n } else if (keyCount === 2 && hasData && data.data !== undefined) {\n body = `{\"success\":${data.success},\"data\":${JSON.stringify(data.data)}}`;\n } else if (keyCount === 2 && hasError && data.error !== undefined) {\n body = `{\"success\":${data.success},\"error\":${JSON.stringify(data.error)}}`;\n } else {\n body = JSON.stringify(data);\n }\n } else {\n body = JSON.stringify(data);\n }\n\n if (!('content-type' in this.responseHeaders)) {\n this.responseHeaders['content-type'] = 'application/json';\n }\n\n try {\n // Compression (when enabled + compressible + accepted) takes over the\n // write asynchronously; otherwise the synchronous corked path runs.\n if (this._tryCompressedEnd(body, 'application/json')) return;\n this._res.cork(() => {\n this._res.writeStatus(UWebSocketsHttpServer.getStatusString(this.statusCode));\n UWebSocketsHttpServer.writeHeaders(this._res, this.responseHeaders);\n this._res.end(body);\n });\n this.headersSent = true;\n this._emitDone();\n } catch {\n this._logger.error('Failed to send JSON response', 'ResponseError');\n }\n }\n\n send(data: string | Buffer) {\n if (this.headersSent || this._res.aborted) return;\n\n const body = typeof data === 'string' ? data : data.toString();\n\n try {\n if (this._tryCompressedEnd(body, undefined)) return;\n this._res.cork(() => {\n this._res.writeStatus(UWebSocketsHttpServer.getStatusString(this.statusCode));\n UWebSocketsHttpServer.writeHeaders(this._res, this.responseHeaders);\n this._res.end(body);\n });\n this.headersSent = true;\n this._emitDone();\n } catch {\n this._logger.error('Failed to send response', 'ResponseError');\n }\n }\n\n // Flush status + headers without ending the response (Node streaming\n // entry point - SSE and manual chunked responses start here). Supports\n // both (code, headers) and (code, statusMessage, headers) signatures;\n // uWS derives the reason phrase from the status string, so a custom\n // message is folded into it.\n writeHead(statusCode: number, reasonOrHeaders?: any, maybeHeaders?: any) {\n if (this.headersSent || this._res.aborted) return this;\n\n this.statusCode = statusCode;\n const headers =\n reasonOrHeaders && typeof reasonOrHeaders === 'object' ? reasonOrHeaders : maybeHeaders;\n if (headers) {\n for (const key of Object.keys(headers)) {\n this.setHeader(key, headers[key]);\n }\n }\n\n try {\n this._res.cork(() => {\n const status =\n typeof reasonOrHeaders === 'string'\n ? `${statusCode} ${reasonOrHeaders}`\n : UWebSocketsHttpServer.getStatusString(statusCode);\n this._res.writeStatus(status);\n UWebSocketsHttpServer.writeHeaders(this._res, this.responseHeaders);\n });\n this.headersSent = true;\n } catch {\n this._logger.error('Failed to write response head', 'ResponseError');\n }\n\n return this;\n }\n\n // Stream a body chunk, flushing the head first if needed. Returns uWS's\n // backpressure signal like Node's Writable.write; 'drain' fires when the\n // socket can accept more.\n write(chunk: any, encoding?: any, callback?: any): boolean {\n if (typeof encoding === 'function') {\n callback = encoding;\n encoding = undefined;\n }\n if (this._ended || this._res.aborted) return false;\n\n let ok = true;\n try {\n this._res.cork(() => {\n if (!this.headersSent) {\n this._res.writeStatus(UWebSocketsHttpServer.getStatusString(this.statusCode));\n UWebSocketsHttpServer.writeHeaders(this._res, this.responseHeaders);\n this.headersSent = true;\n }\n ok = this._res.write(chunk);\n });\n } catch {\n this._logger.error('Failed to write response chunk', 'ResponseError');\n return false;\n }\n\n if (!ok) this._armDrain();\n if (typeof callback === 'function') callback();\n return ok;\n }\n\n end(data?: any, encoding?: any, callback?: any) {\n if (typeof encoding === 'function') {\n callback = encoding;\n encoding = undefined;\n }\n // Guard on _ended, not headersSent: in streaming mode (writeHead/write)\n // the head is already flushed and end() must still complete the body\n if (this._ended || this._res.aborted) {\n if (typeof callback === 'function') callback();\n return this;\n }\n\n try {\n this._res.cork(() => {\n if (!this.headersSent) {\n this._res.writeStatus(UWebSocketsHttpServer.getStatusString(this.statusCode));\n UWebSocketsHttpServer.writeHeaders(this._res, this.responseHeaders);\n this.headersSent = true;\n }\n this._res.end(data || '');\n });\n this._emitDone();\n if (typeof callback === 'function') callback();\n } catch {\n this._logger.error('Failed to end response', 'ResponseError');\n if (typeof callback === 'function') callback();\n }\n\n return this;\n }\n\n redirect(url: string, code?: number) {\n if (this.headersSent || this._res.aborted) return;\n\n const redirectCode = code || 302;\n this.statusCode = redirectCode;\n\n try {\n this._res.cork(() => {\n this._res.writeStatus(UWebSocketsHttpServer.getStatusString(redirectCode));\n this._res.writeHeader('Location', UWebSocketsHttpServer.sanitizeHeaderValue(url));\n UWebSocketsHttpServer.writeHeaders(this._res, this.responseHeaders);\n this._res.end();\n });\n this.headersSent = true;\n this._emitDone();\n } catch {\n this._logger.error('Failed to send redirect', 'ResponseError');\n }\n }\n\n // Standardized response helpers\n success<T = any>(data: T, message?: string) {\n const response: any = {\n success: true,\n data,\n };\n if (message !== undefined) {\n response.message = message;\n }\n this.json(response);\n }\n\n error(error: string, code?: string, message?: string) {\n const response: any = {\n success: false,\n error,\n };\n if (code !== undefined) {\n response.code = code;\n }\n if (message !== undefined) {\n response.message = message;\n }\n this.json(response);\n }\n\n // Common HTTP error helpers (automatically set status code)\n unauthorized(message: string = 'Authentication required') {\n this.statusCode = 401;\n this.json({\n success: false,\n error: 'Unauthorized',\n code: 'UNAUTHORIZED',\n message,\n });\n }\n\n forbidden(message: string = 'Insufficient permissions') {\n this.statusCode = 403;\n this.json({\n success: false,\n error: 'Forbidden',\n code: 'FORBIDDEN',\n message,\n });\n }\n\n notFound(resource: string = 'Resource') {\n this.statusCode = 404;\n this.json({\n success: false,\n error: 'Not Found',\n code: 'NOT_FOUND',\n message: `${resource} not found`,\n });\n }\n\n badRequest(message: string = 'Invalid request') {\n this.statusCode = 400;\n this.json({\n success: false,\n error: 'Bad Request',\n code: 'BAD_REQUEST',\n message,\n });\n }\n\n conflict(message: string) {\n this.statusCode = 409;\n this.json({\n success: false,\n error: 'Conflict',\n code: 'CONFLICT',\n message,\n });\n }\n\n internalError(message: string = 'Internal server error') {\n this.statusCode = 500;\n this.json({\n success: false,\n error: 'Internal Server Error',\n code: 'INTERNAL_ERROR',\n message,\n });\n }\n\n validationError(errors: Array<{ field: string; message: string; code?: string }>) {\n this.statusCode = 422;\n this.json({\n success: false,\n error: 'Validation Failed',\n code: 'VALIDATION_ERROR',\n errors,\n });\n }\n\n rateLimited(retryAfter?: number) {\n this.statusCode = 429;\n if (retryAfter) {\n this.setHeader('Retry-After', retryAfter.toString());\n }\n this.json({\n success: false,\n error: 'Rate Limit Exceeded',\n code: 'RATE_LIMITED',\n message: retryAfter\n ? `Too many requests. Retry after ${retryAfter} seconds.`\n : 'Too many requests',\n retryAfter,\n });\n }\n\n // Common success patterns\n created<T = any>(data: T, location?: string) {\n this.statusCode = 201;\n if (location) {\n this.setHeader('Location', location);\n }\n this.json({\n success: true,\n data,\n });\n }\n\n noContent() {\n this.statusCode = 204;\n this.end();\n }\n\n paginated<T = any>(data: T[], pagination: { page: number; limit: number; total: number }) {\n const totalPages = Math.ceil(pagination.total / pagination.limit);\n this.json({\n success: true,\n data,\n pagination: {\n page: pagination.page,\n limit: pagination.limit,\n total: pagination.total,\n totalPages,\n hasNext: pagination.page < totalPages,\n hasPrev: pagination.page > 1,\n },\n });\n }\n\n cookie(name: string, value: string, options?: any) {\n // Percent-encode the value (matches the Node path and Express) so a value\n // containing ';'/',' can't inject cookie attributes and control chars\n // don't corrupt the Set-Cookie header.\n const parts = [name, '=', encodeURIComponent(value)];\n\n if (options) {\n // maxAge: 0 is meaningful (immediate expiry - clearCookie relies on it)\n if (options.maxAge !== undefined && options.maxAge !== null) {\n parts.push('; Max-Age=', String(options.maxAge));\n }\n if (options.expires) {\n const expires =\n options.expires instanceof Date\n ? options.expires.toUTCString()\n : String(options.expires);\n parts.push('; Expires=', expires);\n }\n if (options.domain) {\n parts.push('; Domain=', options.domain);\n }\n if (options.secure) {\n parts.push('; Secure');\n }\n if (options.httpOnly) {\n parts.push('; HttpOnly');\n }\n if (options.sameSite) {\n parts.push('; SameSite=', options.sameSite);\n }\n }\n // Path defaults to '/' (Express behavior) so clearCookie() from a nested\n // route can clear a cookie originally set at the site root.\n parts.push('; Path=', options?.path ?? '/');\n\n const cookie = parts.join('');\n const lowerKey = 'set-cookie';\n const existing = this.responseHeaders[lowerKey];\n if (existing) {\n if (Array.isArray(existing)) {\n existing.push(cookie);\n } else {\n this.responseHeaders[lowerKey] = [existing as string, cookie];\n }\n } else {\n this.responseHeaders[lowerKey] = cookie;\n }\n\n return this;\n }\n\n clearCookie(name: string, options: any = {}) {\n const clearOptions: any = { expires: new Date(0), maxAge: 0 };\n if (options.path !== undefined) clearOptions.path = options.path;\n if (options.domain !== undefined) clearOptions.domain = options.domain;\n if (options.httpOnly !== undefined) clearOptions.httpOnly = options.httpOnly;\n if (options.secure !== undefined) clearOptions.secure = options.secure;\n if (options.sameSite !== undefined) clearOptions.sameSite = options.sameSite;\n return this.cookie(name, '', clearOptions);\n }\n\n // ==== Express-compatible response helpers (parity with the Node adapter) ====\n\n public locals: Record<string, any> = {};\n\n set(field: string | Record<string, any>, value?: any) {\n if (this.headersSent) return this;\n if (typeof field === 'string') {\n if (value !== undefined) this.setHeader(field, value);\n } else {\n for (const key in field) {\n this.setHeader(key, field[key]);\n }\n }\n return this;\n }\n\n get(field: string) {\n return this.getHeader(field);\n }\n\n hasHeader(name: string): boolean {\n return this.getHeader(name) !== undefined;\n }\n\n setBulkHeaders(headers: Record<string, string | number>) {\n if (this.headersSent) return this;\n for (const key in headers) {\n this.setHeader(key, String(headers[key]));\n }\n return this;\n }\n\n appendHeader(name: string, value: string | string[]) {\n if (this.headersSent) return this;\n const lower = name.toLowerCase();\n const existing = this.responseHeaders[lower];\n if (existing) {\n const values = Array.isArray(existing) ? existing : [existing as string];\n const incoming = Array.isArray(value) ? value : [value];\n this.responseHeaders[lower] = values.concat(incoming);\n } else {\n this.responseHeaders[lower] = value;\n }\n return this;\n }\n\n append(field: string, value: string | string[]) {\n return this.appendHeader(field, value);\n }\n\n type(contentType: string) {\n if (this.headersSent) return this;\n let ct = contentType;\n if (ct.indexOf('/') === -1) {\n const shorthands: Record<string, string> = {\n json: 'application/json; charset=utf-8',\n html: 'text/html; charset=utf-8',\n text: 'text/plain; charset=utf-8',\n txt: 'text/plain; charset=utf-8',\n xml: 'application/xml',\n js: 'application/javascript',\n css: 'text/css; charset=utf-8',\n form: 'application/x-www-form-urlencoded',\n };\n ct = shorthands[ct.toLowerCase()] || `application/${ct}`;\n }\n this.setHeader('Content-Type', ct);\n return this;\n }\n\n sendStatus(code: number) {\n if (this.headersSent) return;\n this.statusCode = code;\n const statusString = UWebSocketsHttpServer.getStatusString(code);\n const body = statusString.slice(String(code).length + 1) || String(code);\n this.setHeader('Content-Type', 'text/plain; charset=utf-8');\n this.end(body);\n }\n\n location(url: string) {\n if (this.headersSent) return this;\n this.setHeader('Location', url.replace(/[\\r\\n]/g, ''));\n return this;\n }\n\n vary(field: string | string[]) {\n if (this.headersSent) return this;\n const existing = this.responseHeaders['vary'];\n const existingList = existing\n ? String(existing)\n .split(',')\n .map(s => s.trim())\n .filter(Boolean)\n : [];\n const incoming = Array.isArray(field) ? field : [field];\n for (const f of incoming) {\n if (!existingList.some(e => e.toLowerCase() === f.toLowerCase())) {\n existingList.push(f);\n }\n }\n this.responseHeaders['vary'] = existingList.join(', ');\n return this;\n }\n\n links(links: Record<string, string>) {\n if (this.headersSent) return this;\n const parts: string[] = [];\n for (const rel in links) {\n parts.push(`<${links[rel]}>; rel=\"${rel}\"`);\n }\n if (parts.length > 0) {\n const existing = this.responseHeaders['link'];\n this.responseHeaders['link'] = existing\n ? `${existing}, ${parts.join(', ')}`\n : parts.join(', ');\n }\n return this;\n }\n\n canSetHeaders(): boolean {\n return !this.headersSent;\n }\n\n getResponseState() {\n return {\n headersSent: this.headersSent,\n statusCode: this.statusCode,\n headers: this.responseHeaders,\n finished: this._ended,\n writable: !this._ended,\n };\n }\n };\n\n private createMoroResponse(req: any, res: any): HttpResponse {\n // Fresh instance per request. Pooling these was a correctness hazard: a\n // handler that responds after returning (timers, streams) would write into\n // a recycled object already serving another request.\n const httpRes = new UWebSocketsHttpServer.ResponsePrototype();\n httpRes.init(res, req, this.logger);\n return httpRes as any as HttpResponse;\n }\n\n private async readBody(res: any, httpReq: HttpRequest): Promise<void> {\n const contentType = httpReq.headers['content-type'] || '';\n const isMultipart = contentType.includes('multipart/form-data');\n const maxSize = isMultipart ? this.maxUploadSize : this.maxBodySize;\n\n return new Promise((resolve, reject) => {\n // Collect chunks in array, concat once at end (faster than repeated Buffer.concat)\n const chunks: Buffer[] = [];\n let totalLength = 0;\n let settled = false;\n\n const finish = (fn: () => void) => {\n if (settled) return;\n settled = true;\n res._abortHook = null;\n fn();\n };\n\n res.onData((chunk: ArrayBuffer, isLast: boolean) => {\n if (settled) return;\n\n // Buffer.from(ArrayBuffer) is a zero-copy VIEW of uWS-owned memory,\n // which uWS recycles after this callback returns. The final chunk is\n // consumed synchronously below, so the view is safe; earlier chunks\n // must be copied or they alias reused memory (silent body corruption).\n const view = Buffer.from(chunk);\n totalLength += view.length;\n\n if (totalLength > maxSize) {\n const error: any = new Error(\n isMultipart ? 'File upload too large' : 'Request body too large'\n );\n error.statusCode = 413;\n finish(() => reject(error));\n return;\n }\n\n if (!isLast) {\n const copy = Buffer.allocUnsafe(view.length);\n view.copy(copy);\n chunks.push(copy);\n return;\n }\n\n // Final chunk: single-chunk bodies (the common case) parse straight\n // from the view with zero copies\n let buffer: Buffer;\n if (chunks.length === 0) {\n buffer = view;\n } else {\n chunks.push(view);\n buffer = Buffer.concat(chunks, totalLength);\n }\n\n try {\n if (contentType.includes('application/json')) {\n httpReq.body = totalLength === 0 ? null : JSON.parse(buffer.toString('utf-8'));\n } else if (contentType.includes('application/x-www-form-urlencoded')) {\n const params = new URLSearchParams(buffer.toString('utf-8'));\n const body: Record<string, any> = {};\n params.forEach((value, key) => {\n body[key] = value;\n });\n httpReq.body = body;\n } else if (isMultipart) {\n // Shared parser (same as the Node http server) - stringifying\n // multipart would corrupt binary uploads and lose fields/files.\n // parseMultipart retains slices of the payload as file Buffers;\n // the single-chunk fast path (buffer === view) aliases uWS-owned\n // memory that is recycled after this callback returns, so copy\n // it first. Concatenated multi-chunk buffers are already stable.\n const stable = buffer === view ? Buffer.from(buffer) : buffer;\n httpReq.body = parseMultipartBuffer(stable, contentType, this.multipartLimits);\n } else {\n httpReq.body = buffer.toString('utf-8');\n }\n\n finish(resolve);\n } catch (parseError) {\n // A limit error (multipart maxParts/maxFiles/maxFileSize) carries its\n // own 413 - preserve it rather than masking it as a generic 400.\n if (parseError && typeof (parseError as any).statusCode === 'number') {\n finish(() => reject(parseError));\n return;\n }\n // A malformed body is a client error: reject with 400 (parity with\n // the engine and Node transports) rather than silently handing the\n // handler a null body it may treat as \"no input\".\n const error: any = new Error(\n `Invalid request body: ${parseError instanceof Error ? parseError.message : String(parseError)}`\n );\n error.statusCode = 400;\n finish(() => reject(error));\n }\n });\n\n // Chain onto the request-lifetime abort hook (registered in handleRequest\n // or the native route wrapper) instead of replacing it\n res._abortHook = () => {\n this.logger.debug('Request aborted', 'RequestAborted');\n finish(resolve);\n };\n\n // If the client already disconnected before we attached the hook\n if (res.aborted) {\n finish(resolve);\n }\n });\n }\n\n // Middleware execution with Express-compatible error propagation - identical\n // semantics to MoroHttpServer/MoroEngineServer so a route behaves the same on\n // every backend. Supports 3-arg (req, res, next), 4-arg error middleware\n // (err, req, res, next), and next(err) to skip forward to the next error\n // middleware. Previously this adapter called EVERY middleware with three\n // arguments, so registering a 4-arg error handler passed `req` as `err` and\n // broke every ordinary request; with no 4-arg middleware registered the\n // behaviour here is unchanged (next(err) aborts the chain and propagates to\n // the request handler's catch).\n //\n // Sync-aware dispatch: middleware that calls next() synchronously (or throws\n // synchronously) advances the chain in a plain loop with ZERO promise\n // allocations; a promise is only created when a middleware actually completes\n // asynchronously. Returns undefined when the whole chain ran synchronously so\n // the caller can skip its await.\n private executeMiddleware(\n middleware: Middleware[],\n req: HttpRequest,\n res: HttpResponse\n ): void | Promise<void> {\n return this.dispatchMiddleware(middleware, req, res, 0, undefined);\n }\n\n private dispatchMiddleware(\n middleware: Middleware[],\n req: HttpRequest,\n res: HttpResponse,\n startIndex: number,\n initialError: any\n ): void | Promise<void> {\n const len = middleware.length;\n let activeError: any = initialError;\n let i = startIndex;\n\n while (i < len) {\n if (res.headersSent) return;\n\n const mw = middleware[i] as any;\n i++;\n const isErrorHandler = mw.length >= 4;\n\n // Non-error middleware is skipped while an error is active; error middleware\n // is skipped while no error is active. Matches Express semantics.\n if (activeError !== undefined && !isErrorHandler) continue;\n if (activeError === undefined && isErrorHandler) continue;\n\n let settled = false;\n let settledError: any = undefined;\n let asyncResolve: ((err: any) => void) | undefined;\n\n const next = (err?: any) => {\n if (settled) return;\n settled = true;\n settledError = err;\n if (asyncResolve) asyncResolve(err);\n };\n\n let result: any;\n try {\n result = isErrorHandler ? mw(activeError, req, res, next) : mw(req, res, next);\n } catch (err) {\n if (!settled) {\n settled = true;\n settledError = err;\n }\n }\n\n const isThenable = result && typeof result.then === 'function';\n\n if (settled) {\n // Completed synchronously (next() called sync, or threw sync). A still\n // pending returned promise no longer gates the chain once next() has\n // been called; swallow late rejections so they never go unhandled.\n if (isThenable) {\n (result as Promise<void>).then(undefined, () => {});\n }\n activeError = settledError;\n continue;\n }\n\n if (!isThenable && res.headersSent) {\n // Terminal middleware (Express style): it answered the request and\n // deliberately never calls next(). The chain is finished - skip\n // allocating a promise that nothing would ever settle.\n return;\n }\n\n if (!isThenable) {\n // Sync-looking middleware that neither called next() nor returned a\n // promise: it will call next() later (e.g. from an event callback).\n // Fall back to a promise for the remainder of the chain.\n const resumeIndex = i;\n return new Promise<any>(resolve => {\n asyncResolve = resolve;\n }).then(err => this.dispatchMiddleware(middleware, req, res, resumeIndex, err));\n }\n\n // Async middleware: completion is next() OR promise settle, whichever\n // happens first (same semantics as the previous implementation).\n const resumeIndex = i;\n return new Promise<any>(resolve => {\n asyncResolve = resolve;\n (result as Promise<void>).then(\n () => {\n if (!settled) next();\n },\n (err: any) => {\n if (!settled) next(err);\n }\n );\n }).then(err => this.dispatchMiddleware(middleware, req, res, resumeIndex, err));\n }\n\n // If an error is still unhandled after the chain, re-throw so the request\n // handler's catch can invoke the registered errorHandler / default 500.\n if (activeError !== undefined) {\n throw activeError;\n }\n }\n\n // Public API - matches MoroHttpServer interface\n\n use(middleware: Middleware): void {\n // Defensive check: Don't add MiddlewareInterface objects to globalMiddleware\n // MiddlewareInterface objects should only be handled by MiddlewareManager\n if (\n middleware &&\n typeof middleware === 'object' &&\n (middleware as any).install &&\n (middleware as any).metadata\n ) {\n this.logger?.warn?.(\n `Attempted to add MiddlewareInterface \"${(middleware as any).metadata?.name}\" to HTTP server globalMiddleware. ` +\n `This should be handled by MiddlewareManager instead. Skipping.`,\n 'Middleware'\n );\n return;\n }\n\n this.globalMiddleware.push(middleware);\n }\n\n // Configure request tracking (ID generation)\n setRequestTracking(enabled: boolean): void {\n this.requestTrackingEnabled = enabled;\n }\n\n // Note: Route registration methods (get, post, etc.) are not used by uWebSockets adapter\n // All routing is handled by UnifiedRouter through the middleware chain\n\n setHookManager(hookManager: any): void {\n this.hookManager = hookManager;\n }\n\n /** @internal buffered-response compression settings (read at init). */\n _compression: CompressionSettings = resolveCompressionSettings();\n\n configurePerformance(config: any): void {\n // uWS batches the request hot path natively; response compression is the\n // one thing it doesn't do itself, so wire that here (parity with Node/\n // engine). Buffered responses only - streaming stays raw.\n this._compression = resolveCompressionSettings(config);\n this.logger.debug(\n `Performance configured (compression ${this._compression.enabled ? 'on' : 'off'})`,\n 'Config'\n );\n }\n\n listen(port: number, callback?: () => void): void;\n listen(port: number, host: string, callback?: () => void): void;\n listen(port: number, hostOrCallback?: string | (() => void), callback?: () => void): void {\n // Wrap in async to await init\n this.initPromise\n .then(() => {\n if (this.isListening) {\n this.logger.warn('Server is already listening', 'Listen');\n return;\n }\n\n const host = typeof hostOrCallback === 'string' ? hostOrCallback : '0.0.0.0';\n const cb = typeof hostOrCallback === 'function' ? hostOrCallback : callback;\n\n this.port = port;\n this.host = host;\n\n // Register fast-path routes on the native router now that all routes\n // (including file-based/auto-discovered ones) are loaded\n try {\n this.registerNativeFastPathRoutes();\n } catch (error) {\n this.logger.warn(\n `Native fast-path route registration failed, falling back to catchall: ${\n error instanceof Error ? error.message : String(error)\n }`,\n 'NativeRoutes'\n );\n }\n\n // Check if we're in a cluster environment\n const isClusterWorker = cluster.isWorker;\n\n // uWebSockets.js automatically enables SO_REUSEPORT when in cluster mode\n // Do NOT pass listenOptions in cluster mode - let uWS handle it automatically\n // In non-cluster mode, we don't need SO_REUSEPORT\n\n const onListen = (token: any) => {\n if (token) {\n this.listenSocket = token;\n this.isListening = true;\n const clusterInfo = isClusterWorker ? ` (worker ${process.pid})` : '';\n this.logger.info(\n `uWebSockets HTTP server listening on ${host}:${port}${clusterInfo}`,\n 'Listen'\n );\n if (cb) cb();\n } else {\n const clusterInfo = isClusterWorker ? ` (worker ${process.pid})` : '';\n this.logger.error(`Failed to listen on ${host}:${port}${clusterInfo}`, 'Listen');\n // Don't throw in cluster workers - let them fail gracefully\n if (!isClusterWorker) {\n throw new Error(`Failed to bind to ${host}:${port}`);\n }\n }\n };\n\n // Honor the requested bind host. For the all-interfaces default (and\n // cluster mode, where uWS auto-enables SO_REUSEPORT) keep the 2-arg\n // form so that behavior is unchanged; when a specific host is given\n // (e.g. 127.0.0.1 for an internal/admin service behind a proxy) use\n // uWS's (host, port, cb) overload so we don't silently bind 0.0.0.0.\n const bindAllInterfaces = host === '0.0.0.0' || host === '::';\n if (bindAllInterfaces) {\n this.app.listen(port, onListen);\n } else {\n this.app.listen(host, port, onListen);\n }\n })\n .catch(error => {\n this.logger.error('Failed to initialize server before listen', 'Listen', {\n error: error instanceof Error ? error.message : String(error),\n });\n });\n }\n\n close(callback?: (error?: Error) => void): void {\n if (!this.isListening) {\n if (callback) callback();\n return;\n }\n\n try {\n // Close the listen socket first\n if (this.listenSocket && this.uws) {\n this.uws.us_listen_socket_close(this.listenSocket);\n this.listenSocket = null;\n this.isListening = false;\n this.logger.info('uWebSockets listen socket closed', 'Close');\n }\n\n // Clear middleware to break references\n this.globalMiddleware = [];\n\n // Clear the app reference to release uWebSockets resources\n // This is critical for worker thread cleanup\n if (this.app) {\n // Remove any route handlers\n this.app = null;\n }\n\n if (callback) {\n // Give the event loop time to process any pending uWebSockets events\n // before invoking the callback. This ensures handles are properly closed.\n setTimeout(() => {\n callback();\n }, 50);\n }\n } catch (error) {\n this.logger.error('Error closing server', 'Close', {\n error: error instanceof Error ? error.message : String(error),\n });\n if (callback) callback(error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n getServer(): any {\n // Return the uWebSockets app for direct access if needed\n return this.app;\n }\n\n getApp(): any {\n return this.app;\n }\n\n // Get app descriptor for worker thread clustering\n getDescriptor(): any {\n if (!this.app || typeof this.app.getDescriptor !== 'function') {\n throw new Error('uWebSockets app does not support getDescriptor()');\n }\n return this.app.getDescriptor();\n }\n\n // Add child app descriptor for acceptor pattern\n addChildAppDescriptor(descriptor: any): void {\n if (!this.app || typeof this.app.addChildAppDescriptor !== 'function') {\n throw new Error('uWebSockets app does not support addChildAppDescriptor()');\n }\n this.app.addChildAppDescriptor(descriptor);\n }\n\n forceCleanup(): void {\n // Cleanup method for compatibility\n this.logger.debug('Force cleanup called', 'Cleanup');\n }\n}\n"]}
|