logixia 2.0.10 → 2.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{async-context-COuvmwsS.mjs → async-context-BGUCdYAa.mjs} +3 -3
- package/dist/{async-context-COuvmwsS.mjs.map → async-context-BGUCdYAa.mjs.map} +1 -1
- package/dist/{async-context-Dv0bmPC-.js → async-context-D8um9I5V.js} +3 -3
- package/dist/{async-context-Dv0bmPC-.js.map → async-context-D8um9I5V.js.map} +1 -1
- package/dist/{azure-monitor.transport-D6ryi8rA.js → azure-monitor.transport-C8KdmsSw.js} +19 -8
- package/dist/{azure-monitor.transport-D6ryi8rA.js.map → azure-monitor.transport-C8KdmsSw.js.map} +1 -1
- package/dist/{azure-monitor.transport-Coz5Gesu.mjs → azure-monitor.transport-CTnfwA0F.mjs} +19 -8
- package/dist/{azure-monitor.transport-Coz5Gesu.mjs.map → azure-monitor.transport-CTnfwA0F.mjs.map} +1 -1
- package/dist/azure.js +1 -1
- package/dist/azure.mjs +1 -1
- package/dist/{batch-buffer-CQUWDMYq.mjs → batch-buffer-BJqzpfpT.mjs} +11 -7
- package/dist/{batch-buffer-CQUWDMYq.mjs.map → batch-buffer-BJqzpfpT.mjs.map} +1 -1
- package/dist/{batch-buffer-CFzKnuNZ.js → batch-buffer-BTQdAXwC.js} +11 -7
- package/dist/{batch-buffer-CFzKnuNZ.js.map → batch-buffer-BTQdAXwC.js.map} +1 -1
- package/dist/browser.js +24 -9
- package/dist/browser.js.map +1 -1
- package/dist/browser.mjs +24 -9
- package/dist/browser.mjs.map +1 -1
- package/dist/{builder-Bj3mDeBw.mjs → builder-C6kKEVrU.mjs} +149 -51
- package/dist/builder-C6kKEVrU.mjs.map +1 -0
- package/dist/{builder-BLIStsCK.js → builder-Up4YxX7l.js} +153 -55
- package/dist/builder-Up4YxX7l.js.map +1 -0
- package/dist/cli/index.js +21 -16
- package/dist/cloudwatch.js +1 -1
- package/dist/cloudwatch.mjs +1 -1
- package/dist/{cloudwatch.transport-Cr1aeTGj.mjs → cloudwatch.transport-Bl1qzdBx.mjs} +24 -9
- package/dist/{cloudwatch.transport-Cr1aeTGj.mjs.map → cloudwatch.transport-Bl1qzdBx.mjs.map} +1 -1
- package/dist/{cloudwatch.transport-D4G5xYfG.js → cloudwatch.transport-BoCyxNKO.js} +24 -9
- package/dist/{cloudwatch.transport-D4G5xYfG.js.map → cloudwatch.transport-BoCyxNKO.js.map} +1 -1
- package/dist/correlation.js +3 -3
- package/dist/correlation.mjs +3 -3
- package/dist/{coerce.utils-C1C5sIX0.js → csv.utils-CbVHY1pd.js} +24 -1
- package/dist/csv.utils-CbVHY1pd.js.map +1 -0
- package/dist/{coerce.utils-B_rEudCn.mjs → csv.utils-ZdxSod5g.mjs} +19 -2
- package/dist/csv.utils-ZdxSod5g.mjs.map +1 -0
- package/dist/{entry-fields-CVwoQplO.js → entry-fields-CJbeaoBs.js} +2 -2
- package/dist/{entry-fields-CVwoQplO.js.map → entry-fields-CJbeaoBs.js.map} +1 -1
- package/dist/{entry-fields-DNTKQxoU.mjs → entry-fields-D_aNnjg0.mjs} +2 -2
- package/dist/{entry-fields-DNTKQxoU.mjs.map → entry-fields-D_aNnjg0.mjs.map} +1 -1
- package/dist/gcp.js +1 -1
- package/dist/gcp.mjs +1 -1
- package/dist/{gcp.transport-LLK2bw2-.mjs → gcp.transport-DOH4bpWM.mjs} +18 -9
- package/dist/{gcp.transport-LLK2bw2-.mjs.map → gcp.transport-DOH4bpWM.mjs.map} +1 -1
- package/dist/{gcp.transport-CVuRpchl.js → gcp.transport-D_NHVZrw.js} +18 -9
- package/dist/{gcp.transport-CVuRpchl.js.map → gcp.transport-D_NHVZrw.js.map} +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +35 -19
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +32 -16
- package/dist/index.mjs.map +1 -1
- package/dist/logitron-logger-DVUdgmBY.d.ts.map +1 -1
- package/dist/logitron-logger-DoWmMjYB.d.mts.map +1 -1
- package/dist/middleware.d.mts.map +1 -1
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +10 -6
- package/dist/middleware.js.map +1 -1
- package/dist/middleware.mjs +10 -6
- package/dist/middleware.mjs.map +1 -1
- package/dist/nest.d.mts +4 -3
- package/dist/nest.d.mts.map +1 -1
- package/dist/nest.d.ts +4 -3
- package/dist/nest.d.ts.map +1 -1
- package/dist/nest.js +41 -20
- package/dist/nest.js.map +1 -1
- package/dist/nest.mjs +39 -18
- package/dist/nest.mjs.map +1 -1
- package/dist/{otel-DOuwGPCd.mjs → otel-DAVxpArV.mjs} +135 -56
- package/dist/otel-DAVxpArV.mjs.map +1 -0
- package/dist/{otel-ChnVYRLA.js → otel-DH6-G6DR.js} +137 -58
- package/dist/otel-DH6-G6DR.js.map +1 -0
- package/dist/{request-trace-ByujsUZk.js → request-trace-C7kXMjx5.js} +5 -6
- package/dist/{request-trace-ByujsUZk.js.map → request-trace-C7kXMjx5.js.map} +1 -1
- package/dist/{request-trace-BgNykH9M.mjs → request-trace-Dekcnenb.mjs} +5 -6
- package/dist/{request-trace-BgNykH9M.mjs.map → request-trace-Dekcnenb.mjs.map} +1 -1
- package/dist/{safe-stringify-CN7icp8S.js → safe-stringify-CJisLyZ3.js} +2 -2
- package/dist/{safe-stringify-CN7icp8S.js.map → safe-stringify-CJisLyZ3.js.map} +1 -1
- package/dist/{safe-stringify--7gbe95n.mjs → safe-stringify-pZOnzGRJ.mjs} +2 -2
- package/dist/{safe-stringify--7gbe95n.mjs.map → safe-stringify-pZOnzGRJ.mjs.map} +1 -1
- package/dist/{search-DPwTKPve.d.ts → search-B4eEzrhM.d.ts} +3 -6
- package/dist/{search-DPwTKPve.d.ts.map → search-B4eEzrhM.d.ts.map} +1 -1
- package/dist/{search-CRjhHxe9.js → search-CJw_xoQl.js} +44 -35
- package/dist/search-CJw_xoQl.js.map +1 -0
- package/dist/{search-DAXKE-P9.mjs → search-CjYl-mo5.mjs} +41 -32
- package/dist/search-CjYl-mo5.mjs.map +1 -0
- package/dist/{search-D-8HJADE.d.mts → search-Crf2IEoA.d.mts} +3 -6
- package/dist/{search-D-8HJADE.d.mts.map → search-Crf2IEoA.d.mts.map} +1 -1
- package/dist/search.d.mts +1 -1
- package/dist/search.d.ts +1 -1
- package/dist/search.js +1 -1
- package/dist/search.mjs +1 -1
- package/dist/{secret-config-BvFl2dC8.js → secret-config-6hdODxBb.js} +2 -2
- package/dist/{secret-config-BvFl2dC8.js.map → secret-config-6hdODxBb.js.map} +1 -1
- package/dist/{secret-config-ByGq7kJd.mjs → secret-config-D1F4MW69.mjs} +2 -2
- package/dist/{secret-config-ByGq7kJd.mjs.map → secret-config-D1F4MW69.mjs.map} +1 -1
- package/dist/{sensitive-names-CHMowujD.js → sensitive-names-CNgHaqv9.js} +7 -1
- package/dist/{sensitive-names-CHMowujD.js.map → sensitive-names-CNgHaqv9.js.map} +1 -1
- package/dist/{sensitive-names-o__1PUUR.mjs → sensitive-names-wv27qBQC.mjs} +2 -2
- package/dist/{sensitive-names-o__1PUUR.mjs.map → sensitive-names-wv27qBQC.mjs.map} +1 -1
- package/dist/{slack.transport-zLQ9MGxS.js → slack.transport-CEYBVzUj.js} +46 -18
- package/dist/{slack.transport-zLQ9MGxS.js.map → slack.transport-CEYBVzUj.js.map} +1 -1
- package/dist/{slack.transport-CSj1j0_X.mjs → slack.transport-YvaLJxNv.mjs} +46 -18
- package/dist/{slack.transport-CSj1j0_X.mjs.map → slack.transport-YvaLJxNv.mjs.map} +1 -1
- package/dist/transports.d.mts.map +1 -1
- package/dist/transports.d.ts.map +1 -1
- package/dist/transports.js +6 -6
- package/dist/transports.mjs +6 -6
- package/dist/worker-entry.js +109 -41
- package/dist/worker.js +1 -1
- package/dist/worker.mjs +1 -1
- package/dist/{worker.transport-DQDv1nAJ.js → worker.transport-CwNpH98o.js} +21 -13
- package/dist/{worker.transport-DQDv1nAJ.js.map → worker.transport-CwNpH98o.js.map} +1 -1
- package/dist/{worker.transport-D78xhNhB.mjs → worker.transport-DgK_ZXlB.mjs} +21 -13
- package/dist/{worker.transport-D78xhNhB.mjs.map → worker.transport-DgK_ZXlB.mjs.map} +1 -1
- package/package.json +10 -3
- package/dist/builder-BLIStsCK.js.map +0 -1
- package/dist/builder-Bj3mDeBw.mjs.map +0 -1
- package/dist/coerce.utils-B_rEudCn.mjs.map +0 -1
- package/dist/coerce.utils-C1C5sIX0.js.map +0 -1
- package/dist/otel-ChnVYRLA.js.map +0 -1
- package/dist/otel-DOuwGPCd.mjs.map +0 -1
- package/dist/search-CRjhHxe9.js.map +0 -1
- package/dist/search-DAXKE-P9.mjs.map +0 -1
package/dist/middleware.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.mjs","names":["sanitizeUrl"],"sources":["../src/middleware/http-logger.ts"],"sourcesContent":["/**\n * HTTP request/response logging middleware — Morgan replacement.\n *\n * Fixes every documented Morgan bug:\n * - statusCode always captured correctly, even for requests > 20 s\n * - Logs request START (with traceId) and response FINISH (with duration)\n * - Captures errors before and after response\n * - Auto-redacts Authorization / Cookie / Set-Cookie headers\n * - Slow-request warnings\n * - Skip predicates for health-check routes / static assets\n *\n * @example Express\n * ```ts\n * import { createExpressMiddleware } from 'logixia/middleware';\n * app.use(createExpressMiddleware(logger));\n * ```\n *\n * @example Fastify\n * ```ts\n * import { createFastifyPlugin } from 'logixia/middleware';\n * await fastify.register(createFastifyPlugin(logger));\n * ```\n */\n\nimport type { IBaseLogger } from '../types';\nimport type { HttpRequestShape, HttpResponseShape } from '../types/http-shapes';\nimport { internalError } from '../utils/internal-log';\nimport { assignOwn } from '../utils/own-property';\nimport { resolveRequestTraceId, resolveTraceHeaders } from '../utils/request-trace';\nimport { stringifyForLog } from '../utils/safe-stringify';\nimport {\n buildNameSet,\n DEFAULT_REDACT_HEADERS,\n DEFAULT_REDACT_QUERY_PARAMS,\n redactUrlQuery as sanitizeUrl,\n} from '../utils/sensitive-names';\n\n// ── Shared types ─────────────────────────────────────────────────────────────\n\nexport interface HttpLoggerOptions {\n /**\n * Skip logging for a request. Called before any I/O.\n * @example `skip: (req) => req.url === '/health'`\n */\n skip?: (req: IncomingRequest) => boolean;\n /**\n * Log request body (POST/PUT/PATCH). Capped at `bodyMaxBytes` (default: 4096).\n * Redaction still applies to the captured body.\n * Default: false.\n */\n logBody?: boolean;\n /** Max bytes of body to capture. Default: 4096. */\n bodyMaxBytes?: number;\n /**\n * Emit a WARN log when a request duration exceeds this threshold (ms).\n * Default: 1000.\n */\n slowRequestThresholdMs?: number;\n /**\n * Additional fields to include in every log entry.\n * @example `extraFields: (req) => ({ tenantId: req.headers['x-tenant-id'] })`\n */\n extraFields?: (req: IncomingRequest) => Record<string, unknown>;\n /**\n * Header name, or list of names tried in order, to read the trace ID from.\n * Default: the library-wide list (`DEFAULT_TRACE_HEADERS`: traceparent,\n * x-trace-id, x-request-id, x-correlation-id, trace-id).\n * If none is present, `request.id` is used when it is not a framework counter,\n * otherwise a UUID is generated and shared with the logixia context helpers.\n */\n traceIdHeader?: string | readonly string[];\n /**\n * Additional headers to redact from logged output. Merged with the defaults\n * (authorization, cookie, set-cookie, x-api-key, proxy-authorization,\n * x-auth-token, x-access-token, x-csrf-token, x-amz-security-token).\n */\n redactHeaders?: string[];\n /**\n * Additional query-string parameter names whose values are redacted from the\n * logged URL. Merged with the defaults (token, access_token, refresh_token,\n * code, password, secret, api_key, apikey, key, signature, sig, auth).\n */\n redactQueryParams?: string[];\n /**\n * Log level for request-start entries. Default: 'debug'.\n * Set to 'silent' to suppress request-start logs entirely.\n */\n requestLevel?: string;\n /** Log level for successful response entries. Default: 'info'. */\n responseLevel?: string;\n /** Log level for error responses (status ≥ 500). Default: 'error'. */\n errorLevel?: string;\n}\n\n// Minimal structural types so we don't need @types/express / fastify in core\nexport type IncomingRequest = HttpRequestShape;\nexport type OutgoingResponse = HttpResponseShape;\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction sanitizeHeaders(\n headers: Record<string, string | string[] | undefined> | undefined,\n redactSet: Set<string>\n): Record<string, unknown> {\n if (!headers) return {};\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(headers)) {\n assignOwn(out, k, redactSet.has(k.toLowerCase()) ? '[REDACTED]' : v);\n }\n return out;\n}\n\n/** Fire-and-forget a logger call; a failing log must never become an unhandled rejection. */\nfunction fire(result: unknown): void {\n if (result && typeof (result as Promise<unknown>).catch === 'function') {\n (result as Promise<unknown>).catch((error: unknown) =>\n internalError('http-logger: log call failed', error)\n );\n }\n}\n\ninterface NameSets {\n headers: Set<string>;\n queryParams: Set<string>;\n}\n\nfunction resolveNameSets(options: HttpLoggerOptions): NameSets {\n return {\n headers: buildNameSet(DEFAULT_REDACT_HEADERS, options.redactHeaders),\n queryParams: buildNameSet(DEFAULT_REDACT_QUERY_PARAMS, options.redactQueryParams),\n };\n}\n\nfunction buildBaseFields(\n req: IncomingRequest,\n traceId: string,\n options: HttpLoggerOptions,\n { headers: redactSet, queryParams: paramSet }: NameSets\n): Record<string, unknown> {\n const fields: Record<string, unknown> = {\n traceId,\n method: req.method?.toUpperCase() ?? 'UNKNOWN',\n url: sanitizeUrl(req.url ?? '/', paramSet),\n ip: req.ip ?? req.socket?.remoteAddress ?? 'unknown',\n headers: sanitizeHeaders(req.headers, redactSet),\n };\n\n if (options.extraFields) {\n Object.assign(fields, options.extraFields(req));\n }\n\n return fields;\n}\n\n// ── Express middleware ────────────────────────────────────────────────────────\n\n/**\n * Create an Express / Connect compatible middleware that replaces Morgan.\n */\nexport function createExpressMiddleware(\n logger: IBaseLogger,\n options: HttpLoggerOptions = {}\n): (req: IncomingRequest, res: OutgoingResponse, next: () => void) => void {\n const {\n skip,\n logBody,\n bodyMaxBytes,\n traceIdHeader,\n requestLevel = 'debug',\n responseLevel = 'info',\n errorLevel = 'error',\n slowRequestThresholdMs = 1000,\n } = options;\n const nameSets = resolveNameSets(options);\n const traceHeaders = resolveTraceHeaders(traceIdHeader);\n\n return function logixiaHttpMiddleware(\n req: IncomingRequest,\n res: OutgoingResponse,\n next: () => void\n ): void {\n if (skip?.(req)) {\n next();\n return;\n }\n\n const traceId = resolveRequestTraceId(req, traceHeaders);\n const startMs = Date.now();\n const baseFields = buildBaseFields(req, traceId, options, nameSets);\n\n // Log request start\n if (requestLevel !== 'silent') {\n fire(\n logger.logLevel(requestLevel, 'request started', {\n ...baseFields,\n ...(logBody && req.body ? { body: truncateBody(req.body, bodyMaxBytes) } : {}),\n })\n );\n }\n\n // Hook into the response 'finish' event — fires after headers + body are sent.\n // This is what Morgan gets wrong for slow requests (it uses 'close' which may\n // fire before the status code is set on some Node versions).\n //\n // BOTH 'finish' and 'close' fire on a normal response, so guard against\n // logging the completion twice (which would duplicate the completed entry and\n // the slow-request warning).\n let completed = false;\n const onFinish = (): void => {\n if (completed) return;\n completed = true;\n\n const duration = Date.now() - startMs;\n const status = res.statusCode ?? 0;\n const level = status >= 500 ? errorLevel : responseLevel;\n\n fire(\n logger.logLevel(level, 'request completed', {\n ...baseFields,\n statusCode: status,\n duration,\n })\n );\n\n if (duration > slowRequestThresholdMs) {\n fire(\n logger.warn('slow request detected', {\n ...baseFields,\n statusCode: status,\n duration,\n threshold: slowRequestThresholdMs,\n })\n );\n }\n };\n\n res.once?.('finish', onFinish);\n // Fallback: also covers a client that disconnects before 'finish' fires. The\n // `completed` guard ensures a normal finish+close pair logs only once.\n res.once?.('close', onFinish);\n\n next();\n };\n}\n\n// ── Fastify plugin ─────────────────────────────────────────────────────────────\n\nexport interface FastifyInstance {\n addHook: (name: string, fn: (req: unknown, reply: unknown, done: () => void) => void) => void;\n}\n\n/**\n * Create a Fastify plugin (a function you pass to `fastify.register()`).\n *\n * @example\n * ```ts\n * await fastify.register(createFastifyPlugin(logger, { slowRequestThresholdMs: 500 }));\n * ```\n */\nexport function createFastifyPlugin(logger: IBaseLogger, options: HttpLoggerOptions = {}) {\n const {\n skip,\n traceIdHeader,\n requestLevel = 'debug',\n responseLevel = 'info',\n errorLevel = 'error',\n slowRequestThresholdMs = 1000,\n } = options;\n const nameSets = resolveNameSets(options);\n const traceHeaders = resolveTraceHeaders(traceIdHeader);\n\n function logixiaFastifyPlugin(fastify: FastifyInstance, _opts: unknown, done: () => void): void {\n fastify.addHook('onRequest', (request: unknown, _reply: unknown, hookDone: () => void) => {\n const req = request as IncomingRequest & { _logixiaStart?: number };\n if (skip?.(req)) {\n hookDone();\n return;\n }\n\n const traceId = resolveRequestTraceId(req, traceHeaders);\n req._logixiaStart = Date.now();\n\n if (requestLevel !== 'silent') {\n fire(\n logger.logLevel(\n requestLevel,\n 'request started',\n buildBaseFields(req, traceId, options, nameSets)\n )\n );\n }\n hookDone();\n });\n\n fastify.addHook('onResponse', (request: unknown, reply: unknown, hookDone: () => void) => {\n const req = request as IncomingRequest & { _logixiaStart?: number };\n if (req._logixiaStart === undefined) {\n hookDone();\n return;\n }\n\n const rep = reply as { statusCode?: number };\n const duration = Date.now() - req._logixiaStart;\n const status = rep.statusCode ?? 0;\n const traceId = resolveRequestTraceId(req, traceHeaders);\n const level = status >= 500 ? errorLevel : responseLevel;\n const baseFields = buildBaseFields(req, traceId, options, nameSets);\n\n fire(\n logger.logLevel(level, 'request completed', {\n ...baseFields,\n statusCode: status,\n duration,\n })\n );\n\n if (duration > slowRequestThresholdMs) {\n fire(\n logger.warn('slow request detected', {\n traceId,\n url: baseFields.url,\n method: req.method,\n duration,\n threshold: slowRequestThresholdMs,\n })\n );\n }\n\n hookDone();\n });\n\n done();\n }\n\n return Object.assign(logixiaFastifyPlugin, {\n [Symbol.for('skip-override')]: true,\n [Symbol.for('fastify.display-name')]: 'logixia',\n });\n}\n\n// ── Internal helpers ──────────────────────────────────────────────────────────\n\n/**\n * Bound the captured body without turning it into a string, so the logger's\n * path-based redaction still sees the original keys. Oversized structures are\n * pruned (extra keys/items dropped, long strings cut) rather than serialized.\n */\nfunction truncateBody(body: unknown, maxBytes = 4096): unknown {\n if (typeof body === 'string') {\n return body.length > maxBytes ? body.slice(0, maxBytes) + '…[truncated]' : body;\n }\n if (body && typeof body === 'object') {\n const str = stringifyForLog(body);\n if (str.length <= maxBytes) return body;\n return pruneValue(body, { left: maxBytes }, 0, new Set());\n }\n return body;\n}\n\nconst TRUNCATED = '…[truncated]';\nconst MAX_PRUNE_DEPTH = 8;\n\nfunction pruneValue(\n value: unknown,\n budget: { left: number },\n depth: number,\n ancestors: Set<object>\n): unknown {\n if (typeof value === 'string') {\n const cut = value.slice(0, Math.max(0, budget.left));\n budget.left -= cut.length;\n return cut.length < value.length ? cut + TRUNCATED : cut;\n }\n if (value === null || typeof value !== 'object') {\n budget.left -= 8;\n return value;\n }\n if (value instanceof Date) {\n budget.left -= 24;\n return Number.isNaN(value.getTime()) ? 'Invalid Date' : value.toISOString();\n }\n if (value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {\n budget.left -= 16;\n return `[Buffer ${value.byteLength} bytes]`;\n }\n if (value instanceof Error) return value;\n if (ancestors.has(value) || depth >= MAX_PRUNE_DEPTH) return TRUNCATED;\n ancestors.add(value);\n try {\n if (Array.isArray(value) || value instanceof Set || value instanceof Map) {\n const items: unknown[] = [];\n for (const item of value instanceof Map ? value.entries() : value) {\n if (budget.left <= 0) {\n items.push(TRUNCATED);\n break;\n }\n items.push(pruneValue(item, budget, depth + 1, ancestors));\n }\n return items;\n }\n const toJSON = (value as { toJSON?: unknown }).toJSON;\n if (typeof toJSON === 'function') {\n const json: unknown = toJSON.call(value);\n if (json !== value) return pruneValue(json, budget, depth + 1, ancestors);\n }\n const record: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n if (budget.left <= 0) {\n record['…'] = TRUNCATED;\n break;\n }\n budget.left -= k.length;\n assignOwn(record, k, pruneValue(v, budget, depth + 1, ancestors));\n }\n return record;\n } catch {\n return TRUNCATED;\n } finally {\n ancestors.delete(value);\n }\n}\n"],"mappings":";;;;;AAoGA,SAAS,gBACP,SACA,WACyB;CACzB,IAAI,CAAC,SAAS,OAAO,CAAC;CACtB,MAAM,MAA+B,CAAC;CACtC,KAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,OAAO,GACzC,UAAU,KAAK,GAAG,UAAU,IAAI,EAAE,YAAY,CAAC,IAAI,eAAe,CAAC;CAErE,OAAO;AACT;;AAGA,SAAS,KAAK,QAAuB;CACnC,IAAI,UAAU,OAAQ,OAA4B,UAAU,YAC1D,OAA6B,OAAO,UAClC,cAAc,gCAAgC,KAAK,CACrD;AAEJ;AAOA,SAAS,gBAAgB,SAAsC;CAC7D,OAAO;EACL,SAAS,aAAa,wBAAwB,QAAQ,aAAa;EACnE,aAAa,aAAa,6BAA6B,QAAQ,iBAAiB;CAClF;AACF;AAEA,SAAS,gBACP,KACA,SACA,SACA,EAAE,SAAS,WAAW,aAAa,YACV;;CACzB,MAAM,SAAkC;EACtC;EACA,UAAA,cAAQ,IAAI,YAAA,QAAA,gBAAA,KAAA,IAAA,KAAA,IAAA,YAAQ,YAAY,MAAK;EACrC,KAAKA,eAAY,IAAI,OAAO,KAAK,QAAQ;EACzC,IAAI,IAAI,QAAA,cAAM,IAAI,YAAA,QAAA,gBAAA,KAAA,IAAA,KAAA,IAAA,YAAQ,kBAAiB;EAC3C,SAAS,gBAAgB,IAAI,SAAS,SAAS;CACjD;CAEA,IAAI,QAAQ,aACV,OAAO,OAAO,QAAQ,QAAQ,YAAY,GAAG,CAAC;CAGhD,OAAO;AACT;;;;AAOA,SAAgB,wBACd,QACA,UAA6B,CAAC,GAC2C;CACzE,MAAM,EACJ,MACA,SACA,cACA,eACA,eAAe,SACf,gBAAgB,QAChB,aAAa,SACb,yBAAyB,QACvB;CACJ,MAAM,WAAW,gBAAgB,OAAO;CACxC,MAAM,eAAe,oBAAoB,aAAa;CAEtD,OAAO,SAAS,sBACd,KACA,KACA,MACM;;EACN,IAAA,SAAA,QAAA,SAAA,KAAA,IAAA,KAAA,IAAI,KAAO,GAAG,GAAG;GACf,KAAK;GACL;EACF;EAEA,MAAM,UAAU,sBAAsB,KAAK,YAAY;EACvD,MAAM,UAAU,KAAK,IAAI;EACzB,MAAM,aAAa,gBAAgB,KAAK,SAAS,SAAS,QAAQ;EAGlE,IAAI,iBAAiB,UACnB,KACE,OAAO,SAAS,cAAc,mBAAmB;GAC/C,GAAG;GACH,GAAI,WAAW,IAAI,OAAO,EAAE,MAAM,aAAa,IAAI,MAAM,YAAY,EAAE,IAAI,CAAC;EAC9E,CAAC,CACH;EAUF,IAAI,YAAY;EAChB,MAAM,iBAAuB;GAC3B,IAAI,WAAW;GACf,YAAY;GAEZ,MAAM,WAAW,KAAK,IAAI,IAAI;GAC9B,MAAM,SAAS,IAAI,cAAc;GACjC,MAAM,QAAQ,UAAU,MAAM,aAAa;GAE3C,KACE,OAAO,SAAS,OAAO,qBAAqB;IAC1C,GAAG;IACH,YAAY;IACZ;GACF,CAAC,CACH;GAEA,IAAI,WAAW,wBACb,KACE,OAAO,KAAK,yBAAyB;IACnC,GAAG;IACH,YAAY;IACZ;IACA,WAAW;GACb,CAAC,CACH;EAEJ;EAEA,CAAA,YAAA,IAAI,UAAA,QAAA,cAAA,KAAA,KAAA,UAAA,KAAA,KAAO,UAAU,QAAQ;EAG7B,CAAA,aAAA,IAAI,UAAA,QAAA,eAAA,KAAA,KAAA,WAAA,KAAA,KAAO,SAAS,QAAQ;EAE5B,KAAK;CACP;AACF;;;;;;;;;AAgBA,SAAgB,oBAAoB,QAAqB,UAA6B,CAAC,GAAG;CACxF,MAAM,EACJ,MACA,eACA,eAAe,SACf,gBAAgB,QAChB,aAAa,SACb,yBAAyB,QACvB;CACJ,MAAM,WAAW,gBAAgB,OAAO;CACxC,MAAM,eAAe,oBAAoB,aAAa;CAEtD,SAAS,qBAAqB,SAA0B,OAAgB,MAAwB;EAC9F,QAAQ,QAAQ,cAAc,SAAkB,QAAiB,aAAyB;GACxF,MAAM,MAAM;GACZ,IAAA,SAAA,QAAA,SAAA,KAAA,IAAA,KAAA,IAAI,KAAO,GAAG,GAAG;IACf,SAAS;IACT;GACF;GAEA,MAAM,UAAU,sBAAsB,KAAK,YAAY;GACvD,IAAI,gBAAgB,KAAK,IAAI;GAE7B,IAAI,iBAAiB,UACnB,KACE,OAAO,SACL,cACA,mBACA,gBAAgB,KAAK,SAAS,SAAS,QAAQ,CACjD,CACF;GAEF,SAAS;EACX,CAAC;EAED,QAAQ,QAAQ,eAAe,SAAkB,OAAgB,aAAyB;GACxF,MAAM,MAAM;GACZ,IAAI,IAAI,kBAAkB,KAAA,GAAW;IACnC,SAAS;IACT;GACF;GAEA,MAAM,MAAM;GACZ,MAAM,WAAW,KAAK,IAAI,IAAI,IAAI;GAClC,MAAM,SAAS,IAAI,cAAc;GACjC,MAAM,UAAU,sBAAsB,KAAK,YAAY;GACvD,MAAM,QAAQ,UAAU,MAAM,aAAa;GAC3C,MAAM,aAAa,gBAAgB,KAAK,SAAS,SAAS,QAAQ;GAElE,KACE,OAAO,SAAS,OAAO,qBAAqB;IAC1C,GAAG;IACH,YAAY;IACZ;GACF,CAAC,CACH;GAEA,IAAI,WAAW,wBACb,KACE,OAAO,KAAK,yBAAyB;IACnC;IACA,KAAK,WAAW;IAChB,QAAQ,IAAI;IACZ;IACA,WAAW;GACb,CAAC,CACH;GAGF,SAAS;EACX,CAAC;EAED,KAAK;CACP;CAEA,OAAO,OAAO,OAAO,sBAAsB;GACxC,OAAO,IAAI,eAAe,IAAI;GAC9B,OAAO,IAAI,sBAAsB,IAAI;CACxC,CAAC;AACH;;;;;;AASA,SAAS,aAAa,MAAe,WAAW,MAAe;CAC7D,IAAI,OAAO,SAAS,UAClB,OAAO,KAAK,SAAS,WAAW,KAAK,MAAM,GAAG,QAAQ,IAAI,iBAAiB;CAE7E,IAAI,QAAQ,OAAO,SAAS,UAAU;EAEpC,IADY,gBAAgB,IACtB,CAAC,CAAC,UAAU,UAAU,OAAO;EACnC,OAAO,WAAW,MAAM,EAAE,MAAM,SAAS,GAAG,mBAAG,IAAI,IAAI,CAAC;CAC1D;CACA,OAAO;AACT;AAEA,MAAM,YAAY;AAClB,MAAM,kBAAkB;AAExB,SAAS,WACP,OACA,QACA,OACA,WACS;CACT,IAAI,OAAO,UAAU,UAAU;EAC7B,MAAM,MAAM,MAAM,MAAM,GAAG,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC;EACnD,OAAO,QAAQ,IAAI;EACnB,OAAO,IAAI,SAAS,MAAM,SAAS,MAAM,YAAY;CACvD;CACA,IAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;EAC/C,OAAO,QAAQ;EACf,OAAO;CACT;CACA,IAAI,iBAAiB,MAAM;EACzB,OAAO,QAAQ;EACf,OAAO,OAAO,MAAM,MAAM,QAAQ,CAAC,IAAI,iBAAiB,MAAM,YAAY;CAC5E;CACA,IAAI,iBAAiB,eAAe,YAAY,OAAO,KAAK,GAAG;EAC7D,OAAO,QAAQ;EACf,OAAO,WAAW,MAAM,WAAW;CACrC;CACA,IAAI,iBAAiB,OAAO,OAAO;CACnC,IAAI,UAAU,IAAI,KAAK,KAAK,SAAS,iBAAiB,OAAO;CAC7D,UAAU,IAAI,KAAK;CACnB,IAAI;EACF,IAAI,MAAM,QAAQ,KAAK,KAAK,iBAAiB,OAAO,iBAAiB,KAAK;GACxE,MAAM,QAAmB,CAAC;GAC1B,KAAK,MAAM,QAAQ,iBAAiB,MAAM,MAAM,QAAQ,IAAI,OAAO;IACjE,IAAI,OAAO,QAAQ,GAAG;KACpB,MAAM,KAAK,SAAS;KACpB;IACF;IACA,MAAM,KAAK,WAAW,MAAM,QAAQ,QAAQ,GAAG,SAAS,CAAC;GAC3D;GACA,OAAO;EACT;EACA,MAAM,SAAU,MAA+B;EAC/C,IAAI,OAAO,WAAW,YAAY;GAChC,MAAM,OAAgB,OAAO,KAAK,KAAK;GACvC,IAAI,SAAS,OAAO,OAAO,WAAW,MAAM,QAAQ,QAAQ,GAAG,SAAS;EAC1E;EACA,MAAM,SAAkC,CAAC;EACzC,KAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,KAAK,GAAG;GAC1C,IAAI,OAAO,QAAQ,GAAG;IACpB,OAAO,OAAO;IACd;GACF;GACA,OAAO,QAAQ,EAAE;GACjB,UAAU,QAAQ,GAAG,WAAW,GAAG,QAAQ,QAAQ,GAAG,SAAS,CAAC;EAClE;EACA,OAAO;CACT,QAAQ;EACN,OAAO;CACT,UAAU;EACR,UAAU,OAAO,KAAK;CACxB;AACF"}
|
|
1
|
+
{"version":3,"file":"middleware.mjs","names":["sanitizeUrl"],"sources":["../src/middleware/http-logger.ts"],"sourcesContent":["/**\n * HTTP request/response logging middleware — Morgan replacement.\n *\n * Fixes every documented Morgan bug:\n * - statusCode always captured correctly, even for requests > 20 s\n * - Logs request START (with traceId) and response FINISH (with duration)\n * - Captures errors before and after response\n * - Auto-redacts Authorization / Cookie / Set-Cookie headers\n * - Slow-request warnings\n * - Skip predicates for health-check routes / static assets\n *\n * @example Express\n * ```ts\n * import { createExpressMiddleware } from 'logixia/middleware';\n * app.use(createExpressMiddleware(logger));\n * ```\n *\n * @example Fastify\n * ```ts\n * import { createFastifyPlugin } from 'logixia/middleware';\n * await fastify.register(createFastifyPlugin(logger));\n * ```\n */\n\nimport type { IBaseLogger } from '../types';\nimport type { HttpRequestShape, HttpResponseShape } from '../types/http-shapes';\nimport { internalError } from '../utils/internal-log';\nimport { assignOwn } from '../utils/own-property';\nimport { resolveRequestTraceId, resolveTraceHeaders } from '../utils/request-trace';\nimport { stringifyForLog } from '../utils/safe-stringify';\nimport {\n buildNameSet,\n DEFAULT_REDACT_HEADERS,\n DEFAULT_REDACT_QUERY_PARAMS,\n redactUrlQuery as sanitizeUrl,\n redactUrlsInText,\n} from '../utils/sensitive-names';\n\n// ── Shared types ─────────────────────────────────────────────────────────────\n\nexport interface HttpLoggerOptions {\n /**\n * Skip logging for a request. Called before any I/O.\n * @example `skip: (req) => req.url === '/health'`\n */\n skip?: (req: IncomingRequest) => boolean;\n /**\n * Log request body (POST/PUT/PATCH). Capped at `bodyMaxBytes` (default: 4096).\n * Redaction still applies to the captured body.\n * Default: false.\n */\n logBody?: boolean;\n /** Max bytes of body to capture. Default: 4096. */\n bodyMaxBytes?: number;\n /**\n * Emit a WARN log when a request duration exceeds this threshold (ms).\n * Default: 1000.\n */\n slowRequestThresholdMs?: number;\n /**\n * Additional fields to include in every log entry.\n * @example `extraFields: (req) => ({ tenantId: req.headers['x-tenant-id'] })`\n */\n extraFields?: (req: IncomingRequest) => Record<string, unknown>;\n /**\n * Header name, or list of names tried in order, to read the trace ID from.\n * Default: the library-wide list (`DEFAULT_TRACE_HEADERS`: traceparent,\n * x-trace-id, x-request-id, x-correlation-id, trace-id).\n * If none is present, `request.id` is used when it is not a framework counter,\n * otherwise a UUID is generated and shared with the logixia context helpers.\n */\n traceIdHeader?: string | readonly string[];\n /**\n * Additional headers to redact from logged output. Merged with the defaults\n * (authorization, cookie, set-cookie, x-api-key, proxy-authorization,\n * x-auth-token, x-access-token, x-csrf-token, x-amz-security-token).\n */\n redactHeaders?: string[];\n /**\n * Additional query-string parameter names whose values are redacted from the\n * logged URL. Merged with the defaults (token, access_token, refresh_token,\n * code, password, secret, api_key, apikey, key, signature, sig, auth).\n */\n redactQueryParams?: string[];\n /**\n * Log level for request-start entries. Default: 'debug'.\n * Set to 'silent' to suppress request-start logs entirely.\n */\n requestLevel?: string;\n /** Log level for successful response entries. Default: 'info'. */\n responseLevel?: string;\n /** Log level for error responses (status ≥ 500). Default: 'error'. */\n errorLevel?: string;\n}\n\n// Minimal structural types so we don't need @types/express / fastify in core\nexport type IncomingRequest = HttpRequestShape;\nexport type OutgoingResponse = HttpResponseShape;\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\n// Referer, X-Forwarded-Uri, X-Original-Url and the like carry full URLs, so their\n// query strings get the same parameter redaction as the request URL.\nfunction redactHeaderUrls(value: unknown, paramSet: Set<string>): unknown {\n if (typeof value === 'string') {\n return value.includes('?') ? redactUrlsInText(value, paramSet) : value;\n }\n return Array.isArray(value) ? value.map((item) => redactHeaderUrls(item, paramSet)) : value;\n}\n\nfunction sanitizeHeaders(\n headers: Record<string, string | string[] | undefined> | undefined,\n redactSet: Set<string>,\n paramSet: Set<string>\n): Record<string, unknown> {\n if (!headers) return {};\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(headers)) {\n assignOwn(\n out,\n k,\n redactSet.has(k.toLowerCase()) ? '[REDACTED]' : redactHeaderUrls(v, paramSet)\n );\n }\n return out;\n}\n\n/** Fire-and-forget a logger call; a failing log must never become an unhandled rejection. */\nfunction fire(result: unknown): void {\n if (result && typeof (result as Promise<unknown>).catch === 'function') {\n (result as Promise<unknown>).catch((error: unknown) =>\n internalError('http-logger: log call failed', error)\n );\n }\n}\n\ninterface NameSets {\n headers: Set<string>;\n queryParams: Set<string>;\n}\n\nfunction resolveNameSets(options: HttpLoggerOptions): NameSets {\n return {\n headers: buildNameSet(DEFAULT_REDACT_HEADERS, options.redactHeaders),\n queryParams: buildNameSet(DEFAULT_REDACT_QUERY_PARAMS, options.redactQueryParams),\n };\n}\n\nfunction buildBaseFields(\n req: IncomingRequest,\n traceId: string,\n options: HttpLoggerOptions,\n { headers: redactSet, queryParams: paramSet }: NameSets\n): Record<string, unknown> {\n const fields: Record<string, unknown> = {\n traceId,\n method: req.method?.toUpperCase() ?? 'UNKNOWN',\n url: sanitizeUrl(req.url ?? '/', paramSet),\n ip: req.ip ?? req.socket?.remoteAddress ?? 'unknown',\n headers: sanitizeHeaders(req.headers, redactSet, paramSet),\n };\n\n if (options.extraFields) {\n Object.assign(fields, options.extraFields(req));\n }\n\n return fields;\n}\n\n// ── Express middleware ────────────────────────────────────────────────────────\n\n/**\n * Create an Express / Connect compatible middleware that replaces Morgan.\n */\nexport function createExpressMiddleware(\n logger: IBaseLogger,\n options: HttpLoggerOptions = {}\n): (req: IncomingRequest, res: OutgoingResponse, next: () => void) => void {\n const {\n skip,\n logBody,\n bodyMaxBytes,\n traceIdHeader,\n requestLevel = 'debug',\n responseLevel = 'info',\n errorLevel = 'error',\n slowRequestThresholdMs = 1000,\n } = options;\n const nameSets = resolveNameSets(options);\n const traceHeaders = resolveTraceHeaders(traceIdHeader);\n\n return function logixiaHttpMiddleware(\n req: IncomingRequest,\n res: OutgoingResponse,\n next: () => void\n ): void {\n if (skip?.(req)) {\n next();\n return;\n }\n\n const traceId = resolveRequestTraceId(req, traceHeaders);\n const startMs = Date.now();\n const baseFields = buildBaseFields(req, traceId, options, nameSets);\n\n // Log request start\n if (requestLevel !== 'silent') {\n fire(\n logger.logLevel(requestLevel, 'request started', {\n ...baseFields,\n ...(logBody && req.body ? { body: truncateBody(req.body, bodyMaxBytes) } : {}),\n })\n );\n }\n\n // Hook into the response 'finish' event — fires after headers + body are sent.\n // This is what Morgan gets wrong for slow requests (it uses 'close' which may\n // fire before the status code is set on some Node versions).\n //\n // BOTH 'finish' and 'close' fire on a normal response, so guard against\n // logging the completion twice (which would duplicate the completed entry and\n // the slow-request warning).\n let completed = false;\n const onFinish = (): void => {\n if (completed) return;\n completed = true;\n\n const duration = Date.now() - startMs;\n const status = res.statusCode ?? 0;\n const level = status >= 500 ? errorLevel : responseLevel;\n\n fire(\n logger.logLevel(level, 'request completed', {\n ...baseFields,\n statusCode: status,\n duration,\n })\n );\n\n if (duration > slowRequestThresholdMs) {\n fire(\n logger.warn('slow request detected', {\n ...baseFields,\n statusCode: status,\n duration,\n threshold: slowRequestThresholdMs,\n })\n );\n }\n };\n\n res.once?.('finish', onFinish);\n // Fallback: also covers a client that disconnects before 'finish' fires. The\n // `completed` guard ensures a normal finish+close pair logs only once.\n res.once?.('close', onFinish);\n\n next();\n };\n}\n\n// ── Fastify plugin ─────────────────────────────────────────────────────────────\n\nexport interface FastifyInstance {\n addHook: (name: string, fn: (req: unknown, reply: unknown, done: () => void) => void) => void;\n}\n\n/**\n * Create a Fastify plugin (a function you pass to `fastify.register()`).\n *\n * @example\n * ```ts\n * await fastify.register(createFastifyPlugin(logger, { slowRequestThresholdMs: 500 }));\n * ```\n */\nexport function createFastifyPlugin(logger: IBaseLogger, options: HttpLoggerOptions = {}) {\n const {\n skip,\n traceIdHeader,\n requestLevel = 'debug',\n responseLevel = 'info',\n errorLevel = 'error',\n slowRequestThresholdMs = 1000,\n } = options;\n const nameSets = resolveNameSets(options);\n const traceHeaders = resolveTraceHeaders(traceIdHeader);\n\n function logixiaFastifyPlugin(fastify: FastifyInstance, _opts: unknown, done: () => void): void {\n fastify.addHook('onRequest', (request: unknown, _reply: unknown, hookDone: () => void) => {\n const req = request as IncomingRequest & { _logixiaStart?: number };\n if (skip?.(req)) {\n hookDone();\n return;\n }\n\n const traceId = resolveRequestTraceId(req, traceHeaders);\n req._logixiaStart = Date.now();\n\n if (requestLevel !== 'silent') {\n fire(\n logger.logLevel(\n requestLevel,\n 'request started',\n buildBaseFields(req, traceId, options, nameSets)\n )\n );\n }\n hookDone();\n });\n\n fastify.addHook('onResponse', (request: unknown, reply: unknown, hookDone: () => void) => {\n const req = request as IncomingRequest & { _logixiaStart?: number };\n if (req._logixiaStart === undefined) {\n hookDone();\n return;\n }\n\n const rep = reply as { statusCode?: number };\n const duration = Date.now() - req._logixiaStart;\n const status = rep.statusCode ?? 0;\n const traceId = resolveRequestTraceId(req, traceHeaders);\n const level = status >= 500 ? errorLevel : responseLevel;\n const baseFields = buildBaseFields(req, traceId, options, nameSets);\n\n fire(\n logger.logLevel(level, 'request completed', {\n ...baseFields,\n statusCode: status,\n duration,\n })\n );\n\n if (duration > slowRequestThresholdMs) {\n fire(\n logger.warn('slow request detected', {\n traceId,\n url: baseFields.url,\n method: req.method,\n duration,\n threshold: slowRequestThresholdMs,\n })\n );\n }\n\n hookDone();\n });\n\n done();\n }\n\n return Object.assign(logixiaFastifyPlugin, {\n [Symbol.for('skip-override')]: true,\n [Symbol.for('fastify.display-name')]: 'logixia',\n });\n}\n\n// ── Internal helpers ──────────────────────────────────────────────────────────\n\n/**\n * Bound the captured body without turning it into a string, so the logger's\n * path-based redaction still sees the original keys. Oversized structures are\n * pruned (extra keys/items dropped, long strings cut) rather than serialized.\n */\nfunction truncateBody(body: unknown, maxBytes = 4096): unknown {\n if (typeof body === 'string') {\n return body.length > maxBytes ? body.slice(0, maxBytes) + '…[truncated]' : body;\n }\n if (body && typeof body === 'object') {\n const str = stringifyForLog(body);\n if (str.length <= maxBytes) return body;\n return pruneValue(body, { left: maxBytes }, 0, new Set());\n }\n return body;\n}\n\nconst TRUNCATED = '…[truncated]';\nconst MAX_PRUNE_DEPTH = 8;\n\nfunction pruneValue(\n value: unknown,\n budget: { left: number },\n depth: number,\n ancestors: Set<object>\n): unknown {\n if (typeof value === 'string') {\n const cut = value.slice(0, Math.max(0, budget.left));\n budget.left -= cut.length;\n return cut.length < value.length ? cut + TRUNCATED : cut;\n }\n if (value === null || typeof value !== 'object') {\n budget.left -= 8;\n return value;\n }\n if (value instanceof Date) {\n budget.left -= 24;\n return Number.isNaN(value.getTime()) ? 'Invalid Date' : value.toISOString();\n }\n if (value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {\n budget.left -= 16;\n return `[Buffer ${value.byteLength} bytes]`;\n }\n if (value instanceof Error) return value;\n if (ancestors.has(value) || depth >= MAX_PRUNE_DEPTH) return TRUNCATED;\n ancestors.add(value);\n try {\n if (Array.isArray(value) || value instanceof Set || value instanceof Map) {\n const items: unknown[] = [];\n for (const item of value instanceof Map ? value.entries() : value) {\n if (budget.left <= 0) {\n items.push(TRUNCATED);\n break;\n }\n items.push(pruneValue(item, budget, depth + 1, ancestors));\n }\n return items;\n }\n const toJSON = (value as { toJSON?: unknown }).toJSON;\n if (typeof toJSON === 'function') {\n const json: unknown = toJSON.call(value);\n if (json !== value) return pruneValue(json, budget, depth + 1, ancestors);\n }\n const record: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n if (budget.left <= 0) {\n record['…'] = TRUNCATED;\n break;\n }\n budget.left -= k.length;\n assignOwn(record, k, pruneValue(v, budget, depth + 1, ancestors));\n }\n return record;\n } catch {\n return TRUNCATED;\n } finally {\n ancestors.delete(value);\n }\n}\n"],"mappings":"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"}
|
package/dist/nest.d.mts
CHANGED
|
@@ -377,9 +377,10 @@ interface LogMethodOptions {
|
|
|
377
377
|
*/
|
|
378
378
|
level?: LogLevelString;
|
|
379
379
|
/**
|
|
380
|
-
* Whether to log the arguments
|
|
381
|
-
*
|
|
382
|
-
*
|
|
380
|
+
* Whether to log the method's arguments. Off by default: positional arguments
|
|
381
|
+
* have no key names, so redaction rules can't recognise a password passed as
|
|
382
|
+
* `validate(username, password)`.
|
|
383
|
+
* @default false
|
|
383
384
|
*/
|
|
384
385
|
logArgs?: boolean;
|
|
385
386
|
/**
|
package/dist/nest.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nest.d.mts","names":[],"sources":["../src/core/logitron-nestjs.service.ts","../src/core/kafka-trace.interceptor.ts","../src/core/websocket-trace.interceptor.ts","../src/core/logitron-logger.module.ts","../src/core/nestjs-extras.ts","../src/core/trace.middleware.ts","../src/nest.ts"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"nest.d.mts","names":[],"sources":["../src/core/logitron-nestjs.service.ts","../src/core/kafka-trace.interceptor.ts","../src/core/websocket-trace.interceptor.ts","../src/core/logitron-logger.module.ts","../src/core/nestjs-extras.ts","../src/core/trace.middleware.ts","../src/nest.ts"],"mappings":"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"}
|
package/dist/nest.d.ts
CHANGED
|
@@ -377,9 +377,10 @@ interface LogMethodOptions {
|
|
|
377
377
|
*/
|
|
378
378
|
level?: LogLevelString;
|
|
379
379
|
/**
|
|
380
|
-
* Whether to log the arguments
|
|
381
|
-
*
|
|
382
|
-
*
|
|
380
|
+
* Whether to log the method's arguments. Off by default: positional arguments
|
|
381
|
+
* have no key names, so redaction rules can't recognise a password passed as
|
|
382
|
+
* `validate(username, password)`.
|
|
383
|
+
* @default false
|
|
383
384
|
*/
|
|
384
385
|
logArgs?: boolean;
|
|
385
386
|
/**
|
package/dist/nest.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nest.d.ts","names":[],"sources":["../src/core/logitron-nestjs.service.ts","../src/core/kafka-trace.interceptor.ts","../src/core/websocket-trace.interceptor.ts","../src/core/logitron-logger.module.ts","../src/core/nestjs-extras.ts","../src/core/trace.middleware.ts","../src/nest.ts"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"nest.d.ts","names":[],"sources":["../src/core/logitron-nestjs.service.ts","../src/core/kafka-trace.interceptor.ts","../src/core/websocket-trace.interceptor.ts","../src/core/logitron-logger.module.ts","../src/core/nestjs-extras.ts","../src/core/trace.middleware.ts","../src/nest.ts"],"mappings":"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"}
|
package/dist/nest.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_secret_config = require("./secret-config-
|
|
3
|
-
const require_builder = require("./builder-
|
|
4
|
-
const require_sensitive_names = require("./sensitive-names-
|
|
5
|
-
const require_request_trace = require("./request-trace-
|
|
2
|
+
const require_secret_config = require("./secret-config-6hdODxBb.js");
|
|
3
|
+
const require_builder = require("./builder-Up4YxX7l.js");
|
|
4
|
+
const require_sensitive_names = require("./sensitive-names-CNgHaqv9.js");
|
|
5
|
+
const require_request_trace = require("./request-trace-C7kXMjx5.js");
|
|
6
6
|
const require_internal_log = require("./internal-log-DwqTjhpb.js");
|
|
7
|
-
const
|
|
7
|
+
const require_csv_utils = require("./csv.utils-CbVHY1pd.js");
|
|
8
8
|
let _nestjs_common = require("@nestjs/common");
|
|
9
9
|
let rxjs = require("rxjs");
|
|
10
10
|
// \0@oxc-project+runtime@0.155.0/helpers/esm/decorateMetadata.js
|
|
@@ -21,6 +21,9 @@ function __decorate(decorators, target, key, desc) {
|
|
|
21
21
|
// src/core/logitron-nestjs.service.ts
|
|
22
22
|
var _LogixiaLoggerService;
|
|
23
23
|
let LogixiaLoggerService = _LogixiaLoggerService = class LogixiaLoggerService {
|
|
24
|
+
logger;
|
|
25
|
+
context;
|
|
26
|
+
_mergedConfig;
|
|
24
27
|
constructor(config) {
|
|
25
28
|
const defaultConfig = {
|
|
26
29
|
appName: "NestJS-App",
|
|
@@ -141,7 +144,7 @@ let LogixiaLoggerService = _LogixiaLoggerService = class LogixiaLoggerService {
|
|
|
141
144
|
return this.logger.timeAsync(label, fn);
|
|
142
145
|
}
|
|
143
146
|
setContext(context) {
|
|
144
|
-
const coerced = typeof context === "string" ? context :
|
|
147
|
+
const coerced = typeof context === "string" ? context : require_csv_utils.safeToString(context);
|
|
145
148
|
this.context = coerced;
|
|
146
149
|
this.logger.setContext(coerced);
|
|
147
150
|
}
|
|
@@ -182,7 +185,8 @@ let LogixiaLoggerService = _LogixiaLoggerService = class LogixiaLoggerService {
|
|
|
182
185
|
}
|
|
183
186
|
formatMessage(message) {
|
|
184
187
|
if (typeof message === "string") return message;
|
|
185
|
-
|
|
188
|
+
if (message !== null && typeof message === "object") return message;
|
|
189
|
+
return require_csv_utils.safeToString(message);
|
|
186
190
|
}
|
|
187
191
|
};
|
|
188
192
|
LogixiaLoggerService = _LogixiaLoggerService = __decorate([(0, _nestjs_common.Injectable)({ scope: _nestjs_common.Scope.TRANSIENT }), __decorateMetadata("design:paramtypes", [Object])], LogixiaLoggerService);
|
|
@@ -192,12 +196,24 @@ let KafkaTraceInterceptor = class KafkaTraceInterceptor {
|
|
|
192
196
|
static {
|
|
193
197
|
_KafkaTraceInterceptor = this;
|
|
194
198
|
}
|
|
199
|
+
requireTraceId;
|
|
200
|
+
/**
|
|
201
|
+
* Process-wide counters. Readable from anywhere — scrape into your metrics
|
|
202
|
+
* system (Prometheus, Datadog, CloudWatch) on an interval.
|
|
203
|
+
*/
|
|
204
|
+
static metrics = {
|
|
205
|
+
accepted: 0,
|
|
206
|
+
acceptedWithoutTrace: 0,
|
|
207
|
+
dropped: 0
|
|
208
|
+
};
|
|
195
209
|
/** Reset counters (tests). */
|
|
196
210
|
static resetMetrics() {
|
|
197
211
|
_KafkaTraceInterceptor.metrics.accepted = 0;
|
|
198
212
|
_KafkaTraceInterceptor.metrics.acceptedWithoutTrace = 0;
|
|
199
213
|
_KafkaTraceInterceptor.metrics.dropped = 0;
|
|
200
214
|
}
|
|
215
|
+
ctx = require_request_trace.TraceContext.instance;
|
|
216
|
+
config;
|
|
201
217
|
/**
|
|
202
218
|
* @param config - TraceIdConfig options (extractor keys, contextKey, etc.)
|
|
203
219
|
* @param requireTraceId - When true, messages with no traceId are silently skipped
|
|
@@ -208,7 +224,6 @@ let KafkaTraceInterceptor = class KafkaTraceInterceptor {
|
|
|
208
224
|
*/
|
|
209
225
|
constructor(config, requireTraceId = false) {
|
|
210
226
|
this.requireTraceId = requireTraceId;
|
|
211
|
-
this.ctx = require_request_trace.TraceContext.instance;
|
|
212
227
|
this.config = {
|
|
213
228
|
enabled: true,
|
|
214
229
|
contextKey: "traceId",
|
|
@@ -267,11 +282,6 @@ let KafkaTraceInterceptor = class KafkaTraceInterceptor {
|
|
|
267
282
|
return () => inner === null || inner === void 0 ? void 0 : inner.unsubscribe();
|
|
268
283
|
});
|
|
269
284
|
}
|
|
270
|
-
static #_ = () => this.metrics = {
|
|
271
|
-
accepted: 0,
|
|
272
|
-
acceptedWithoutTrace: 0,
|
|
273
|
-
dropped: 0
|
|
274
|
-
};
|
|
275
285
|
};
|
|
276
286
|
KafkaTraceInterceptor = _KafkaTraceInterceptor = __decorate([(0, _nestjs_common.Injectable)(), __decorateMetadata("design:paramtypes", [Object, Boolean])], KafkaTraceInterceptor);
|
|
277
287
|
// \0@oxc-project+runtime@0.155.0/helpers/esm/decorateParam.js
|
|
@@ -312,9 +322,11 @@ function traceUrl(req, names) {
|
|
|
312
322
|
return raw === void 0 ? void 0 : require_sensitive_names.redactUrlQuery(raw, names);
|
|
313
323
|
}
|
|
314
324
|
let TraceMiddleware = class TraceMiddleware {
|
|
325
|
+
config;
|
|
326
|
+
ctx = require_request_trace.TraceContext.instance;
|
|
327
|
+
redactParams;
|
|
315
328
|
constructor(config, redactQueryParams) {
|
|
316
329
|
this.config = config;
|
|
317
|
-
this.ctx = require_request_trace.TraceContext.instance;
|
|
318
330
|
this.redactParams = require_sensitive_names.buildNameSet(require_sensitive_names.DEFAULT_REDACT_QUERY_PARAMS, redactQueryParams);
|
|
319
331
|
const defaultExtractor = {
|
|
320
332
|
header: require_request_trace.DEFAULT_TRACE_HEADERS,
|
|
@@ -363,8 +375,9 @@ TraceMiddleware = __decorate([
|
|
|
363
375
|
], TraceMiddleware);
|
|
364
376
|
// src/core/websocket-trace.interceptor.ts
|
|
365
377
|
let WebSocketTraceInterceptor = class WebSocketTraceInterceptor {
|
|
378
|
+
ctx = require_request_trace.TraceContext.instance;
|
|
379
|
+
config;
|
|
366
380
|
constructor(config) {
|
|
367
|
-
this.ctx = require_request_trace.TraceContext.instance;
|
|
368
381
|
this.config = {
|
|
369
382
|
enabled: true,
|
|
370
383
|
contextKey: "traceId",
|
|
@@ -433,9 +446,14 @@ let LogixiaLoggerModule = class LogixiaLoggerModule {
|
|
|
433
446
|
static {
|
|
434
447
|
_LogixiaLoggerModule = this;
|
|
435
448
|
}
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
449
|
+
config = {};
|
|
450
|
+
static loggerConfig = {};
|
|
451
|
+
/**
|
|
452
|
+
* @internal Backing field for the global logger. Do not read or write
|
|
453
|
+
* directly — use {@link getGlobalLogger} / {@link _setGlobalLogger} which
|
|
454
|
+
* enforce single-init semantics.
|
|
455
|
+
*/
|
|
456
|
+
static _globalLogger = null;
|
|
439
457
|
/**
|
|
440
458
|
* @internal Set the global logger exactly once.
|
|
441
459
|
*
|
|
@@ -675,7 +693,6 @@ let LogixiaLoggerModule = class LogixiaLoggerModule {
|
|
|
675
693
|
inject: [options.useExisting || options.useClass]
|
|
676
694
|
};
|
|
677
695
|
}
|
|
678
|
-
static #_ = () => (this.loggerConfig = {}, this._globalLogger = null);
|
|
679
696
|
};
|
|
680
697
|
LogixiaLoggerModule = _LogixiaLoggerModule = __decorate([(0, _nestjs_common.Module)({})], LogixiaLoggerModule);
|
|
681
698
|
// src/core/nestjs-extras.ts
|
|
@@ -712,7 +729,7 @@ const InjectLogger = (context) => context === void 0 ? (0, _nestjs_common.Inject
|
|
|
712
729
|
* ```
|
|
713
730
|
*/
|
|
714
731
|
function LogMethod(options = {}) {
|
|
715
|
-
const { level = "debug", logArgs =
|
|
732
|
+
const { level = "debug", logArgs = false, logResult = false, logErrors = true } = options;
|
|
716
733
|
return function(target, propertyKey, descriptor) {
|
|
717
734
|
var _constructor;
|
|
718
735
|
const originalMethod = descriptor.value;
|
|
@@ -853,6 +870,10 @@ function sanitizedError(exception, clean) {
|
|
|
853
870
|
}
|
|
854
871
|
}
|
|
855
872
|
let LogixiaExceptionFilter = class LogixiaExceptionFilter {
|
|
873
|
+
_logger;
|
|
874
|
+
_traceConfig;
|
|
875
|
+
_options;
|
|
876
|
+
_redactParams;
|
|
856
877
|
constructor(logger, loggerConfig, options) {
|
|
857
878
|
var _loggerConfig$redact;
|
|
858
879
|
this._options = options ?? {};
|