{"version":3,"sources":["/Users/shyun/comcom/ain-enterprise/ain-adk/dist/cjs/chunk-AVKQOQ3G.cjs","../../src/middlewares/request-context.middleware.ts"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACA;ACRA,gCAA2B;AAQ3B,IAAM,kBAAA,EAAoB,cAAA;AAG1B,IAAM,gBAAA,EAAkB,yBAAA;AAQjB,IAAM,yBAAA,EAA2B,CAAA,EAAA,GAAsB;AAC7D,EAAA,OAAO,CAAC,GAAA,EAAK,GAAA,EAAK,IAAA,EAAA,GAAS;AAC1B,IAAA,MAAM,SAAA,kBAAW,GAAA,mBAAI,MAAA,mBAAO,iBAAiB,CAAA,6BAAG,IAAA,mBAAK,GAAA;AACrD,IAAA,MAAM,UAAA,EACL,SAAA,GAAY,eAAA,CAAgB,IAAA,CAAK,QAAQ,EAAA,EAAI,SAAA,EAAW,gCAAA,CAAW;AACpE,IAAA,GAAA,CAAI,SAAA,CAAU,cAAA,EAAgB,SAAS,CAAA;AACvC,IAAA,qDAAA,EAAwB,UAAU,CAAA,EAAG,IAAI,CAAA;AAAA,EAC1C,CAAA;AACD,CAAA;AAGA,IAAM,sBAAA,kBAAwB,IAAI,GAAA,CAAI;AAAA,EACrC,GAAA;AAAA,EACA,yBAAA;AAAA,EACA;AACD,CAAC,CAAA;AAOM,IAAM,oBAAA,EAAsB,CAAA,EAAA,GAAsB;AACxD,EAAA,OAAO,CAAC,GAAA,EAAK,GAAA,EAAK,IAAA,EAAA,GAAS;AAC1B,IAAA,GAAA,CAAI,qBAAA,CAAsB,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,EAAG,OAAO,IAAA,CAAK,CAAA;AACrD,IAAA,MAAM,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA;AAKvB,IAAA,MAAM,IAAA,EAAM,iDAAA,CAAkB;AAC9B,IAAA,IAAI,OAAA,EAAS,KAAA;AAIb,IAAA,MAAM,QAAA,EAAU,CAAC,OAAA,EAAA,GAAqB;AACrC,MAAA,GAAA,CAAI,MAAA,EAAQ,MAAA;AACZ,MAAA,OAAA,EAAS,IAAA;AACT,MAAA,yBAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,cAAA,EAAgB;AAAA,QACjC,MAAA,EAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,IAAA,EAAM,GAAA,CAAI,WAAA;AAAA,QACV,MAAA,EAAQ,GAAA,CAAI,UAAA;AAAA,QACZ,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,KAAA;AAAA,QACzB,GAAI,QAAA,EAAU,EAAE,OAAA,EAAS,KAAK,EAAA,EAAI,CAAC,CAAA;AAAA,QACnC,mBAAI,GAAA,6BAAK,YAAA,EAAY,EAAE,SAAA,EAAW,GAAA,CAAI,UAAU,EAAA,EAAI,CAAC,CAAA;AAAA,QACrD,mBAAI,GAAA,6BAAK,SAAA,EAAS,EAAE,MAAA,EAAQ,GAAA,CAAI,OAAO,EAAA,EAAI,CAAC;AAAA,MAC7C,CAAC,CAAA;AAAA,IACF,CAAA;AACA,IAAA,GAAA,CAAI,EAAA,CAAG,QAAA,EAAU,CAAA,EAAA,GAAM,OAAA,CAAQ,KAAK,CAAC,CAAA;AACrC,IAAA,GAAA,CAAI,EAAA,CAAG,OAAA,EAAS,CAAA,EAAA,GAAM,OAAA,CAAQ,CAAC,GAAA,CAAI,gBAAgB,CAAC,CAAA;AACpD,IAAA,IAAA,CAAK,CAAA;AAAA,EACN,CAAA;AACD,CAAA;ADtBA;AACA;AACE;AACA;AACF,+GAAC","file":"/Users/shyun/comcom/ain-enterprise/ain-adk/dist/cjs/chunk-AVKQOQ3G.cjs","sourcesContent":[null,"import { randomUUID } from \"node:crypto\";\nimport type { RequestHandler } from \"express\";\nimport { loggers } from \"@/utils/logger\";\nimport {\n\tgetRequestContext,\n\trunWithRequestContext,\n} from \"@/utils/request-context\";\n\nconst REQUEST_ID_HEADER = \"x-request-id\";\n\n// Reused only when the client-supplied id is safe to embed in logs.\nconst SAFE_REQUEST_ID = /^[A-Za-z0-9._-]{1,128}$/;\n\n/**\n * Opens an AsyncLocalStorage request context for the whole request chain.\n * Reuses the incoming X-Request-Id when present (so ids can be correlated\n * across services), otherwise generates one, and echoes it in the response.\n * Must be registered before anything that logs.\n */\nexport const requestContextMiddleware = (): RequestHandler => {\n\treturn (req, res, next) => {\n\t\tconst incoming = req.header(REQUEST_ID_HEADER)?.trim();\n\t\tconst requestId =\n\t\t\tincoming && SAFE_REQUEST_ID.test(incoming) ? incoming : randomUUID();\n\t\tres.setHeader(\"X-Request-Id\", requestId);\n\t\trunWithRequestContext({ requestId }, next);\n\t};\n};\n\n// Health checks and agent-card discovery poll these constantly.\nconst ACCESS_LOG_SKIP_PATHS = new Set([\n\t\"/\",\n\t\"/.well-known/agent.json\",\n\t\"/.well-known/agent-card.json\",\n]);\n\n/**\n * Logs one line per completed request (method, path, status, duration) so\n * the log always records the request boundary, even when no service-level\n * log was emitted.\n */\nexport const accessLogMiddleware = (): RequestHandler => {\n\treturn (req, res, next) => {\n\t\tif (ACCESS_LOG_SKIP_PATHS.has(req.path)) return next();\n\t\tconst start = Date.now();\n\t\t// Captured now: finish/close fire from HTTP internals, outside this\n\t\t// request's AsyncLocalStorage context. The object reference is kept\n\t\t// (not just the id) so fields set later in the request — auth's\n\t\t// userId — are visible at log time.\n\t\tconst ctx = getRequestContext();\n\t\tlet logged = false;\n\t\t// `finish` = response fully sent; `close` also covers requests that\n\t\t// never finish (client gave up on a hung handler) — without it those\n\t\t// leave no access log at all, hiding the very requests that matter.\n\t\tconst logOnce = (aborted: boolean) => {\n\t\t\tif (logged) return;\n\t\t\tlogged = true;\n\t\t\tloggers.http.info(\"HTTP request\", {\n\t\t\t\tmethod: req.method,\n\t\t\t\tpath: req.originalUrl,\n\t\t\t\tstatus: res.statusCode,\n\t\t\t\tdurationMs: Date.now() - start,\n\t\t\t\t...(aborted ? { aborted: true } : {}),\n\t\t\t\t...(ctx?.requestId ? { requestId: ctx.requestId } : {}),\n\t\t\t\t...(ctx?.userId ? { userId: ctx.userId } : {}),\n\t\t\t});\n\t\t};\n\t\tres.on(\"finish\", () => logOnce(false));\n\t\tres.on(\"close\", () => logOnce(!res.writableFinished));\n\t\tnext();\n\t};\n};\n"]}