@jaypie/express 1.2.11-dev.2 → 1.2.11-dev.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../src/adapter/LambdaRequest.ts","../../../src/adapter/LambdaResponseBuffered.ts","../../../src/adapter/LambdaResponseStreaming.ts","../../../src/adapter/index.ts","../../../src/constants.ts","../../../src/cors.helper.ts","../../../src/getCurrentInvokeUuid.adapter.ts","../../../src/decorateResponse.helper.ts","../../../src/summarizeRequest.helper.ts","../../../src/summarizeResponse.helper.ts","../../../src/expressHandler.ts","../../../src/http.handler.ts","../../../src/expressStreamHandler.ts","../../../src/echo.handler.ts","../../../src/routes.ts"],"sourcesContent":["import type { IncomingHttpHeaders } from \"node:http\";\nimport { Readable } from \"node:stream\";\n\nimport type {\n ApiGatewayV1Event,\n FunctionUrlEvent,\n LambdaContext,\n LambdaEvent,\n} from \"./types.js\";\n\n//\n//\n// Types\n//\n\ninterface LambdaRequestOptions {\n body?: Buffer | null;\n headers: Record<string, string>;\n lambdaContext: LambdaContext;\n lambdaEvent: LambdaEvent;\n method: string;\n protocol: string;\n query?: Record<string, string | string[]>;\n remoteAddress: string;\n url: string;\n}\n\ninterface MockSocket {\n destroy: () => void;\n encrypted: boolean;\n remoteAddress: string;\n}\n\n//\n//\n// LambdaRequest Class\n//\n\n/**\n * Mock IncomingMessage that extends Readable stream.\n * Provides Express-compatible request interface from Lambda Function URL events.\n */\nexport class LambdaRequest extends Readable {\n // IncomingMessage required properties\n public readonly method: string;\n public readonly url: string;\n public readonly headers: IncomingHttpHeaders;\n public readonly httpVersion: string = \"1.1\";\n public readonly httpVersionMajor: number = 1;\n public readonly httpVersionMinor: number = 1;\n public complete: boolean = false;\n\n // Socket mock for Express compatibility\n public readonly socket: MockSocket;\n public readonly connection: MockSocket;\n\n // Express-expected properties\n public readonly originalUrl: string;\n public readonly path: string;\n public baseUrl: string = \"\";\n public body: unknown;\n public params: Record<string, string> = {};\n public query: Record<string, unknown> = {};\n\n // Jaypie-specific: store Lambda context for getCurrentInvokeUuid\n public readonly _lambdaContext: LambdaContext;\n public readonly _lambdaEvent: LambdaEvent;\n\n // Internal state\n private bodyBuffer: Buffer | null;\n private bodyPushed: boolean = false;\n\n constructor(options: LambdaRequestOptions) {\n super();\n\n this.method = options.method;\n this.url = options.url;\n this.originalUrl = options.url;\n this.path = options.url.split(\"?\")[0];\n this.headers = this.normalizeHeaders(options.headers);\n this.bodyBuffer = options.body ?? null;\n\n // Use pre-parsed query if provided, otherwise parse from URL\n if (options.query) {\n this.query = options.query;\n } else {\n const queryIndex = options.url.indexOf(\"?\");\n if (queryIndex !== -1) {\n const queryString = options.url.slice(queryIndex + 1);\n this.query = parseQueryString(queryString);\n }\n }\n\n // Store Lambda context\n this._lambdaContext = options.lambdaContext;\n this._lambdaEvent = options.lambdaEvent;\n\n // Create mock socket\n this.socket = {\n destroy: () => {},\n encrypted: options.protocol === \"https\",\n remoteAddress: options.remoteAddress,\n };\n this.connection = this.socket;\n\n // Schedule body push for next tick to ensure stream is ready\n // This is needed for body parsers that consume the stream\n if (this.bodyBuffer && this.bodyBuffer.length > 0) {\n process.nextTick(() => {\n if (!this.bodyPushed) {\n this.push(this.bodyBuffer);\n this.push(null);\n this.bodyPushed = true;\n this.complete = true;\n }\n });\n }\n }\n\n //\n // Readable stream implementation\n //\n\n _read(): void {\n if (!this.bodyPushed) {\n if (this.bodyBuffer && this.bodyBuffer.length > 0) {\n this.push(this.bodyBuffer);\n }\n this.push(null); // Signal end of stream\n this.bodyPushed = true;\n this.complete = true;\n }\n }\n\n //\n // Express helper methods\n //\n\n get(headerName: string): string | undefined {\n const key = headerName.toLowerCase();\n const value = this.headers[key];\n return Array.isArray(value) ? value[0] : value;\n }\n\n header(headerName: string): string | undefined {\n return this.get(headerName);\n }\n\n //\n // Private helpers\n //\n\n private normalizeHeaders(\n headers: Record<string, string>,\n ): IncomingHttpHeaders {\n const normalized: IncomingHttpHeaders = {};\n for (const [key, value] of Object.entries(headers)) {\n normalized[key.toLowerCase()] = value;\n }\n return normalized;\n }\n}\n\n//\n//\n// Helper Functions\n//\n\n/**\n * Normalize bracket notation in query parameter key.\n * Removes trailing `[]` from keys (e.g., `filterByStatus[]` → `filterByStatus`).\n */\nfunction normalizeQueryKey(key: string): string {\n return key.endsWith(\"[]\") ? key.slice(0, -2) : key;\n}\n\n/**\n * Parse a query string into a record with proper array handling.\n * Handles bracket notation (e.g., `param[]`) and multi-value parameters.\n */\nfunction parseQueryString(\n queryString: string,\n): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {};\n const params = new URLSearchParams(queryString);\n\n for (const [rawKey, value] of params) {\n const key = normalizeQueryKey(rawKey);\n const existing = result[key];\n\n if (existing === undefined) {\n // First occurrence - check if it's bracket notation to determine if it should be an array\n result[key] = rawKey.endsWith(\"[]\") ? [value] : value;\n } else if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n // Convert to array when we encounter a second value\n result[key] = [existing, value];\n }\n }\n\n return result;\n}\n\n/**\n * Build query object from API Gateway v1 multiValueQueryStringParameters.\n * Normalizes bracket notation and preserves array values.\n */\nfunction buildQueryFromMultiValue(\n multiValueParams: Record<string, string[]> | null | undefined,\n): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {};\n if (!multiValueParams) return result;\n\n for (const [rawKey, values] of Object.entries(multiValueParams)) {\n const key = normalizeQueryKey(rawKey);\n const existingValues = result[key];\n\n if (existingValues === undefined) {\n // First occurrence - use array if multiple values or bracket notation\n result[key] =\n values.length === 1 && !rawKey.endsWith(\"[]\") ? values[0] : values;\n } else if (Array.isArray(existingValues)) {\n existingValues.push(...values);\n } else {\n // Convert to array and merge\n result[key] = [existingValues, ...values];\n }\n }\n\n return result;\n}\n\n//\n//\n// Type Guards\n//\n\n/**\n * Check if event is a Function URL / HTTP API v2 event.\n */\nfunction isFunctionUrlEvent(event: LambdaEvent): event is FunctionUrlEvent {\n return \"requestContext\" in event && \"http\" in event.requestContext;\n}\n\n/**\n * Check if event is an API Gateway REST API v1 event.\n */\nfunction isApiGatewayV1Event(event: LambdaEvent): event is ApiGatewayV1Event {\n return \"httpMethod\" in event;\n}\n\n//\n//\n// Factory Function\n//\n\n/**\n * Create a LambdaRequest from a Lambda event (Function URL, HTTP API v2, or REST API v1).\n */\nexport function createLambdaRequest(\n event: LambdaEvent,\n context: LambdaContext,\n): LambdaRequest {\n let url: string;\n let method: string;\n let protocol: string;\n let query: Record<string, string | string[]> | undefined;\n let remoteAddress: string;\n const headers = { ...event.headers };\n\n if (isFunctionUrlEvent(event)) {\n // Function URL / HTTP API v2 format\n url = event.rawQueryString\n ? `${event.rawPath}?${event.rawQueryString}`\n : event.rawPath;\n method = event.requestContext.http.method;\n protocol = event.requestContext.http.protocol.split(\"/\")[0].toLowerCase();\n remoteAddress = event.requestContext.http.sourceIp;\n\n // Parse query string with proper multi-value and bracket notation support\n if (event.rawQueryString) {\n query = parseQueryString(event.rawQueryString);\n }\n\n // Normalize cookies into Cookie header if not already present\n if (event.cookies && event.cookies.length > 0 && !headers.cookie) {\n headers.cookie = event.cookies.join(\"; \");\n }\n } else if (isApiGatewayV1Event(event)) {\n // API Gateway REST API v1 format\n // Use multiValueQueryStringParameters for proper array support\n const multiValueParams = event.multiValueQueryStringParameters;\n const queryParams = event.queryStringParameters;\n\n if (multiValueParams && Object.keys(multiValueParams).length > 0) {\n query = buildQueryFromMultiValue(multiValueParams);\n }\n\n // Build URL with query string\n if (queryParams && Object.keys(queryParams).length > 0) {\n const queryString = new URLSearchParams(\n queryParams as Record<string, string>,\n ).toString();\n url = `${event.path}?${queryString}`;\n } else {\n url = event.path;\n }\n\n method = event.httpMethod;\n protocol = event.requestContext.protocol.split(\"/\")[0].toLowerCase();\n remoteAddress = event.requestContext.identity.sourceIp;\n } else {\n throw new Error(\n \"Unsupported Lambda event format. Expected Function URL, HTTP API v2, or REST API v1 event.\",\n );\n }\n\n // Decode body if present\n let body: Buffer | null = null;\n if (event.body) {\n body = event.isBase64Encoded\n ? Buffer.from(event.body, \"base64\")\n : Buffer.from(event.body, \"utf8\");\n\n // Add content-length header if not present (required for body parsers)\n const hasContentLength = Object.keys(headers).some(\n (k) => k.toLowerCase() === \"content-length\",\n );\n if (!hasContentLength) {\n headers[\"content-length\"] = String(body.length);\n }\n }\n\n return new LambdaRequest({\n body,\n headers,\n lambdaContext: context,\n lambdaEvent: event,\n method,\n protocol,\n query,\n remoteAddress,\n url,\n });\n}\n\nexport default LambdaRequest;\n","import type { OutgoingHttpHeaders } from \"node:http\";\nimport { ServerResponse } from \"node:http\";\nimport { Writable } from \"node:stream\";\n\nimport type { LambdaResponse } from \"./types.js\";\n\n//\n//\n// Constants\n//\n\n// Symbol to identify Lambda mock responses. Uses Symbol.for() to ensure\n// the same symbol is used across bundles/realms. Survives prototype manipulation.\nexport const JAYPIE_LAMBDA_MOCK = Symbol.for(\"@jaypie/express/LambdaMock\");\n\n// Get Node's internal kOutHeaders symbol from ServerResponse prototype.\n// This is needed for compatibility with Datadog dd-trace instrumentation,\n// which patches HTTP methods and expects this internal state to exist.\nconst kOutHeaders = Object.getOwnPropertySymbols(ServerResponse.prototype).find(\n (s) => s.toString() === \"Symbol(kOutHeaders)\",\n);\n\nconst BINARY_CONTENT_TYPE_PATTERNS = [\n /^application\\/octet-stream$/,\n /^application\\/pdf$/,\n /^application\\/zip$/,\n /^audio\\//,\n /^font\\//,\n /^image\\//,\n /^video\\//,\n];\n\n//\n//\n// LambdaResponseBuffered Class\n//\n\n/**\n * Mock ServerResponse that buffers the response.\n * Collects status, headers, and body chunks, then returns a Lambda response.\n */\nexport class LambdaResponseBuffered extends Writable {\n public statusCode: number = 200;\n public statusMessage: string = \"OK\";\n\n // Mock socket to satisfy Express/finalhandler checks\n public readonly socket: { remoteAddress: string } = {\n remoteAddress: \"127.0.0.1\",\n };\n\n // Internal state exposed for direct manipulation by safe response methods\n // that need to bypass dd-trace interception of stream methods\n public _chunks: Buffer[] = [];\n public _ended: boolean = false; // Track ended state since writableEnded is lost after prototype change\n public _headers: Map<string, string | string[]> = new Map();\n public _headersSent: boolean = false;\n public _resolve: ((result: LambdaResponse) => void) | null = null;\n\n constructor() {\n super();\n // Mark as Lambda mock response for identification in expressHandler\n (this as Record<symbol, unknown>)[JAYPIE_LAMBDA_MOCK] = true;\n\n // Initialize Node's internal kOutHeaders for dd-trace compatibility.\n // dd-trace patches HTTP methods and expects this internal state.\n if (kOutHeaders) {\n (this as Record<symbol, unknown>)[kOutHeaders] = Object.create(null);\n }\n\n // CRITICAL: Define key methods as instance properties to survive Express's\n // setPrototypeOf(res, app.response) in middleware/init.js which would\n // otherwise replace our prototype with ServerResponse.prototype.\n // Instance properties take precedence over prototype properties.\n this.getHeader = this.getHeader.bind(this);\n this.setHeader = this.setHeader.bind(this);\n this.removeHeader = this.removeHeader.bind(this);\n this.hasHeader = this.hasHeader.bind(this);\n this.getHeaders = this.getHeaders.bind(this);\n this.getHeaderNames = this.getHeaderNames.bind(this);\n this.writeHead = this.writeHead.bind(this);\n this.get = this.get.bind(this);\n this.set = this.set.bind(this);\n this.status = this.status.bind(this);\n this.json = this.json.bind(this);\n this.send = this.send.bind(this);\n this.vary = this.vary.bind(this);\n this.end = this.end.bind(this);\n this.write = this.write.bind(this);\n // Also bind internal Writable methods that are called via prototype chain\n this._write = this._write.bind(this);\n this._final = this._final.bind(this);\n // Bind result-building methods\n this.getResult = this.getResult.bind(this);\n this.buildResult = this.buildResult.bind(this);\n this.isBinaryContentType = this.isBinaryContentType.bind(this);\n }\n\n //\n // Internal bypass methods - completely avoid prototype chain lookup\n // These directly access _headers Map, safe from dd-trace interception\n //\n\n _internalGetHeader(name: string): string | undefined {\n const value = this._headers.get(name.toLowerCase());\n return value ? String(value) : undefined;\n }\n\n _internalSetHeader(name: string, value: string): void {\n if (!this._headersSent) {\n const lowerName = name.toLowerCase();\n this._headers.set(lowerName, value);\n // Also sync kOutHeaders for any code that expects it\n if (kOutHeaders) {\n const outHeaders = (\n this as unknown as Record<symbol, Record<string, unknown>>\n )[kOutHeaders];\n if (outHeaders) {\n outHeaders[lowerName] = [name, value];\n }\n }\n }\n }\n\n _internalHasHeader(name: string): boolean {\n return this._headers.has(name.toLowerCase());\n }\n\n _internalRemoveHeader(name: string): void {\n if (!this._headersSent) {\n const lowerName = name.toLowerCase();\n this._headers.delete(lowerName);\n if (kOutHeaders) {\n const outHeaders = (\n this as unknown as Record<symbol, Record<string, unknown>>\n )[kOutHeaders];\n if (outHeaders) {\n delete outHeaders[lowerName];\n }\n }\n }\n }\n\n //\n // Promise-based API for getting final result\n //\n\n getResult(): Promise<LambdaResponse> {\n return new Promise((resolve) => {\n // Use _ended instead of writableEnded since Express's setPrototypeOf breaks the getter\n if (this._ended) {\n resolve(this.buildResult());\n } else {\n this._resolve = resolve;\n }\n });\n }\n\n //\n // Header management\n //\n\n setHeader(name: string, value: number | string | string[]): this {\n if (this._headersSent) {\n // In production, log warning but don't throw to match Express behavior\n return this;\n }\n const lowerName = name.toLowerCase();\n this._headers.set(lowerName, String(value));\n // Sync with kOutHeaders for dd-trace compatibility\n // Node stores as { 'header-name': ['Header-Name', value] }\n if (kOutHeaders) {\n const outHeaders = (\n this as unknown as Record<symbol, Record<string, unknown>>\n )[kOutHeaders];\n if (outHeaders) {\n outHeaders[lowerName] = [name, String(value)];\n }\n }\n return this;\n }\n\n getHeader(name: string): number | string | string[] | undefined {\n return this._headers.get(name.toLowerCase());\n }\n\n removeHeader(name: string): void {\n const lowerName = name.toLowerCase();\n this._headers.delete(lowerName);\n // Sync with kOutHeaders for dd-trace compatibility\n if (kOutHeaders) {\n const outHeaders = (\n this as unknown as Record<symbol, Record<string, unknown>>\n )[kOutHeaders];\n if (outHeaders) {\n delete outHeaders[lowerName];\n }\n }\n }\n\n getHeaders(): OutgoingHttpHeaders {\n const headers: OutgoingHttpHeaders = {};\n for (const [key, value] of this._headers) {\n headers[key] = value;\n }\n return headers;\n }\n\n hasHeader(name: string): boolean {\n return this._headers.has(name.toLowerCase());\n }\n\n getHeaderNames(): string[] {\n return Array.from(this._headers.keys());\n }\n\n /**\n * Proxy for direct header access (e.g., res.headers['content-type']).\n * Required for compatibility with middleware like helmet that access headers directly.\n * Uses direct _headers access to bypass dd-trace interception.\n */\n get headers(): Record<string, string | string[] | undefined> {\n return new Proxy(\n {},\n {\n deleteProperty: (_target, prop) => {\n this._headers.delete(String(prop).toLowerCase());\n return true;\n },\n get: (_target, prop) => {\n if (typeof prop === \"symbol\") return undefined;\n return this._headers.get(String(prop).toLowerCase());\n },\n getOwnPropertyDescriptor: (_target, prop) => {\n const lowerProp = String(prop).toLowerCase();\n if (this._headers.has(lowerProp)) {\n return {\n configurable: true,\n enumerable: true,\n value: this._headers.get(lowerProp),\n };\n }\n return undefined;\n },\n has: (_target, prop) => {\n return this._headers.has(String(prop).toLowerCase());\n },\n ownKeys: () => {\n return Array.from(this._headers.keys());\n },\n set: (_target, prop, value) => {\n if (!this._headersSent) {\n this._headers.set(String(prop).toLowerCase(), value);\n }\n return true;\n },\n },\n );\n }\n\n writeHead(\n statusCode: number,\n statusMessageOrHeaders?: OutgoingHttpHeaders | string,\n headers?: OutgoingHttpHeaders,\n ): this {\n this.statusCode = statusCode;\n\n let headersToSet: OutgoingHttpHeaders | undefined;\n\n if (typeof statusMessageOrHeaders === \"string\") {\n this.statusMessage = statusMessageOrHeaders;\n headersToSet = headers;\n } else if (\n statusMessageOrHeaders &&\n typeof statusMessageOrHeaders === \"object\"\n ) {\n headersToSet = statusMessageOrHeaders;\n }\n\n if (headersToSet) {\n // Use direct _headers access to bypass dd-trace interception\n for (const [key, value] of Object.entries(headersToSet)) {\n if (value !== undefined) {\n this._headers.set(key.toLowerCase(), String(value));\n }\n }\n }\n\n this._headersSent = true;\n return this;\n }\n\n get headersSent(): boolean {\n return this._headersSent;\n }\n\n //\n // Express compatibility methods\n //\n\n /**\n * Express-style alias for getHeader().\n * Used by middleware like decorateResponse that use res.get().\n * Note: Directly accesses _headers to avoid prototype chain issues with bundled code.\n */\n get(name: string): number | string | string[] | undefined {\n return this._headers.get(name.toLowerCase());\n }\n\n /**\n * Express-style alias for setHeader().\n * Used by middleware like decorateResponse that use res.set().\n * Note: Directly accesses _headers to avoid prototype chain issues with bundled code.\n */\n set(name: string, value: number | string | string[]): this {\n if (!this._headersSent) {\n this._headers.set(name.toLowerCase(), String(value));\n }\n return this;\n }\n\n status(code: number): this {\n this.statusCode = code;\n return this;\n }\n\n json(data: unknown): this {\n // Use direct _headers access to bypass dd-trace interception\n this._headers.set(\"content-type\", \"application/json\");\n this.end(JSON.stringify(data));\n return this;\n }\n\n send(body?: Buffer | object | string): this {\n if (typeof body === \"object\" && !Buffer.isBuffer(body)) {\n return this.json(body);\n }\n this.end(body);\n return this;\n }\n\n /**\n * Add a field to the Vary response header.\n * Used by CORS middleware to indicate response varies by Origin.\n * Uses direct _headers access to bypass dd-trace interception.\n */\n vary(field: string): this {\n const existing = this._headers.get(\"vary\");\n if (!existing) {\n this._headers.set(\"vary\", field);\n } else {\n // Append to existing Vary header if field not already present\n const fields = String(existing)\n .split(\",\")\n .map((f) => f.trim().toLowerCase());\n if (!fields.includes(field.toLowerCase())) {\n this._headers.set(\"vary\", `${existing}, ${field}`);\n }\n }\n return this;\n }\n\n //\n // Writable stream implementation\n //\n\n _write(\n chunk: Buffer | string,\n encoding: BufferEncoding, // eslint-disable-line no-undef\n callback: (error?: Error | null) => void,\n ): void {\n const buffer = Buffer.isBuffer(chunk)\n ? chunk\n : Buffer.from(chunk, encoding);\n this._chunks.push(buffer);\n this._headersSent = true;\n callback();\n }\n\n _final(callback: (error?: Error | null) => void): void {\n this._ended = true;\n if (this._resolve) {\n this._resolve(this.buildResult());\n }\n callback();\n }\n\n //\n // Private helpers\n //\n\n public buildResult(): LambdaResponse {\n const body = Buffer.concat(this._chunks);\n // Use direct _headers access to bypass dd-trace interception\n const contentType = (this._headers.get(\"content-type\") as string) || \"\";\n\n // Determine if response should be base64 encoded\n const isBase64Encoded = this.isBinaryContentType(contentType);\n\n // Build headers object\n const headers: Record<string, string> = {};\n const cookies: string[] = [];\n\n for (const [key, value] of this._headers) {\n if (key === \"set-cookie\") {\n // Collect Set-Cookie headers for v2 response format\n if (Array.isArray(value)) {\n cookies.push(...value);\n } else {\n cookies.push(value);\n }\n } else {\n headers[key] = Array.isArray(value) ? value.join(\", \") : String(value);\n }\n }\n\n const result: LambdaResponse = {\n body: isBase64Encoded ? body.toString(\"base64\") : body.toString(\"utf8\"),\n headers,\n isBase64Encoded,\n statusCode: this.statusCode,\n };\n\n // Only include cookies if present (v2 format)\n if (cookies.length > 0) {\n result.cookies = cookies;\n }\n\n return result;\n }\n\n private isBinaryContentType(contentType: string): boolean {\n return BINARY_CONTENT_TYPE_PATTERNS.some((pattern) =>\n pattern.test(contentType),\n );\n }\n}\n\nexport default LambdaResponseBuffered;\n","import type { OutgoingHttpHeaders } from \"node:http\";\nimport { ServerResponse } from \"node:http\";\nimport { Writable } from \"node:stream\";\n\nimport type {\n AwsLambdaGlobal,\n HttpResponseStreamMetadata,\n ResponseStream,\n} from \"./types.js\";\n\n//\n//\n// Constants\n//\n\n// Symbol to identify Lambda streaming responses. Uses Symbol.for() to ensure\n// the same symbol is used across bundles/realms. Survives prototype manipulation.\nexport const JAYPIE_LAMBDA_STREAMING = Symbol.for(\n \"@jaypie/express/LambdaStreaming\",\n);\n\n// Get Node's internal kOutHeaders symbol from ServerResponse prototype.\n// This is needed for compatibility with Datadog dd-trace instrumentation,\n// which patches HTTP methods and expects this internal state to exist.\nconst kOutHeaders = Object.getOwnPropertySymbols(ServerResponse.prototype).find(\n (s) => s.toString() === \"Symbol(kOutHeaders)\",\n);\n\n//\n//\n// Declare awslambda global (provided by Lambda runtime)\n//\n\ndeclare const awslambda: AwsLambdaGlobal;\n\n//\n//\n// Types\n//\n\ninterface PendingWrite {\n callback: () => void;\n chunk: Buffer;\n}\n\n//\n//\n// LambdaResponseStreaming Class\n//\n\n/**\n * Mock ServerResponse that streams directly to Lambda responseStream.\n * Uses awslambda.HttpResponseStream.from() to set status and headers.\n */\nexport class LambdaResponseStreaming extends Writable {\n public statusCode: number = 200;\n public statusMessage: string = \"OK\";\n\n // Mock socket to satisfy Express/finalhandler checks\n public readonly socket: { remoteAddress: string } = {\n remoteAddress: \"127.0.0.1\",\n };\n\n // Internal state exposed for direct manipulation by safe response methods\n // that need to bypass dd-trace interception\n public _headers: Map<string, string | string[]> = new Map();\n public _headersSent: boolean = false;\n private _pendingWrites: PendingWrite[] = [];\n private _responseStream: ResponseStream;\n private _wrappedStream: ResponseStream | null = null;\n\n constructor(responseStream: ResponseStream) {\n super();\n this._responseStream = responseStream;\n // Mark as Lambda streaming response using Symbol for reliable detection.\n // Survives prototype manipulation from Express and dd-trace.\n (this as unknown as Record<symbol, unknown>)[JAYPIE_LAMBDA_STREAMING] =\n true;\n // DIAGNOSTIC: Log symbol assignment\n console.log(\"[DIAG:LambdaResponseStreaming:constructor] Symbol set\", {\n symbolValue: (this as unknown as Record<symbol, unknown>)[\n JAYPIE_LAMBDA_STREAMING\n ],\n });\n // Initialize Node's internal kOutHeaders for dd-trace compatibility.\n // dd-trace patches HTTP methods and expects this internal state.\n if (kOutHeaders) {\n (this as Record<symbol, unknown>)[kOutHeaders] = Object.create(null);\n }\n\n // CRITICAL: Define key methods as instance properties to survive Express's\n // setPrototypeOf(res, app.response) in middleware/init.js which would\n // otherwise replace our prototype with ServerResponse.prototype.\n // Instance properties take precedence over prototype properties.\n this.getHeader = this.getHeader.bind(this);\n this.setHeader = this.setHeader.bind(this);\n this.removeHeader = this.removeHeader.bind(this);\n this.hasHeader = this.hasHeader.bind(this);\n this.getHeaders = this.getHeaders.bind(this);\n this.getHeaderNames = this.getHeaderNames.bind(this);\n this.writeHead = this.writeHead.bind(this);\n this.flushHeaders = this.flushHeaders.bind(this);\n this.get = this.get.bind(this);\n this.set = this.set.bind(this);\n this.status = this.status.bind(this);\n this.json = this.json.bind(this);\n this.send = this.send.bind(this);\n this.vary = this.vary.bind(this);\n this.end = this.end.bind(this);\n this.write = this.write.bind(this);\n // Also bind internal Writable methods that are called via prototype chain\n this._write = this._write.bind(this);\n this._final = this._final.bind(this);\n }\n\n //\n // Internal bypass methods - completely avoid prototype chain lookup\n // These directly access _headers Map, safe from dd-trace interception\n //\n\n _internalGetHeader(name: string): string | undefined {\n const value = this._headers.get(name.toLowerCase());\n return value ? String(value) : undefined;\n }\n\n _internalSetHeader(name: string, value: string): void {\n if (!this._headersSent) {\n const lowerName = name.toLowerCase();\n this._headers.set(lowerName, value);\n // Also sync kOutHeaders for any code that expects it\n if (kOutHeaders) {\n const outHeaders = (\n this as unknown as Record<symbol, Record<string, unknown>>\n )[kOutHeaders];\n if (outHeaders) {\n outHeaders[lowerName] = [name, value];\n }\n }\n }\n }\n\n _internalHasHeader(name: string): boolean {\n return this._headers.has(name.toLowerCase());\n }\n\n _internalRemoveHeader(name: string): void {\n if (!this._headersSent) {\n const lowerName = name.toLowerCase();\n this._headers.delete(lowerName);\n if (kOutHeaders) {\n const outHeaders = (\n this as unknown as Record<symbol, Record<string, unknown>>\n )[kOutHeaders];\n if (outHeaders) {\n delete outHeaders[lowerName];\n }\n }\n }\n }\n\n //\n // Header management\n //\n\n setHeader(name: string, value: number | string | string[]): this {\n if (this._headersSent) {\n // In streaming mode, log warning but don't throw\n // Headers cannot be changed after body starts\n return this;\n }\n const lowerName = name.toLowerCase();\n this._headers.set(lowerName, String(value));\n // Sync with kOutHeaders for dd-trace compatibility\n // Node stores as { 'header-name': ['Header-Name', value] }\n if (kOutHeaders) {\n const outHeaders = (\n this as unknown as Record<symbol, Record<string, unknown>>\n )[kOutHeaders];\n if (outHeaders) {\n outHeaders[lowerName] = [name, String(value)];\n }\n }\n return this;\n }\n\n getHeader(name: string): number | string | string[] | undefined {\n return this._headers.get(name.toLowerCase());\n }\n\n removeHeader(name: string): void {\n if (!this._headersSent) {\n const lowerName = name.toLowerCase();\n this._headers.delete(lowerName);\n // Sync with kOutHeaders for dd-trace compatibility\n if (kOutHeaders) {\n const outHeaders = (\n this as unknown as Record<symbol, Record<string, unknown>>\n )[kOutHeaders];\n if (outHeaders) {\n delete outHeaders[lowerName];\n }\n }\n }\n }\n\n getHeaders(): OutgoingHttpHeaders {\n const headers: OutgoingHttpHeaders = {};\n for (const [key, value] of this._headers) {\n headers[key] = value;\n }\n return headers;\n }\n\n hasHeader(name: string): boolean {\n return this._headers.has(name.toLowerCase());\n }\n\n getHeaderNames(): string[] {\n return Array.from(this._headers.keys());\n }\n\n /**\n * Proxy for direct header access (e.g., res.headers['content-type']).\n * Required for compatibility with middleware like helmet that access headers directly.\n * Uses direct _headers access to bypass dd-trace interception.\n */\n get headers(): Record<string, string | string[] | undefined> {\n return new Proxy(\n {},\n {\n deleteProperty: (_target, prop) => {\n if (!this._headersSent) {\n this._headers.delete(String(prop).toLowerCase());\n }\n return true;\n },\n get: (_target, prop) => {\n if (typeof prop === \"symbol\") return undefined;\n return this._headers.get(String(prop).toLowerCase());\n },\n getOwnPropertyDescriptor: (_target, prop) => {\n const lowerProp = String(prop).toLowerCase();\n if (this._headers.has(lowerProp)) {\n return {\n configurable: true,\n enumerable: true,\n value: this._headers.get(lowerProp),\n };\n }\n return undefined;\n },\n has: (_target, prop) => {\n return this._headers.has(String(prop).toLowerCase());\n },\n ownKeys: () => {\n return Array.from(this._headers.keys());\n },\n set: (_target, prop, value) => {\n if (!this._headersSent) {\n this._headers.set(String(prop).toLowerCase(), value);\n }\n return true;\n },\n },\n );\n }\n\n writeHead(\n statusCode: number,\n statusMessageOrHeaders?: OutgoingHttpHeaders | string,\n headers?: OutgoingHttpHeaders,\n ): this {\n if (this._headersSent) {\n return this;\n }\n\n this.statusCode = statusCode;\n\n let headersToSet: OutgoingHttpHeaders | undefined;\n\n if (typeof statusMessageOrHeaders === \"string\") {\n this.statusMessage = statusMessageOrHeaders;\n headersToSet = headers;\n } else if (\n statusMessageOrHeaders &&\n typeof statusMessageOrHeaders === \"object\"\n ) {\n headersToSet = statusMessageOrHeaders;\n }\n\n if (headersToSet) {\n // Use direct _headers access to bypass dd-trace interception\n for (const [key, value] of Object.entries(headersToSet)) {\n if (value !== undefined) {\n this._headers.set(key.toLowerCase(), String(value));\n }\n }\n }\n\n this.flushHeaders();\n return this;\n }\n\n get headersSent(): boolean {\n return this._headersSent;\n }\n\n flushHeaders(): void {\n // DIAGNOSTIC: Log every flushHeaders call with stack trace\n const caller = new Error().stack?.split(\"\\n\").slice(1, 5).join(\"\\n\");\n console.log(\"[DIAG:LambdaResponseStreaming:flushHeaders] Called\", {\n statusCode: this.statusCode,\n headersSent: this._headersSent,\n caller,\n });\n\n if (this._headersSent) {\n console.log(\n \"[DIAG:LambdaResponseStreaming:flushHeaders] Already sent, returning early\",\n );\n return;\n }\n\n const headers: Record<string, string> = {};\n for (const [key, value] of this._headers) {\n headers[key] = Array.isArray(value) ? value.join(\", \") : String(value);\n }\n\n const metadata: HttpResponseStreamMetadata = {\n headers,\n statusCode: this.statusCode,\n };\n\n // DIAGNOSTIC: Log what we're sending to Lambda\n console.log(\n \"[DIAG:LambdaResponseStreaming:flushHeaders] Creating wrapped stream\",\n {\n metadata,\n },\n );\n\n // Wrap the stream with metadata using awslambda global\n this._wrappedStream = awslambda.HttpResponseStream.from(\n this._responseStream,\n metadata,\n );\n this._headersSent = true;\n\n // Flush pending writes\n for (const { callback, chunk } of this._pendingWrites) {\n this._wrappedStream.write(chunk);\n callback();\n }\n this._pendingWrites = [];\n }\n\n //\n // Express compatibility methods\n //\n\n /**\n * Express-style alias for getHeader().\n * Used by middleware like decorateResponse that use res.get().\n * Note: Directly accesses _headers to avoid prototype chain issues with bundled code.\n */\n get(name: string): number | string | string[] | undefined {\n return this._headers.get(name.toLowerCase());\n }\n\n /**\n * Express-style alias for setHeader().\n * Used by middleware like decorateResponse that use res.set().\n * Note: Directly accesses _headers to avoid prototype chain issues with bundled code.\n */\n set(name: string, value: number | string | string[]): this {\n if (!this._headersSent) {\n this._headers.set(name.toLowerCase(), String(value));\n }\n return this;\n }\n\n status(code: number): this {\n // DIAGNOSTIC: Log status code changes\n const caller = new Error().stack?.split(\"\\n\").slice(1, 4).join(\"\\n\");\n console.log(\"[DIAG:LambdaResponseStreaming:status] Setting status\", {\n newCode: code,\n previousCode: this.statusCode,\n headersSent: this._headersSent,\n caller,\n });\n this.statusCode = code;\n return this;\n }\n\n json(data: unknown): this {\n // Use direct _headers access to bypass dd-trace interception\n this._headers.set(\"content-type\", \"application/json\");\n this.end(JSON.stringify(data));\n return this;\n }\n\n send(body?: Buffer | object | string): this {\n if (typeof body === \"object\" && !Buffer.isBuffer(body)) {\n return this.json(body);\n }\n this.end(body);\n return this;\n }\n\n /**\n * Add a field to the Vary response header.\n * Used by CORS middleware to indicate response varies by Origin.\n * Uses direct _headers access to bypass dd-trace interception.\n */\n vary(field: string): this {\n const existing = this._headers.get(\"vary\");\n if (!existing) {\n this._headers.set(\"vary\", field);\n } else {\n // Append to existing Vary header if field not already present\n const fields = String(existing)\n .split(\",\")\n .map((f) => f.trim().toLowerCase());\n if (!fields.includes(field.toLowerCase())) {\n this._headers.set(\"vary\", `${existing}, ${field}`);\n }\n }\n return this;\n }\n\n //\n // Writable stream implementation\n //\n\n _write(\n chunk: Buffer | string,\n encoding: BufferEncoding, // eslint-disable-line no-undef\n callback: (error?: Error | null) => void,\n ): void {\n const buffer = Buffer.isBuffer(chunk)\n ? chunk\n : Buffer.from(chunk, encoding);\n\n // DIAGNOSTIC: Log every write\n console.log(\"[DIAG:LambdaResponseStreaming:_write] Called\", {\n chunkLength: buffer.length,\n headersSent: this._headersSent,\n statusCode: this.statusCode,\n });\n\n if (!this._headersSent) {\n // Buffer writes until headers are sent\n this._pendingWrites.push({ callback: () => callback(), chunk: buffer });\n // Auto-flush headers on first write\n console.log(\n \"[DIAG:LambdaResponseStreaming:_write] Auto-flushing headers on first write\",\n );\n this.flushHeaders();\n } else {\n this._wrappedStream!.write(buffer);\n callback();\n }\n }\n\n _final(callback: (error?: Error | null) => void): void {\n // DIAGNOSTIC: Log _final call\n console.log(\"[DIAG:LambdaResponseStreaming:_final] Called\", {\n headersSent: this._headersSent,\n statusCode: this.statusCode,\n hasWrappedStream: !!this._wrappedStream,\n });\n\n if (!this._headersSent) {\n console.log(\n \"[DIAG:LambdaResponseStreaming:_final] Headers not sent, flushing now\",\n );\n this.flushHeaders();\n }\n this._wrappedStream?.end();\n callback();\n }\n}\n\nexport default LambdaResponseStreaming;\n","import type { Application, Request, Response } from \"express\";\n\nimport { createLambdaRequest, LambdaRequest } from \"./LambdaRequest.js\";\nimport LambdaResponseBuffered from \"./LambdaResponseBuffered.js\";\nimport LambdaResponseStreaming from \"./LambdaResponseStreaming.js\";\nimport type {\n AwsLambdaGlobal,\n CreateLambdaHandlerOptions,\n LambdaContext,\n LambdaEvent,\n LambdaHandler,\n LambdaResponse,\n LambdaStreamHandler,\n ResponseStream,\n} from \"./types.js\";\n\n//\n//\n// Declare awslambda global (provided by Lambda runtime)\n// This may be undefined in non-Lambda environments\n//\n\ndeclare const awslambda: AwsLambdaGlobal | undefined;\n\n//\n//\n// Current Invoke Context\n//\n\nlet currentInvoke: { context: LambdaContext; event: LambdaEvent } | null = null;\n\n/**\n * Get the current Lambda invoke context.\n * Used by getCurrentInvokeUuid adapter to get the request ID.\n */\nexport function getCurrentInvoke(): {\n context: LambdaContext;\n event: LambdaEvent;\n} | null {\n return currentInvoke;\n}\n\n/**\n * Set the current Lambda invoke context.\n * Called at the start of each Lambda invocation.\n */\nfunction setCurrentInvoke(event: LambdaEvent, context: LambdaContext): void {\n currentInvoke = { context, event };\n}\n\n/**\n * Clear the current Lambda invoke context.\n * Called at the end of each Lambda invocation.\n */\nfunction clearCurrentInvoke(): void {\n currentInvoke = null;\n}\n\n//\n//\n// Express App Runner\n//\n\n/**\n * Run Express app with mock request/response.\n * Returns a promise that resolves when the response is complete.\n */\nfunction runExpressApp(\n app: Application,\n req: LambdaRequest,\n res: LambdaResponseBuffered | LambdaResponseStreaming,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n // Listen for response completion\n res.on(\"finish\", resolve);\n res.on(\"error\", reject);\n\n // Run the Express app\n // Cast to Express types since our mocks implement the required interface\n app(req as unknown as Request, res as unknown as Response);\n });\n}\n\n//\n//\n// Buffered Handler Factory\n//\n\n/**\n * Create a Lambda handler that buffers the Express response.\n * Returns the complete response as a Lambda response object.\n *\n * @example\n * ```typescript\n * import express from \"express\";\n * import { createLambdaHandler } from \"@jaypie/express\";\n *\n * const app = express();\n * app.get(\"/\", (req, res) => res.json({ message: \"Hello\" }));\n *\n * export const handler = createLambdaHandler(app);\n * ```\n */\nexport function createLambdaHandler(\n app: Application,\n _options?: CreateLambdaHandlerOptions,\n): LambdaHandler {\n return async (\n event: LambdaEvent,\n context: LambdaContext,\n ): Promise<LambdaResponse> => {\n let result: LambdaResponse | undefined;\n try {\n // Set current invoke for getCurrentInvokeUuid\n setCurrentInvoke(event, context);\n\n // Create mock request from Lambda event\n const req = createLambdaRequest(event, context);\n\n // Create buffered response collector\n const res = new LambdaResponseBuffered();\n\n // Run Express app\n await runExpressApp(app, req, res);\n\n // Get Lambda response - await explicitly to ensure we have the result\n result = await res.getResult();\n\n return result;\n } catch (error) {\n // Log any unhandled errors\n console.error(\"[createLambdaHandler] Unhandled error:\", error);\n if (error instanceof Error) {\n console.error(\"[createLambdaHandler] Stack:\", error.stack);\n }\n\n // Return a proper error response instead of throwing\n return {\n statusCode: 500,\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n errors: [\n {\n status: 500,\n title: \"Internal Server Error\",\n detail:\n error instanceof Error\n ? error.message\n : \"Unknown error occurred\",\n },\n ],\n }),\n isBase64Encoded: false,\n };\n } finally {\n // Clear current invoke context\n clearCurrentInvoke();\n }\n };\n}\n\n//\n//\n// Streaming Handler Factory\n//\n\n/**\n * Create a Lambda handler that streams the Express response.\n * Uses awslambda.streamifyResponse() for Lambda response streaming.\n *\n * @example\n * ```typescript\n * import express from \"express\";\n * import { createLambdaStreamHandler } from \"@jaypie/express\";\n *\n * const app = express();\n * app.get(\"/stream\", (req, res) => {\n * res.setHeader(\"Content-Type\", \"text/event-stream\");\n * res.write(\"data: Hello\\n\\n\");\n * res.end();\n * });\n *\n * export const handler = createLambdaStreamHandler(app);\n * ```\n */\nexport function createLambdaStreamHandler(\n app: Application,\n _options?: CreateLambdaHandlerOptions,\n): LambdaStreamHandler {\n // Wrap with awslambda.streamifyResponse for Lambda streaming\n // @ts-expect-error awslambda is a Lambda runtime global\n return awslambda.streamifyResponse(\n async (\n event: LambdaEvent,\n responseStream: ResponseStream,\n context: LambdaContext,\n ): Promise<void> => {\n try {\n // Set current invoke for getCurrentInvokeUuid\n setCurrentInvoke(event, context);\n\n // Create mock request from Lambda event\n const req = createLambdaRequest(event, context);\n\n // Create streaming response that pipes to Lambda responseStream\n const res = new LambdaResponseStreaming(responseStream);\n\n // Run Express app\n await runExpressApp(app, req, res);\n } finally {\n // Clear current invoke context\n clearCurrentInvoke();\n }\n },\n );\n}\n\n//\n//\n// Re-exports\n//\n\nexport { LambdaRequest, createLambdaRequest } from \"./LambdaRequest.js\";\nexport { LambdaResponseBuffered } from \"./LambdaResponseBuffered.js\";\nexport { LambdaResponseStreaming } from \"./LambdaResponseStreaming.js\";\nexport type {\n ApiGatewayV1Event,\n AwsLambdaGlobal,\n CreateLambdaHandlerOptions,\n FunctionUrlEvent,\n HttpResponseStreamMetadata,\n LambdaContext,\n LambdaEvent,\n LambdaHandler,\n LambdaHandlerFactory,\n LambdaResponse,\n LambdaStreamHandler,\n LambdaStreamHandlerFactory,\n ResponseStream,\n} from \"./types.js\";\n","//\n//\n// Constants\n//\n\nexport const EXPRESS = {\n PATH: {\n ANY: \"*\",\n ID: \"/:id\",\n ROOT: /^\\/?$/,\n },\n} as const;\n\nexport type ExpressConstants = typeof EXPRESS;\n","import type { Request, Response, NextFunction } from \"express\";\nimport { CorsError } from \"@jaypie/errors\";\nimport { envBoolean, force } from \"@jaypie/kit\";\nimport expressCors from \"cors\";\n\n//\n//\n// Constants\n//\n\nconst HTTP_PROTOCOL = \"http://\";\nconst HTTPS_PROTOCOL = \"https://\";\nconst SANDBOX_ENV = \"sandbox\";\n\n//\n//\n// Types\n//\n\nexport interface CorsConfig {\n origin?: string | string[];\n overrides?: Record<string, unknown>;\n}\n\ntype CorsCallback = (err: Error | null, allow?: boolean) => void;\n\n//\n//\n// Helper Functions\n//\n\nconst ensureProtocol = (url: string | undefined): string | undefined => {\n if (!url) return url;\n if (url.startsWith(HTTP_PROTOCOL) || url.startsWith(HTTPS_PROTOCOL))\n return url;\n return HTTPS_PROTOCOL + url;\n};\n\nconst extractHostname = (origin: string): string | undefined => {\n try {\n const url = new URL(origin);\n return url.hostname;\n } catch {\n return undefined;\n }\n};\n\nconst isOriginAllowed = (requestOrigin: string, allowed: string): boolean => {\n const normalizedAllowed = ensureProtocol(allowed) as string;\n const normalizedRequest = ensureProtocol(requestOrigin) as string;\n\n const allowedHostname = extractHostname(normalizedAllowed);\n const requestHostname = extractHostname(normalizedRequest);\n\n if (!allowedHostname || !requestHostname) {\n return false;\n }\n\n // Exact match\n if (requestHostname === allowedHostname) {\n return true;\n }\n\n // Subdomain match\n if (requestHostname.endsWith(`.${allowedHostname}`)) {\n return true;\n }\n\n return false;\n};\n\nexport const dynamicOriginCallbackHandler = (\n origin?: string | string[],\n): ((requestOrigin: string | undefined, callback: CorsCallback) => void) => {\n return (requestOrigin: string | undefined, callback: CorsCallback) => {\n // Handle wildcard origin\n if (origin === \"*\") {\n callback(null, true);\n return;\n }\n\n // Allow requests with no origin (like mobile apps, curl, etc)\n if (!requestOrigin) {\n callback(null, true);\n return;\n }\n\n const allowedOrigins: (string | RegExp)[] = [];\n if (process.env.BASE_URL) {\n allowedOrigins.push(ensureProtocol(process.env.BASE_URL) as string);\n }\n if (process.env.PROJECT_BASE_URL) {\n allowedOrigins.push(\n ensureProtocol(process.env.PROJECT_BASE_URL) as string,\n );\n }\n if (origin) {\n const additionalOrigins = force.array<string>(origin);\n allowedOrigins.push(...additionalOrigins);\n }\n\n // Add localhost origins in sandbox\n if (\n process.env.PROJECT_ENV === SANDBOX_ENV ||\n envBoolean(\"PROJECT_SANDBOX_MODE\")\n ) {\n allowedOrigins.push(\"http://localhost\");\n allowedOrigins.push(/^http:\\/\\/localhost:\\d+$/);\n }\n\n const isAllowed = allowedOrigins.some((allowed) => {\n if (allowed instanceof RegExp) {\n return allowed.test(requestOrigin);\n }\n return isOriginAllowed(requestOrigin, allowed);\n });\n\n if (isAllowed) {\n callback(null, true);\n } else {\n callback(new CorsError());\n }\n };\n};\n\n//\n//\n// Main\n//\n\nconst corsHelper = (\n config: CorsConfig = {},\n): ReturnType<typeof expressCors> => {\n const { origin, overrides = {} } = config;\n\n const options = {\n origin: dynamicOriginCallbackHandler(origin),\n // * The default behavior is to allow any headers and methods so they are not included here\n ...overrides,\n };\n\n return expressCors(options);\n};\n\n//\n//\n// Constants\n//\n\nconst HTTP_CODE_NO_CONTENT = 204;\nconst HTTP_METHOD_OPTIONS = \"OPTIONS\";\n\n//\n//\n// Export\n//\n\ninterface CorsErrorWithBody extends Error {\n status: number;\n body: () => Record<string, unknown>;\n}\n\n/**\n * CORS middleware with Lambda streaming support.\n *\n * For OPTIONS preflight requests, this middleware handles them early and\n * terminates the response immediately. This is critical for Lambda streaming\n * handlers where the response stream would otherwise stay open waiting for\n * streaming data that never comes.\n *\n * For regular requests, delegates to the standard cors package behavior.\n */\nexport default (\n config?: CorsConfig,\n): ((req: Request, res: Response, next: NextFunction) => void) => {\n const cors = corsHelper(config);\n const { origin, overrides = {} } = config || {};\n const originHandler = dynamicOriginCallbackHandler(origin);\n\n return (req: Request, res: Response, next: NextFunction) => {\n // Handle OPTIONS preflight requests early for Lambda streaming compatibility.\n // The standard cors package would eventually call res.end(), but with Lambda\n // streaming, we need to ensure the response is terminated immediately without\n // going through any async middleware chains that might keep the stream open.\n if (req.method === HTTP_METHOD_OPTIONS) {\n const requestOrigin = req.headers.origin;\n\n originHandler(requestOrigin, (error, isAllowed) => {\n if (error || !isAllowed) {\n // Origin not allowed - send CORS error\n const corsError = error as CorsErrorWithBody;\n if (corsError?.status && corsError?.body) {\n res.status(corsError.status);\n res.setHeader(\"Content-Type\", \"application/json\");\n res.json(corsError.body());\n } else {\n // Fallback for non-CorsError errors\n res.status(HTTP_CODE_NO_CONTENT);\n if (typeof res.flushHeaders === \"function\") {\n res.flushHeaders();\n }\n res.end();\n }\n return;\n }\n\n // Origin is allowed - send preflight response\n // Set CORS headers\n if (requestOrigin) {\n res.setHeader(\"Access-Control-Allow-Origin\", requestOrigin);\n }\n res.setHeader(\"Vary\", \"Origin\");\n\n // Allow all methods by default (or use overrides if specified)\n const methods =\n (overrides.methods as string) || \"GET,HEAD,PUT,PATCH,POST,DELETE\";\n res.setHeader(\"Access-Control-Allow-Methods\", methods);\n\n // Reflect requested headers (standard cors behavior)\n const requestedHeaders = req.headers[\"access-control-request-headers\"];\n if (requestedHeaders) {\n res.setHeader(\"Access-Control-Allow-Headers\", requestedHeaders);\n }\n\n // Handle credentials if configured\n if (overrides.credentials === true) {\n res.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\n }\n\n // Handle max age if configured\n if (overrides.maxAge !== undefined) {\n res.setHeader(\"Access-Control-Max-Age\", String(overrides.maxAge));\n }\n\n // Send 204 No Content response and terminate immediately\n // This is critical for Lambda streaming - we must end the response\n // synchronously to prevent the stream from hanging.\n // CRITICAL: Flush headers first to initialize the Lambda stream wrapper.\n // Without this, _wrappedStream may be null when _final() is called,\n // causing the Lambda response stream to never close.\n res.statusCode = HTTP_CODE_NO_CONTENT;\n res.setHeader(\"Content-Length\", \"0\");\n if (typeof res.flushHeaders === \"function\") {\n res.flushHeaders();\n }\n res.end();\n });\n return;\n }\n\n // For non-OPTIONS requests, use the standard cors middleware\n cors(req, res, (error?: Error | null) => {\n if (error) {\n const corsError = error as CorsErrorWithBody;\n res.status(corsError.status);\n res.setHeader(\"Content-Type\", \"application/json\");\n return res.json(corsError.body());\n }\n next();\n });\n };\n};\n","import type { Request } from \"express\";\n\nimport { getCurrentInvoke } from \"./adapter/index.js\";\n\n//\n//\n// Helper Functions\n//\n\n/**\n * Get UUID from Jaypie Lambda adapter context.\n * This is set by createLambdaHandler/createLambdaStreamHandler.\n */\nfunction getJaypieAdapterUuid(): string | undefined {\n const currentInvoke = getCurrentInvoke();\n if (currentInvoke?.context?.awsRequestId) {\n return currentInvoke.context.awsRequestId;\n }\n return undefined;\n}\n\n/**\n * Get UUID from request object if it has Lambda context attached.\n * The Jaypie adapter attaches _lambdaContext to the request.\n */\nfunction getRequestContextUuid(req?: Request): string | undefined {\n if (req && (req as unknown as Record<string, unknown>)._lambdaContext) {\n const lambdaContext = (req as unknown as Record<string, unknown>)\n ._lambdaContext as {\n awsRequestId?: string;\n };\n if (lambdaContext.awsRequestId) {\n return lambdaContext.awsRequestId;\n }\n }\n return undefined;\n}\n\n//\n//\n// Main\n//\n\n/**\n * Get the current invoke UUID from Lambda context.\n * Works with Jaypie Lambda adapter (createLambdaHandler/createLambdaStreamHandler).\n *\n * @param req - Optional Express request object. Used to extract context\n * from Jaypie adapter's _lambdaContext.\n * @returns The AWS request ID or undefined if not in Lambda context\n */\nfunction getCurrentInvokeUuid(req?: Request): string | undefined {\n // Priority 1: Request has Lambda context attached (Jaypie adapter)\n const requestContextUuid = getRequestContextUuid(req);\n if (requestContextUuid) {\n return requestContextUuid;\n }\n\n // Priority 2: Global context from Jaypie adapter\n return getJaypieAdapterUuid();\n}\n\n//\n//\n// Export\n//\n\nexport default getCurrentInvokeUuid;\n","import type { Response } from \"express\";\nimport { HTTP, JAYPIE } from \"@jaypie/kit\";\nimport { log as publicLogger } from \"@jaypie/logger\";\n\nimport getCurrentInvokeUuid from \"./getCurrentInvokeUuid.adapter.js\";\n\n//\n//\n// Types\n//\n\ninterface DecorateResponseOptions {\n handler?: string;\n version?: string;\n}\n\n// Extended response type that may have _headers Map and internal bypass methods (Lambda adapter)\ninterface ExtendedResponse extends Response {\n _headers?: Map<string, string | string[]>;\n // Internal bypass methods added for dd-trace compatibility\n _internalGetHeader?: (name: string) => string | undefined;\n _internalSetHeader?: (name: string, value: string) => void;\n}\n\n//\n//\n// Helpers\n//\n\n/**\n * Safely get a header value from response.\n * Handles both Express Response and Lambda adapter responses.\n * Defensive against dd-trace instrumentation issues.\n */\nfunction safeGetHeader(\n res: ExtendedResponse,\n name: string,\n): string | undefined {\n try {\n // Try internal method first (completely bypasses dd-trace)\n if (typeof res._internalGetHeader === \"function\") {\n return res._internalGetHeader(name);\n }\n // Fall back to _headers Map access (Lambda adapter, avoids dd-trace)\n if (res._headers instanceof Map) {\n const value = res._headers.get(name.toLowerCase());\n return value ? String(value) : undefined;\n }\n // Fall back to getHeader (more standard than get)\n if (typeof res.getHeader === \"function\") {\n const value = res.getHeader(name);\n return value ? String(value) : undefined;\n }\n // Last resort: try get\n if (typeof res.get === \"function\") {\n const value = res.get(name);\n return value ? String(value) : undefined;\n }\n } catch {\n // Silently fail - caller will handle missing value\n }\n return undefined;\n}\n\n/**\n * Safely set a header value on response.\n * Handles both Express Response and Lambda adapter responses.\n * Defensive against dd-trace instrumentation issues.\n */\nfunction safeSetHeader(\n res: ExtendedResponse,\n name: string,\n value: string,\n): void {\n try {\n // Try internal method first (completely bypasses dd-trace)\n if (typeof res._internalSetHeader === \"function\") {\n res._internalSetHeader(name, value);\n return;\n }\n // Fall back to _headers Map access (Lambda adapter, avoids dd-trace)\n if (res._headers instanceof Map) {\n res._headers.set(name.toLowerCase(), value);\n return;\n }\n // Fall back to setHeader (more standard than set)\n if (typeof res.setHeader === \"function\") {\n res.setHeader(name, value);\n return;\n }\n // Last resort: try set\n if (typeof res.set === \"function\") {\n res.set(name, value);\n }\n } catch {\n // Silently fail - header just won't be set\n }\n}\n\n//\n//\n// Main\n//\n\nconst decorateResponse = (\n res: Response,\n {\n handler = \"\",\n version = process.env.PROJECT_VERSION,\n }: DecorateResponseOptions = {},\n): void => {\n const log = publicLogger.lib({\n lib: JAYPIE.LIB.EXPRESS,\n });\n\n //\n //\n // Validate\n //\n if (typeof res !== \"object\" || res === null) {\n log.warn(\"decorateResponse called but response is not an object\");\n return;\n }\n\n const extRes = res as ExtendedResponse;\n\n try {\n //\n //\n // Decorate Headers\n //\n\n // X-Powered-By, override \"Express\" but nothing else\n const currentPoweredBy = safeGetHeader(extRes, HTTP.HEADER.POWERED_BY);\n if (!currentPoweredBy || currentPoweredBy === \"Express\") {\n // DIAGNOSTIC: Include dev marker to verify build deployment\n safeSetHeader(\n extRes,\n HTTP.HEADER.POWERED_BY,\n `${JAYPIE.LIB.EXPRESS}@1.2.11-dev`,\n );\n }\n\n // X-Project-Environment\n if (process.env.PROJECT_ENV) {\n safeSetHeader(\n extRes,\n HTTP.HEADER.PROJECT.ENVIRONMENT,\n process.env.PROJECT_ENV,\n );\n }\n\n // X-Project-Handler\n if (handler) {\n safeSetHeader(extRes, HTTP.HEADER.PROJECT.HANDLER, handler);\n }\n\n // X-Project-Invocation\n const currentInvoke = getCurrentInvokeUuid();\n if (currentInvoke) {\n safeSetHeader(extRes, HTTP.HEADER.PROJECT.INVOCATION, currentInvoke);\n }\n\n // X-Project-Key\n if (process.env.PROJECT_KEY) {\n safeSetHeader(extRes, HTTP.HEADER.PROJECT.KEY, process.env.PROJECT_KEY);\n }\n\n // X-Project-Version\n if (version) {\n safeSetHeader(extRes, HTTP.HEADER.PROJECT.VERSION, version);\n }\n\n //\n //\n // Error Handling\n //\n } catch (error) {\n log.warn(\"decorateResponse caught an internal error\");\n log.var({ error });\n }\n};\n\n//\n//\n// Export\n//\n\nexport default decorateResponse;\n\n//\n//\n// Footnotes\n//\n\n// This is a \"utility\" function but it needs a lot of \"context\"\n// about the environment's secret parameters, the special adapter,\n// HTTP, etc. There must be a better way to organize this\n","import type { Request } from \"express\";\n\n//\n//\n// Types\n//\n\nexport interface RequestSummary {\n baseUrl: string;\n body: unknown;\n headers: Request[\"headers\"];\n method: string;\n query: Request[\"query\"];\n url: string;\n}\n\n//\n//\n// Function Definition\n//\n\nfunction summarizeRequest(req: Request): RequestSummary {\n // If body is a buffer, convert it to a string\n let { body } = req;\n if (Buffer.isBuffer(body)) {\n body = body.toString();\n }\n\n return {\n baseUrl: req.baseUrl,\n body,\n headers: req.headers,\n method: req.method,\n query: req.query,\n url: req.url,\n };\n}\n\n//\n//\n// Export\n//\n\nexport default summarizeRequest;\n","import type { Response } from \"express\";\n\n//\n//\n// Types\n//\n\nexport interface ResponseSummary {\n statusCode: number;\n statusMessage: string;\n headers?: ReturnType<Response[\"getHeaders\"]>;\n [key: string]: unknown;\n}\n\n//\n//\n// Function Definition\n//\n\nfunction summarizeResponse(\n res: Response,\n extras?: Record<string, unknown>,\n): ResponseSummary {\n const response: ResponseSummary = {\n statusCode: res.statusCode,\n statusMessage: res.statusMessage,\n };\n if (typeof res.getHeaders === \"function\") {\n response.headers = res.getHeaders();\n }\n if (typeof extras === \"object\" && extras !== null) {\n Object.assign(response, extras);\n }\n return response;\n}\n\n//\n//\n// Export\n//\n\nexport default summarizeResponse;\n","import type { Request, Response } from \"express\";\nimport { loadEnvSecrets } from \"@jaypie/aws\";\nimport { BadRequestError, UnhandledError } from \"@jaypie/errors\";\nimport { force, getHeaderFrom, HTTP, JAYPIE, jaypieHandler } from \"@jaypie/kit\";\nimport { log as publicLogger } from \"@jaypie/logger\";\nimport { DATADOG, hasDatadogEnv, submitMetric } from \"@jaypie/datadog\";\n\nimport { JAYPIE_LAMBDA_MOCK } from \"./adapter/LambdaResponseBuffered.js\";\nimport { JAYPIE_LAMBDA_STREAMING } from \"./adapter/LambdaResponseStreaming.js\";\nimport getCurrentInvokeUuid from \"./getCurrentInvokeUuid.adapter.js\";\nimport decorateResponse from \"./decorateResponse.helper.js\";\nimport summarizeRequest from \"./summarizeRequest.helper.js\";\nimport summarizeResponse from \"./summarizeResponse.helper.js\";\n\n//\n//\n// Types\n//\n\n// Extended logger interface for features not in the base type definitions\ninterface ExtendedLogger {\n init: () => void;\n level: string;\n debug: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n error: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n fatal: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n info: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n trace: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n warn: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n var(key: string | Record<string, unknown>, value?: unknown): void;\n tag(\n key: string | string[] | Record<string, unknown> | null,\n value?: string,\n ): void;\n untag(tags: string | string[] | Record<string, unknown> | null): void;\n lib(options: {\n level?: string;\n lib?: string;\n tags?: Record<string, unknown>;\n }): ExtendedLogger;\n}\n\n// Exported type aliases for defining handler lifecycle functions\nexport type JaypieHandlerSetup = (\n req: Request,\n res: Response,\n) => Promise<void> | void;\n\nexport type JaypieHandlerTeardown = (\n req: Request,\n res: Response,\n) => Promise<void> | void;\n\nexport type JaypieHandlerValidate = (\n req: Request,\n res: Response,\n) => Promise<boolean> | boolean;\n\nexport type ExpressHandlerLocals = (\n req: Request,\n res: Response,\n) => Promise<unknown> | unknown;\n\nexport interface ExpressHandlerOptions {\n chaos?: string;\n locals?: Record<string, unknown | ExpressHandlerLocals>;\n name?: string;\n secrets?: string[];\n setup?: JaypieHandlerSetup[] | JaypieHandlerSetup;\n teardown?: JaypieHandlerTeardown[] | JaypieHandlerTeardown;\n unavailable?: boolean;\n validate?: JaypieHandlerValidate[] | JaypieHandlerValidate;\n}\n\ninterface ExtendedRequest extends Request {\n locals: Record<string, unknown> & {\n _jaypie?: Record<string, unknown>;\n };\n}\n\ninterface ExtendedResponse extends Response {\n locals: Record<string, unknown> & {\n _jaypie?: Record<string, unknown>;\n };\n}\n\n// Extended response type for Lambda mock responses with direct internal access\ninterface LambdaMockResponse extends Response {\n _chunks?: Buffer[];\n _headers?: Map<string, string | string[]>;\n _headersSent?: boolean;\n _resolve?: ((result: unknown) => void) | null;\n buildResult?: () => unknown;\n // Internal bypass methods for dd-trace compatibility\n _internalGetHeader?: (name: string) => string | undefined;\n _internalSetHeader?: (name: string, value: string) => void;\n _internalHasHeader?: (name: string) => boolean;\n _internalRemoveHeader?: (name: string) => void;\n}\n\ntype ExpressHandler<T> = (\n req: Request,\n res: Response,\n ...params: unknown[]\n) => Promise<T>;\n\ninterface JaypieError extends Error {\n status?: number;\n body?: () => Record<string, unknown>;\n}\n\ninterface ResponseWithJson {\n json: () => Record<string, unknown>;\n}\n\n// Cast logger to extended interface for runtime features not in type definitions\nconst logger = publicLogger as unknown as ExtendedLogger;\n\n//\n//\n// Helpers - Safe response methods to bypass dd-trace interception\n//\n\n/**\n * Check if response is a Lambda mock response with direct internal access.\n * Uses Symbol marker to survive prototype chain modifications from Express and dd-trace.\n */\nfunction isLambdaMockResponse(res: Response): res is LambdaMockResponse {\n return (\n (res as unknown as Record<symbol, unknown>)[JAYPIE_LAMBDA_MOCK] === true\n );\n}\n\n/**\n * Check if response is a Lambda streaming response.\n * Uses Symbol marker to survive prototype chain modifications from Express and dd-trace.\n */\nfunction isLambdaStreamingResponse(res: Response): boolean {\n const symbolValue = (res as unknown as Record<symbol, unknown>)[\n JAYPIE_LAMBDA_STREAMING\n ];\n const result = symbolValue === true;\n // DIAGNOSTIC: Log symbol check\n console.log(\"[DIAG:expressHandler:isLambdaStreamingResponse] Check\", {\n symbolValue,\n result,\n resConstructorName: res?.constructor?.name,\n hasFlushHeaders: typeof res.flushHeaders === \"function\",\n });\n return result;\n}\n\n/**\n * Safely send a JSON response, avoiding dd-trace interception.\n * For Lambda mock responses, directly manipulates internal state instead of\n * using stream methods (write/end) which dd-trace intercepts.\n */\nfunction safeSendJson(res: Response, statusCode: number, data: unknown): void {\n if (isLambdaMockResponse(res)) {\n // Use internal method to set header (completely bypasses dd-trace)\n if (typeof res._internalSetHeader === \"function\") {\n res._internalSetHeader(\"content-type\", \"application/json\");\n } else {\n // Fall back to direct _headers manipulation\n res._headers!.set(\"content-type\", \"application/json\");\n }\n res.statusCode = statusCode;\n\n // Directly push to chunks array instead of using stream write/end\n const chunk = Buffer.from(JSON.stringify(data));\n res._chunks!.push(chunk);\n res._headersSent = true;\n\n // Mark as ended so getResult() resolves immediately\n (res as LambdaMockResponse & { _ended?: boolean })._ended = true;\n\n // Signal completion if a promise is waiting\n if (res._resolve) {\n res._resolve(res.buildResult!());\n }\n // Emit \"finish\" event so runExpressApp's promise resolves\n console.log(\"[safeSendJson] Emitting finish event\");\n res.emit(\"finish\");\n return;\n }\n // Fall back to standard Express methods for real responses\n // DIAGNOSTIC: Log before setting status\n console.log(\"[DIAG:expressHandler:safeSendJson] Before res.status()\", {\n statusCode,\n currentStatusCode: res.statusCode,\n });\n res.status(statusCode);\n console.log(\"[DIAG:expressHandler:safeSendJson] After res.status()\", {\n statusCode,\n newStatusCode: res.statusCode,\n });\n // CRITICAL: For Lambda streaming responses, flush headers before send to\n // initialize the stream wrapper. This ensures the status code is captured\n // before any writes occur (which would auto-flush with default 200).\n // Uses Symbol marker for reliable detection that survives prototype manipulation.\n const isStreaming = isLambdaStreamingResponse(res);\n console.log(\"[DIAG:expressHandler:safeSendJson] Streaming check\", {\n isStreaming,\n });\n if (isStreaming && typeof res.flushHeaders === \"function\") {\n console.log(\n \"[DIAG:expressHandler:safeSendJson] Calling flushHeaders explicitly\",\n );\n res.flushHeaders();\n }\n console.log(\"[DIAG:expressHandler:safeSendJson] Calling res.json()\");\n res.json(data);\n}\n\n/**\n * Safely send a response body, avoiding dd-trace interception.\n * For Lambda mock responses, directly manipulates internal state instead of\n * using stream methods (write/end) which dd-trace intercepts.\n */\nfunction safeSend(res: Response, statusCode: number, body?: string): void {\n if (isLambdaMockResponse(res)) {\n // Direct internal state manipulation - bypasses dd-trace completely\n res.statusCode = statusCode;\n\n if (body !== undefined) {\n const chunk = Buffer.from(body);\n res._chunks!.push(chunk);\n }\n res._headersSent = true;\n\n // Mark as ended so getResult() resolves immediately\n (res as LambdaMockResponse & { _ended?: boolean })._ended = true;\n\n // Signal completion if a promise is waiting\n if (res._resolve) {\n res._resolve(res.buildResult!());\n }\n // Emit \"finish\" event so runExpressApp's promise resolves\n console.log(\"[safeSend] Emitting finish event\");\n res.emit(\"finish\");\n return;\n }\n // Fall back to standard Express methods for real responses\n // DIAGNOSTIC: Log before setting status\n console.log(\"[DIAG:expressHandler:safeSend] Before res.status()\", {\n statusCode,\n currentStatusCode: res.statusCode,\n hasBody: body !== undefined,\n });\n res.status(statusCode);\n console.log(\"[DIAG:expressHandler:safeSend] After res.status()\", {\n statusCode,\n newStatusCode: res.statusCode,\n });\n // CRITICAL: For Lambda streaming responses, flush headers before send to\n // initialize the stream wrapper. This ensures the status code is captured\n // before any writes occur (which would auto-flush with default 200).\n // Uses Symbol marker for reliable detection that survives prototype manipulation.\n const isStreaming = isLambdaStreamingResponse(res);\n console.log(\"[DIAG:expressHandler:safeSend] Streaming check\", {\n isStreaming,\n });\n if (isStreaming && typeof res.flushHeaders === \"function\") {\n console.log(\n \"[DIAG:expressHandler:safeSend] Calling flushHeaders explicitly\",\n );\n res.flushHeaders();\n }\n if (body !== undefined) {\n console.log(\"[DIAG:expressHandler:safeSend] Calling res.send(body)\");\n res.send(body);\n } else {\n console.log(\"[DIAG:expressHandler:safeSend] Calling res.send() (no body)\");\n res.send();\n }\n}\n\n//\n//\n// Main\n//\n\n/* eslint-disable no-redeclare */\nfunction expressHandler<T>(\n handler: ExpressHandler<T>,\n options?: ExpressHandlerOptions,\n): ExpressHandler<T>;\nfunction expressHandler<T>(\n options: ExpressHandlerOptions,\n handler: ExpressHandler<T>,\n): ExpressHandler<T>;\nfunction expressHandler<T>(\n handlerOrOptions: ExpressHandler<T> | ExpressHandlerOptions,\n optionsOrHandler?: ExpressHandlerOptions | ExpressHandler<T>,\n): ExpressHandler<T> {\n /* eslint-enable no-redeclare */\n let handler: ExpressHandler<T>;\n let options: ExpressHandlerOptions;\n\n // If handler is an object and options is a function, swap them\n if (\n typeof handlerOrOptions === \"object\" &&\n typeof optionsOrHandler === \"function\"\n ) {\n handler = optionsOrHandler as ExpressHandler<T>;\n options = handlerOrOptions as ExpressHandlerOptions;\n } else {\n handler = handlerOrOptions as ExpressHandler<T>;\n options = (optionsOrHandler || {}) as ExpressHandlerOptions;\n }\n\n //\n //\n // Validate\n //\n let {\n chaos,\n locals,\n name,\n secrets,\n setup = [],\n teardown = [],\n unavailable,\n validate,\n } = options;\n if (typeof handler !== \"function\") {\n throw new BadRequestError(\n `Argument \"${handler}\" doesn't match type \"function\"`,\n );\n }\n if (\n locals !== undefined &&\n (typeof locals !== \"object\" || locals === null || Array.isArray(locals))\n ) {\n throw new BadRequestError(\n `Argument \"${locals}\" doesn't match type \"object\"`,\n );\n }\n setup = force.array(setup) as ((\n req: Request,\n res: Response,\n ) => Promise<void>)[]; // allows a single item\n teardown = force.array(teardown) as ((\n req: Request,\n res: Response,\n ) => Promise<void>)[]; // allows a single item\n\n //\n //\n // Setup\n //\n\n let jaypieFunction: ReturnType<typeof jaypieHandler>;\n\n return async (\n req: Request,\n res: Response,\n ...params: unknown[]\n ): Promise<T> => {\n // * This is the first line of code that runs when a request is received\n const extReq = req as ExtendedRequest;\n const extRes = res as ExtendedResponse;\n\n // Set default chaos value\n if (chaos === undefined) {\n chaos =\n process.env.PROJECT_CHAOS ||\n (getHeaderFrom(\n \"X-Project-Chaos\",\n req as unknown as Record<string, unknown>,\n ) as string | undefined);\n }\n\n // Re-init the logger\n logger.init();\n // Very low-level, internal sub-trace details\n const libLogger = logger.lib({\n lib: JAYPIE.LIB.EXPRESS,\n });\n // Top-level, important details that run at the same level as the main logger\n const log = logger.lib({\n level: logger.level,\n lib: JAYPIE.LIB.EXPRESS,\n });\n\n // Update the public logger with the request ID\n const invokeUuid = getCurrentInvokeUuid(req);\n if (invokeUuid) {\n logger.tag({ invoke: invokeUuid });\n logger.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n // TODO: in theory this is redundant\n libLogger.tag({ invoke: invokeUuid });\n libLogger.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n log.tag({ invoke: invokeUuid });\n log.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n }\n\n if (!name) {\n // If handler has a name, use it\n if (handler.name) {\n name = handler.name;\n } else {\n name = JAYPIE.UNKNOWN;\n }\n }\n logger.tag({ handler: name });\n // TODO: in theory this is redundant\n libLogger.tag({ handler: name });\n log.tag({ handler: name });\n\n libLogger.trace(\"[jaypie] Express init\");\n\n // Set req.locals if it doesn't exist\n if (!extReq.locals) extReq.locals = {};\n if (!extReq.locals._jaypie) extReq.locals._jaypie = {};\n\n // Set res.locals if it doesn't exist\n if (!extRes.locals) extRes.locals = {};\n if (!extRes.locals._jaypie) extRes.locals._jaypie = {};\n\n const originalRes = {\n attemptedCall: undefined as ((...args: unknown[]) => unknown) | undefined,\n attemptedParams: undefined as unknown[] | undefined,\n end: res.end.bind(res) as typeof res.end,\n json: res.json.bind(res) as typeof res.json,\n send: res.send.bind(res) as typeof res.send,\n status: res.status.bind(res) as typeof res.status,\n statusSent: false as boolean | number,\n };\n\n res.end = ((...endParams: unknown[]) => {\n originalRes.attemptedCall = originalRes.end as unknown as (\n ...args: unknown[]\n ) => unknown;\n originalRes.attemptedParams = endParams;\n log.warn(\n \"[jaypie] Illegal call to res.end(); prefer Jaypie response conventions\",\n );\n return res;\n }) as typeof res.end;\n\n res.json = ((...jsonParams: unknown[]) => {\n originalRes.attemptedCall = originalRes.json;\n originalRes.attemptedParams = jsonParams;\n log.warn(\n \"[jaypie] Illegal call to res.json(); prefer Jaypie response conventions\",\n );\n return res;\n }) as typeof res.json;\n\n res.send = ((...sendParams: unknown[]) => {\n originalRes.attemptedCall = originalRes.send;\n originalRes.attemptedParams = sendParams;\n log.warn(\n \"[jaypie] Illegal call to res.send(); prefer Jaypie response conventions\",\n );\n return res;\n }) as typeof res.send;\n\n res.status = ((...statusParams: [number]) => {\n originalRes.statusSent = statusParams[0];\n return originalRes.status(...statusParams);\n }) as typeof res.status;\n\n //\n //\n // Preprocess\n //\n\n // Load secrets into process.env if configured\n if (secrets && secrets.length > 0) {\n const secretsToLoad = secrets;\n const secretsSetup: JaypieHandlerSetup = async () => {\n await loadEnvSecrets(...secretsToLoad);\n };\n setup.unshift(secretsSetup);\n }\n\n if (locals) {\n // Locals\n const keys = Object.keys(locals);\n if (keys.length > 0) {\n const localsSetup = async (localsReq: Request, localsRes: Response) => {\n const extLocalsReq = localsReq as ExtendedRequest;\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n libLogger.trace(`[jaypie] Locals: ${key}`);\n const localValue = locals[key];\n if (typeof localValue === \"function\") {\n extLocalsReq.locals[key] = await localValue(localsReq, localsRes);\n } else {\n extLocalsReq.locals[key] = localValue;\n }\n }\n };\n setup.push(localsSetup);\n }\n }\n\n let response: T | Record<string, unknown> | undefined;\n let status: number = HTTP.CODE.OK;\n\n try {\n log.info.var({ req: summarizeRequest(req) });\n\n // Initialize after logging is set up\n\n jaypieFunction = jaypieHandler(\n handler as unknown as (...args: unknown[]) => Promise<unknown>,\n {\n chaos,\n name,\n setup,\n teardown,\n unavailable,\n validate,\n } as any,\n );\n\n libLogger.trace(\"[jaypie] Express execution\");\n\n //\n //\n // Process\n //\n\n response = (await jaypieFunction(req, res, ...params)) as\n | T\n | Record<string, unknown>\n | undefined;\n\n //\n //\n // Error Handling\n //\n } catch (error) {\n // In theory jaypieFunction has handled all errors\n const jaypieError = error as JaypieError;\n if (jaypieError.status) {\n status = jaypieError.status;\n }\n if (typeof jaypieError.body === \"function\") {\n response = jaypieError.body();\n } else {\n // This should never happen\n const unhandledError = new UnhandledError();\n response = unhandledError.body() as unknown as Record<string, unknown>;\n status = unhandledError.status;\n }\n }\n\n //\n //\n // Postprocess\n //\n\n // Restore original res functions\n res.end = originalRes.end;\n res.json = originalRes.json;\n res.send = originalRes.send;\n res.status = originalRes.status;\n\n // Decorate response\n decorateResponse(res, { handler: name });\n\n // Allow the sent status to override the status in the response\n if (originalRes.statusSent) {\n status = originalRes.statusSent as number;\n }\n\n // Send response\n try {\n if (!originalRes.attemptedCall) {\n // Body\n if (response) {\n if (typeof response === \"object\") {\n if (\n typeof (response as unknown as ResponseWithJson).json ===\n \"function\"\n ) {\n safeSendJson(\n res,\n status,\n (response as unknown as ResponseWithJson).json(),\n );\n } else {\n safeSendJson(res, status, response);\n }\n } else if (typeof response === \"string\") {\n try {\n safeSendJson(res, status, JSON.parse(response));\n } catch {\n safeSend(res, status, response);\n }\n } else if (response === true) {\n safeSend(res, HTTP.CODE.CREATED);\n } else {\n safeSend(res, status, response as unknown as string);\n }\n } else {\n // No response\n safeSend(res, HTTP.CODE.NO_CONTENT);\n }\n } else {\n // Resolve illegal call to res.end(), res.json(), or res.send()\n log.debug(\"[jaypie] Resolving illegal call to res\");\n log.var({\n attemptedCall: {\n name: originalRes.attemptedCall.name,\n params: originalRes.attemptedParams,\n },\n });\n // Call the original function with the original parameters and the original `this` (res)\n (originalRes.attemptedCall as (...args: unknown[]) => unknown).call(\n res,\n ...(originalRes.attemptedParams || []),\n );\n }\n } catch (error) {\n // Use console.error for raw stack trace to ensure it appears in CloudWatch\n // Handle both Error objects and plain thrown values\n const errorMessage =\n error instanceof Error\n ? error.message\n : typeof error === \"object\" && error !== null\n ? JSON.stringify(error)\n : String(error);\n const errorStack =\n error instanceof Error\n ? error.stack\n : new Error(\"Stack trace\").stack?.replace(\n \"Error: Stack trace\",\n `Error: ${errorMessage}`,\n );\n console.error(\"Express response error stack trace:\", errorStack);\n log.fatal(\n `Express encountered an error while sending the response: ${errorMessage}`,\n );\n log.var({ responseError: error });\n }\n\n // Log response\n const extras: Record<string, unknown> = {};\n if (response) extras.body = response;\n log.info.var({\n res: summarizeResponse(res, extras),\n });\n\n // Submit metric if Datadog is configured\n if (hasDatadogEnv()) {\n // Construct path from baseUrl and url\n let path = (req.baseUrl || \"\") + (req.url || \"\");\n // Ensure path starts with /\n if (!path.startsWith(\"/\")) {\n path = \"/\" + path;\n }\n // Remove trailing slash unless it's the root path\n if (path.length > 1 && path.endsWith(\"/\")) {\n path = path.slice(0, -1);\n }\n\n // Replace UUIDs with :id for better aggregation\n // Matches standard UUID v4 format (8-4-4-4-12 hex characters)\n path = path.replace(\n /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi,\n \":id\",\n );\n\n // Determine metric name based on environment variables\n let metricPrefix = \"project\";\n if (process.env.PROJECT_SPONSOR) {\n metricPrefix = process.env.PROJECT_SPONSOR;\n } else if (process.env.PROJECT_KEY) {\n metricPrefix = `project.${process.env.PROJECT_KEY}`;\n }\n\n await submitMetric({\n name: `${metricPrefix}.api.response`,\n type: DATADOG.METRIC.TYPE.COUNT,\n value: 1,\n tags: {\n status: String(res.statusCode),\n path,\n },\n });\n }\n\n // Clean up the public logger\n logger.untag(\"handler\");\n\n //\n //\n // Return\n //\n\n return response as T;\n };\n}\n\n//\n//\n// Export\n//\n\nexport default expressHandler;\n","import type { Request, Response } from \"express\";\nimport {\n BadGatewayError,\n BadRequestError,\n ForbiddenError,\n GatewayTimeoutError,\n GoneError,\n InternalError,\n MethodNotAllowedError,\n NotFoundError,\n TeapotError,\n UnauthorizedError,\n UnavailableError,\n} from \"@jaypie/errors\";\nimport { HTTP } from \"@jaypie/kit\";\nimport { log } from \"@jaypie/logger\";\n\nimport expressHandler, { ExpressHandlerOptions } from \"./expressHandler.js\";\n\n//\n//\n// Types\n//\n\ntype ErrorConstructor = new () => Error;\n\n//\n//\n// Main\n//\n\nconst httpHandler = (\n statusCode: number = HTTP.CODE.OK,\n context: ExpressHandlerOptions = {},\n): ((\n req: Request,\n res: Response,\n) => Promise<Record<string, unknown> | null>) => {\n // Give a default name if there isn't one\n if (!context.name) {\n context.name = \"_http\";\n }\n\n // Return a function that will be used as an express route\n return expressHandler(\n async (\n req: Request,\n res: Response,\n ): Promise<Record<string, unknown> | null> => {\n // Map the most throwable status codes to errors and throw them!\n const error: Record<number, ErrorConstructor> = {\n [HTTP.CODE.BAD_REQUEST]: BadRequestError,\n [HTTP.CODE.UNAUTHORIZED]: UnauthorizedError,\n [HTTP.CODE.FORBIDDEN]: ForbiddenError,\n [HTTP.CODE.NOT_FOUND]: NotFoundError,\n [HTTP.CODE.METHOD_NOT_ALLOWED]: MethodNotAllowedError,\n [HTTP.CODE.GONE]: GoneError,\n [HTTP.CODE.TEAPOT]: TeapotError,\n [HTTP.CODE.INTERNAL_ERROR]: InternalError,\n [HTTP.CODE.BAD_GATEWAY]: BadGatewayError,\n [HTTP.CODE.UNAVAILABLE]: UnavailableError,\n [HTTP.CODE.GATEWAY_TIMEOUT]: GatewayTimeoutError,\n };\n\n // If this maps to an error, throw it\n if (error[statusCode]) {\n log.trace(\n `@knowdev/express: gracefully throwing ${statusCode} up to projectHandler`,\n );\n throw new error[statusCode]();\n }\n\n // If this is an error and we didn't get thrown, log a warning\n if (statusCode >= 400) {\n log.warn(\n `@knowdev/express: status code ${statusCode} not mapped as throwable`,\n );\n }\n\n // Send the response\n res.status(statusCode);\n return statusCode === HTTP.CODE.NO_CONTENT ? null : {};\n },\n context,\n );\n};\n\n//\n//\n// Export\n//\n\nexport default httpHandler;\n","import type { Request, Response } from \"express\";\nimport {\n formatStreamError,\n getContentTypeForFormat,\n loadEnvSecrets,\n} from \"@jaypie/aws\";\nimport type { StreamFormat } from \"@jaypie/aws\";\nimport { BadRequestError, UnhandledError } from \"@jaypie/errors\";\nimport { force, getHeaderFrom, JAYPIE, jaypieHandler } from \"@jaypie/kit\";\nimport { log as publicLogger } from \"@jaypie/logger\";\nimport { DATADOG, hasDatadogEnv, submitMetric } from \"@jaypie/datadog\";\n\nimport getCurrentInvokeUuid from \"./getCurrentInvokeUuid.adapter.js\";\nimport summarizeRequest from \"./summarizeRequest.helper.js\";\n\n//\n//\n// Types\n//\n\n// Extended logger interface for features not in the base type definitions\ninterface ExtendedLogger {\n init: () => void;\n level: string;\n debug: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n error: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n fatal: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n info: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n trace: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n warn: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n var(key: string | Record<string, unknown>, value?: unknown): void;\n tag(\n key: string | string[] | Record<string, unknown> | null,\n value?: string,\n ): void;\n untag(tags: string | string[] | Record<string, unknown> | null): void;\n lib(options: {\n level?: string;\n lib?: string;\n tags?: Record<string, unknown>;\n }): ExtendedLogger;\n}\n\n// Exported type aliases for defining handler lifecycle functions\nexport type JaypieStreamHandlerSetup = (\n req: Request,\n res: Response,\n) => Promise<void> | void;\n\nexport type JaypieStreamHandlerTeardown = (\n req: Request,\n res: Response,\n) => Promise<void> | void;\n\nexport type JaypieStreamHandlerValidate = (\n req: Request,\n res: Response,\n) => Promise<boolean> | boolean;\n\nexport type ExpressStreamHandlerLocals = (\n req: Request,\n res: Response,\n) => Promise<unknown> | unknown;\n\nexport interface ExpressStreamHandlerOptions {\n chaos?: string;\n contentType?: string;\n format?: StreamFormat;\n locals?: Record<string, unknown | ExpressStreamHandlerLocals>;\n name?: string;\n secrets?: string[];\n setup?: JaypieStreamHandlerSetup[] | JaypieStreamHandlerSetup;\n teardown?: JaypieStreamHandlerTeardown[] | JaypieStreamHandlerTeardown;\n unavailable?: boolean;\n validate?: JaypieStreamHandlerValidate[] | JaypieStreamHandlerValidate;\n}\n\ninterface ExtendedRequest extends Request {\n locals: Record<string, unknown> & {\n _jaypie?: Record<string, unknown>;\n };\n}\n\ninterface ExtendedResponse extends Response {\n locals: Record<string, unknown> & {\n _jaypie?: Record<string, unknown>;\n };\n}\n\n/**\n * Streaming Express handler function signature.\n * Handler should write to the response stream and not return a value.\n */\nexport type ExpressStreamHandler = (\n req: Request,\n res: Response,\n ...params: unknown[]\n) => Promise<void>;\n\ninterface JaypieError extends Error {\n status?: number;\n body?: () => Record<string, unknown>;\n isProjectError?: boolean;\n}\n\n// Cast logger to extended interface for runtime features not in type definitions\nconst logger = publicLogger as unknown as ExtendedLogger;\n\n//\n//\n// Helper\n//\n\n/**\n * Get error body from an error\n */\nfunction getErrorBody(error: JaypieError | Error): Record<string, unknown> {\n const isJaypieError = (error as JaypieError).isProjectError;\n return isJaypieError\n ? ((error as JaypieError).body?.() ?? { error: error.message })\n : (new UnhandledError().body() as unknown as Record<string, unknown>);\n}\n\n//\n//\n// Main\n//\n\n/**\n * Creates a streaming Express handler that sets up SSE headers and allows\n * streaming responses. The handler receives the standard req/res and should\n * write to res.write() directly.\n *\n * Usage:\n * ```ts\n * app.get('/stream', expressStreamHandler(async (req, res) => {\n * const llmStream = llm.stream(\"Hello\");\n * await createExpressStream(llmStream, res);\n * }));\n * ```\n *\n * The handler sets appropriate SSE headers automatically:\n * - Content-Type: text/event-stream\n * - Cache-Control: no-cache\n * - Connection: keep-alive\n * - X-Accel-Buffering: no (disables nginx buffering)\n */\n/* eslint-disable no-redeclare */\nfunction expressStreamHandler(\n handler: ExpressStreamHandler,\n options?: ExpressStreamHandlerOptions,\n): ExpressStreamHandler;\nfunction expressStreamHandler(\n options: ExpressStreamHandlerOptions,\n handler: ExpressStreamHandler,\n): ExpressStreamHandler;\nfunction expressStreamHandler(\n handlerOrOptions: ExpressStreamHandler | ExpressStreamHandlerOptions,\n optionsOrHandler?: ExpressStreamHandlerOptions | ExpressStreamHandler,\n): ExpressStreamHandler {\n /* eslint-enable no-redeclare */\n let handler: ExpressStreamHandler;\n let options: ExpressStreamHandlerOptions;\n\n // If handler is an object and options is a function, swap them\n if (\n typeof handlerOrOptions === \"object\" &&\n typeof optionsOrHandler === \"function\"\n ) {\n handler = optionsOrHandler as ExpressStreamHandler;\n options = handlerOrOptions as ExpressStreamHandlerOptions;\n } else {\n handler = handlerOrOptions as ExpressStreamHandler;\n options = (optionsOrHandler || {}) as ExpressStreamHandlerOptions;\n }\n\n //\n //\n // Validate\n //\n const format: StreamFormat = options.format ?? \"sse\";\n let {\n chaos,\n contentType = getContentTypeForFormat(format),\n locals,\n name,\n secrets,\n setup = [],\n teardown = [],\n unavailable,\n validate,\n } = options;\n if (typeof handler !== \"function\") {\n throw new BadRequestError(\n `Argument \"${handler}\" doesn't match type \"function\"`,\n );\n }\n if (\n locals !== undefined &&\n (typeof locals !== \"object\" || locals === null || Array.isArray(locals))\n ) {\n throw new BadRequestError(\n `Argument \"${locals}\" doesn't match type \"object\"`,\n );\n }\n setup = force.array(setup) as ((\n req: Request,\n res: Response,\n ) => Promise<void>)[];\n teardown = force.array(teardown) as ((\n req: Request,\n res: Response,\n ) => Promise<void>)[];\n\n //\n //\n // Setup\n //\n\n let jaypieFunction: ReturnType<typeof jaypieHandler>;\n\n return async (\n req: Request,\n res: Response,\n ...params: unknown[]\n ): Promise<void> => {\n const extReq = req as ExtendedRequest;\n const extRes = res as ExtendedResponse;\n\n // Set default chaos value\n if (chaos === undefined) {\n chaos =\n process.env.PROJECT_CHAOS ||\n (getHeaderFrom(\n \"X-Project-Chaos\",\n req as unknown as Record<string, unknown>,\n ) as string | undefined);\n }\n\n // Re-init the logger\n logger.init();\n const libLogger = logger.lib({\n lib: JAYPIE.LIB.EXPRESS,\n });\n const log = logger.lib({\n level: logger.level,\n lib: JAYPIE.LIB.EXPRESS,\n });\n\n // Update the public logger with the request ID\n const invokeUuid = getCurrentInvokeUuid(req);\n if (invokeUuid) {\n logger.tag({ invoke: invokeUuid });\n logger.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n libLogger.tag({ invoke: invokeUuid });\n libLogger.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n log.tag({ invoke: invokeUuid });\n log.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n }\n\n if (!name) {\n if (handler.name) {\n name = handler.name;\n } else {\n name = JAYPIE.UNKNOWN;\n }\n }\n logger.tag({ handler: name });\n libLogger.tag({ handler: name });\n log.tag({ handler: name });\n\n libLogger.trace(\"[jaypie] Express stream init\");\n\n // Set req.locals if it doesn't exist\n if (!extReq.locals) extReq.locals = {};\n if (!extReq.locals._jaypie) extReq.locals._jaypie = {};\n\n // Set res.locals if it doesn't exist\n if (!extRes.locals) extRes.locals = {};\n if (!extRes.locals._jaypie) extRes.locals._jaypie = {};\n\n //\n //\n // SSE Headers\n //\n\n res.setHeader(\"Content-Type\", contentType);\n res.setHeader(\"Cache-Control\", \"no-cache\");\n res.setHeader(\"Connection\", \"keep-alive\");\n res.setHeader(\"X-Accel-Buffering\", \"no\"); // Disable nginx buffering\n res.flushHeaders();\n\n //\n //\n // Preprocess\n //\n\n // Load secrets into process.env if configured\n if (secrets && secrets.length > 0) {\n const secretsToLoad = secrets;\n const secretsSetup: JaypieStreamHandlerSetup = async () => {\n await loadEnvSecrets(...secretsToLoad);\n };\n setup.unshift(secretsSetup);\n }\n\n if (locals) {\n const keys = Object.keys(locals);\n if (keys.length > 0) {\n const localsSetup = async (localsReq: Request, localsRes: Response) => {\n const extLocalsReq = localsReq as ExtendedRequest;\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n libLogger.trace(`[jaypie] Locals: ${key}`);\n const localValue = locals[key];\n if (typeof localValue === \"function\") {\n extLocalsReq.locals[key] = await localValue(localsReq, localsRes);\n } else {\n extLocalsReq.locals[key] = localValue;\n }\n }\n };\n setup.push(localsSetup);\n }\n }\n\n try {\n log.info.var({ req: summarizeRequest(req) });\n\n jaypieFunction = jaypieHandler(\n handler as unknown as (...args: unknown[]) => Promise<unknown>,\n {\n chaos,\n name,\n setup,\n teardown,\n unavailable,\n validate,\n } as any,\n );\n\n libLogger.trace(\"[jaypie] Express stream execution\");\n\n //\n //\n // Process\n //\n\n await jaypieFunction(req, res, ...params);\n\n //\n //\n // Error Handling\n //\n } catch (error) {\n const jaypieError = error as JaypieError;\n\n // Log the error\n if (jaypieError.isProjectError) {\n log.debug(\"Caught jaypie error in stream handler\");\n log.info.var({ jaypieError: error });\n } else {\n log.fatal(\"Caught unhandled error in stream handler\");\n log.info.var({ unhandledError: (error as Error).message });\n }\n\n // Write error in the appropriate format\n try {\n const errorBody = getErrorBody(error as Error);\n res.write(formatStreamError(errorBody, format));\n } catch {\n // Response may already be closed\n log.warn(\"Failed to write error to stream - response may be closed\");\n }\n } finally {\n // End the response\n try {\n res.end();\n } catch {\n // Response may already be ended\n }\n\n //\n //\n // Postprocess\n //\n\n // Log completion\n log.info.var({\n res: { statusCode: res.statusCode, streaming: true },\n });\n\n // Submit metric if Datadog is configured\n if (hasDatadogEnv()) {\n let path = (req.baseUrl || \"\") + (req.url || \"\");\n if (!path.startsWith(\"/\")) {\n path = \"/\" + path;\n }\n if (path.length > 1 && path.endsWith(\"/\")) {\n path = path.slice(0, -1);\n }\n path = path.replace(\n /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi,\n \":id\",\n );\n\n let metricPrefix = \"project\";\n if (process.env.PROJECT_SPONSOR) {\n metricPrefix = process.env.PROJECT_SPONSOR;\n } else if (process.env.PROJECT_KEY) {\n metricPrefix = `project.${process.env.PROJECT_KEY}`;\n }\n\n await submitMetric({\n name: `${metricPrefix}.api.stream`,\n type: DATADOG.METRIC.TYPE.COUNT,\n value: 1,\n tags: {\n status: String(res.statusCode),\n path,\n },\n });\n }\n\n // Clean up the public logger\n logger.untag(\"handler\");\n }\n };\n}\n\n//\n//\n// Export\n//\n\nexport default expressStreamHandler;\n","import type { Request, Response } from \"express\";\nimport { BadRequestError } from \"@jaypie/errors\";\n\nimport expressHandler, { ExpressHandlerOptions } from \"./expressHandler.js\";\nimport summarizeRequest from \"./summarizeRequest.helper.js\";\n\n//\n//\n// Types\n//\n\nexport interface EchoResponse {\n req: ReturnType<typeof summarizeRequest>;\n}\n\n//\n//\n// Main\n//\n\nconst echoHandler = (\n context: ExpressHandlerOptions = {},\n): ((req: Request, res: Response) => Promise<EchoResponse>) => {\n if (\n typeof context !== \"object\" ||\n context === null ||\n Array.isArray(context)\n ) {\n throw new BadRequestError(\n `Argument \"${context}\" doesn't match type \"object\"`,\n );\n }\n // Give a default name if there isn't one\n if (!context.name) {\n context.name = \"_echo\";\n }\n\n // Return a function that will be used as an express route\n return expressHandler(async (req: Request): Promise<EchoResponse> => {\n return {\n req: summarizeRequest(req),\n };\n }, context);\n};\n\n//\n//\n// Export\n//\n\nexport default echoHandler;\n","import { NotImplementedError } from \"@jaypie/errors\";\nimport { HTTP } from \"@jaypie/kit\";\n\nimport expressHandler from \"./expressHandler.js\";\nimport httpHandler from \"./http.handler.js\";\nimport echoHandler from \"./echo.handler.js\";\n\n//\n//\n// Functions\n//\n\nconst routes = {\n badRequestRoute: httpHandler(HTTP.CODE.BAD_REQUEST, { name: \"_badRequest\" }),\n echoRoute: echoHandler(),\n forbiddenRoute: httpHandler(HTTP.CODE.FORBIDDEN, { name: \"_forbidden\" }),\n goneRoute: httpHandler(HTTP.CODE.GONE, { name: \"_gone\" }),\n methodNotAllowedRoute: httpHandler(HTTP.CODE.METHOD_NOT_ALLOWED, {\n name: \"_methodNotAllowed\",\n }),\n noContentRoute: httpHandler(HTTP.CODE.NO_CONTENT, { name: \"_noContent\" }),\n notFoundRoute: httpHandler(HTTP.CODE.NOT_FOUND, { name: \"_notFound\" }),\n notImplementedRoute: expressHandler(\n (): never => {\n throw new NotImplementedError();\n },\n { name: \"_notImplemented\" },\n ),\n};\n\n//\n//\n// Export\n//\n\nexport const badRequestRoute = routes.badRequestRoute;\nexport const echoRoute = routes.echoRoute;\nexport const forbiddenRoute = routes.forbiddenRoute;\nexport const goneRoute = routes.goneRoute;\nexport const methodNotAllowedRoute = routes.methodNotAllowedRoute;\nexport const noContentRoute = routes.noContentRoute;\nexport const notFoundRoute = routes.notFoundRoute;\nexport const notImplementedRoute = routes.notImplementedRoute;\n"],"names":["Readable","kOutHeaders","ServerResponse","Writable","force","envBoolean","CorsError","publicLogger","JAYPIE","HTTP","logger","BadRequestError","getHeaderFrom","loadEnvSecrets","jaypieHandler","UnhandledError","hasDatadogEnv","submitMetric","DATADOG","UnauthorizedError","ForbiddenError","NotFoundError","MethodNotAllowedError","GoneError","TeapotError","InternalError","BadGatewayError","UnavailableError","GatewayTimeoutError","log","getContentTypeForFormat","formatStreamError","NotImplementedError"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/adapter/LambdaRequest.ts","../../../src/adapter/LambdaResponseBuffered.ts","../../../src/adapter/LambdaResponseStreaming.ts","../../../src/adapter/index.ts","../../../src/constants.ts","../../../src/cors.helper.ts","../../../src/getCurrentInvokeUuid.adapter.ts","../../../src/decorateResponse.helper.ts","../../../src/summarizeRequest.helper.ts","../../../src/summarizeResponse.helper.ts","../../../src/expressHandler.ts","../../../src/http.handler.ts","../../../src/expressStreamHandler.ts","../../../src/echo.handler.ts","../../../src/routes.ts"],"sourcesContent":["import type { IncomingHttpHeaders } from \"node:http\";\nimport { Readable } from \"node:stream\";\n\nimport type {\n ApiGatewayV1Event,\n FunctionUrlEvent,\n LambdaContext,\n LambdaEvent,\n} from \"./types.js\";\n\n//\n//\n// Types\n//\n\ninterface LambdaRequestOptions {\n body?: Buffer | null;\n headers: Record<string, string>;\n lambdaContext: LambdaContext;\n lambdaEvent: LambdaEvent;\n method: string;\n protocol: string;\n query?: Record<string, string | string[]>;\n remoteAddress: string;\n url: string;\n}\n\ninterface MockSocket {\n destroy: () => void;\n encrypted: boolean;\n remoteAddress: string;\n}\n\n//\n//\n// LambdaRequest Class\n//\n\n/**\n * Mock IncomingMessage that extends Readable stream.\n * Provides Express-compatible request interface from Lambda Function URL events.\n */\nexport class LambdaRequest extends Readable {\n // IncomingMessage required properties\n public readonly method: string;\n public readonly url: string;\n public readonly headers: IncomingHttpHeaders;\n public readonly httpVersion: string = \"1.1\";\n public readonly httpVersionMajor: number = 1;\n public readonly httpVersionMinor: number = 1;\n public complete: boolean = false;\n\n // Socket mock for Express compatibility\n public readonly socket: MockSocket;\n public readonly connection: MockSocket;\n\n // Express-expected properties\n public readonly originalUrl: string;\n public readonly path: string;\n public baseUrl: string = \"\";\n public body: unknown;\n public params: Record<string, string> = {};\n public query: Record<string, unknown> = {};\n\n // Jaypie-specific: store Lambda context for getCurrentInvokeUuid\n public readonly _lambdaContext: LambdaContext;\n public readonly _lambdaEvent: LambdaEvent;\n\n // Internal state\n private bodyBuffer: Buffer | null;\n private bodyPushed: boolean = false;\n\n constructor(options: LambdaRequestOptions) {\n super();\n\n this.method = options.method;\n this.url = options.url;\n this.originalUrl = options.url;\n this.path = options.url.split(\"?\")[0];\n this.headers = this.normalizeHeaders(options.headers);\n this.bodyBuffer = options.body ?? null;\n\n // Use pre-parsed query if provided, otherwise parse from URL\n if (options.query) {\n this.query = options.query;\n } else {\n const queryIndex = options.url.indexOf(\"?\");\n if (queryIndex !== -1) {\n const queryString = options.url.slice(queryIndex + 1);\n this.query = parseQueryString(queryString);\n }\n }\n\n // Store Lambda context\n this._lambdaContext = options.lambdaContext;\n this._lambdaEvent = options.lambdaEvent;\n\n // Create mock socket\n this.socket = {\n destroy: () => {},\n encrypted: options.protocol === \"https\",\n remoteAddress: options.remoteAddress,\n };\n this.connection = this.socket;\n\n // Schedule body push for next tick to ensure stream is ready\n // This is needed for body parsers that consume the stream\n if (this.bodyBuffer && this.bodyBuffer.length > 0) {\n process.nextTick(() => {\n if (!this.bodyPushed) {\n this.push(this.bodyBuffer);\n this.push(null);\n this.bodyPushed = true;\n this.complete = true;\n }\n });\n }\n }\n\n //\n // Readable stream implementation\n //\n\n _read(): void {\n if (!this.bodyPushed) {\n if (this.bodyBuffer && this.bodyBuffer.length > 0) {\n this.push(this.bodyBuffer);\n }\n this.push(null); // Signal end of stream\n this.bodyPushed = true;\n this.complete = true;\n }\n }\n\n //\n // Express helper methods\n //\n\n get(headerName: string): string | undefined {\n const key = headerName.toLowerCase();\n const value = this.headers[key];\n return Array.isArray(value) ? value[0] : value;\n }\n\n header(headerName: string): string | undefined {\n return this.get(headerName);\n }\n\n //\n // Private helpers\n //\n\n private normalizeHeaders(\n headers: Record<string, string>,\n ): IncomingHttpHeaders {\n const normalized: IncomingHttpHeaders = {};\n for (const [key, value] of Object.entries(headers)) {\n normalized[key.toLowerCase()] = value;\n }\n return normalized;\n }\n}\n\n//\n//\n// Helper Functions\n//\n\n/**\n * Normalize bracket notation in query parameter key.\n * Removes trailing `[]` from keys (e.g., `filterByStatus[]` → `filterByStatus`).\n */\nfunction normalizeQueryKey(key: string): string {\n return key.endsWith(\"[]\") ? key.slice(0, -2) : key;\n}\n\n/**\n * Parse a query string into a record with proper array handling.\n * Handles bracket notation (e.g., `param[]`) and multi-value parameters.\n */\nfunction parseQueryString(\n queryString: string,\n): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {};\n const params = new URLSearchParams(queryString);\n\n for (const [rawKey, value] of params) {\n const key = normalizeQueryKey(rawKey);\n const existing = result[key];\n\n if (existing === undefined) {\n // First occurrence - check if it's bracket notation to determine if it should be an array\n result[key] = rawKey.endsWith(\"[]\") ? [value] : value;\n } else if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n // Convert to array when we encounter a second value\n result[key] = [existing, value];\n }\n }\n\n return result;\n}\n\n/**\n * Build query object from API Gateway v1 multiValueQueryStringParameters.\n * Normalizes bracket notation and preserves array values.\n */\nfunction buildQueryFromMultiValue(\n multiValueParams: Record<string, string[]> | null | undefined,\n): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {};\n if (!multiValueParams) return result;\n\n for (const [rawKey, values] of Object.entries(multiValueParams)) {\n const key = normalizeQueryKey(rawKey);\n const existingValues = result[key];\n\n if (existingValues === undefined) {\n // First occurrence - use array if multiple values or bracket notation\n result[key] =\n values.length === 1 && !rawKey.endsWith(\"[]\") ? values[0] : values;\n } else if (Array.isArray(existingValues)) {\n existingValues.push(...values);\n } else {\n // Convert to array and merge\n result[key] = [existingValues, ...values];\n }\n }\n\n return result;\n}\n\n//\n//\n// Type Guards\n//\n\n/**\n * Check if event is a Function URL / HTTP API v2 event.\n */\nfunction isFunctionUrlEvent(event: LambdaEvent): event is FunctionUrlEvent {\n return \"requestContext\" in event && \"http\" in event.requestContext;\n}\n\n/**\n * Check if event is an API Gateway REST API v1 event.\n */\nfunction isApiGatewayV1Event(event: LambdaEvent): event is ApiGatewayV1Event {\n return \"httpMethod\" in event;\n}\n\n//\n//\n// Factory Function\n//\n\n/**\n * Create a LambdaRequest from a Lambda event (Function URL, HTTP API v2, or REST API v1).\n */\nexport function createLambdaRequest(\n event: LambdaEvent,\n context: LambdaContext,\n): LambdaRequest {\n let url: string;\n let method: string;\n let protocol: string;\n let query: Record<string, string | string[]> | undefined;\n let remoteAddress: string;\n const headers = { ...event.headers };\n\n if (isFunctionUrlEvent(event)) {\n // Function URL / HTTP API v2 format\n url = event.rawQueryString\n ? `${event.rawPath}?${event.rawQueryString}`\n : event.rawPath;\n method = event.requestContext.http.method;\n protocol = event.requestContext.http.protocol.split(\"/\")[0].toLowerCase();\n remoteAddress = event.requestContext.http.sourceIp;\n\n // Parse query string with proper multi-value and bracket notation support\n if (event.rawQueryString) {\n query = parseQueryString(event.rawQueryString);\n }\n\n // Normalize cookies into Cookie header if not already present\n if (event.cookies && event.cookies.length > 0 && !headers.cookie) {\n headers.cookie = event.cookies.join(\"; \");\n }\n } else if (isApiGatewayV1Event(event)) {\n // API Gateway REST API v1 format\n // Use multiValueQueryStringParameters for proper array support\n const multiValueParams = event.multiValueQueryStringParameters;\n const queryParams = event.queryStringParameters;\n\n if (multiValueParams && Object.keys(multiValueParams).length > 0) {\n query = buildQueryFromMultiValue(multiValueParams);\n }\n\n // Build URL with query string\n if (queryParams && Object.keys(queryParams).length > 0) {\n const queryString = new URLSearchParams(\n queryParams as Record<string, string>,\n ).toString();\n url = `${event.path}?${queryString}`;\n } else {\n url = event.path;\n }\n\n method = event.httpMethod;\n protocol = event.requestContext.protocol.split(\"/\")[0].toLowerCase();\n remoteAddress = event.requestContext.identity.sourceIp;\n } else {\n throw new Error(\n \"Unsupported Lambda event format. Expected Function URL, HTTP API v2, or REST API v1 event.\",\n );\n }\n\n // Decode body if present\n let body: Buffer | null = null;\n if (event.body) {\n body = event.isBase64Encoded\n ? Buffer.from(event.body, \"base64\")\n : Buffer.from(event.body, \"utf8\");\n\n // Add content-length header if not present (required for body parsers)\n const hasContentLength = Object.keys(headers).some(\n (k) => k.toLowerCase() === \"content-length\",\n );\n if (!hasContentLength) {\n headers[\"content-length\"] = String(body.length);\n }\n }\n\n return new LambdaRequest({\n body,\n headers,\n lambdaContext: context,\n lambdaEvent: event,\n method,\n protocol,\n query,\n remoteAddress,\n url,\n });\n}\n\nexport default LambdaRequest;\n","import type { OutgoingHttpHeaders } from \"node:http\";\nimport { ServerResponse } from \"node:http\";\nimport { Writable } from \"node:stream\";\n\nimport type { LambdaResponse } from \"./types.js\";\n\n//\n//\n// Constants\n//\n\n// Symbol to identify Lambda mock responses. Uses Symbol.for() to ensure\n// the same symbol is used across bundles/realms. Survives prototype manipulation.\nexport const JAYPIE_LAMBDA_MOCK = Symbol.for(\"@jaypie/express/LambdaMock\");\n\n// Get Node's internal kOutHeaders symbol from ServerResponse prototype.\n// This is needed for compatibility with Datadog dd-trace instrumentation,\n// which patches HTTP methods and expects this internal state to exist.\nconst kOutHeaders = Object.getOwnPropertySymbols(ServerResponse.prototype).find(\n (s) => s.toString() === \"Symbol(kOutHeaders)\",\n);\n\nconst BINARY_CONTENT_TYPE_PATTERNS = [\n /^application\\/octet-stream$/,\n /^application\\/pdf$/,\n /^application\\/zip$/,\n /^audio\\//,\n /^font\\//,\n /^image\\//,\n /^video\\//,\n];\n\n//\n//\n// LambdaResponseBuffered Class\n//\n\n/**\n * Mock ServerResponse that buffers the response.\n * Collects status, headers, and body chunks, then returns a Lambda response.\n */\nexport class LambdaResponseBuffered extends Writable {\n public statusCode: number = 200;\n public statusMessage: string = \"OK\";\n\n // Mock socket to satisfy Express/finalhandler checks\n public readonly socket: { remoteAddress: string } = {\n remoteAddress: \"127.0.0.1\",\n };\n\n // Internal state exposed for direct manipulation by safe response methods\n // that need to bypass dd-trace interception of stream methods\n public _chunks: Buffer[] = [];\n public _ended: boolean = false; // Track ended state since writableEnded is lost after prototype change\n public _headers: Map<string, string | string[]> = new Map();\n public _headersSent: boolean = false;\n public _resolve: ((result: LambdaResponse) => void) | null = null;\n\n constructor() {\n super();\n // Mark as Lambda mock response for identification in expressHandler\n (this as Record<symbol, unknown>)[JAYPIE_LAMBDA_MOCK] = true;\n\n // Initialize Node's internal kOutHeaders for dd-trace compatibility.\n // dd-trace patches HTTP methods and expects this internal state.\n if (kOutHeaders) {\n (this as Record<symbol, unknown>)[kOutHeaders] = Object.create(null);\n }\n\n // CRITICAL: Define key methods as instance properties to survive Express's\n // setPrototypeOf(res, app.response) in middleware/init.js which would\n // otherwise replace our prototype with ServerResponse.prototype.\n // Instance properties take precedence over prototype properties.\n this.getHeader = this.getHeader.bind(this);\n this.setHeader = this.setHeader.bind(this);\n this.removeHeader = this.removeHeader.bind(this);\n this.hasHeader = this.hasHeader.bind(this);\n this.getHeaders = this.getHeaders.bind(this);\n this.getHeaderNames = this.getHeaderNames.bind(this);\n this.writeHead = this.writeHead.bind(this);\n this.get = this.get.bind(this);\n this.set = this.set.bind(this);\n this.status = this.status.bind(this);\n this.json = this.json.bind(this);\n this.send = this.send.bind(this);\n this.vary = this.vary.bind(this);\n this.end = this.end.bind(this);\n this.write = this.write.bind(this);\n // Also bind internal Writable methods that are called via prototype chain\n this._write = this._write.bind(this);\n this._final = this._final.bind(this);\n // Bind result-building methods\n this.getResult = this.getResult.bind(this);\n this.buildResult = this.buildResult.bind(this);\n this.isBinaryContentType = this.isBinaryContentType.bind(this);\n }\n\n //\n // Internal bypass methods - completely avoid prototype chain lookup\n // These directly access _headers Map, safe from dd-trace interception\n //\n\n _internalGetHeader(name: string): string | undefined {\n const value = this._headers.get(name.toLowerCase());\n return value ? String(value) : undefined;\n }\n\n _internalSetHeader(name: string, value: string): void {\n if (!this._headersSent) {\n const lowerName = name.toLowerCase();\n this._headers.set(lowerName, value);\n // Also sync kOutHeaders for any code that expects it\n if (kOutHeaders) {\n const outHeaders = (\n this as unknown as Record<symbol, Record<string, unknown>>\n )[kOutHeaders];\n if (outHeaders) {\n outHeaders[lowerName] = [name, value];\n }\n }\n }\n }\n\n _internalHasHeader(name: string): boolean {\n return this._headers.has(name.toLowerCase());\n }\n\n _internalRemoveHeader(name: string): void {\n if (!this._headersSent) {\n const lowerName = name.toLowerCase();\n this._headers.delete(lowerName);\n if (kOutHeaders) {\n const outHeaders = (\n this as unknown as Record<symbol, Record<string, unknown>>\n )[kOutHeaders];\n if (outHeaders) {\n delete outHeaders[lowerName];\n }\n }\n }\n }\n\n //\n // Promise-based API for getting final result\n //\n\n getResult(): Promise<LambdaResponse> {\n return new Promise((resolve) => {\n // Use _ended instead of writableEnded since Express's setPrototypeOf breaks the getter\n if (this._ended) {\n resolve(this.buildResult());\n } else {\n this._resolve = resolve;\n }\n });\n }\n\n //\n // Header management\n //\n\n setHeader(name: string, value: number | string | string[]): this {\n if (this._headersSent) {\n // In production, log warning but don't throw to match Express behavior\n return this;\n }\n const lowerName = name.toLowerCase();\n this._headers.set(lowerName, String(value));\n // Sync with kOutHeaders for dd-trace compatibility\n // Node stores as { 'header-name': ['Header-Name', value] }\n if (kOutHeaders) {\n const outHeaders = (\n this as unknown as Record<symbol, Record<string, unknown>>\n )[kOutHeaders];\n if (outHeaders) {\n outHeaders[lowerName] = [name, String(value)];\n }\n }\n return this;\n }\n\n getHeader(name: string): number | string | string[] | undefined {\n return this._headers.get(name.toLowerCase());\n }\n\n removeHeader(name: string): void {\n const lowerName = name.toLowerCase();\n this._headers.delete(lowerName);\n // Sync with kOutHeaders for dd-trace compatibility\n if (kOutHeaders) {\n const outHeaders = (\n this as unknown as Record<symbol, Record<string, unknown>>\n )[kOutHeaders];\n if (outHeaders) {\n delete outHeaders[lowerName];\n }\n }\n }\n\n getHeaders(): OutgoingHttpHeaders {\n const headers: OutgoingHttpHeaders = {};\n for (const [key, value] of this._headers) {\n headers[key] = value;\n }\n return headers;\n }\n\n hasHeader(name: string): boolean {\n return this._headers.has(name.toLowerCase());\n }\n\n getHeaderNames(): string[] {\n return Array.from(this._headers.keys());\n }\n\n /**\n * Proxy for direct header access (e.g., res.headers['content-type']).\n * Required for compatibility with middleware like helmet that access headers directly.\n * Uses direct _headers access to bypass dd-trace interception.\n */\n get headers(): Record<string, string | string[] | undefined> {\n return new Proxy(\n {},\n {\n deleteProperty: (_target, prop) => {\n this._headers.delete(String(prop).toLowerCase());\n return true;\n },\n get: (_target, prop) => {\n if (typeof prop === \"symbol\") return undefined;\n return this._headers.get(String(prop).toLowerCase());\n },\n getOwnPropertyDescriptor: (_target, prop) => {\n const lowerProp = String(prop).toLowerCase();\n if (this._headers.has(lowerProp)) {\n return {\n configurable: true,\n enumerable: true,\n value: this._headers.get(lowerProp),\n };\n }\n return undefined;\n },\n has: (_target, prop) => {\n return this._headers.has(String(prop).toLowerCase());\n },\n ownKeys: () => {\n return Array.from(this._headers.keys());\n },\n set: (_target, prop, value) => {\n if (!this._headersSent) {\n this._headers.set(String(prop).toLowerCase(), value);\n }\n return true;\n },\n },\n );\n }\n\n writeHead(\n statusCode: number,\n statusMessageOrHeaders?: OutgoingHttpHeaders | string,\n headers?: OutgoingHttpHeaders,\n ): this {\n this.statusCode = statusCode;\n\n let headersToSet: OutgoingHttpHeaders | undefined;\n\n if (typeof statusMessageOrHeaders === \"string\") {\n this.statusMessage = statusMessageOrHeaders;\n headersToSet = headers;\n } else if (\n statusMessageOrHeaders &&\n typeof statusMessageOrHeaders === \"object\"\n ) {\n headersToSet = statusMessageOrHeaders;\n }\n\n if (headersToSet) {\n // Use direct _headers access to bypass dd-trace interception\n for (const [key, value] of Object.entries(headersToSet)) {\n if (value !== undefined) {\n this._headers.set(key.toLowerCase(), String(value));\n }\n }\n }\n\n this._headersSent = true;\n return this;\n }\n\n get headersSent(): boolean {\n return this._headersSent;\n }\n\n //\n // Express compatibility methods\n //\n\n /**\n * Express-style alias for getHeader().\n * Used by middleware like decorateResponse that use res.get().\n * Note: Directly accesses _headers to avoid prototype chain issues with bundled code.\n */\n get(name: string): number | string | string[] | undefined {\n return this._headers.get(name.toLowerCase());\n }\n\n /**\n * Express-style alias for setHeader().\n * Used by middleware like decorateResponse that use res.set().\n * Note: Directly accesses _headers to avoid prototype chain issues with bundled code.\n */\n set(name: string, value: number | string | string[]): this {\n if (!this._headersSent) {\n this._headers.set(name.toLowerCase(), String(value));\n }\n return this;\n }\n\n status(code: number): this {\n this.statusCode = code;\n return this;\n }\n\n json(data: unknown): this {\n // Use direct _headers access to bypass dd-trace interception\n this._headers.set(\"content-type\", \"application/json\");\n this.end(JSON.stringify(data));\n return this;\n }\n\n send(body?: Buffer | object | string): this {\n if (typeof body === \"object\" && !Buffer.isBuffer(body)) {\n return this.json(body);\n }\n this.end(body);\n return this;\n }\n\n /**\n * Add a field to the Vary response header.\n * Used by CORS middleware to indicate response varies by Origin.\n * Uses direct _headers access to bypass dd-trace interception.\n */\n vary(field: string): this {\n const existing = this._headers.get(\"vary\");\n if (!existing) {\n this._headers.set(\"vary\", field);\n } else {\n // Append to existing Vary header if field not already present\n const fields = String(existing)\n .split(\",\")\n .map((f) => f.trim().toLowerCase());\n if (!fields.includes(field.toLowerCase())) {\n this._headers.set(\"vary\", `${existing}, ${field}`);\n }\n }\n return this;\n }\n\n //\n // Writable stream implementation\n //\n\n _write(\n chunk: Buffer | string,\n encoding: BufferEncoding, // eslint-disable-line no-undef\n callback: (error?: Error | null) => void,\n ): void {\n const buffer = Buffer.isBuffer(chunk)\n ? chunk\n : Buffer.from(chunk, encoding);\n this._chunks.push(buffer);\n this._headersSent = true;\n callback();\n }\n\n _final(callback: (error?: Error | null) => void): void {\n this._ended = true;\n if (this._resolve) {\n this._resolve(this.buildResult());\n }\n callback();\n }\n\n //\n // Private helpers\n //\n\n public buildResult(): LambdaResponse {\n const body = Buffer.concat(this._chunks);\n // Use direct _headers access to bypass dd-trace interception\n const contentType = (this._headers.get(\"content-type\") as string) || \"\";\n\n // Determine if response should be base64 encoded\n const isBase64Encoded = this.isBinaryContentType(contentType);\n\n // Build headers object\n const headers: Record<string, string> = {};\n const cookies: string[] = [];\n\n for (const [key, value] of this._headers) {\n if (key === \"set-cookie\") {\n // Collect Set-Cookie headers for v2 response format\n if (Array.isArray(value)) {\n cookies.push(...value);\n } else {\n cookies.push(value);\n }\n } else {\n headers[key] = Array.isArray(value) ? value.join(\", \") : String(value);\n }\n }\n\n const result: LambdaResponse = {\n body: isBase64Encoded ? body.toString(\"base64\") : body.toString(\"utf8\"),\n headers,\n isBase64Encoded,\n statusCode: this.statusCode,\n };\n\n // Only include cookies if present (v2 format)\n if (cookies.length > 0) {\n result.cookies = cookies;\n }\n\n return result;\n }\n\n private isBinaryContentType(contentType: string): boolean {\n return BINARY_CONTENT_TYPE_PATTERNS.some((pattern) =>\n pattern.test(contentType),\n );\n }\n}\n\nexport default LambdaResponseBuffered;\n","import type { OutgoingHttpHeaders } from \"node:http\";\nimport { ServerResponse } from \"node:http\";\nimport { Writable } from \"node:stream\";\n\nimport type {\n AwsLambdaGlobal,\n HttpResponseStreamMetadata,\n ResponseStream,\n} from \"./types.js\";\n\n//\n//\n// Constants\n//\n\n// Symbol to identify Lambda streaming responses. Uses Symbol.for() to ensure\n// the same symbol is used across bundles/realms. Survives prototype manipulation.\nexport const JAYPIE_LAMBDA_STREAMING = Symbol.for(\n \"@jaypie/express/LambdaStreaming\",\n);\n\n// Get Node's internal kOutHeaders symbol from ServerResponse prototype.\n// This is needed for compatibility with Datadog dd-trace instrumentation,\n// which patches HTTP methods and expects this internal state to exist.\nconst kOutHeaders = Object.getOwnPropertySymbols(ServerResponse.prototype).find(\n (s) => s.toString() === \"Symbol(kOutHeaders)\",\n);\n\n//\n//\n// Declare awslambda global (provided by Lambda runtime)\n//\n\ndeclare const awslambda: AwsLambdaGlobal;\n\n//\n//\n// Types\n//\n\ninterface PendingWrite {\n callback: () => void;\n chunk: Buffer;\n}\n\n//\n//\n// LambdaResponseStreaming Class\n//\n\n/**\n * Mock ServerResponse that streams directly to Lambda responseStream.\n * Uses awslambda.HttpResponseStream.from() to set status and headers.\n */\nexport class LambdaResponseStreaming extends Writable {\n public statusCode: number = 200;\n public statusMessage: string = \"OK\";\n\n // Mock socket to satisfy Express/finalhandler checks\n public readonly socket: { remoteAddress: string } = {\n remoteAddress: \"127.0.0.1\",\n };\n\n // Internal state exposed for direct manipulation by safe response methods\n // that need to bypass dd-trace interception\n public _headers: Map<string, string | string[]> = new Map();\n public _headersSent: boolean = false;\n private _pendingWrites: PendingWrite[] = [];\n private _responseStream: ResponseStream;\n private _wrappedStream: ResponseStream | null = null;\n\n constructor(responseStream: ResponseStream) {\n super();\n this._responseStream = responseStream;\n // Mark as Lambda streaming response using Symbol for reliable detection.\n // Survives prototype manipulation from Express and dd-trace.\n (this as unknown as Record<symbol, unknown>)[JAYPIE_LAMBDA_STREAMING] =\n true;\n // DIAGNOSTIC: Log symbol assignment\n console.log(\"[DIAG:LambdaResponseStreaming:constructor] Symbol set\", {\n symbolValue: (this as unknown as Record<symbol, unknown>)[\n JAYPIE_LAMBDA_STREAMING\n ],\n });\n // Initialize Node's internal kOutHeaders for dd-trace compatibility.\n // dd-trace patches HTTP methods and expects this internal state.\n if (kOutHeaders) {\n (this as Record<symbol, unknown>)[kOutHeaders] = Object.create(null);\n }\n\n // CRITICAL: Define key methods as instance properties to survive Express's\n // setPrototypeOf(res, app.response) in middleware/init.js which would\n // otherwise replace our prototype with ServerResponse.prototype.\n // Instance properties take precedence over prototype properties.\n this.getHeader = this.getHeader.bind(this);\n this.setHeader = this.setHeader.bind(this);\n this.removeHeader = this.removeHeader.bind(this);\n this.hasHeader = this.hasHeader.bind(this);\n this.getHeaders = this.getHeaders.bind(this);\n this.getHeaderNames = this.getHeaderNames.bind(this);\n this.writeHead = this.writeHead.bind(this);\n this.flushHeaders = this.flushHeaders.bind(this);\n this.get = this.get.bind(this);\n this.set = this.set.bind(this);\n this.status = this.status.bind(this);\n this.json = this.json.bind(this);\n this.send = this.send.bind(this);\n this.vary = this.vary.bind(this);\n this.end = this.end.bind(this);\n this.write = this.write.bind(this);\n // Also bind internal Writable methods that are called via prototype chain\n this._write = this._write.bind(this);\n this._final = this._final.bind(this);\n }\n\n //\n // Internal bypass methods - completely avoid prototype chain lookup\n // These directly access _headers Map, safe from dd-trace interception\n //\n\n _internalGetHeader(name: string): string | undefined {\n const value = this._headers.get(name.toLowerCase());\n return value ? String(value) : undefined;\n }\n\n _internalSetHeader(name: string, value: string): void {\n if (!this._headersSent) {\n const lowerName = name.toLowerCase();\n this._headers.set(lowerName, value);\n // Also sync kOutHeaders for any code that expects it\n if (kOutHeaders) {\n const outHeaders = (\n this as unknown as Record<symbol, Record<string, unknown>>\n )[kOutHeaders];\n if (outHeaders) {\n outHeaders[lowerName] = [name, value];\n }\n }\n }\n }\n\n _internalHasHeader(name: string): boolean {\n return this._headers.has(name.toLowerCase());\n }\n\n _internalRemoveHeader(name: string): void {\n if (!this._headersSent) {\n const lowerName = name.toLowerCase();\n this._headers.delete(lowerName);\n if (kOutHeaders) {\n const outHeaders = (\n this as unknown as Record<symbol, Record<string, unknown>>\n )[kOutHeaders];\n if (outHeaders) {\n delete outHeaders[lowerName];\n }\n }\n }\n }\n\n //\n // Header management\n //\n\n setHeader(name: string, value: number | string | string[]): this {\n if (this._headersSent) {\n // In streaming mode, log warning but don't throw\n // Headers cannot be changed after body starts\n return this;\n }\n const lowerName = name.toLowerCase();\n this._headers.set(lowerName, String(value));\n // Sync with kOutHeaders for dd-trace compatibility\n // Node stores as { 'header-name': ['Header-Name', value] }\n if (kOutHeaders) {\n const outHeaders = (\n this as unknown as Record<symbol, Record<string, unknown>>\n )[kOutHeaders];\n if (outHeaders) {\n outHeaders[lowerName] = [name, String(value)];\n }\n }\n return this;\n }\n\n getHeader(name: string): number | string | string[] | undefined {\n return this._headers.get(name.toLowerCase());\n }\n\n removeHeader(name: string): void {\n if (!this._headersSent) {\n const lowerName = name.toLowerCase();\n this._headers.delete(lowerName);\n // Sync with kOutHeaders for dd-trace compatibility\n if (kOutHeaders) {\n const outHeaders = (\n this as unknown as Record<symbol, Record<string, unknown>>\n )[kOutHeaders];\n if (outHeaders) {\n delete outHeaders[lowerName];\n }\n }\n }\n }\n\n getHeaders(): OutgoingHttpHeaders {\n const headers: OutgoingHttpHeaders = {};\n for (const [key, value] of this._headers) {\n headers[key] = value;\n }\n return headers;\n }\n\n hasHeader(name: string): boolean {\n return this._headers.has(name.toLowerCase());\n }\n\n getHeaderNames(): string[] {\n return Array.from(this._headers.keys());\n }\n\n /**\n * Proxy for direct header access (e.g., res.headers['content-type']).\n * Required for compatibility with middleware like helmet that access headers directly.\n * Uses direct _headers access to bypass dd-trace interception.\n */\n get headers(): Record<string, string | string[] | undefined> {\n return new Proxy(\n {},\n {\n deleteProperty: (_target, prop) => {\n if (!this._headersSent) {\n this._headers.delete(String(prop).toLowerCase());\n }\n return true;\n },\n get: (_target, prop) => {\n if (typeof prop === \"symbol\") return undefined;\n return this._headers.get(String(prop).toLowerCase());\n },\n getOwnPropertyDescriptor: (_target, prop) => {\n const lowerProp = String(prop).toLowerCase();\n if (this._headers.has(lowerProp)) {\n return {\n configurable: true,\n enumerable: true,\n value: this._headers.get(lowerProp),\n };\n }\n return undefined;\n },\n has: (_target, prop) => {\n return this._headers.has(String(prop).toLowerCase());\n },\n ownKeys: () => {\n return Array.from(this._headers.keys());\n },\n set: (_target, prop, value) => {\n if (!this._headersSent) {\n this._headers.set(String(prop).toLowerCase(), value);\n }\n return true;\n },\n },\n );\n }\n\n writeHead(\n statusCode: number,\n statusMessageOrHeaders?: OutgoingHttpHeaders | string,\n headers?: OutgoingHttpHeaders,\n ): this {\n if (this._headersSent) {\n return this;\n }\n\n this.statusCode = statusCode;\n\n let headersToSet: OutgoingHttpHeaders | undefined;\n\n if (typeof statusMessageOrHeaders === \"string\") {\n this.statusMessage = statusMessageOrHeaders;\n headersToSet = headers;\n } else if (\n statusMessageOrHeaders &&\n typeof statusMessageOrHeaders === \"object\"\n ) {\n headersToSet = statusMessageOrHeaders;\n }\n\n if (headersToSet) {\n // Use direct _headers access to bypass dd-trace interception\n for (const [key, value] of Object.entries(headersToSet)) {\n if (value !== undefined) {\n this._headers.set(key.toLowerCase(), String(value));\n }\n }\n }\n\n this.flushHeaders();\n return this;\n }\n\n get headersSent(): boolean {\n return this._headersSent;\n }\n\n flushHeaders(): void {\n // DIAGNOSTIC: Log every flushHeaders call with stack trace\n const caller = new Error().stack?.split(\"\\n\").slice(1, 5).join(\"\\n\");\n console.log(\"[DIAG:LambdaResponseStreaming:flushHeaders] Called\", {\n statusCode: this.statusCode,\n headersSent: this._headersSent,\n caller,\n });\n\n if (this._headersSent) {\n console.log(\n \"[DIAG:LambdaResponseStreaming:flushHeaders] Already sent, returning early\",\n );\n return;\n }\n\n const headers: Record<string, string> = {};\n for (const [key, value] of this._headers) {\n headers[key] = Array.isArray(value) ? value.join(\", \") : String(value);\n }\n\n const metadata: HttpResponseStreamMetadata = {\n headers,\n statusCode: this.statusCode,\n };\n\n // DIAGNOSTIC: Log what we're sending to Lambda\n console.log(\n \"[DIAG:LambdaResponseStreaming:flushHeaders] Creating wrapped stream\",\n {\n metadata,\n },\n );\n\n // Wrap the stream with metadata using awslambda global\n this._wrappedStream = awslambda.HttpResponseStream.from(\n this._responseStream,\n metadata,\n );\n this._headersSent = true;\n\n // Flush pending writes\n for (const { callback, chunk } of this._pendingWrites) {\n this._wrappedStream.write(chunk);\n callback();\n }\n this._pendingWrites = [];\n }\n\n //\n // Express compatibility methods\n //\n\n /**\n * Express-style alias for getHeader().\n * Used by middleware like decorateResponse that use res.get().\n * Note: Directly accesses _headers to avoid prototype chain issues with bundled code.\n */\n get(name: string): number | string | string[] | undefined {\n return this._headers.get(name.toLowerCase());\n }\n\n /**\n * Express-style alias for setHeader().\n * Used by middleware like decorateResponse that use res.set().\n * Note: Directly accesses _headers to avoid prototype chain issues with bundled code.\n */\n set(name: string, value: number | string | string[]): this {\n if (!this._headersSent) {\n this._headers.set(name.toLowerCase(), String(value));\n }\n return this;\n }\n\n status(code: number): this {\n // DIAGNOSTIC: Log status code changes\n const caller = new Error().stack?.split(\"\\n\").slice(1, 4).join(\"\\n\");\n console.log(\"[DIAG:LambdaResponseStreaming:status] Setting status\", {\n newCode: code,\n previousCode: this.statusCode,\n headersSent: this._headersSent,\n caller,\n });\n this.statusCode = code;\n return this;\n }\n\n json(data: unknown): this {\n // Use direct _headers access to bypass dd-trace interception\n this._headers.set(\"content-type\", \"application/json\");\n this.end(JSON.stringify(data));\n return this;\n }\n\n send(body?: Buffer | object | string): this {\n if (typeof body === \"object\" && !Buffer.isBuffer(body)) {\n return this.json(body);\n }\n this.end(body);\n return this;\n }\n\n /**\n * Add a field to the Vary response header.\n * Used by CORS middleware to indicate response varies by Origin.\n * Uses direct _headers access to bypass dd-trace interception.\n */\n vary(field: string): this {\n const existing = this._headers.get(\"vary\");\n if (!existing) {\n this._headers.set(\"vary\", field);\n } else {\n // Append to existing Vary header if field not already present\n const fields = String(existing)\n .split(\",\")\n .map((f) => f.trim().toLowerCase());\n if (!fields.includes(field.toLowerCase())) {\n this._headers.set(\"vary\", `${existing}, ${field}`);\n }\n }\n return this;\n }\n\n //\n // Writable stream implementation\n //\n\n _write(\n chunk: Buffer | string,\n encoding: BufferEncoding, // eslint-disable-line no-undef\n callback: (error?: Error | null) => void,\n ): void {\n const buffer = Buffer.isBuffer(chunk)\n ? chunk\n : Buffer.from(chunk, encoding);\n\n // DIAGNOSTIC: Log every write\n console.log(\"[DIAG:LambdaResponseStreaming:_write] Called\", {\n chunkLength: buffer.length,\n headersSent: this._headersSent,\n statusCode: this.statusCode,\n });\n\n if (!this._headersSent) {\n // Buffer writes until headers are sent\n this._pendingWrites.push({ callback: () => callback(), chunk: buffer });\n // Auto-flush headers on first write\n console.log(\n \"[DIAG:LambdaResponseStreaming:_write] Auto-flushing headers on first write\",\n );\n this.flushHeaders();\n } else {\n this._wrappedStream!.write(buffer);\n callback();\n }\n }\n\n _final(callback: (error?: Error | null) => void): void {\n // DIAGNOSTIC: Log _final call\n console.log(\"[DIAG:LambdaResponseStreaming:_final] Called\", {\n headersSent: this._headersSent,\n statusCode: this.statusCode,\n hasWrappedStream: !!this._wrappedStream,\n });\n\n if (!this._headersSent) {\n console.log(\n \"[DIAG:LambdaResponseStreaming:_final] Headers not sent, flushing now\",\n );\n this.flushHeaders();\n }\n\n if (this._wrappedStream) {\n // FIX #178: Write empty chunk to force Lambda to process metadata\n // Without this, 204 responses have no writes and Lambda ignores our statusCode/headers\n console.log(\n \"[DIAG:LambdaResponseStreaming:_final] Writing empty chunk for metadata\",\n );\n this._wrappedStream.write(\"\");\n this._wrappedStream.end();\n }\n // Use setImmediate to ensure stream operations complete before callback\n setImmediate(callback);\n }\n}\n\nexport default LambdaResponseStreaming;\n","import type { Application, Request, Response } from \"express\";\n\nimport { createLambdaRequest, LambdaRequest } from \"./LambdaRequest.js\";\nimport LambdaResponseBuffered from \"./LambdaResponseBuffered.js\";\nimport LambdaResponseStreaming from \"./LambdaResponseStreaming.js\";\nimport type {\n AwsLambdaGlobal,\n CreateLambdaHandlerOptions,\n LambdaContext,\n LambdaEvent,\n LambdaHandler,\n LambdaResponse,\n LambdaStreamHandler,\n ResponseStream,\n} from \"./types.js\";\n\n//\n//\n// Declare awslambda global (provided by Lambda runtime)\n// This may be undefined in non-Lambda environments\n//\n\ndeclare const awslambda: AwsLambdaGlobal | undefined;\n\n//\n//\n// Current Invoke Context\n//\n\nlet currentInvoke: { context: LambdaContext; event: LambdaEvent } | null = null;\n\n/**\n * Get the current Lambda invoke context.\n * Used by getCurrentInvokeUuid adapter to get the request ID.\n */\nexport function getCurrentInvoke(): {\n context: LambdaContext;\n event: LambdaEvent;\n} | null {\n return currentInvoke;\n}\n\n/**\n * Set the current Lambda invoke context.\n * Called at the start of each Lambda invocation.\n */\nfunction setCurrentInvoke(event: LambdaEvent, context: LambdaContext): void {\n currentInvoke = { context, event };\n}\n\n/**\n * Clear the current Lambda invoke context.\n * Called at the end of each Lambda invocation.\n */\nfunction clearCurrentInvoke(): void {\n currentInvoke = null;\n}\n\n//\n//\n// Express App Runner\n//\n\n/**\n * Run Express app with mock request/response.\n * Returns a promise that resolves when the response is complete.\n */\nfunction runExpressApp(\n app: Application,\n req: LambdaRequest,\n res: LambdaResponseBuffered | LambdaResponseStreaming,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n // Listen for response completion\n res.on(\"finish\", resolve);\n res.on(\"error\", reject);\n\n // Run the Express app\n // Cast to Express types since our mocks implement the required interface\n app(req as unknown as Request, res as unknown as Response);\n });\n}\n\n//\n//\n// Buffered Handler Factory\n//\n\n/**\n * Create a Lambda handler that buffers the Express response.\n * Returns the complete response as a Lambda response object.\n *\n * @example\n * ```typescript\n * import express from \"express\";\n * import { createLambdaHandler } from \"@jaypie/express\";\n *\n * const app = express();\n * app.get(\"/\", (req, res) => res.json({ message: \"Hello\" }));\n *\n * export const handler = createLambdaHandler(app);\n * ```\n */\nexport function createLambdaHandler(\n app: Application,\n _options?: CreateLambdaHandlerOptions,\n): LambdaHandler {\n return async (\n event: LambdaEvent,\n context: LambdaContext,\n ): Promise<LambdaResponse> => {\n let result: LambdaResponse | undefined;\n try {\n // Set current invoke for getCurrentInvokeUuid\n setCurrentInvoke(event, context);\n\n // Create mock request from Lambda event\n const req = createLambdaRequest(event, context);\n\n // Create buffered response collector\n const res = new LambdaResponseBuffered();\n\n // Run Express app\n await runExpressApp(app, req, res);\n\n // Get Lambda response - await explicitly to ensure we have the result\n result = await res.getResult();\n\n return result;\n } catch (error) {\n // Log any unhandled errors\n console.error(\"[createLambdaHandler] Unhandled error:\", error);\n if (error instanceof Error) {\n console.error(\"[createLambdaHandler] Stack:\", error.stack);\n }\n\n // Return a proper error response instead of throwing\n return {\n statusCode: 500,\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n errors: [\n {\n status: 500,\n title: \"Internal Server Error\",\n detail:\n error instanceof Error\n ? error.message\n : \"Unknown error occurred\",\n },\n ],\n }),\n isBase64Encoded: false,\n };\n } finally {\n // Clear current invoke context\n clearCurrentInvoke();\n }\n };\n}\n\n//\n//\n// Streaming Handler Factory\n//\n\n/**\n * Create a Lambda handler that streams the Express response.\n * Uses awslambda.streamifyResponse() for Lambda response streaming.\n *\n * @example\n * ```typescript\n * import express from \"express\";\n * import { createLambdaStreamHandler } from \"@jaypie/express\";\n *\n * const app = express();\n * app.get(\"/stream\", (req, res) => {\n * res.setHeader(\"Content-Type\", \"text/event-stream\");\n * res.write(\"data: Hello\\n\\n\");\n * res.end();\n * });\n *\n * export const handler = createLambdaStreamHandler(app);\n * ```\n */\nexport function createLambdaStreamHandler(\n app: Application,\n _options?: CreateLambdaHandlerOptions,\n): LambdaStreamHandler {\n // Wrap with awslambda.streamifyResponse for Lambda streaming\n // @ts-expect-error awslambda is a Lambda runtime global\n return awslambda.streamifyResponse(\n async (\n event: LambdaEvent,\n responseStream: ResponseStream,\n context: LambdaContext,\n ): Promise<void> => {\n try {\n // Set current invoke for getCurrentInvokeUuid\n setCurrentInvoke(event, context);\n\n // Create mock request from Lambda event\n const req = createLambdaRequest(event, context);\n\n // Create streaming response that pipes to Lambda responseStream\n const res = new LambdaResponseStreaming(responseStream);\n\n // Run Express app\n await runExpressApp(app, req, res);\n } finally {\n // Clear current invoke context\n clearCurrentInvoke();\n }\n },\n );\n}\n\n//\n//\n// Re-exports\n//\n\nexport { LambdaRequest, createLambdaRequest } from \"./LambdaRequest.js\";\nexport { LambdaResponseBuffered } from \"./LambdaResponseBuffered.js\";\nexport { LambdaResponseStreaming } from \"./LambdaResponseStreaming.js\";\nexport type {\n ApiGatewayV1Event,\n AwsLambdaGlobal,\n CreateLambdaHandlerOptions,\n FunctionUrlEvent,\n HttpResponseStreamMetadata,\n LambdaContext,\n LambdaEvent,\n LambdaHandler,\n LambdaHandlerFactory,\n LambdaResponse,\n LambdaStreamHandler,\n LambdaStreamHandlerFactory,\n ResponseStream,\n} from \"./types.js\";\n","//\n//\n// Constants\n//\n\nexport const EXPRESS = {\n PATH: {\n ANY: \"*\",\n ID: \"/:id\",\n ROOT: /^\\/?$/,\n },\n} as const;\n\nexport type ExpressConstants = typeof EXPRESS;\n","import type { Request, Response, NextFunction } from \"express\";\nimport { CorsError } from \"@jaypie/errors\";\nimport { envBoolean, force } from \"@jaypie/kit\";\nimport expressCors from \"cors\";\n\n//\n//\n// Constants\n//\n\nconst HTTP_PROTOCOL = \"http://\";\nconst HTTPS_PROTOCOL = \"https://\";\nconst SANDBOX_ENV = \"sandbox\";\n\n//\n//\n// Types\n//\n\nexport interface CorsConfig {\n origin?: string | string[];\n overrides?: Record<string, unknown>;\n}\n\ntype CorsCallback = (err: Error | null, allow?: boolean) => void;\n\n//\n//\n// Helper Functions\n//\n\nconst ensureProtocol = (url: string | undefined): string | undefined => {\n if (!url) return url;\n if (url.startsWith(HTTP_PROTOCOL) || url.startsWith(HTTPS_PROTOCOL))\n return url;\n return HTTPS_PROTOCOL + url;\n};\n\nconst extractHostname = (origin: string): string | undefined => {\n try {\n const url = new URL(origin);\n return url.hostname;\n } catch {\n return undefined;\n }\n};\n\nconst isOriginAllowed = (requestOrigin: string, allowed: string): boolean => {\n const normalizedAllowed = ensureProtocol(allowed) as string;\n const normalizedRequest = ensureProtocol(requestOrigin) as string;\n\n const allowedHostname = extractHostname(normalizedAllowed);\n const requestHostname = extractHostname(normalizedRequest);\n\n if (!allowedHostname || !requestHostname) {\n return false;\n }\n\n // Exact match\n if (requestHostname === allowedHostname) {\n return true;\n }\n\n // Subdomain match\n if (requestHostname.endsWith(`.${allowedHostname}`)) {\n return true;\n }\n\n return false;\n};\n\nexport const dynamicOriginCallbackHandler = (\n origin?: string | string[],\n): ((requestOrigin: string | undefined, callback: CorsCallback) => void) => {\n return (requestOrigin: string | undefined, callback: CorsCallback) => {\n // Handle wildcard origin\n if (origin === \"*\") {\n callback(null, true);\n return;\n }\n\n // Allow requests with no origin (like mobile apps, curl, etc)\n if (!requestOrigin) {\n callback(null, true);\n return;\n }\n\n const allowedOrigins: (string | RegExp)[] = [];\n if (process.env.BASE_URL) {\n allowedOrigins.push(ensureProtocol(process.env.BASE_URL) as string);\n }\n if (process.env.PROJECT_BASE_URL) {\n allowedOrigins.push(\n ensureProtocol(process.env.PROJECT_BASE_URL) as string,\n );\n }\n if (origin) {\n const additionalOrigins = force.array<string>(origin);\n allowedOrigins.push(...additionalOrigins);\n }\n\n // Add localhost origins in sandbox\n if (\n process.env.PROJECT_ENV === SANDBOX_ENV ||\n envBoolean(\"PROJECT_SANDBOX_MODE\")\n ) {\n allowedOrigins.push(\"http://localhost\");\n allowedOrigins.push(/^http:\\/\\/localhost:\\d+$/);\n }\n\n const isAllowed = allowedOrigins.some((allowed) => {\n if (allowed instanceof RegExp) {\n return allowed.test(requestOrigin);\n }\n return isOriginAllowed(requestOrigin, allowed);\n });\n\n if (isAllowed) {\n callback(null, true);\n } else {\n callback(new CorsError());\n }\n };\n};\n\n//\n//\n// Main\n//\n\nconst corsHelper = (\n config: CorsConfig = {},\n): ReturnType<typeof expressCors> => {\n const { origin, overrides = {} } = config;\n\n const options = {\n origin: dynamicOriginCallbackHandler(origin),\n // * The default behavior is to allow any headers and methods so they are not included here\n ...overrides,\n };\n\n return expressCors(options);\n};\n\n//\n//\n// Constants\n//\n\nconst HTTP_CODE_NO_CONTENT = 204;\nconst HTTP_METHOD_OPTIONS = \"OPTIONS\";\n\n//\n//\n// Export\n//\n\ninterface CorsErrorWithBody extends Error {\n status: number;\n body: () => Record<string, unknown>;\n}\n\n/**\n * CORS middleware with Lambda streaming support.\n *\n * For OPTIONS preflight requests, this middleware handles them early and\n * terminates the response immediately. This is critical for Lambda streaming\n * handlers where the response stream would otherwise stay open waiting for\n * streaming data that never comes.\n *\n * For regular requests, delegates to the standard cors package behavior.\n */\nexport default (\n config?: CorsConfig,\n): ((req: Request, res: Response, next: NextFunction) => void) => {\n const cors = corsHelper(config);\n const { origin, overrides = {} } = config || {};\n const originHandler = dynamicOriginCallbackHandler(origin);\n\n return (req: Request, res: Response, next: NextFunction) => {\n // Handle OPTIONS preflight requests early for Lambda streaming compatibility.\n // The standard cors package would eventually call res.end(), but with Lambda\n // streaming, we need to ensure the response is terminated immediately without\n // going through any async middleware chains that might keep the stream open.\n if (req.method === HTTP_METHOD_OPTIONS) {\n const requestOrigin = req.headers.origin;\n\n originHandler(requestOrigin, (error, isAllowed) => {\n if (error || !isAllowed) {\n // Origin not allowed - send CORS error\n const corsError = error as CorsErrorWithBody;\n if (corsError?.status && corsError?.body) {\n res.status(corsError.status);\n res.setHeader(\"Content-Type\", \"application/json\");\n res.json(corsError.body());\n } else {\n // Fallback for non-CorsError errors\n res.status(HTTP_CODE_NO_CONTENT);\n if (typeof res.flushHeaders === \"function\") {\n res.flushHeaders();\n }\n res.end();\n }\n return;\n }\n\n // Origin is allowed - send preflight response\n // Set CORS headers\n if (requestOrigin) {\n res.setHeader(\"Access-Control-Allow-Origin\", requestOrigin);\n }\n res.setHeader(\"Vary\", \"Origin\");\n\n // Allow all methods by default (or use overrides if specified)\n const methods =\n (overrides.methods as string) || \"GET,HEAD,PUT,PATCH,POST,DELETE\";\n res.setHeader(\"Access-Control-Allow-Methods\", methods);\n\n // Reflect requested headers (standard cors behavior)\n const requestedHeaders = req.headers[\"access-control-request-headers\"];\n if (requestedHeaders) {\n res.setHeader(\"Access-Control-Allow-Headers\", requestedHeaders);\n }\n\n // Handle credentials if configured\n if (overrides.credentials === true) {\n res.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\n }\n\n // Handle max age if configured\n if (overrides.maxAge !== undefined) {\n res.setHeader(\"Access-Control-Max-Age\", String(overrides.maxAge));\n }\n\n // Send 204 No Content response and terminate immediately\n // This is critical for Lambda streaming - we must end the response\n // synchronously to prevent the stream from hanging.\n // CRITICAL: Flush headers first to initialize the Lambda stream wrapper.\n // Without this, _wrappedStream may be null when _final() is called,\n // causing the Lambda response stream to never close.\n res.statusCode = HTTP_CODE_NO_CONTENT;\n res.setHeader(\"Content-Length\", \"0\");\n if (typeof res.flushHeaders === \"function\") {\n res.flushHeaders();\n }\n res.end();\n });\n return;\n }\n\n // For non-OPTIONS requests, use the standard cors middleware\n cors(req, res, (error?: Error | null) => {\n if (error) {\n const corsError = error as CorsErrorWithBody;\n res.status(corsError.status);\n res.setHeader(\"Content-Type\", \"application/json\");\n return res.json(corsError.body());\n }\n next();\n });\n };\n};\n","import type { Request } from \"express\";\n\nimport { getCurrentInvoke } from \"./adapter/index.js\";\n\n//\n//\n// Helper Functions\n//\n\n/**\n * Get UUID from Jaypie Lambda adapter context.\n * This is set by createLambdaHandler/createLambdaStreamHandler.\n */\nfunction getJaypieAdapterUuid(): string | undefined {\n const currentInvoke = getCurrentInvoke();\n if (currentInvoke?.context?.awsRequestId) {\n return currentInvoke.context.awsRequestId;\n }\n return undefined;\n}\n\n/**\n * Get UUID from request object if it has Lambda context attached.\n * The Jaypie adapter attaches _lambdaContext to the request.\n */\nfunction getRequestContextUuid(req?: Request): string | undefined {\n if (req && (req as unknown as Record<string, unknown>)._lambdaContext) {\n const lambdaContext = (req as unknown as Record<string, unknown>)\n ._lambdaContext as {\n awsRequestId?: string;\n };\n if (lambdaContext.awsRequestId) {\n return lambdaContext.awsRequestId;\n }\n }\n return undefined;\n}\n\n//\n//\n// Main\n//\n\n/**\n * Get the current invoke UUID from Lambda context.\n * Works with Jaypie Lambda adapter (createLambdaHandler/createLambdaStreamHandler).\n *\n * @param req - Optional Express request object. Used to extract context\n * from Jaypie adapter's _lambdaContext.\n * @returns The AWS request ID or undefined if not in Lambda context\n */\nfunction getCurrentInvokeUuid(req?: Request): string | undefined {\n // Priority 1: Request has Lambda context attached (Jaypie adapter)\n const requestContextUuid = getRequestContextUuid(req);\n if (requestContextUuid) {\n return requestContextUuid;\n }\n\n // Priority 2: Global context from Jaypie adapter\n return getJaypieAdapterUuid();\n}\n\n//\n//\n// Export\n//\n\nexport default getCurrentInvokeUuid;\n","import type { Response } from \"express\";\nimport { HTTP, JAYPIE } from \"@jaypie/kit\";\nimport { log as publicLogger } from \"@jaypie/logger\";\n\nimport getCurrentInvokeUuid from \"./getCurrentInvokeUuid.adapter.js\";\n\n//\n//\n// Types\n//\n\ninterface DecorateResponseOptions {\n handler?: string;\n version?: string;\n}\n\n// Extended response type that may have _headers Map and internal bypass methods (Lambda adapter)\ninterface ExtendedResponse extends Response {\n _headers?: Map<string, string | string[]>;\n // Internal bypass methods added for dd-trace compatibility\n _internalGetHeader?: (name: string) => string | undefined;\n _internalSetHeader?: (name: string, value: string) => void;\n}\n\n//\n//\n// Helpers\n//\n\n/**\n * Safely get a header value from response.\n * Handles both Express Response and Lambda adapter responses.\n * Defensive against dd-trace instrumentation issues.\n */\nfunction safeGetHeader(\n res: ExtendedResponse,\n name: string,\n): string | undefined {\n try {\n // Try internal method first (completely bypasses dd-trace)\n if (typeof res._internalGetHeader === \"function\") {\n return res._internalGetHeader(name);\n }\n // Fall back to _headers Map access (Lambda adapter, avoids dd-trace)\n if (res._headers instanceof Map) {\n const value = res._headers.get(name.toLowerCase());\n return value ? String(value) : undefined;\n }\n // Fall back to getHeader (more standard than get)\n if (typeof res.getHeader === \"function\") {\n const value = res.getHeader(name);\n return value ? String(value) : undefined;\n }\n // Last resort: try get\n if (typeof res.get === \"function\") {\n const value = res.get(name);\n return value ? String(value) : undefined;\n }\n } catch {\n // Silently fail - caller will handle missing value\n }\n return undefined;\n}\n\n/**\n * Safely set a header value on response.\n * Handles both Express Response and Lambda adapter responses.\n * Defensive against dd-trace instrumentation issues.\n */\nfunction safeSetHeader(\n res: ExtendedResponse,\n name: string,\n value: string,\n): void {\n try {\n // Try internal method first (completely bypasses dd-trace)\n if (typeof res._internalSetHeader === \"function\") {\n res._internalSetHeader(name, value);\n return;\n }\n // Fall back to _headers Map access (Lambda adapter, avoids dd-trace)\n if (res._headers instanceof Map) {\n res._headers.set(name.toLowerCase(), value);\n return;\n }\n // Fall back to setHeader (more standard than set)\n if (typeof res.setHeader === \"function\") {\n res.setHeader(name, value);\n return;\n }\n // Last resort: try set\n if (typeof res.set === \"function\") {\n res.set(name, value);\n }\n } catch {\n // Silently fail - header just won't be set\n }\n}\n\n//\n//\n// Main\n//\n\nconst decorateResponse = (\n res: Response,\n {\n handler = \"\",\n version = process.env.PROJECT_VERSION,\n }: DecorateResponseOptions = {},\n): void => {\n const log = publicLogger.lib({\n lib: JAYPIE.LIB.EXPRESS,\n });\n\n //\n //\n // Validate\n //\n if (typeof res !== \"object\" || res === null) {\n log.warn(\"decorateResponse called but response is not an object\");\n return;\n }\n\n const extRes = res as ExtendedResponse;\n\n try {\n //\n //\n // Decorate Headers\n //\n\n // X-Powered-By, override \"Express\" but nothing else\n const currentPoweredBy = safeGetHeader(extRes, HTTP.HEADER.POWERED_BY);\n if (!currentPoweredBy || currentPoweredBy === \"Express\") {\n // DIAGNOSTIC: Include dev marker to verify build deployment\n safeSetHeader(\n extRes,\n HTTP.HEADER.POWERED_BY,\n `${JAYPIE.LIB.EXPRESS}@1.2.11-dev`,\n );\n }\n\n // X-Project-Environment\n if (process.env.PROJECT_ENV) {\n safeSetHeader(\n extRes,\n HTTP.HEADER.PROJECT.ENVIRONMENT,\n process.env.PROJECT_ENV,\n );\n }\n\n // X-Project-Handler\n if (handler) {\n safeSetHeader(extRes, HTTP.HEADER.PROJECT.HANDLER, handler);\n }\n\n // X-Project-Invocation\n const currentInvoke = getCurrentInvokeUuid();\n if (currentInvoke) {\n safeSetHeader(extRes, HTTP.HEADER.PROJECT.INVOCATION, currentInvoke);\n }\n\n // X-Project-Key\n if (process.env.PROJECT_KEY) {\n safeSetHeader(extRes, HTTP.HEADER.PROJECT.KEY, process.env.PROJECT_KEY);\n }\n\n // X-Project-Version\n if (version) {\n safeSetHeader(extRes, HTTP.HEADER.PROJECT.VERSION, version);\n }\n\n //\n //\n // Error Handling\n //\n } catch (error) {\n log.warn(\"decorateResponse caught an internal error\");\n log.var({ error });\n }\n};\n\n//\n//\n// Export\n//\n\nexport default decorateResponse;\n\n//\n//\n// Footnotes\n//\n\n// This is a \"utility\" function but it needs a lot of \"context\"\n// about the environment's secret parameters, the special adapter,\n// HTTP, etc. There must be a better way to organize this\n","import type { Request } from \"express\";\n\n//\n//\n// Types\n//\n\nexport interface RequestSummary {\n baseUrl: string;\n body: unknown;\n headers: Request[\"headers\"];\n method: string;\n query: Request[\"query\"];\n url: string;\n}\n\n//\n//\n// Function Definition\n//\n\nfunction summarizeRequest(req: Request): RequestSummary {\n // If body is a buffer, convert it to a string\n let { body } = req;\n if (Buffer.isBuffer(body)) {\n body = body.toString();\n }\n\n return {\n baseUrl: req.baseUrl,\n body,\n headers: req.headers,\n method: req.method,\n query: req.query,\n url: req.url,\n };\n}\n\n//\n//\n// Export\n//\n\nexport default summarizeRequest;\n","import type { Response } from \"express\";\n\n//\n//\n// Types\n//\n\nexport interface ResponseSummary {\n statusCode: number;\n statusMessage: string;\n headers?: ReturnType<Response[\"getHeaders\"]>;\n [key: string]: unknown;\n}\n\n//\n//\n// Function Definition\n//\n\nfunction summarizeResponse(\n res: Response,\n extras?: Record<string, unknown>,\n): ResponseSummary {\n const response: ResponseSummary = {\n statusCode: res.statusCode,\n statusMessage: res.statusMessage,\n };\n if (typeof res.getHeaders === \"function\") {\n response.headers = res.getHeaders();\n }\n if (typeof extras === \"object\" && extras !== null) {\n Object.assign(response, extras);\n }\n return response;\n}\n\n//\n//\n// Export\n//\n\nexport default summarizeResponse;\n","import type { Request, Response } from \"express\";\nimport { loadEnvSecrets } from \"@jaypie/aws\";\nimport { BadRequestError, UnhandledError } from \"@jaypie/errors\";\nimport { force, getHeaderFrom, HTTP, JAYPIE, jaypieHandler } from \"@jaypie/kit\";\nimport { log as publicLogger } from \"@jaypie/logger\";\nimport { DATADOG, hasDatadogEnv, submitMetric } from \"@jaypie/datadog\";\n\nimport { JAYPIE_LAMBDA_MOCK } from \"./adapter/LambdaResponseBuffered.js\";\nimport { JAYPIE_LAMBDA_STREAMING } from \"./adapter/LambdaResponseStreaming.js\";\nimport getCurrentInvokeUuid from \"./getCurrentInvokeUuid.adapter.js\";\nimport decorateResponse from \"./decorateResponse.helper.js\";\nimport summarizeRequest from \"./summarizeRequest.helper.js\";\nimport summarizeResponse from \"./summarizeResponse.helper.js\";\n\n//\n//\n// Types\n//\n\n// Extended logger interface for features not in the base type definitions\ninterface ExtendedLogger {\n init: () => void;\n level: string;\n debug: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n error: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n fatal: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n info: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n trace: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n warn: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n var(key: string | Record<string, unknown>, value?: unknown): void;\n tag(\n key: string | string[] | Record<string, unknown> | null,\n value?: string,\n ): void;\n untag(tags: string | string[] | Record<string, unknown> | null): void;\n lib(options: {\n level?: string;\n lib?: string;\n tags?: Record<string, unknown>;\n }): ExtendedLogger;\n}\n\n// Exported type aliases for defining handler lifecycle functions\nexport type JaypieHandlerSetup = (\n req: Request,\n res: Response,\n) => Promise<void> | void;\n\nexport type JaypieHandlerTeardown = (\n req: Request,\n res: Response,\n) => Promise<void> | void;\n\nexport type JaypieHandlerValidate = (\n req: Request,\n res: Response,\n) => Promise<boolean> | boolean;\n\nexport type ExpressHandlerLocals = (\n req: Request,\n res: Response,\n) => Promise<unknown> | unknown;\n\nexport interface ExpressHandlerOptions {\n chaos?: string;\n locals?: Record<string, unknown | ExpressHandlerLocals>;\n name?: string;\n secrets?: string[];\n setup?: JaypieHandlerSetup[] | JaypieHandlerSetup;\n teardown?: JaypieHandlerTeardown[] | JaypieHandlerTeardown;\n unavailable?: boolean;\n validate?: JaypieHandlerValidate[] | JaypieHandlerValidate;\n}\n\ninterface ExtendedRequest extends Request {\n locals: Record<string, unknown> & {\n _jaypie?: Record<string, unknown>;\n };\n}\n\ninterface ExtendedResponse extends Response {\n locals: Record<string, unknown> & {\n _jaypie?: Record<string, unknown>;\n };\n}\n\n// Extended response type for Lambda mock responses with direct internal access\ninterface LambdaMockResponse extends Response {\n _chunks?: Buffer[];\n _headers?: Map<string, string | string[]>;\n _headersSent?: boolean;\n _resolve?: ((result: unknown) => void) | null;\n buildResult?: () => unknown;\n // Internal bypass methods for dd-trace compatibility\n _internalGetHeader?: (name: string) => string | undefined;\n _internalSetHeader?: (name: string, value: string) => void;\n _internalHasHeader?: (name: string) => boolean;\n _internalRemoveHeader?: (name: string) => void;\n}\n\ntype ExpressHandler<T> = (\n req: Request,\n res: Response,\n ...params: unknown[]\n) => Promise<T>;\n\ninterface JaypieError extends Error {\n status?: number;\n body?: () => Record<string, unknown>;\n}\n\ninterface ResponseWithJson {\n json: () => Record<string, unknown>;\n}\n\n// Cast logger to extended interface for runtime features not in type definitions\nconst logger = publicLogger as unknown as ExtendedLogger;\n\n//\n//\n// Helpers - Safe response methods to bypass dd-trace interception\n//\n\n/**\n * Check if response is a Lambda mock response with direct internal access.\n * Uses Symbol marker to survive prototype chain modifications from Express and dd-trace.\n */\nfunction isLambdaMockResponse(res: Response): res is LambdaMockResponse {\n return (\n (res as unknown as Record<symbol, unknown>)[JAYPIE_LAMBDA_MOCK] === true\n );\n}\n\n/**\n * Check if response is a Lambda streaming response.\n * Uses Symbol marker to survive prototype chain modifications from Express and dd-trace.\n */\nfunction isLambdaStreamingResponse(res: Response): boolean {\n const symbolValue = (res as unknown as Record<symbol, unknown>)[\n JAYPIE_LAMBDA_STREAMING\n ];\n const result = symbolValue === true;\n // DIAGNOSTIC: Log symbol check\n console.log(\"[DIAG:expressHandler:isLambdaStreamingResponse] Check\", {\n symbolValue,\n result,\n resConstructorName: res?.constructor?.name,\n hasFlushHeaders: typeof res.flushHeaders === \"function\",\n });\n return result;\n}\n\n/**\n * Safely send a JSON response, avoiding dd-trace interception.\n * For Lambda mock responses, directly manipulates internal state instead of\n * using stream methods (write/end) which dd-trace intercepts.\n */\nfunction safeSendJson(res: Response, statusCode: number, data: unknown): void {\n if (isLambdaMockResponse(res)) {\n // Use internal method to set header (completely bypasses dd-trace)\n if (typeof res._internalSetHeader === \"function\") {\n res._internalSetHeader(\"content-type\", \"application/json\");\n } else {\n // Fall back to direct _headers manipulation\n res._headers!.set(\"content-type\", \"application/json\");\n }\n res.statusCode = statusCode;\n\n // Directly push to chunks array instead of using stream write/end\n const chunk = Buffer.from(JSON.stringify(data));\n res._chunks!.push(chunk);\n res._headersSent = true;\n\n // Mark as ended so getResult() resolves immediately\n (res as LambdaMockResponse & { _ended?: boolean })._ended = true;\n\n // Signal completion if a promise is waiting\n if (res._resolve) {\n res._resolve(res.buildResult!());\n }\n // Emit \"finish\" event so runExpressApp's promise resolves\n console.log(\"[safeSendJson] Emitting finish event\");\n res.emit(\"finish\");\n return;\n }\n // Fall back to standard Express methods for real responses\n // DIAGNOSTIC: Log before setting status\n console.log(\"[DIAG:expressHandler:safeSendJson] Before res.status()\", {\n statusCode,\n currentStatusCode: res.statusCode,\n });\n res.status(statusCode);\n console.log(\"[DIAG:expressHandler:safeSendJson] After res.status()\", {\n statusCode,\n newStatusCode: res.statusCode,\n });\n // CRITICAL: For Lambda streaming responses, flush headers before send to\n // initialize the stream wrapper. This ensures the status code is captured\n // before any writes occur (which would auto-flush with default 200).\n // Uses Symbol marker for reliable detection that survives prototype manipulation.\n const isStreaming = isLambdaStreamingResponse(res);\n console.log(\"[DIAG:expressHandler:safeSendJson] Streaming check\", {\n isStreaming,\n });\n if (isStreaming && typeof res.flushHeaders === \"function\") {\n console.log(\n \"[DIAG:expressHandler:safeSendJson] Calling flushHeaders explicitly\",\n );\n res.flushHeaders();\n }\n console.log(\"[DIAG:expressHandler:safeSendJson] Calling res.json()\");\n res.json(data);\n}\n\n/**\n * Safely send a response body, avoiding dd-trace interception.\n * For Lambda mock responses, directly manipulates internal state instead of\n * using stream methods (write/end) which dd-trace intercepts.\n */\nfunction safeSend(res: Response, statusCode: number, body?: string): void {\n if (isLambdaMockResponse(res)) {\n // Direct internal state manipulation - bypasses dd-trace completely\n res.statusCode = statusCode;\n\n if (body !== undefined) {\n const chunk = Buffer.from(body);\n res._chunks!.push(chunk);\n }\n res._headersSent = true;\n\n // Mark as ended so getResult() resolves immediately\n (res as LambdaMockResponse & { _ended?: boolean })._ended = true;\n\n // Signal completion if a promise is waiting\n if (res._resolve) {\n res._resolve(res.buildResult!());\n }\n // Emit \"finish\" event so runExpressApp's promise resolves\n console.log(\"[safeSend] Emitting finish event\");\n res.emit(\"finish\");\n return;\n }\n // Fall back to standard Express methods for real responses\n // DIAGNOSTIC: Log before setting status\n console.log(\"[DIAG:expressHandler:safeSend] Before res.status()\", {\n statusCode,\n currentStatusCode: res.statusCode,\n hasBody: body !== undefined,\n });\n res.status(statusCode);\n console.log(\"[DIAG:expressHandler:safeSend] After res.status()\", {\n statusCode,\n newStatusCode: res.statusCode,\n });\n // CRITICAL: For Lambda streaming responses, flush headers before send to\n // initialize the stream wrapper. This ensures the status code is captured\n // before any writes occur (which would auto-flush with default 200).\n // Uses Symbol marker for reliable detection that survives prototype manipulation.\n const isStreaming = isLambdaStreamingResponse(res);\n console.log(\"[DIAG:expressHandler:safeSend] Streaming check\", {\n isStreaming,\n });\n if (isStreaming && typeof res.flushHeaders === \"function\") {\n console.log(\n \"[DIAG:expressHandler:safeSend] Calling flushHeaders explicitly\",\n );\n res.flushHeaders();\n }\n if (body !== undefined) {\n console.log(\"[DIAG:expressHandler:safeSend] Calling res.send(body)\");\n res.send(body);\n } else {\n console.log(\"[DIAG:expressHandler:safeSend] Calling res.send() (no body)\");\n res.send();\n }\n}\n\n//\n//\n// Main\n//\n\n/* eslint-disable no-redeclare */\nfunction expressHandler<T>(\n handler: ExpressHandler<T>,\n options?: ExpressHandlerOptions,\n): ExpressHandler<T>;\nfunction expressHandler<T>(\n options: ExpressHandlerOptions,\n handler: ExpressHandler<T>,\n): ExpressHandler<T>;\nfunction expressHandler<T>(\n handlerOrOptions: ExpressHandler<T> | ExpressHandlerOptions,\n optionsOrHandler?: ExpressHandlerOptions | ExpressHandler<T>,\n): ExpressHandler<T> {\n /* eslint-enable no-redeclare */\n let handler: ExpressHandler<T>;\n let options: ExpressHandlerOptions;\n\n // If handler is an object and options is a function, swap them\n if (\n typeof handlerOrOptions === \"object\" &&\n typeof optionsOrHandler === \"function\"\n ) {\n handler = optionsOrHandler as ExpressHandler<T>;\n options = handlerOrOptions as ExpressHandlerOptions;\n } else {\n handler = handlerOrOptions as ExpressHandler<T>;\n options = (optionsOrHandler || {}) as ExpressHandlerOptions;\n }\n\n //\n //\n // Validate\n //\n let {\n chaos,\n locals,\n name,\n secrets,\n setup = [],\n teardown = [],\n unavailable,\n validate,\n } = options;\n if (typeof handler !== \"function\") {\n throw new BadRequestError(\n `Argument \"${handler}\" doesn't match type \"function\"`,\n );\n }\n if (\n locals !== undefined &&\n (typeof locals !== \"object\" || locals === null || Array.isArray(locals))\n ) {\n throw new BadRequestError(\n `Argument \"${locals}\" doesn't match type \"object\"`,\n );\n }\n setup = force.array(setup) as ((\n req: Request,\n res: Response,\n ) => Promise<void>)[]; // allows a single item\n teardown = force.array(teardown) as ((\n req: Request,\n res: Response,\n ) => Promise<void>)[]; // allows a single item\n\n //\n //\n // Setup\n //\n\n let jaypieFunction: ReturnType<typeof jaypieHandler>;\n\n return async (\n req: Request,\n res: Response,\n ...params: unknown[]\n ): Promise<T> => {\n // * This is the first line of code that runs when a request is received\n const extReq = req as ExtendedRequest;\n const extRes = res as ExtendedResponse;\n\n // Set default chaos value\n if (chaos === undefined) {\n chaos =\n process.env.PROJECT_CHAOS ||\n (getHeaderFrom(\n \"X-Project-Chaos\",\n req as unknown as Record<string, unknown>,\n ) as string | undefined);\n }\n\n // Re-init the logger\n logger.init();\n // Very low-level, internal sub-trace details\n const libLogger = logger.lib({\n lib: JAYPIE.LIB.EXPRESS,\n });\n // Top-level, important details that run at the same level as the main logger\n const log = logger.lib({\n level: logger.level,\n lib: JAYPIE.LIB.EXPRESS,\n });\n\n // Update the public logger with the request ID\n const invokeUuid = getCurrentInvokeUuid(req);\n if (invokeUuid) {\n logger.tag({ invoke: invokeUuid });\n logger.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n // TODO: in theory this is redundant\n libLogger.tag({ invoke: invokeUuid });\n libLogger.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n log.tag({ invoke: invokeUuid });\n log.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n }\n\n if (!name) {\n // If handler has a name, use it\n if (handler.name) {\n name = handler.name;\n } else {\n name = JAYPIE.UNKNOWN;\n }\n }\n logger.tag({ handler: name });\n // TODO: in theory this is redundant\n libLogger.tag({ handler: name });\n log.tag({ handler: name });\n\n libLogger.trace(\"[jaypie] Express init\");\n\n // Set req.locals if it doesn't exist\n if (!extReq.locals) extReq.locals = {};\n if (!extReq.locals._jaypie) extReq.locals._jaypie = {};\n\n // Set res.locals if it doesn't exist\n if (!extRes.locals) extRes.locals = {};\n if (!extRes.locals._jaypie) extRes.locals._jaypie = {};\n\n const originalRes = {\n attemptedCall: undefined as ((...args: unknown[]) => unknown) | undefined,\n attemptedParams: undefined as unknown[] | undefined,\n end: res.end.bind(res) as typeof res.end,\n json: res.json.bind(res) as typeof res.json,\n send: res.send.bind(res) as typeof res.send,\n status: res.status.bind(res) as typeof res.status,\n statusSent: false as boolean | number,\n };\n\n res.end = ((...endParams: unknown[]) => {\n originalRes.attemptedCall = originalRes.end as unknown as (\n ...args: unknown[]\n ) => unknown;\n originalRes.attemptedParams = endParams;\n log.warn(\n \"[jaypie] Illegal call to res.end(); prefer Jaypie response conventions\",\n );\n return res;\n }) as typeof res.end;\n\n res.json = ((...jsonParams: unknown[]) => {\n originalRes.attemptedCall = originalRes.json;\n originalRes.attemptedParams = jsonParams;\n log.warn(\n \"[jaypie] Illegal call to res.json(); prefer Jaypie response conventions\",\n );\n return res;\n }) as typeof res.json;\n\n res.send = ((...sendParams: unknown[]) => {\n originalRes.attemptedCall = originalRes.send;\n originalRes.attemptedParams = sendParams;\n log.warn(\n \"[jaypie] Illegal call to res.send(); prefer Jaypie response conventions\",\n );\n return res;\n }) as typeof res.send;\n\n res.status = ((...statusParams: [number]) => {\n originalRes.statusSent = statusParams[0];\n return originalRes.status(...statusParams);\n }) as typeof res.status;\n\n //\n //\n // Preprocess\n //\n\n // Load secrets into process.env if configured\n if (secrets && secrets.length > 0) {\n const secretsToLoad = secrets;\n const secretsSetup: JaypieHandlerSetup = async () => {\n await loadEnvSecrets(...secretsToLoad);\n };\n setup.unshift(secretsSetup);\n }\n\n if (locals) {\n // Locals\n const keys = Object.keys(locals);\n if (keys.length > 0) {\n const localsSetup = async (localsReq: Request, localsRes: Response) => {\n const extLocalsReq = localsReq as ExtendedRequest;\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n libLogger.trace(`[jaypie] Locals: ${key}`);\n const localValue = locals[key];\n if (typeof localValue === \"function\") {\n extLocalsReq.locals[key] = await localValue(localsReq, localsRes);\n } else {\n extLocalsReq.locals[key] = localValue;\n }\n }\n };\n setup.push(localsSetup);\n }\n }\n\n let response: T | Record<string, unknown> | undefined;\n let status: number = HTTP.CODE.OK;\n\n try {\n log.info.var({ req: summarizeRequest(req) });\n\n // Initialize after logging is set up\n\n jaypieFunction = jaypieHandler(\n handler as unknown as (...args: unknown[]) => Promise<unknown>,\n {\n chaos,\n name,\n setup,\n teardown,\n unavailable,\n validate,\n } as any,\n );\n\n libLogger.trace(\"[jaypie] Express execution\");\n\n //\n //\n // Process\n //\n\n response = (await jaypieFunction(req, res, ...params)) as\n | T\n | Record<string, unknown>\n | undefined;\n\n //\n //\n // Error Handling\n //\n } catch (error) {\n // In theory jaypieFunction has handled all errors\n const jaypieError = error as JaypieError;\n if (jaypieError.status) {\n status = jaypieError.status;\n }\n if (typeof jaypieError.body === \"function\") {\n response = jaypieError.body();\n } else {\n // This should never happen\n const unhandledError = new UnhandledError();\n response = unhandledError.body() as unknown as Record<string, unknown>;\n status = unhandledError.status;\n }\n }\n\n //\n //\n // Postprocess\n //\n\n // Restore original res functions\n res.end = originalRes.end;\n res.json = originalRes.json;\n res.send = originalRes.send;\n res.status = originalRes.status;\n\n // Decorate response\n decorateResponse(res, { handler: name });\n\n // Allow the sent status to override the status in the response\n if (originalRes.statusSent) {\n status = originalRes.statusSent as number;\n }\n\n // Send response\n try {\n if (!originalRes.attemptedCall) {\n // Body\n if (response) {\n if (typeof response === \"object\") {\n if (\n typeof (response as unknown as ResponseWithJson).json ===\n \"function\"\n ) {\n safeSendJson(\n res,\n status,\n (response as unknown as ResponseWithJson).json(),\n );\n } else {\n safeSendJson(res, status, response);\n }\n } else if (typeof response === \"string\") {\n try {\n safeSendJson(res, status, JSON.parse(response));\n } catch {\n safeSend(res, status, response);\n }\n } else if (response === true) {\n safeSend(res, HTTP.CODE.CREATED);\n } else {\n safeSend(res, status, response as unknown as string);\n }\n } else {\n // No response\n safeSend(res, HTTP.CODE.NO_CONTENT);\n }\n } else {\n // Resolve illegal call to res.end(), res.json(), or res.send()\n log.debug(\"[jaypie] Resolving illegal call to res\");\n log.var({\n attemptedCall: {\n name: originalRes.attemptedCall.name,\n params: originalRes.attemptedParams,\n },\n });\n // Call the original function with the original parameters and the original `this` (res)\n (originalRes.attemptedCall as (...args: unknown[]) => unknown).call(\n res,\n ...(originalRes.attemptedParams || []),\n );\n }\n } catch (error) {\n // Use console.error for raw stack trace to ensure it appears in CloudWatch\n // Handle both Error objects and plain thrown values\n const errorMessage =\n error instanceof Error\n ? error.message\n : typeof error === \"object\" && error !== null\n ? JSON.stringify(error)\n : String(error);\n const errorStack =\n error instanceof Error\n ? error.stack\n : new Error(\"Stack trace\").stack?.replace(\n \"Error: Stack trace\",\n `Error: ${errorMessage}`,\n );\n console.error(\"Express response error stack trace:\", errorStack);\n log.fatal(\n `Express encountered an error while sending the response: ${errorMessage}`,\n );\n log.var({ responseError: error });\n }\n\n // Log response\n const extras: Record<string, unknown> = {};\n if (response) extras.body = response;\n log.info.var({\n res: summarizeResponse(res, extras),\n });\n\n // Submit metric if Datadog is configured\n if (hasDatadogEnv()) {\n // Construct path from baseUrl and url\n let path = (req.baseUrl || \"\") + (req.url || \"\");\n // Ensure path starts with /\n if (!path.startsWith(\"/\")) {\n path = \"/\" + path;\n }\n // Remove trailing slash unless it's the root path\n if (path.length > 1 && path.endsWith(\"/\")) {\n path = path.slice(0, -1);\n }\n\n // Replace UUIDs with :id for better aggregation\n // Matches standard UUID v4 format (8-4-4-4-12 hex characters)\n path = path.replace(\n /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi,\n \":id\",\n );\n\n // Determine metric name based on environment variables\n let metricPrefix = \"project\";\n if (process.env.PROJECT_SPONSOR) {\n metricPrefix = process.env.PROJECT_SPONSOR;\n } else if (process.env.PROJECT_KEY) {\n metricPrefix = `project.${process.env.PROJECT_KEY}`;\n }\n\n await submitMetric({\n name: `${metricPrefix}.api.response`,\n type: DATADOG.METRIC.TYPE.COUNT,\n value: 1,\n tags: {\n status: String(res.statusCode),\n path,\n },\n });\n }\n\n // Clean up the public logger\n logger.untag(\"handler\");\n\n //\n //\n // Return\n //\n\n return response as T;\n };\n}\n\n//\n//\n// Export\n//\n\nexport default expressHandler;\n","import type { Request, Response } from \"express\";\nimport {\n BadGatewayError,\n BadRequestError,\n ForbiddenError,\n GatewayTimeoutError,\n GoneError,\n InternalError,\n MethodNotAllowedError,\n NotFoundError,\n TeapotError,\n UnauthorizedError,\n UnavailableError,\n} from \"@jaypie/errors\";\nimport { HTTP } from \"@jaypie/kit\";\nimport { log } from \"@jaypie/logger\";\n\nimport expressHandler, { ExpressHandlerOptions } from \"./expressHandler.js\";\n\n//\n//\n// Types\n//\n\ntype ErrorConstructor = new () => Error;\n\n//\n//\n// Main\n//\n\nconst httpHandler = (\n statusCode: number = HTTP.CODE.OK,\n context: ExpressHandlerOptions = {},\n): ((\n req: Request,\n res: Response,\n) => Promise<Record<string, unknown> | null>) => {\n // Give a default name if there isn't one\n if (!context.name) {\n context.name = \"_http\";\n }\n\n // Return a function that will be used as an express route\n return expressHandler(\n async (\n req: Request,\n res: Response,\n ): Promise<Record<string, unknown> | null> => {\n // Map the most throwable status codes to errors and throw them!\n const error: Record<number, ErrorConstructor> = {\n [HTTP.CODE.BAD_REQUEST]: BadRequestError,\n [HTTP.CODE.UNAUTHORIZED]: UnauthorizedError,\n [HTTP.CODE.FORBIDDEN]: ForbiddenError,\n [HTTP.CODE.NOT_FOUND]: NotFoundError,\n [HTTP.CODE.METHOD_NOT_ALLOWED]: MethodNotAllowedError,\n [HTTP.CODE.GONE]: GoneError,\n [HTTP.CODE.TEAPOT]: TeapotError,\n [HTTP.CODE.INTERNAL_ERROR]: InternalError,\n [HTTP.CODE.BAD_GATEWAY]: BadGatewayError,\n [HTTP.CODE.UNAVAILABLE]: UnavailableError,\n [HTTP.CODE.GATEWAY_TIMEOUT]: GatewayTimeoutError,\n };\n\n // If this maps to an error, throw it\n if (error[statusCode]) {\n log.trace(\n `@knowdev/express: gracefully throwing ${statusCode} up to projectHandler`,\n );\n throw new error[statusCode]();\n }\n\n // If this is an error and we didn't get thrown, log a warning\n if (statusCode >= 400) {\n log.warn(\n `@knowdev/express: status code ${statusCode} not mapped as throwable`,\n );\n }\n\n // Send the response\n res.status(statusCode);\n return statusCode === HTTP.CODE.NO_CONTENT ? null : {};\n },\n context,\n );\n};\n\n//\n//\n// Export\n//\n\nexport default httpHandler;\n","import type { Request, Response } from \"express\";\nimport {\n formatStreamError,\n getContentTypeForFormat,\n loadEnvSecrets,\n} from \"@jaypie/aws\";\nimport type { StreamFormat } from \"@jaypie/aws\";\nimport { BadRequestError, UnhandledError } from \"@jaypie/errors\";\nimport { force, getHeaderFrom, JAYPIE, jaypieHandler } from \"@jaypie/kit\";\nimport { log as publicLogger } from \"@jaypie/logger\";\nimport { DATADOG, hasDatadogEnv, submitMetric } from \"@jaypie/datadog\";\n\nimport getCurrentInvokeUuid from \"./getCurrentInvokeUuid.adapter.js\";\nimport summarizeRequest from \"./summarizeRequest.helper.js\";\n\n//\n//\n// Types\n//\n\n// Extended logger interface for features not in the base type definitions\ninterface ExtendedLogger {\n init: () => void;\n level: string;\n debug: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n error: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n fatal: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n info: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n trace: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n warn: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n var(key: string | Record<string, unknown>, value?: unknown): void;\n tag(\n key: string | string[] | Record<string, unknown> | null,\n value?: string,\n ): void;\n untag(tags: string | string[] | Record<string, unknown> | null): void;\n lib(options: {\n level?: string;\n lib?: string;\n tags?: Record<string, unknown>;\n }): ExtendedLogger;\n}\n\n// Exported type aliases for defining handler lifecycle functions\nexport type JaypieStreamHandlerSetup = (\n req: Request,\n res: Response,\n) => Promise<void> | void;\n\nexport type JaypieStreamHandlerTeardown = (\n req: Request,\n res: Response,\n) => Promise<void> | void;\n\nexport type JaypieStreamHandlerValidate = (\n req: Request,\n res: Response,\n) => Promise<boolean> | boolean;\n\nexport type ExpressStreamHandlerLocals = (\n req: Request,\n res: Response,\n) => Promise<unknown> | unknown;\n\nexport interface ExpressStreamHandlerOptions {\n chaos?: string;\n contentType?: string;\n format?: StreamFormat;\n locals?: Record<string, unknown | ExpressStreamHandlerLocals>;\n name?: string;\n secrets?: string[];\n setup?: JaypieStreamHandlerSetup[] | JaypieStreamHandlerSetup;\n teardown?: JaypieStreamHandlerTeardown[] | JaypieStreamHandlerTeardown;\n unavailable?: boolean;\n validate?: JaypieStreamHandlerValidate[] | JaypieStreamHandlerValidate;\n}\n\ninterface ExtendedRequest extends Request {\n locals: Record<string, unknown> & {\n _jaypie?: Record<string, unknown>;\n };\n}\n\ninterface ExtendedResponse extends Response {\n locals: Record<string, unknown> & {\n _jaypie?: Record<string, unknown>;\n };\n}\n\n/**\n * Streaming Express handler function signature.\n * Handler should write to the response stream and not return a value.\n */\nexport type ExpressStreamHandler = (\n req: Request,\n res: Response,\n ...params: unknown[]\n) => Promise<void>;\n\ninterface JaypieError extends Error {\n status?: number;\n body?: () => Record<string, unknown>;\n isProjectError?: boolean;\n}\n\n// Cast logger to extended interface for runtime features not in type definitions\nconst logger = publicLogger as unknown as ExtendedLogger;\n\n//\n//\n// Helper\n//\n\n/**\n * Get error body from an error\n */\nfunction getErrorBody(error: JaypieError | Error): Record<string, unknown> {\n const isJaypieError = (error as JaypieError).isProjectError;\n return isJaypieError\n ? ((error as JaypieError).body?.() ?? { error: error.message })\n : (new UnhandledError().body() as unknown as Record<string, unknown>);\n}\n\n//\n//\n// Main\n//\n\n/**\n * Creates a streaming Express handler that sets up SSE headers and allows\n * streaming responses. The handler receives the standard req/res and should\n * write to res.write() directly.\n *\n * Usage:\n * ```ts\n * app.get('/stream', expressStreamHandler(async (req, res) => {\n * const llmStream = llm.stream(\"Hello\");\n * await createExpressStream(llmStream, res);\n * }));\n * ```\n *\n * The handler sets appropriate SSE headers automatically:\n * - Content-Type: text/event-stream\n * - Cache-Control: no-cache\n * - Connection: keep-alive\n * - X-Accel-Buffering: no (disables nginx buffering)\n */\n/* eslint-disable no-redeclare */\nfunction expressStreamHandler(\n handler: ExpressStreamHandler,\n options?: ExpressStreamHandlerOptions,\n): ExpressStreamHandler;\nfunction expressStreamHandler(\n options: ExpressStreamHandlerOptions,\n handler: ExpressStreamHandler,\n): ExpressStreamHandler;\nfunction expressStreamHandler(\n handlerOrOptions: ExpressStreamHandler | ExpressStreamHandlerOptions,\n optionsOrHandler?: ExpressStreamHandlerOptions | ExpressStreamHandler,\n): ExpressStreamHandler {\n /* eslint-enable no-redeclare */\n let handler: ExpressStreamHandler;\n let options: ExpressStreamHandlerOptions;\n\n // If handler is an object and options is a function, swap them\n if (\n typeof handlerOrOptions === \"object\" &&\n typeof optionsOrHandler === \"function\"\n ) {\n handler = optionsOrHandler as ExpressStreamHandler;\n options = handlerOrOptions as ExpressStreamHandlerOptions;\n } else {\n handler = handlerOrOptions as ExpressStreamHandler;\n options = (optionsOrHandler || {}) as ExpressStreamHandlerOptions;\n }\n\n //\n //\n // Validate\n //\n const format: StreamFormat = options.format ?? \"sse\";\n let {\n chaos,\n contentType = getContentTypeForFormat(format),\n locals,\n name,\n secrets,\n setup = [],\n teardown = [],\n unavailable,\n validate,\n } = options;\n if (typeof handler !== \"function\") {\n throw new BadRequestError(\n `Argument \"${handler}\" doesn't match type \"function\"`,\n );\n }\n if (\n locals !== undefined &&\n (typeof locals !== \"object\" || locals === null || Array.isArray(locals))\n ) {\n throw new BadRequestError(\n `Argument \"${locals}\" doesn't match type \"object\"`,\n );\n }\n setup = force.array(setup) as ((\n req: Request,\n res: Response,\n ) => Promise<void>)[];\n teardown = force.array(teardown) as ((\n req: Request,\n res: Response,\n ) => Promise<void>)[];\n\n //\n //\n // Setup\n //\n\n let jaypieFunction: ReturnType<typeof jaypieHandler>;\n\n return async (\n req: Request,\n res: Response,\n ...params: unknown[]\n ): Promise<void> => {\n const extReq = req as ExtendedRequest;\n const extRes = res as ExtendedResponse;\n\n // Set default chaos value\n if (chaos === undefined) {\n chaos =\n process.env.PROJECT_CHAOS ||\n (getHeaderFrom(\n \"X-Project-Chaos\",\n req as unknown as Record<string, unknown>,\n ) as string | undefined);\n }\n\n // Re-init the logger\n logger.init();\n const libLogger = logger.lib({\n lib: JAYPIE.LIB.EXPRESS,\n });\n const log = logger.lib({\n level: logger.level,\n lib: JAYPIE.LIB.EXPRESS,\n });\n\n // Update the public logger with the request ID\n const invokeUuid = getCurrentInvokeUuid(req);\n if (invokeUuid) {\n logger.tag({ invoke: invokeUuid });\n logger.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n libLogger.tag({ invoke: invokeUuid });\n libLogger.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n log.tag({ invoke: invokeUuid });\n log.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n }\n\n if (!name) {\n if (handler.name) {\n name = handler.name;\n } else {\n name = JAYPIE.UNKNOWN;\n }\n }\n logger.tag({ handler: name });\n libLogger.tag({ handler: name });\n log.tag({ handler: name });\n\n libLogger.trace(\"[jaypie] Express stream init\");\n\n // Set req.locals if it doesn't exist\n if (!extReq.locals) extReq.locals = {};\n if (!extReq.locals._jaypie) extReq.locals._jaypie = {};\n\n // Set res.locals if it doesn't exist\n if (!extRes.locals) extRes.locals = {};\n if (!extRes.locals._jaypie) extRes.locals._jaypie = {};\n\n //\n //\n // SSE Headers\n //\n\n res.setHeader(\"Content-Type\", contentType);\n res.setHeader(\"Cache-Control\", \"no-cache\");\n res.setHeader(\"Connection\", \"keep-alive\");\n res.setHeader(\"X-Accel-Buffering\", \"no\"); // Disable nginx buffering\n res.flushHeaders();\n\n //\n //\n // Preprocess\n //\n\n // Load secrets into process.env if configured\n if (secrets && secrets.length > 0) {\n const secretsToLoad = secrets;\n const secretsSetup: JaypieStreamHandlerSetup = async () => {\n await loadEnvSecrets(...secretsToLoad);\n };\n setup.unshift(secretsSetup);\n }\n\n if (locals) {\n const keys = Object.keys(locals);\n if (keys.length > 0) {\n const localsSetup = async (localsReq: Request, localsRes: Response) => {\n const extLocalsReq = localsReq as ExtendedRequest;\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n libLogger.trace(`[jaypie] Locals: ${key}`);\n const localValue = locals[key];\n if (typeof localValue === \"function\") {\n extLocalsReq.locals[key] = await localValue(localsReq, localsRes);\n } else {\n extLocalsReq.locals[key] = localValue;\n }\n }\n };\n setup.push(localsSetup);\n }\n }\n\n try {\n log.info.var({ req: summarizeRequest(req) });\n\n jaypieFunction = jaypieHandler(\n handler as unknown as (...args: unknown[]) => Promise<unknown>,\n {\n chaos,\n name,\n setup,\n teardown,\n unavailable,\n validate,\n } as any,\n );\n\n libLogger.trace(\"[jaypie] Express stream execution\");\n\n //\n //\n // Process\n //\n\n await jaypieFunction(req, res, ...params);\n\n //\n //\n // Error Handling\n //\n } catch (error) {\n const jaypieError = error as JaypieError;\n\n // Log the error\n if (jaypieError.isProjectError) {\n log.debug(\"Caught jaypie error in stream handler\");\n log.info.var({ jaypieError: error });\n } else {\n log.fatal(\"Caught unhandled error in stream handler\");\n log.info.var({ unhandledError: (error as Error).message });\n }\n\n // Write error in the appropriate format\n try {\n const errorBody = getErrorBody(error as Error);\n res.write(formatStreamError(errorBody, format));\n } catch {\n // Response may already be closed\n log.warn(\"Failed to write error to stream - response may be closed\");\n }\n } finally {\n // End the response\n try {\n res.end();\n } catch {\n // Response may already be ended\n }\n\n //\n //\n // Postprocess\n //\n\n // Log completion\n log.info.var({\n res: { statusCode: res.statusCode, streaming: true },\n });\n\n // Submit metric if Datadog is configured\n if (hasDatadogEnv()) {\n let path = (req.baseUrl || \"\") + (req.url || \"\");\n if (!path.startsWith(\"/\")) {\n path = \"/\" + path;\n }\n if (path.length > 1 && path.endsWith(\"/\")) {\n path = path.slice(0, -1);\n }\n path = path.replace(\n /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi,\n \":id\",\n );\n\n let metricPrefix = \"project\";\n if (process.env.PROJECT_SPONSOR) {\n metricPrefix = process.env.PROJECT_SPONSOR;\n } else if (process.env.PROJECT_KEY) {\n metricPrefix = `project.${process.env.PROJECT_KEY}`;\n }\n\n await submitMetric({\n name: `${metricPrefix}.api.stream`,\n type: DATADOG.METRIC.TYPE.COUNT,\n value: 1,\n tags: {\n status: String(res.statusCode),\n path,\n },\n });\n }\n\n // Clean up the public logger\n logger.untag(\"handler\");\n }\n };\n}\n\n//\n//\n// Export\n//\n\nexport default expressStreamHandler;\n","import type { Request, Response } from \"express\";\nimport { BadRequestError } from \"@jaypie/errors\";\n\nimport expressHandler, { ExpressHandlerOptions } from \"./expressHandler.js\";\nimport summarizeRequest from \"./summarizeRequest.helper.js\";\n\n//\n//\n// Types\n//\n\nexport interface EchoResponse {\n req: ReturnType<typeof summarizeRequest>;\n}\n\n//\n//\n// Main\n//\n\nconst echoHandler = (\n context: ExpressHandlerOptions = {},\n): ((req: Request, res: Response) => Promise<EchoResponse>) => {\n if (\n typeof context !== \"object\" ||\n context === null ||\n Array.isArray(context)\n ) {\n throw new BadRequestError(\n `Argument \"${context}\" doesn't match type \"object\"`,\n );\n }\n // Give a default name if there isn't one\n if (!context.name) {\n context.name = \"_echo\";\n }\n\n // Return a function that will be used as an express route\n return expressHandler(async (req: Request): Promise<EchoResponse> => {\n return {\n req: summarizeRequest(req),\n };\n }, context);\n};\n\n//\n//\n// Export\n//\n\nexport default echoHandler;\n","import { NotImplementedError } from \"@jaypie/errors\";\nimport { HTTP } from \"@jaypie/kit\";\n\nimport expressHandler from \"./expressHandler.js\";\nimport httpHandler from \"./http.handler.js\";\nimport echoHandler from \"./echo.handler.js\";\n\n//\n//\n// Functions\n//\n\nconst routes = {\n badRequestRoute: httpHandler(HTTP.CODE.BAD_REQUEST, { name: \"_badRequest\" }),\n echoRoute: echoHandler(),\n forbiddenRoute: httpHandler(HTTP.CODE.FORBIDDEN, { name: \"_forbidden\" }),\n goneRoute: httpHandler(HTTP.CODE.GONE, { name: \"_gone\" }),\n methodNotAllowedRoute: httpHandler(HTTP.CODE.METHOD_NOT_ALLOWED, {\n name: \"_methodNotAllowed\",\n }),\n noContentRoute: httpHandler(HTTP.CODE.NO_CONTENT, { name: \"_noContent\" }),\n notFoundRoute: httpHandler(HTTP.CODE.NOT_FOUND, { name: \"_notFound\" }),\n notImplementedRoute: expressHandler(\n (): never => {\n throw new NotImplementedError();\n },\n { name: \"_notImplemented\" },\n ),\n};\n\n//\n//\n// Export\n//\n\nexport const badRequestRoute = routes.badRequestRoute;\nexport const echoRoute = routes.echoRoute;\nexport const forbiddenRoute = routes.forbiddenRoute;\nexport const goneRoute = routes.goneRoute;\nexport const methodNotAllowedRoute = routes.methodNotAllowedRoute;\nexport const noContentRoute = routes.noContentRoute;\nexport const notFoundRoute = routes.notFoundRoute;\nexport const notImplementedRoute = routes.notImplementedRoute;\n"],"names":["Readable","kOutHeaders","ServerResponse","Writable","force","envBoolean","CorsError","publicLogger","JAYPIE","HTTP","logger","BadRequestError","getHeaderFrom","loadEnvSecrets","jaypieHandler","UnhandledError","hasDatadogEnv","submitMetric","DATADOG","UnauthorizedError","ForbiddenError","NotFoundError","MethodNotAllowedError","GoneError","TeapotError","InternalError","BadGatewayError","UnavailableError","GatewayTimeoutError","log","getContentTypeForFormat","formatStreamError","NotImplementedError"],"mappings":"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"}