@mks2508/better-logger 0.18.3 → 0.18.4
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/Logger.d.ts +0 -18
- package/dist/Logger.d.ts.map +1 -1
- package/dist/chunks/{LogContext-Dyzs61XG.js → LogContext-BO-f0KXu.js} +20 -14
- package/dist/chunks/{LogContext-Dyzs61XG.js.map → LogContext-BO-f0KXu.js.map} +1 -1
- package/dist/chunks/{LogContext-DZasm_P5.cjs → LogContext-CIKxWPrK.cjs} +20 -14
- package/dist/chunks/{LogContext-DZasm_P5.cjs.map → LogContext-CIKxWPrK.cjs.map} +1 -1
- package/dist/context/LogContext.d.ts.map +1 -1
- package/dist/context.cjs +1 -1
- package/dist/context.js +1 -1
- package/dist/index.cjs +25 -35
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +25 -35
- package/dist/index.js.map +1 -1
- package/dist/transports/SpanRuntime.d.ts +3 -0
- package/dist/transports/SpanRuntime.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/LogContext-BaMXleWj.cjs +0 -105
- package/dist/chunks/LogContext-BaMXleWj.cjs.map +0 -1
- package/dist/chunks/LogContext-DjlITOzZ.js +0 -100
- package/dist/chunks/LogContext-DjlITOzZ.js.map +0 -1
- package/dist/chunks/transports-BGfwwakw.js +0 -1237
- package/dist/chunks/transports-BGfwwakw.js.map +0 -1
- package/dist/chunks/transports-yK6CL0Ml.cjs +0 -1278
- package/dist/chunks/transports-yK6CL0Ml.cjs.map +0 -1
package/dist/Logger.d.ts
CHANGED
|
@@ -686,24 +686,6 @@ export declare class Logger {
|
|
|
686
686
|
* @internal
|
|
687
687
|
*/
|
|
688
688
|
protected _dispatchTag: string | undefined;
|
|
689
|
-
/**
|
|
690
|
-
* Computa el contexto completamente mergueado para este logger.
|
|
691
|
-
*
|
|
692
|
-
* La cadena de contexto se construye en el momento de crear el child:
|
|
693
|
-
* cada child almacena el contexto fully-merged de su parent (en ese
|
|
694
|
-
* instante) como `_parentContextRecord`. Esto implica que
|
|
695
|
-
* `_parentContextRecord` ya contiene los bindings de todos los ancestros
|
|
696
|
-
* en el orden de precedencia correcto (root primero, child más cercano al final).
|
|
697
|
-
*
|
|
698
|
-
* Orden de merge (gana el último):
|
|
699
|
-
* 1. _parentContextRecord — snapshot del contexto mergueado del parent en la creación
|
|
700
|
-
* 2. _bindings — bindings propios de este logger (llamadas a `child()`)
|
|
701
|
-
* 3. ALS store — scope de `withContext`/`withContextAsync` (prioridad máxima)
|
|
702
|
-
*
|
|
703
|
-
* @internal
|
|
704
|
-
* @returns El record de contexto mergueado
|
|
705
|
-
*/
|
|
706
|
-
private _getMergedContext;
|
|
707
689
|
/** @internal Expone el contexto base mergueado (sin ALS) a la closure de la child factory de LogContext. */
|
|
708
690
|
_captureMergedContext(): Record<string, unknown>;
|
|
709
691
|
/**
|
package/dist/Logger.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../src/Logger.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../src/Logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,7 +33,8 @@ function resolveAsyncLocalStorage() {
|
|
|
33
33
|
}
|
|
34
34
|
//#endregion
|
|
35
35
|
//#region src/context/LogContext.ts
|
|
36
|
-
|
|
36
|
+
let alsInstance;
|
|
37
|
+
let alsActivated = false;
|
|
37
38
|
/**
|
|
38
39
|
* Factory que crea una instancia de {@link LogContext}.
|
|
39
40
|
*
|
|
@@ -58,32 +59,37 @@ const alsInstance = resolveAsyncLocalStorage();
|
|
|
58
59
|
function createLogContext(options) {
|
|
59
60
|
let context = { ...options.initialContext };
|
|
60
61
|
let resource = options.initialResource ? { ...options.initialResource } : void 0;
|
|
61
|
-
const
|
|
62
|
+
const activateAls = () => {
|
|
63
|
+
if (!alsActivated) {
|
|
64
|
+
alsActivated = true;
|
|
65
|
+
alsInstance = resolveAsyncLocalStorage();
|
|
66
|
+
}
|
|
67
|
+
return options.alsInstance ?? alsInstance;
|
|
68
|
+
};
|
|
62
69
|
return {
|
|
63
70
|
getContext() {
|
|
64
71
|
return { ...context };
|
|
65
72
|
},
|
|
66
73
|
withContext(bindings, fn) {
|
|
67
|
-
if (!als) {
|
|
68
|
-
if (fn) return fn();
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
74
|
if (!fn) return void 0;
|
|
75
|
+
const store = activateAls();
|
|
76
|
+
if (!store) return fn();
|
|
72
77
|
const merged = {
|
|
73
78
|
...context,
|
|
74
|
-
...
|
|
79
|
+
...store.getStore(),
|
|
75
80
|
...bindings
|
|
76
81
|
};
|
|
77
|
-
return
|
|
82
|
+
return store.run(merged, fn);
|
|
78
83
|
},
|
|
79
84
|
async withContextAsync(bindings, fn) {
|
|
80
|
-
|
|
85
|
+
const store = activateAls();
|
|
86
|
+
if (!store) return fn();
|
|
81
87
|
const merged = {
|
|
82
88
|
...context,
|
|
83
|
-
...
|
|
89
|
+
...store.getStore(),
|
|
84
90
|
...bindings
|
|
85
91
|
};
|
|
86
|
-
return
|
|
92
|
+
return store.run(merged, fn);
|
|
87
93
|
},
|
|
88
94
|
clearContext() {
|
|
89
95
|
context = {};
|
|
@@ -104,7 +110,7 @@ function createLogContext(options) {
|
|
|
104
110
|
},
|
|
105
111
|
_getContextRecord() {
|
|
106
112
|
const base = this._getBaseContextRecord();
|
|
107
|
-
const alsContext =
|
|
113
|
+
const alsContext = (options.alsInstance ?? (alsActivated ? alsInstance : void 0))?.getStore();
|
|
108
114
|
if (alsContext && Object.keys(alsContext).length > 0) return {
|
|
109
115
|
...base,
|
|
110
116
|
...alsContext
|
|
@@ -126,11 +132,11 @@ function createLogContext(options) {
|
|
|
126
132
|
return resource;
|
|
127
133
|
},
|
|
128
134
|
_getAlsStore() {
|
|
129
|
-
return
|
|
135
|
+
return (options.alsInstance ?? (alsActivated ? alsInstance : void 0))?.getStore();
|
|
130
136
|
}
|
|
131
137
|
};
|
|
132
138
|
}
|
|
133
139
|
//#endregion
|
|
134
140
|
export { resolveAsyncLocalStorage as n, createLogContext as t };
|
|
135
141
|
|
|
136
|
-
//# sourceMappingURL=LogContext-
|
|
142
|
+
//# sourceMappingURL=LogContext-BO-f0KXu.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LogContext-Dyzs61XG.js","names":[],"sources":["../../src/utils/asyncLocalStorage.ts","../../src/context/LogContext.ts"],"sourcesContent":["/**\n * @fileoverview Resolución compartida de `AsyncLocalStorage` — utilidad\n * interna, NO exportada por el barrel público (`src/utils/index.ts`).\n *\n * Único punto de verdad para resolver `node:async_hooks` por capas. Lo\n * consumen tanto `transports/SpanRuntime.ts` (ALS singleton de spans) como\n * `context/LogContext.ts` (ALS singleton de MDC). Antes había dos copias de\n * este conocimiento: una acertaba (SpanRuntime, la que sigue este archivo) y\n * otra usaba `typeof AsyncLocalStorage !== 'undefined'` — un feature-detect\n * roto, porque en Node y Bun el constructor NO es global, así que esa rama\n * quedaba siempre en `undefined` y el MDC de logs era no-op silencioso fuera\n * del browser.\n */\n\n/**\n * Forma mínima de `AsyncLocalStorage<T>` que necesita este paquete.\n */\nexport interface AsyncLocalStorageLike<T> {\n run<R>(store: T, fn: () => R): R;\n getStore(): T | undefined;\n}\n\n/**\n * Resuelve `AsyncLocalStorage` por capas:\n * 1. global `AsyncLocalStorage` (runtimes/polyfills que lo exponen),\n * 2. `process.getBuiltinModule('async_hooks')` (Node >= 22.3, Bun),\n * 3. `require('node:async_hooks')` (CJS interop),\n * 4. `undefined` → browser estricto: sin correlación (degradación\n * documentada; el caller decide qué hacer sin ALS).\n *\n * Nota: NO basta con `typeof AsyncLocalStorage !== 'undefined'` — en Node y\n * Bun el constructor NO es global y hay que ir a `node:async_hooks`.\n */\nexport function resolveAsyncLocalStorage<T>(): AsyncLocalStorageLike<T> | undefined {\n const globalCtor = (globalThis as { AsyncLocalStorage?: new () => AsyncLocalStorageLike<T> }).AsyncLocalStorage;\n if (typeof globalCtor === 'function') {\n return new globalCtor();\n }\n\n const proc = globalThis as {\n process?: {\n getBuiltinModule?: (id: string) => { AsyncLocalStorage?: new () => AsyncLocalStorageLike<T> } | undefined;\n };\n };\n try {\n const asyncHooks = proc.process?.getBuiltinModule?.('async_hooks');\n if (asyncHooks?.AsyncLocalStorage) {\n return new asyncHooks.AsyncLocalStorage();\n }\n } catch {\n // getBuiltinModule no disponible — siguiente capa\n }\n\n try {\n if (typeof require === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const asyncHooks = require('node:async_hooks') as { AsyncLocalStorage?: new () => AsyncLocalStorageLike<T> };\n if (asyncHooks?.AsyncLocalStorage) {\n return new asyncHooks.AsyncLocalStorage();\n }\n }\n } catch {\n // ESM puro sin require ni builtin accessor — browser\n }\n\n return undefined;\n}\n","/**\n * @fileoverview Bridge de LogContext — gestión de MDC (Mapped Diagnostic Context).\n *\n * Encapsula el contexto estructurado por logger, la creación de child loggers y\n * el merge de resource OTel en cada record emitido.\n *\n * Modelo de API:\n * - `withContext(bindings, fn?)` — si se pasa `fn`, lo ejecuta dentro de un\n * scope de AsyncLocalStorage mergeando `bindings`. Sin `fn`: no-op (shim de\n * backwards compat para la vieja forma de setter).\n * - `withContextAsync(bindings, fn)` — variante async callback.\n * - `child(bindings)` — inmutable (patrón canónico de MDC).\n * - Feature-detect de AsyncLocalStorage; en browser sin ALS es no-op.\n */\n\nimport type { ILogResourceRef } from '../types/index.js';\nimport type { LoggerConfig } from '../types/index.js';\nimport { resolveAsyncLocalStorage, type AsyncLocalStorageLike } from '../utils/asyncLocalStorage.js';\n\n/**\n * Snapshot del contexto bound. Lo retorna {@link LogContext.getContext}.\n *\n * Es `Readonly` para marcar contractually que el objeto devuelto es una shallow\n * copy: mutarlo no afecta a los records que emitan futuras llamadas de log.\n */\nexport type ContextSnapshot = Readonly<Record<string, unknown>>;\n\n/**\n * Tipo de la factory function para crear instancias child de Logger.\n *\n * Se inyecta en LogContext para que `child()` pueda instanciar nuevos loggers\n * sin introducir un import circular entre `Logger.ts` y `LogContext.ts`.\n * Retorna `unknown` — la clase Logger concreta la maneja el caller, y la\n * instancia devuelta tiene su campo `context` escrito por LogContext tras la\n * creación.\n */\nexport type ChildLoggerFactory = (config: Partial<LoggerConfig>) => unknown;\n\n/**\n * Shape mínima de una instancia de Logger que LogContext necesita ver.\n *\n * Evita dependencias circulares entre LogContext y Logger. El campo\n * `_parentContextRecord` lo setea el Logger padre después de que\n * `LogContext.child()` retorna, estableciendo la cadena de contextos.\n */\nexport interface ChildLoggerShape {\n _parentContextRecord?: Record<string, unknown>;\n /** Campo legacy — ya no es la fuente canónica del contexto. */\n context?: Record<string, unknown>;\n}\n\n/**\n * Options que se pasan a {@link createLogContext}.\n */\nexport interface ILogContextOptions {\n /** Pares key-value iniciales del contexto. */\n initialContext?: Record<string, unknown>;\n /** Factory para crear instancias child de logger. */\n childLoggerFactory: ChildLoggerFactory;\n /** Resource OTel inicial a mergear en cada record emitido. */\n initialResource?: Partial<ILogResourceRef>;\n /**\n * Retorna el record de contexto mergeado del logger padre en el momento\n * de creación del child. Lo usa `_getContextRecord()` para construir la\n * cadena de contextos.\n * @internal\n */\n getParentContextRecord?: () => Record<string, unknown>;\n /**\n * Instancia de AsyncLocalStorage a usar para el scoping de `withContext`.\n * @internal\n */\n alsInstance?: ALS;\n}\n\n/**\n * Contrato que retorna {@link createLogContext}.\n *\n * Fachada de MDC (Mapped Diagnostic Context) por logger. Combina tres fuentes\n * de contexto:\n * - **base inmutable** vía `child()` (snapshot capturado al crear el child),\n * - **scope transitorio** vía `withContext()` / `withContextAsync()` sobre\n * AsyncLocalStorage,\n * - **resource OTel** mergeado en cada record.\n *\n * En entornos browser sin `AsyncLocalStorage`, las variantes `withContext*`\n * degradan a no-op: ejecutan `fn` sin scoping (o lo skipan si no hay `fn`).\n * `child()` sigue operativo en browser porque no depende de ALS.\n */\nexport interface LogContext {\n /**\n * Snapshot actual del contexto bound.\n *\n * @returns Copia inmutable (shallow) del contexto; mutarla no afecta a los\n * records que emitan futuras llamadas de log.\n *\n * @example\n * const ctx = logContext.getContext();\n * console.log(ctx.requestId); // 'abc-123'\n */\n getContext(): ContextSnapshot;\n\n /**\n * Ejecuta `fn` dentro de un scope de AsyncLocalStorage donde `bindings`\n * se mergean al contexto para todas las llamadas de log dentro de `fn`.\n *\n * Si no se pasa `fn` (la vieja forma de setter), es no-op por backwards\n * compatibility. Para binding persistente prefiere `child()`; para\n * callbacks async usa `withContextAsync()`.\n *\n * **Browser fallback**: sin ALS, ejecuta `fn` directamente sin scoping\n * (los bindings NO se mergean). Si tampoco hay `fn`, retorna `undefined`.\n *\n * @param bindings - Pares key-value a attachar durante la ejecución de `fn`\n * @param fn - Función sincrónica opcional a ejecutar bajo el scope ALS\n * @returns El valor de retorno de `fn`, o `undefined` si no se pasa `fn`\n *\n * @example\n * logContext.withContext({ requestId: 'abc-123' }, () => {\n * logger.info('procesando'); // el record lleva requestId=abc-123\n * });\n * // fuera de fn: requestId ya no está presente en próximos logs\n *\n * @see {@link LogContext.withContextAsync} para callbacks async\n * @see {@link LogContext.child} para binding persistente inmutable (sin ALS)\n */\n withContext<R>(bindings: Record<string, unknown>, fn?: () => R): R | undefined;\n\n /**\n * Variante async de {@link withContext}. Ejecuta `fn` dentro de un scope\n * de AsyncLocalStorage para que los bindings queden disponibles a todas las\n * llamadas de log async dentro de `fn` (incluso tras `await`).\n *\n * **Browser fallback**: sin ALS, ejecuta `fn` directamente sin scoping.\n *\n * @param bindings - Pares key-value a attachar durante la ejecución de `fn`\n * @param fn - Función async a ejecutar bajo el scope ALS\n * @returns El Promise retornado por `fn`\n *\n * @example\n * await logContext.withContextAsync({ traceId }, async () => {\n * const user = await fetchUser();\n * logger.info('user cargado', { id: user.id });\n * // el record lleva el traceId aunque el log ocurra tras un await\n * });\n */\n withContextAsync<R>(bindings: Record<string, unknown>, fn: () => Promise<R>): Promise<R>;\n\n /**\n * Droppea todas las keys del contexto bound. Tras esta llamada, los\n * records emitidos ya no llevan `attributes` hasta que\n * {@link withContext} o {@link child} restablezcan uno.\n *\n * @returns La misma instancia de LogContext, ahora sin contexto\n *\n * @example\n * logContext.clearContext();\n * logger.info('limpio'); // sin attributes\n */\n clearContext(): this;\n\n /**\n * Actualiza el resource OTel por defecto (service.name, version,\n * deployment.environment, ...).\n *\n * Se persiste en el campo `resource` de cada record emitido, salvo que el\n * propio record lo overridee.\n *\n * @param resource - Resource OTel parcial a mergear con el actual\n * @returns La misma instancia de LogContext, para encadenar calls\n *\n * @example\n * logContext.setResource({ serviceName: 'api-gateway', environment: 'prod' });\n */\n setResource(resource: Partial<ILogResourceRef>): this;\n\n /**\n * Devuelve una copia inmutable de este logger con el contexto extra bound.\n *\n * Las llamadas futuras sobre el child emiten con el contexto mergeado, sin\n * mutar al padre — patrón canónico de MDC.\n *\n * A diferencia de {@link withContext}, **no involucra AsyncLocalStorage**:\n * el binding es persistente y queda capturado en el snapshot del child al\n * crearse. Por eso `child()` es operativo también en browser sin ALS.\n *\n * Los bindings transitorios de ALS activos en el momento de `child()` NO\n * se bakean en el child — solo se captura el contexto base. ALS se aplica\n * fresco en cada dispatch vía `_getContextRecord()`.\n *\n * @param extra - Pares key-value a attachar (requestId, userId, ...)\n * @returns Un nuevo Logger con el contexto mergeado\n *\n * @example\n * const requestLog = logContext.child({ requestId: 'abc-123' });\n * requestLog.info('inicio'); // siempre lleva requestId=abc-123\n * requestLog.info('fin');\n * // el logger padre no se ve afectado por estos bindings\n *\n * @see {@link LogContext.withContext} para scoping transitorio (ALS)\n */\n child(extra: Record<string, unknown>): ChildLoggerShape;\n\n /**\n * Record de contexto interno. Expuesto para el ensamblado de TransportRecord\n * (base + overlay ALS si hay store activo).\n * @internal\n */\n _getContextRecord(): Record<string, unknown>;\n /**\n * Retorna el contexto base SIN el overlay de ALS.\n *\n * Lo usa `Logger.child()` para capturar el snapshot del contexto padre al\n * crear un child logger, garantizando que el binding ALS transitorio no\n * se bakeé en el child.\n * @internal\n */\n _getBaseContextRecord(): Record<string, unknown>;\n /**\n * Record de resource interno. Expuesto para el ensamblado de TransportRecord.\n * @internal\n */\n _getResource(): Partial<ILogResourceRef> | undefined;\n /**\n * Retorna el store actual de AsyncLocalStorage, si ALS está activo en el\n * call stack corriente.\n * @internal\n */\n _getAlsStore(): Record<string, unknown> | undefined;\n}\n\n// AsyncLocalStorage type (Node 14+, undefined in browser)\ntype ALS = AsyncLocalStorageLike<Record<string, unknown>>;\n\n// ALS singleton del módulo. Resolución por capas (global →\n// `process.getBuiltinModule` → `require`, undefined en browser) delegada al\n// helper compartido `resolveAsyncLocalStorage` — el mismo que usa el ALS de\n// spans en `transports/SpanRuntime.ts`. Antes esto era\n// `typeof AsyncLocalStorage !== 'undefined'`, un feature-detect roto: ese\n// constructor no es global en node/bun, así que siempre resolvía `undefined`\n// y `withContext`/`withContextAsync` eran no-op silenciosos fuera del browser.\nconst alsInstance: ALS | undefined = resolveAsyncLocalStorage<Record<string, unknown>>();\n\n/**\n * Factory que crea una instancia de {@link LogContext}.\n *\n * @param options - Configuración (ver {@link ILogContextOptions})\n * @returns Una instancia de LogContext lista para usar\n *\n * @example\n * const logContext = createLogContext({\n * childLoggerFactory: (cfg) => new Logger(cfg),\n * initialContext: { service: 'orders-api' },\n * initialResource: { serviceName: 'orders-api', environment: 'prod' }\n * });\n *\n * // Child inmutable con contexto persistente\n * const requestLog = logContext.child({ requestId: 'abc-123' });\n *\n * // Scope transitorio vía ALS (Node; en browser sin ALS es no-op)\n * logContext.withContext({ traceId: 't-9' }, () => {\n * requestLog.info('procesando orden');\n * });\n */\nexport function createLogContext(options: ILogContextOptions): LogContext {\n let context: Record<string, unknown> = { ...options.initialContext };\n let resource: Partial<ILogResourceRef> | undefined = options.initialResource\n ? { ...options.initialResource }\n : undefined;\n\n // Use provided ALS instance or fall back to module-level (browser fallback)\n const als = options.alsInstance ?? alsInstance;\n\n return {\n getContext(): ContextSnapshot {\n return { ...context };\n },\n\n withContext<R>(bindings: Record<string, unknown>, fn?: () => R): R | undefined {\n // No-op without AsyncLocalStorage (browser fallback)\n if (!als) {\n if (fn) return fn();\n return undefined;\n }\n // No fn: backwards-compat no-op setter shim\n if (!fn) return undefined;\n // Run fn within AsyncLocalStorage scope, merged with the active\n // outer scope (if any) so nested withContext calls accumulate\n // bindings instead of replacing them.\n const merged = { ...context, ...als.getStore(), ...bindings };\n return als.run(merged, fn);\n },\n\n async withContextAsync<R>(bindings: Record<string, unknown>, fn: () => Promise<R>): Promise<R> {\n if (!als) return fn();\n const merged = { ...context, ...als.getStore(), ...bindings };\n return als.run(merged, fn);\n },\n\n clearContext(): typeof this {\n context = {};\n return this;\n },\n\n setResource(res: Partial<ILogResourceRef>): typeof this {\n resource = { ...resource, ...res };\n return this;\n },\n\n child(_extra: Record<string, unknown>): ChildLoggerShape {\n // Creates the child logger via factory. Captures the current\n // _getBaseContextRecord() snapshot (parent context WITHOUT ALS) at\n // child-creation time. ALS is transient and should not be baked into\n // the child's _parentContextRecord — it is applied fresh at dispatch time.\n // Note: _extra (bindings) are stored by Logger.child() as _bindings.\n const snapshot = this._getBaseContextRecord();\n const childLogger = options.childLoggerFactory({}) as ChildLoggerShape;\n // Store on childLogger for Logger.child() to pick up\n (childLogger as unknown as Record<string, unknown>)['__parentSnapshot'] = snapshot;\n return childLogger;\n },\n\n _getContextRecord(): Record<string, unknown> {\n // Returns the full merged context for dispatch purposes.\n // Base (parent snapshot + own context) plus ALS overlay if active.\n const base = this._getBaseContextRecord();\n const alsContext = als?.getStore();\n if (alsContext && Object.keys(alsContext).length > 0) {\n return { ...base, ...alsContext };\n }\n return base;\n },\n\n _getBaseContextRecord(): Record<string, unknown> {\n // Returns parent context chain + own context (NO ALS overlay).\n // ALS is applied by _getContextRecord() as a live overlay.\n let base: Record<string, unknown> = {};\n const parentRecord = options.getParentContextRecord?.() ?? null;\n if (parentRecord && Object.keys(parentRecord).length > 0) {\n base = parentRecord;\n } else if (Object.keys(context).length > 0) {\n base = context;\n }\n if (Object.keys(context).length > 0) {\n base = { ...base, ...context };\n }\n return base;\n },\n\n _getResource(): Partial<ILogResourceRef> | undefined {\n return resource;\n },\n\n _getAlsStore(): Record<string, unknown> | undefined {\n return als?.getStore();\n }\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAiCA,SAAgB,2BAAoE;CAChF,MAAM,aAAc,WAA0E;CAC9F,IAAI,OAAO,eAAe,YACtB,OAAO,IAAI,WAAW;CAG1B,MAAM,OAAO;CAKb,IAAI;EACA,MAAM,aAAa,KAAK,SAAS,mBAAmB,aAAa;EACjE,IAAI,YAAY,mBACZ,OAAO,IAAI,WAAW,kBAAkB;CAEhD,QAAQ,CAER;CAEA,IAAI;EACA,IAAI,OAAA,cAAmB,YAAY;GAE/B,MAAM,aAAA,UAAqB,kBAAkB;GAC7C,IAAI,YAAY,mBACZ,OAAO,IAAI,WAAW,kBAAkB;EAEhD;CACJ,QAAQ,CAER;AAGJ;;;AC+KA,MAAM,cAA+B,yBAAkD;;;;;;;;;;;;;;;;;;;;;;AAuBvF,SAAgB,iBAAiB,SAAyC;CACtE,IAAI,UAAmC,EAAE,GAAG,QAAQ,eAAe;CACnE,IAAI,WAAiD,QAAQ,kBACvD,EAAE,GAAG,QAAQ,gBAAgB,IAC7B,KAAA;CAGN,MAAM,MAAM,QAAQ,eAAe;CAEnC,OAAO;EACH,aAA8B;GAC1B,OAAO,EAAE,GAAG,QAAQ;EACxB;EAEA,YAAe,UAAmC,IAA6B;GAE3E,IAAI,CAAC,KAAK;IACN,IAAI,IAAI,OAAO,GAAG;IAClB;GACJ;GAEA,IAAI,CAAC,IAAI,OAAO,KAAA;GAIhB,MAAM,SAAS;IAAE,GAAG;IAAS,GAAG,IAAI,SAAS;IAAG,GAAG;GAAS;GAC5D,OAAO,IAAI,IAAI,QAAQ,EAAE;EAC7B;EAEA,MAAM,iBAAoB,UAAmC,IAAkC;GAC3F,IAAI,CAAC,KAAK,OAAO,GAAG;GACpB,MAAM,SAAS;IAAE,GAAG;IAAS,GAAG,IAAI,SAAS;IAAG,GAAG;GAAS;GAC5D,OAAO,IAAI,IAAI,QAAQ,EAAE;EAC7B;EAEA,eAA4B;GACxB,UAAU,CAAC;GACX,OAAO;EACX;EAEA,YAAY,KAA4C;GACpD,WAAW;IAAE,GAAG;IAAU,GAAG;GAAI;GACjC,OAAO;EACX;EAEA,MAAM,QAAmD;GAMrD,MAAM,WAAW,KAAK,sBAAsB;GAC5C,MAAM,cAAc,QAAQ,mBAAmB,CAAC,CAAC;GAEjD,YAAoD,sBAAsB;GAC1E,OAAO;EACX;EAEA,oBAA6C;GAGzC,MAAM,OAAO,KAAK,sBAAsB;GACxC,MAAM,aAAa,KAAK,SAAS;GACjC,IAAI,cAAc,OAAO,KAAK,UAAU,CAAC,CAAC,SAAS,GAC/C,OAAO;IAAE,GAAG;IAAM,GAAG;GAAW;GAEpC,OAAO;EACX;EAEA,wBAAiD;GAG7C,IAAI,OAAgC,CAAC;GACrC,MAAM,eAAe,QAAQ,yBAAyB,KAAK;GAC3D,IAAI,gBAAgB,OAAO,KAAK,YAAY,CAAC,CAAC,SAAS,GACnD,OAAO;QACJ,IAAI,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,GACrC,OAAO;GAEX,IAAI,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,GAC9B,OAAO;IAAE,GAAG;IAAM,GAAG;GAAQ;GAEjC,OAAO;EACX;EAEA,eAAqD;GACjD,OAAO;EACX;EAEA,eAAoD;GAChD,OAAO,KAAK,SAAS;EACzB;CACJ;AACJ"}
|
|
1
|
+
{"version":3,"file":"LogContext-BO-f0KXu.js","names":[],"sources":["../../src/utils/asyncLocalStorage.ts","../../src/context/LogContext.ts"],"sourcesContent":["/**\n * @fileoverview Resolución compartida de `AsyncLocalStorage` — utilidad\n * interna, NO exportada por el barrel público (`src/utils/index.ts`).\n *\n * Único punto de verdad para resolver `node:async_hooks` por capas. Lo\n * consumen tanto `transports/SpanRuntime.ts` (ALS singleton de spans) como\n * `context/LogContext.ts` (ALS singleton de MDC). Antes había dos copias de\n * este conocimiento: una acertaba (SpanRuntime, la que sigue este archivo) y\n * otra usaba `typeof AsyncLocalStorage !== 'undefined'` — un feature-detect\n * roto, porque en Node y Bun el constructor NO es global, así que esa rama\n * quedaba siempre en `undefined` y el MDC de logs era no-op silencioso fuera\n * del browser.\n */\n\n/**\n * Forma mínima de `AsyncLocalStorage<T>` que necesita este paquete.\n */\nexport interface AsyncLocalStorageLike<T> {\n run<R>(store: T, fn: () => R): R;\n getStore(): T | undefined;\n}\n\n/**\n * Resuelve `AsyncLocalStorage` por capas:\n * 1. global `AsyncLocalStorage` (runtimes/polyfills que lo exponen),\n * 2. `process.getBuiltinModule('async_hooks')` (Node >= 22.3, Bun),\n * 3. `require('node:async_hooks')` (CJS interop),\n * 4. `undefined` → browser estricto: sin correlación (degradación\n * documentada; el caller decide qué hacer sin ALS).\n *\n * Nota: NO basta con `typeof AsyncLocalStorage !== 'undefined'` — en Node y\n * Bun el constructor NO es global y hay que ir a `node:async_hooks`.\n */\nexport function resolveAsyncLocalStorage<T>(): AsyncLocalStorageLike<T> | undefined {\n const globalCtor = (globalThis as { AsyncLocalStorage?: new () => AsyncLocalStorageLike<T> }).AsyncLocalStorage;\n if (typeof globalCtor === 'function') {\n return new globalCtor();\n }\n\n const proc = globalThis as {\n process?: {\n getBuiltinModule?: (id: string) => { AsyncLocalStorage?: new () => AsyncLocalStorageLike<T> } | undefined;\n };\n };\n try {\n const asyncHooks = proc.process?.getBuiltinModule?.('async_hooks');\n if (asyncHooks?.AsyncLocalStorage) {\n return new asyncHooks.AsyncLocalStorage();\n }\n } catch {\n // getBuiltinModule no disponible — siguiente capa\n }\n\n try {\n if (typeof require === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const asyncHooks = require('node:async_hooks') as { AsyncLocalStorage?: new () => AsyncLocalStorageLike<T> };\n if (asyncHooks?.AsyncLocalStorage) {\n return new asyncHooks.AsyncLocalStorage();\n }\n }\n } catch {\n // ESM puro sin require ni builtin accessor — browser\n }\n\n return undefined;\n}\n","/**\n * @fileoverview Bridge de LogContext — gestión de MDC (Mapped Diagnostic Context).\n *\n * Encapsula el contexto estructurado por logger, la creación de child loggers y\n * el merge de resource OTel en cada record emitido.\n *\n * Modelo de API:\n * - `withContext(bindings, fn?)` — si se pasa `fn`, lo ejecuta dentro de un\n * scope de AsyncLocalStorage mergeando `bindings`. Sin `fn`: no-op (shim de\n * backwards compat para la vieja forma de setter).\n * - `withContextAsync(bindings, fn)` — variante async callback.\n * - `child(bindings)` — inmutable (patrón canónico de MDC).\n * - Feature-detect de AsyncLocalStorage; en browser sin ALS es no-op.\n */\n\nimport type { ILogResourceRef } from '../types/index.js';\nimport type { LoggerConfig } from '../types/index.js';\nimport { resolveAsyncLocalStorage, type AsyncLocalStorageLike } from '../utils/asyncLocalStorage.js';\n\n/**\n * Snapshot del contexto bound. Lo retorna {@link LogContext.getContext}.\n *\n * Es `Readonly` para marcar contractually que el objeto devuelto es una shallow\n * copy: mutarlo no afecta a los records que emitan futuras llamadas de log.\n */\nexport type ContextSnapshot = Readonly<Record<string, unknown>>;\n\n/**\n * Tipo de la factory function para crear instancias child de Logger.\n *\n * Se inyecta en LogContext para que `child()` pueda instanciar nuevos loggers\n * sin introducir un import circular entre `Logger.ts` y `LogContext.ts`.\n * Retorna `unknown` — la clase Logger concreta la maneja el caller, y la\n * instancia devuelta tiene su campo `context` escrito por LogContext tras la\n * creación.\n */\nexport type ChildLoggerFactory = (config: Partial<LoggerConfig>) => unknown;\n\n/**\n * Shape mínima de una instancia de Logger que LogContext necesita ver.\n *\n * Evita dependencias circulares entre LogContext y Logger. El campo\n * `_parentContextRecord` lo setea el Logger padre después de que\n * `LogContext.child()` retorna, estableciendo la cadena de contextos.\n */\nexport interface ChildLoggerShape {\n _parentContextRecord?: Record<string, unknown>;\n /** Campo legacy — ya no es la fuente canónica del contexto. */\n context?: Record<string, unknown>;\n}\n\n/**\n * Options que se pasan a {@link createLogContext}.\n */\nexport interface ILogContextOptions {\n /** Pares key-value iniciales del contexto. */\n initialContext?: Record<string, unknown>;\n /** Factory para crear instancias child de logger. */\n childLoggerFactory: ChildLoggerFactory;\n /** Resource OTel inicial a mergear en cada record emitido. */\n initialResource?: Partial<ILogResourceRef>;\n /**\n * Retorna el record de contexto mergeado del logger padre en el momento\n * de creación del child. Lo usa `_getContextRecord()` para construir la\n * cadena de contextos.\n * @internal\n */\n getParentContextRecord?: () => Record<string, unknown>;\n /**\n * Instancia de AsyncLocalStorage a usar para el scoping de `withContext`.\n * @internal\n */\n alsInstance?: ALS;\n}\n\n/**\n * Contrato que retorna {@link createLogContext}.\n *\n * Fachada de MDC (Mapped Diagnostic Context) por logger. Combina tres fuentes\n * de contexto:\n * - **base inmutable** vía `child()` (snapshot capturado al crear el child),\n * - **scope transitorio** vía `withContext()` / `withContextAsync()` sobre\n * AsyncLocalStorage,\n * - **resource OTel** mergeado en cada record.\n *\n * En entornos browser sin `AsyncLocalStorage`, las variantes `withContext*`\n * degradan a no-op: ejecutan `fn` sin scoping (o lo skipan si no hay `fn`).\n * `child()` sigue operativo en browser porque no depende de ALS.\n */\nexport interface LogContext {\n /**\n * Snapshot actual del contexto bound.\n *\n * @returns Copia inmutable (shallow) del contexto; mutarla no afecta a los\n * records que emitan futuras llamadas de log.\n *\n * @example\n * const ctx = logContext.getContext();\n * console.log(ctx.requestId); // 'abc-123'\n */\n getContext(): ContextSnapshot;\n\n /**\n * Ejecuta `fn` dentro de un scope de AsyncLocalStorage donde `bindings`\n * se mergean al contexto para todas las llamadas de log dentro de `fn`.\n *\n * Si no se pasa `fn` (la vieja forma de setter), es no-op por backwards\n * compatibility. Para binding persistente prefiere `child()`; para\n * callbacks async usa `withContextAsync()`.\n *\n * **Browser fallback**: sin ALS, ejecuta `fn` directamente sin scoping\n * (los bindings NO se mergean). Si tampoco hay `fn`, retorna `undefined`.\n *\n * @param bindings - Pares key-value a attachar durante la ejecución de `fn`\n * @param fn - Función sincrónica opcional a ejecutar bajo el scope ALS\n * @returns El valor de retorno de `fn`, o `undefined` si no se pasa `fn`\n *\n * @example\n * logContext.withContext({ requestId: 'abc-123' }, () => {\n * logger.info('procesando'); // el record lleva requestId=abc-123\n * });\n * // fuera de fn: requestId ya no está presente en próximos logs\n *\n * @see {@link LogContext.withContextAsync} para callbacks async\n * @see {@link LogContext.child} para binding persistente inmutable (sin ALS)\n */\n withContext<R>(bindings: Record<string, unknown>, fn?: () => R): R | undefined;\n\n /**\n * Variante async de {@link withContext}. Ejecuta `fn` dentro de un scope\n * de AsyncLocalStorage para que los bindings queden disponibles a todas las\n * llamadas de log async dentro de `fn` (incluso tras `await`).\n *\n * **Browser fallback**: sin ALS, ejecuta `fn` directamente sin scoping.\n *\n * @param bindings - Pares key-value a attachar durante la ejecución de `fn`\n * @param fn - Función async a ejecutar bajo el scope ALS\n * @returns El Promise retornado por `fn`\n *\n * @example\n * await logContext.withContextAsync({ traceId }, async () => {\n * const user = await fetchUser();\n * logger.info('user cargado', { id: user.id });\n * // el record lleva el traceId aunque el log ocurra tras un await\n * });\n */\n withContextAsync<R>(bindings: Record<string, unknown>, fn: () => Promise<R>): Promise<R>;\n\n /**\n * Droppea todas las keys del contexto bound. Tras esta llamada, los\n * records emitidos ya no llevan `attributes` hasta que\n * {@link withContext} o {@link child} restablezcan uno.\n *\n * @returns La misma instancia de LogContext, ahora sin contexto\n *\n * @example\n * logContext.clearContext();\n * logger.info('limpio'); // sin attributes\n */\n clearContext(): this;\n\n /**\n * Actualiza el resource OTel por defecto (service.name, version,\n * deployment.environment, ...).\n *\n * Se persiste en el campo `resource` de cada record emitido, salvo que el\n * propio record lo overridee.\n *\n * @param resource - Resource OTel parcial a mergear con el actual\n * @returns La misma instancia de LogContext, para encadenar calls\n *\n * @example\n * logContext.setResource({ serviceName: 'api-gateway', environment: 'prod' });\n */\n setResource(resource: Partial<ILogResourceRef>): this;\n\n /**\n * Devuelve una copia inmutable de este logger con el contexto extra bound.\n *\n * Las llamadas futuras sobre el child emiten con el contexto mergeado, sin\n * mutar al padre — patrón canónico de MDC.\n *\n * A diferencia de {@link withContext}, **no involucra AsyncLocalStorage**:\n * el binding es persistente y queda capturado en el snapshot del child al\n * crearse. Por eso `child()` es operativo también en browser sin ALS.\n *\n * Los bindings transitorios de ALS activos en el momento de `child()` NO\n * se bakean en el child — solo se captura el contexto base. ALS se aplica\n * fresco en cada dispatch vía `_getContextRecord()`.\n *\n * @param extra - Pares key-value a attachar (requestId, userId, ...)\n * @returns Un nuevo Logger con el contexto mergeado\n *\n * @example\n * const requestLog = logContext.child({ requestId: 'abc-123' });\n * requestLog.info('inicio'); // siempre lleva requestId=abc-123\n * requestLog.info('fin');\n * // el logger padre no se ve afectado por estos bindings\n *\n * @see {@link LogContext.withContext} para scoping transitorio (ALS)\n */\n child(extra: Record<string, unknown>): ChildLoggerShape;\n\n /**\n * Record de contexto interno. Expuesto para el ensamblado de TransportRecord\n * (base + overlay ALS si hay store activo).\n * @internal\n */\n _getContextRecord(): Record<string, unknown>;\n /**\n * Retorna el contexto base SIN el overlay de ALS.\n *\n * Lo usa `Logger.child()` para capturar el snapshot del contexto padre al\n * crear un child logger, garantizando que el binding ALS transitorio no\n * se bakeé en el child.\n * @internal\n */\n _getBaseContextRecord(): Record<string, unknown>;\n /**\n * Record de resource interno. Expuesto para el ensamblado de TransportRecord.\n * @internal\n */\n _getResource(): Partial<ILogResourceRef> | undefined;\n /**\n * Retorna el store actual de AsyncLocalStorage, si ALS está activo en el\n * call stack corriente.\n * @internal\n */\n _getAlsStore(): Record<string, unknown> | undefined;\n}\n\n// AsyncLocalStorage type (Node 14+, undefined in browser)\ntype ALS = AsyncLocalStorageLike<Record<string, unknown>>;\n\n// ALS singleton del módulo. Resolución por capas (global →\n// `process.getBuiltinModule` → `require`, undefined en browser) delegada al\n// helper compartido `resolveAsyncLocalStorage` — el mismo que usa el ALS de\n// spans en `transports/SpanRuntime.ts`. Antes esto era\n// `typeof AsyncLocalStorage !== 'undefined'`, un feature-detect roto: ese\n// constructor no es global en node/bun, así que siempre resolvía `undefined`\n// y `withContext`/`withContextAsync` eran no-op silenciosos fuera del browser.\n//\n// Se resuelve lazy en el primer `withContext(fn)`: cargar `node:async_hooks`\n// cuesta ~2,2 MB de RSS en bun, y `_getContextRecord` consulta el store en\n// cada dispatch de log — resolverlo al importar se lo cobraría a todo\n// proceso que loguea, use MDC o no. Sin `run()` previo `getStore()` devuelve\n// `undefined`, así que el guard por flag es observable-identico.\nlet alsInstance: ALS | undefined;\nlet alsActivated = false;\n\n/**\n * Factory que crea una instancia de {@link LogContext}.\n *\n * @param options - Configuración (ver {@link ILogContextOptions})\n * @returns Una instancia de LogContext lista para usar\n *\n * @example\n * const logContext = createLogContext({\n * childLoggerFactory: (cfg) => new Logger(cfg),\n * initialContext: { service: 'orders-api' },\n * initialResource: { serviceName: 'orders-api', environment: 'prod' }\n * });\n *\n * // Child inmutable con contexto persistente\n * const requestLog = logContext.child({ requestId: 'abc-123' });\n *\n * // Scope transitorio vía ALS (Node; en browser sin ALS es no-op)\n * logContext.withContext({ traceId: 't-9' }, () => {\n * requestLog.info('procesando orden');\n * });\n */\nexport function createLogContext(options: ILogContextOptions): LogContext {\n let context: Record<string, unknown> = { ...options.initialContext };\n let resource: Partial<ILogResourceRef> | undefined = options.initialResource\n ? { ...options.initialResource }\n : undefined;\n\n // Provided instance wins; otherwise the module singleton resolves on\n // first real use (see the note on `alsInstance` above). The module\n // instance stays shared across LogContexts: nested `withContext` de\n // loggers distintos se ven entre sí vía el mismo store.\n const activateAls = (): ALS | undefined => {\n if (!alsActivated) {\n alsActivated = true;\n alsInstance = resolveAsyncLocalStorage<Record<string, unknown>>();\n }\n return options.alsInstance ?? alsInstance;\n };\n\n return {\n getContext(): ContextSnapshot {\n return { ...context };\n },\n\n withContext<R>(bindings: Record<string, unknown>, fn?: () => R): R | undefined {\n // No fn: backwards-compat no-op setter shim — never activates ALS\n if (!fn) return undefined;\n const store = activateAls();\n // No AsyncLocalStorage (browser fallback): run fn as-is\n if (!store) return fn();\n // Run fn within AsyncLocalStorage scope, merged with the active\n // outer scope (if any) so nested withContext calls accumulate\n // bindings instead of replacing them.\n const merged = { ...context, ...store.getStore(), ...bindings };\n return store.run(merged, fn);\n },\n\n async withContextAsync<R>(bindings: Record<string, unknown>, fn: () => Promise<R>): Promise<R> {\n const store = activateAls();\n if (!store) return fn();\n const merged = { ...context, ...store.getStore(), ...bindings };\n return store.run(merged, fn);\n },\n\n clearContext(): typeof this {\n context = {};\n return this;\n },\n\n setResource(res: Partial<ILogResourceRef>): typeof this {\n resource = { ...resource, ...res };\n return this;\n },\n\n child(_extra: Record<string, unknown>): ChildLoggerShape {\n // Creates the child logger via factory. Captures the current\n // _getBaseContextRecord() snapshot (parent context WITHOUT ALS) at\n // child-creation time. ALS is transient and should not be baked into\n // the child's _parentContextRecord — it is applied fresh at dispatch time.\n // Note: _extra (bindings) are stored by Logger.child() as _bindings.\n const snapshot = this._getBaseContextRecord();\n const childLogger = options.childLoggerFactory({}) as ChildLoggerShape;\n // Store on childLogger for Logger.child() to pick up\n (childLogger as unknown as Record<string, unknown>)['__parentSnapshot'] = snapshot;\n return childLogger;\n },\n\n _getContextRecord(): Record<string, unknown> {\n // Returns the full merged context for dispatch purposes.\n // Base (parent snapshot + own context) plus ALS overlay if active.\n // An injected instance is read as-is (external runs count); the\n // module singleton only after activation — pre-activation its\n // store would be empty anyway.\n const base = this._getBaseContextRecord();\n const store = options.alsInstance ?? (alsActivated ? alsInstance : undefined);\n const alsContext = store?.getStore();\n if (alsContext && Object.keys(alsContext).length > 0) {\n return { ...base, ...alsContext };\n }\n return base;\n },\n\n _getBaseContextRecord(): Record<string, unknown> {\n // Returns parent context chain + own context (NO ALS overlay).\n // ALS is applied by _getContextRecord() as a live overlay.\n let base: Record<string, unknown> = {};\n const parentRecord = options.getParentContextRecord?.() ?? null;\n if (parentRecord && Object.keys(parentRecord).length > 0) {\n base = parentRecord;\n } else if (Object.keys(context).length > 0) {\n base = context;\n }\n if (Object.keys(context).length > 0) {\n base = { ...base, ...context };\n }\n return base;\n },\n\n _getResource(): Partial<ILogResourceRef> | undefined {\n return resource;\n },\n\n _getAlsStore(): Record<string, unknown> | undefined {\n return (options.alsInstance ?? (alsActivated ? alsInstance : undefined))?.getStore();\n }\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAiCA,SAAgB,2BAAoE;CAChF,MAAM,aAAc,WAA0E;CAC9F,IAAI,OAAO,eAAe,YACtB,OAAO,IAAI,WAAW;CAG1B,MAAM,OAAO;CAKb,IAAI;EACA,MAAM,aAAa,KAAK,SAAS,mBAAmB,aAAa;EACjE,IAAI,YAAY,mBACZ,OAAO,IAAI,WAAW,kBAAkB;CAEhD,QAAQ,CAER;CAEA,IAAI;EACA,IAAI,OAAA,cAAmB,YAAY;GAE/B,MAAM,aAAA,UAAqB,kBAAkB;GAC7C,IAAI,YAAY,mBACZ,OAAO,IAAI,WAAW,kBAAkB;EAEhD;CACJ,QAAQ,CAER;AAGJ;;;ACqLA,IAAI;AACJ,IAAI,eAAe;;;;;;;;;;;;;;;;;;;;;;AAuBnB,SAAgB,iBAAiB,SAAyC;CACtE,IAAI,UAAmC,EAAE,GAAG,QAAQ,eAAe;CACnE,IAAI,WAAiD,QAAQ,kBACvD,EAAE,GAAG,QAAQ,gBAAgB,IAC7B,KAAA;CAMN,MAAM,oBAAqC;EACvC,IAAI,CAAC,cAAc;GACf,eAAe;GACf,cAAc,yBAAkD;EACpE;EACA,OAAO,QAAQ,eAAe;CAClC;CAEA,OAAO;EACH,aAA8B;GAC1B,OAAO,EAAE,GAAG,QAAQ;EACxB;EAEA,YAAe,UAAmC,IAA6B;GAE3E,IAAI,CAAC,IAAI,OAAO,KAAA;GAChB,MAAM,QAAQ,YAAY;GAE1B,IAAI,CAAC,OAAO,OAAO,GAAG;GAItB,MAAM,SAAS;IAAE,GAAG;IAAS,GAAG,MAAM,SAAS;IAAG,GAAG;GAAS;GAC9D,OAAO,MAAM,IAAI,QAAQ,EAAE;EAC/B;EAEA,MAAM,iBAAoB,UAAmC,IAAkC;GAC3F,MAAM,QAAQ,YAAY;GAC1B,IAAI,CAAC,OAAO,OAAO,GAAG;GACtB,MAAM,SAAS;IAAE,GAAG;IAAS,GAAG,MAAM,SAAS;IAAG,GAAG;GAAS;GAC9D,OAAO,MAAM,IAAI,QAAQ,EAAE;EAC/B;EAEA,eAA4B;GACxB,UAAU,CAAC;GACX,OAAO;EACX;EAEA,YAAY,KAA4C;GACpD,WAAW;IAAE,GAAG;IAAU,GAAG;GAAI;GACjC,OAAO;EACX;EAEA,MAAM,QAAmD;GAMrD,MAAM,WAAW,KAAK,sBAAsB;GAC5C,MAAM,cAAc,QAAQ,mBAAmB,CAAC,CAAC;GAEjD,YAAoD,sBAAsB;GAC1E,OAAO;EACX;EAEA,oBAA6C;GAMzC,MAAM,OAAO,KAAK,sBAAsB;GAExC,MAAM,cADQ,QAAQ,gBAAgB,eAAe,cAAc,KAAA,GAAA,EACzC,SAAS;GACnC,IAAI,cAAc,OAAO,KAAK,UAAU,CAAC,CAAC,SAAS,GAC/C,OAAO;IAAE,GAAG;IAAM,GAAG;GAAW;GAEpC,OAAO;EACX;EAEA,wBAAiD;GAG7C,IAAI,OAAgC,CAAC;GACrC,MAAM,eAAe,QAAQ,yBAAyB,KAAK;GAC3D,IAAI,gBAAgB,OAAO,KAAK,YAAY,CAAC,CAAC,SAAS,GACnD,OAAO;QACJ,IAAI,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,GACrC,OAAO;GAEX,IAAI,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,GAC9B,OAAO;IAAE,GAAG;IAAM,GAAG;GAAQ;GAEjC,OAAO;EACX;EAEA,eAAqD;GACjD,OAAO;EACX;EAEA,eAAoD;GAChD,QAAQ,QAAQ,gBAAgB,eAAe,cAAc,KAAA,GAAA,EAAa,SAAS;EACvF;CACJ;AACJ"}
|
|
@@ -27,7 +27,8 @@ function resolveAsyncLocalStorage() {
|
|
|
27
27
|
}
|
|
28
28
|
//#endregion
|
|
29
29
|
//#region src/context/LogContext.ts
|
|
30
|
-
|
|
30
|
+
let alsInstance;
|
|
31
|
+
let alsActivated = false;
|
|
31
32
|
/**
|
|
32
33
|
* Factory que crea una instancia de {@link LogContext}.
|
|
33
34
|
*
|
|
@@ -52,32 +53,37 @@ const alsInstance = resolveAsyncLocalStorage();
|
|
|
52
53
|
function createLogContext(options) {
|
|
53
54
|
let context = { ...options.initialContext };
|
|
54
55
|
let resource = options.initialResource ? { ...options.initialResource } : void 0;
|
|
55
|
-
const
|
|
56
|
+
const activateAls = () => {
|
|
57
|
+
if (!alsActivated) {
|
|
58
|
+
alsActivated = true;
|
|
59
|
+
alsInstance = resolveAsyncLocalStorage();
|
|
60
|
+
}
|
|
61
|
+
return options.alsInstance ?? alsInstance;
|
|
62
|
+
};
|
|
56
63
|
return {
|
|
57
64
|
getContext() {
|
|
58
65
|
return { ...context };
|
|
59
66
|
},
|
|
60
67
|
withContext(bindings, fn) {
|
|
61
|
-
if (!als) {
|
|
62
|
-
if (fn) return fn();
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
68
|
if (!fn) return void 0;
|
|
69
|
+
const store = activateAls();
|
|
70
|
+
if (!store) return fn();
|
|
66
71
|
const merged = {
|
|
67
72
|
...context,
|
|
68
|
-
...
|
|
73
|
+
...store.getStore(),
|
|
69
74
|
...bindings
|
|
70
75
|
};
|
|
71
|
-
return
|
|
76
|
+
return store.run(merged, fn);
|
|
72
77
|
},
|
|
73
78
|
async withContextAsync(bindings, fn) {
|
|
74
|
-
|
|
79
|
+
const store = activateAls();
|
|
80
|
+
if (!store) return fn();
|
|
75
81
|
const merged = {
|
|
76
82
|
...context,
|
|
77
|
-
...
|
|
83
|
+
...store.getStore(),
|
|
78
84
|
...bindings
|
|
79
85
|
};
|
|
80
|
-
return
|
|
86
|
+
return store.run(merged, fn);
|
|
81
87
|
},
|
|
82
88
|
clearContext() {
|
|
83
89
|
context = {};
|
|
@@ -98,7 +104,7 @@ function createLogContext(options) {
|
|
|
98
104
|
},
|
|
99
105
|
_getContextRecord() {
|
|
100
106
|
const base = this._getBaseContextRecord();
|
|
101
|
-
const alsContext =
|
|
107
|
+
const alsContext = (options.alsInstance ?? (alsActivated ? alsInstance : void 0))?.getStore();
|
|
102
108
|
if (alsContext && Object.keys(alsContext).length > 0) return {
|
|
103
109
|
...base,
|
|
104
110
|
...alsContext
|
|
@@ -120,7 +126,7 @@ function createLogContext(options) {
|
|
|
120
126
|
return resource;
|
|
121
127
|
},
|
|
122
128
|
_getAlsStore() {
|
|
123
|
-
return
|
|
129
|
+
return (options.alsInstance ?? (alsActivated ? alsInstance : void 0))?.getStore();
|
|
124
130
|
}
|
|
125
131
|
};
|
|
126
132
|
}
|
|
@@ -138,4 +144,4 @@ Object.defineProperty(exports, "resolveAsyncLocalStorage", {
|
|
|
138
144
|
}
|
|
139
145
|
});
|
|
140
146
|
|
|
141
|
-
//# sourceMappingURL=LogContext-
|
|
147
|
+
//# sourceMappingURL=LogContext-CIKxWPrK.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LogContext-DZasm_P5.cjs","names":[],"sources":["../../src/utils/asyncLocalStorage.ts","../../src/context/LogContext.ts"],"sourcesContent":["/**\n * @fileoverview Resolución compartida de `AsyncLocalStorage` — utilidad\n * interna, NO exportada por el barrel público (`src/utils/index.ts`).\n *\n * Único punto de verdad para resolver `node:async_hooks` por capas. Lo\n * consumen tanto `transports/SpanRuntime.ts` (ALS singleton de spans) como\n * `context/LogContext.ts` (ALS singleton de MDC). Antes había dos copias de\n * este conocimiento: una acertaba (SpanRuntime, la que sigue este archivo) y\n * otra usaba `typeof AsyncLocalStorage !== 'undefined'` — un feature-detect\n * roto, porque en Node y Bun el constructor NO es global, así que esa rama\n * quedaba siempre en `undefined` y el MDC de logs era no-op silencioso fuera\n * del browser.\n */\n\n/**\n * Forma mínima de `AsyncLocalStorage<T>` que necesita este paquete.\n */\nexport interface AsyncLocalStorageLike<T> {\n run<R>(store: T, fn: () => R): R;\n getStore(): T | undefined;\n}\n\n/**\n * Resuelve `AsyncLocalStorage` por capas:\n * 1. global `AsyncLocalStorage` (runtimes/polyfills que lo exponen),\n * 2. `process.getBuiltinModule('async_hooks')` (Node >= 22.3, Bun),\n * 3. `require('node:async_hooks')` (CJS interop),\n * 4. `undefined` → browser estricto: sin correlación (degradación\n * documentada; el caller decide qué hacer sin ALS).\n *\n * Nota: NO basta con `typeof AsyncLocalStorage !== 'undefined'` — en Node y\n * Bun el constructor NO es global y hay que ir a `node:async_hooks`.\n */\nexport function resolveAsyncLocalStorage<T>(): AsyncLocalStorageLike<T> | undefined {\n const globalCtor = (globalThis as { AsyncLocalStorage?: new () => AsyncLocalStorageLike<T> }).AsyncLocalStorage;\n if (typeof globalCtor === 'function') {\n return new globalCtor();\n }\n\n const proc = globalThis as {\n process?: {\n getBuiltinModule?: (id: string) => { AsyncLocalStorage?: new () => AsyncLocalStorageLike<T> } | undefined;\n };\n };\n try {\n const asyncHooks = proc.process?.getBuiltinModule?.('async_hooks');\n if (asyncHooks?.AsyncLocalStorage) {\n return new asyncHooks.AsyncLocalStorage();\n }\n } catch {\n // getBuiltinModule no disponible — siguiente capa\n }\n\n try {\n if (typeof require === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const asyncHooks = require('node:async_hooks') as { AsyncLocalStorage?: new () => AsyncLocalStorageLike<T> };\n if (asyncHooks?.AsyncLocalStorage) {\n return new asyncHooks.AsyncLocalStorage();\n }\n }\n } catch {\n // ESM puro sin require ni builtin accessor — browser\n }\n\n return undefined;\n}\n","/**\n * @fileoverview Bridge de LogContext — gestión de MDC (Mapped Diagnostic Context).\n *\n * Encapsula el contexto estructurado por logger, la creación de child loggers y\n * el merge de resource OTel en cada record emitido.\n *\n * Modelo de API:\n * - `withContext(bindings, fn?)` — si se pasa `fn`, lo ejecuta dentro de un\n * scope de AsyncLocalStorage mergeando `bindings`. Sin `fn`: no-op (shim de\n * backwards compat para la vieja forma de setter).\n * - `withContextAsync(bindings, fn)` — variante async callback.\n * - `child(bindings)` — inmutable (patrón canónico de MDC).\n * - Feature-detect de AsyncLocalStorage; en browser sin ALS es no-op.\n */\n\nimport type { ILogResourceRef } from '../types/index.js';\nimport type { LoggerConfig } from '../types/index.js';\nimport { resolveAsyncLocalStorage, type AsyncLocalStorageLike } from '../utils/asyncLocalStorage.js';\n\n/**\n * Snapshot del contexto bound. Lo retorna {@link LogContext.getContext}.\n *\n * Es `Readonly` para marcar contractually que el objeto devuelto es una shallow\n * copy: mutarlo no afecta a los records que emitan futuras llamadas de log.\n */\nexport type ContextSnapshot = Readonly<Record<string, unknown>>;\n\n/**\n * Tipo de la factory function para crear instancias child de Logger.\n *\n * Se inyecta en LogContext para que `child()` pueda instanciar nuevos loggers\n * sin introducir un import circular entre `Logger.ts` y `LogContext.ts`.\n * Retorna `unknown` — la clase Logger concreta la maneja el caller, y la\n * instancia devuelta tiene su campo `context` escrito por LogContext tras la\n * creación.\n */\nexport type ChildLoggerFactory = (config: Partial<LoggerConfig>) => unknown;\n\n/**\n * Shape mínima de una instancia de Logger que LogContext necesita ver.\n *\n * Evita dependencias circulares entre LogContext y Logger. El campo\n * `_parentContextRecord` lo setea el Logger padre después de que\n * `LogContext.child()` retorna, estableciendo la cadena de contextos.\n */\nexport interface ChildLoggerShape {\n _parentContextRecord?: Record<string, unknown>;\n /** Campo legacy — ya no es la fuente canónica del contexto. */\n context?: Record<string, unknown>;\n}\n\n/**\n * Options que se pasan a {@link createLogContext}.\n */\nexport interface ILogContextOptions {\n /** Pares key-value iniciales del contexto. */\n initialContext?: Record<string, unknown>;\n /** Factory para crear instancias child de logger. */\n childLoggerFactory: ChildLoggerFactory;\n /** Resource OTel inicial a mergear en cada record emitido. */\n initialResource?: Partial<ILogResourceRef>;\n /**\n * Retorna el record de contexto mergeado del logger padre en el momento\n * de creación del child. Lo usa `_getContextRecord()` para construir la\n * cadena de contextos.\n * @internal\n */\n getParentContextRecord?: () => Record<string, unknown>;\n /**\n * Instancia de AsyncLocalStorage a usar para el scoping de `withContext`.\n * @internal\n */\n alsInstance?: ALS;\n}\n\n/**\n * Contrato que retorna {@link createLogContext}.\n *\n * Fachada de MDC (Mapped Diagnostic Context) por logger. Combina tres fuentes\n * de contexto:\n * - **base inmutable** vía `child()` (snapshot capturado al crear el child),\n * - **scope transitorio** vía `withContext()` / `withContextAsync()` sobre\n * AsyncLocalStorage,\n * - **resource OTel** mergeado en cada record.\n *\n * En entornos browser sin `AsyncLocalStorage`, las variantes `withContext*`\n * degradan a no-op: ejecutan `fn` sin scoping (o lo skipan si no hay `fn`).\n * `child()` sigue operativo en browser porque no depende de ALS.\n */\nexport interface LogContext {\n /**\n * Snapshot actual del contexto bound.\n *\n * @returns Copia inmutable (shallow) del contexto; mutarla no afecta a los\n * records que emitan futuras llamadas de log.\n *\n * @example\n * const ctx = logContext.getContext();\n * console.log(ctx.requestId); // 'abc-123'\n */\n getContext(): ContextSnapshot;\n\n /**\n * Ejecuta `fn` dentro de un scope de AsyncLocalStorage donde `bindings`\n * se mergean al contexto para todas las llamadas de log dentro de `fn`.\n *\n * Si no se pasa `fn` (la vieja forma de setter), es no-op por backwards\n * compatibility. Para binding persistente prefiere `child()`; para\n * callbacks async usa `withContextAsync()`.\n *\n * **Browser fallback**: sin ALS, ejecuta `fn` directamente sin scoping\n * (los bindings NO se mergean). Si tampoco hay `fn`, retorna `undefined`.\n *\n * @param bindings - Pares key-value a attachar durante la ejecución de `fn`\n * @param fn - Función sincrónica opcional a ejecutar bajo el scope ALS\n * @returns El valor de retorno de `fn`, o `undefined` si no se pasa `fn`\n *\n * @example\n * logContext.withContext({ requestId: 'abc-123' }, () => {\n * logger.info('procesando'); // el record lleva requestId=abc-123\n * });\n * // fuera de fn: requestId ya no está presente en próximos logs\n *\n * @see {@link LogContext.withContextAsync} para callbacks async\n * @see {@link LogContext.child} para binding persistente inmutable (sin ALS)\n */\n withContext<R>(bindings: Record<string, unknown>, fn?: () => R): R | undefined;\n\n /**\n * Variante async de {@link withContext}. Ejecuta `fn` dentro de un scope\n * de AsyncLocalStorage para que los bindings queden disponibles a todas las\n * llamadas de log async dentro de `fn` (incluso tras `await`).\n *\n * **Browser fallback**: sin ALS, ejecuta `fn` directamente sin scoping.\n *\n * @param bindings - Pares key-value a attachar durante la ejecución de `fn`\n * @param fn - Función async a ejecutar bajo el scope ALS\n * @returns El Promise retornado por `fn`\n *\n * @example\n * await logContext.withContextAsync({ traceId }, async () => {\n * const user = await fetchUser();\n * logger.info('user cargado', { id: user.id });\n * // el record lleva el traceId aunque el log ocurra tras un await\n * });\n */\n withContextAsync<R>(bindings: Record<string, unknown>, fn: () => Promise<R>): Promise<R>;\n\n /**\n * Droppea todas las keys del contexto bound. Tras esta llamada, los\n * records emitidos ya no llevan `attributes` hasta que\n * {@link withContext} o {@link child} restablezcan uno.\n *\n * @returns La misma instancia de LogContext, ahora sin contexto\n *\n * @example\n * logContext.clearContext();\n * logger.info('limpio'); // sin attributes\n */\n clearContext(): this;\n\n /**\n * Actualiza el resource OTel por defecto (service.name, version,\n * deployment.environment, ...).\n *\n * Se persiste en el campo `resource` de cada record emitido, salvo que el\n * propio record lo overridee.\n *\n * @param resource - Resource OTel parcial a mergear con el actual\n * @returns La misma instancia de LogContext, para encadenar calls\n *\n * @example\n * logContext.setResource({ serviceName: 'api-gateway', environment: 'prod' });\n */\n setResource(resource: Partial<ILogResourceRef>): this;\n\n /**\n * Devuelve una copia inmutable de este logger con el contexto extra bound.\n *\n * Las llamadas futuras sobre el child emiten con el contexto mergeado, sin\n * mutar al padre — patrón canónico de MDC.\n *\n * A diferencia de {@link withContext}, **no involucra AsyncLocalStorage**:\n * el binding es persistente y queda capturado en el snapshot del child al\n * crearse. Por eso `child()` es operativo también en browser sin ALS.\n *\n * Los bindings transitorios de ALS activos en el momento de `child()` NO\n * se bakean en el child — solo se captura el contexto base. ALS se aplica\n * fresco en cada dispatch vía `_getContextRecord()`.\n *\n * @param extra - Pares key-value a attachar (requestId, userId, ...)\n * @returns Un nuevo Logger con el contexto mergeado\n *\n * @example\n * const requestLog = logContext.child({ requestId: 'abc-123' });\n * requestLog.info('inicio'); // siempre lleva requestId=abc-123\n * requestLog.info('fin');\n * // el logger padre no se ve afectado por estos bindings\n *\n * @see {@link LogContext.withContext} para scoping transitorio (ALS)\n */\n child(extra: Record<string, unknown>): ChildLoggerShape;\n\n /**\n * Record de contexto interno. Expuesto para el ensamblado de TransportRecord\n * (base + overlay ALS si hay store activo).\n * @internal\n */\n _getContextRecord(): Record<string, unknown>;\n /**\n * Retorna el contexto base SIN el overlay de ALS.\n *\n * Lo usa `Logger.child()` para capturar el snapshot del contexto padre al\n * crear un child logger, garantizando que el binding ALS transitorio no\n * se bakeé en el child.\n * @internal\n */\n _getBaseContextRecord(): Record<string, unknown>;\n /**\n * Record de resource interno. Expuesto para el ensamblado de TransportRecord.\n * @internal\n */\n _getResource(): Partial<ILogResourceRef> | undefined;\n /**\n * Retorna el store actual de AsyncLocalStorage, si ALS está activo en el\n * call stack corriente.\n * @internal\n */\n _getAlsStore(): Record<string, unknown> | undefined;\n}\n\n// AsyncLocalStorage type (Node 14+, undefined in browser)\ntype ALS = AsyncLocalStorageLike<Record<string, unknown>>;\n\n// ALS singleton del módulo. Resolución por capas (global →\n// `process.getBuiltinModule` → `require`, undefined en browser) delegada al\n// helper compartido `resolveAsyncLocalStorage` — el mismo que usa el ALS de\n// spans en `transports/SpanRuntime.ts`. Antes esto era\n// `typeof AsyncLocalStorage !== 'undefined'`, un feature-detect roto: ese\n// constructor no es global en node/bun, así que siempre resolvía `undefined`\n// y `withContext`/`withContextAsync` eran no-op silenciosos fuera del browser.\nconst alsInstance: ALS | undefined = resolveAsyncLocalStorage<Record<string, unknown>>();\n\n/**\n * Factory que crea una instancia de {@link LogContext}.\n *\n * @param options - Configuración (ver {@link ILogContextOptions})\n * @returns Una instancia de LogContext lista para usar\n *\n * @example\n * const logContext = createLogContext({\n * childLoggerFactory: (cfg) => new Logger(cfg),\n * initialContext: { service: 'orders-api' },\n * initialResource: { serviceName: 'orders-api', environment: 'prod' }\n * });\n *\n * // Child inmutable con contexto persistente\n * const requestLog = logContext.child({ requestId: 'abc-123' });\n *\n * // Scope transitorio vía ALS (Node; en browser sin ALS es no-op)\n * logContext.withContext({ traceId: 't-9' }, () => {\n * requestLog.info('procesando orden');\n * });\n */\nexport function createLogContext(options: ILogContextOptions): LogContext {\n let context: Record<string, unknown> = { ...options.initialContext };\n let resource: Partial<ILogResourceRef> | undefined = options.initialResource\n ? { ...options.initialResource }\n : undefined;\n\n // Use provided ALS instance or fall back to module-level (browser fallback)\n const als = options.alsInstance ?? alsInstance;\n\n return {\n getContext(): ContextSnapshot {\n return { ...context };\n },\n\n withContext<R>(bindings: Record<string, unknown>, fn?: () => R): R | undefined {\n // No-op without AsyncLocalStorage (browser fallback)\n if (!als) {\n if (fn) return fn();\n return undefined;\n }\n // No fn: backwards-compat no-op setter shim\n if (!fn) return undefined;\n // Run fn within AsyncLocalStorage scope, merged with the active\n // outer scope (if any) so nested withContext calls accumulate\n // bindings instead of replacing them.\n const merged = { ...context, ...als.getStore(), ...bindings };\n return als.run(merged, fn);\n },\n\n async withContextAsync<R>(bindings: Record<string, unknown>, fn: () => Promise<R>): Promise<R> {\n if (!als) return fn();\n const merged = { ...context, ...als.getStore(), ...bindings };\n return als.run(merged, fn);\n },\n\n clearContext(): typeof this {\n context = {};\n return this;\n },\n\n setResource(res: Partial<ILogResourceRef>): typeof this {\n resource = { ...resource, ...res };\n return this;\n },\n\n child(_extra: Record<string, unknown>): ChildLoggerShape {\n // Creates the child logger via factory. Captures the current\n // _getBaseContextRecord() snapshot (parent context WITHOUT ALS) at\n // child-creation time. ALS is transient and should not be baked into\n // the child's _parentContextRecord — it is applied fresh at dispatch time.\n // Note: _extra (bindings) are stored by Logger.child() as _bindings.\n const snapshot = this._getBaseContextRecord();\n const childLogger = options.childLoggerFactory({}) as ChildLoggerShape;\n // Store on childLogger for Logger.child() to pick up\n (childLogger as unknown as Record<string, unknown>)['__parentSnapshot'] = snapshot;\n return childLogger;\n },\n\n _getContextRecord(): Record<string, unknown> {\n // Returns the full merged context for dispatch purposes.\n // Base (parent snapshot + own context) plus ALS overlay if active.\n const base = this._getBaseContextRecord();\n const alsContext = als?.getStore();\n if (alsContext && Object.keys(alsContext).length > 0) {\n return { ...base, ...alsContext };\n }\n return base;\n },\n\n _getBaseContextRecord(): Record<string, unknown> {\n // Returns parent context chain + own context (NO ALS overlay).\n // ALS is applied by _getContextRecord() as a live overlay.\n let base: Record<string, unknown> = {};\n const parentRecord = options.getParentContextRecord?.() ?? null;\n if (parentRecord && Object.keys(parentRecord).length > 0) {\n base = parentRecord;\n } else if (Object.keys(context).length > 0) {\n base = context;\n }\n if (Object.keys(context).length > 0) {\n base = { ...base, ...context };\n }\n return base;\n },\n\n _getResource(): Partial<ILogResourceRef> | undefined {\n return resource;\n },\n\n _getAlsStore(): Record<string, unknown> | undefined {\n return als?.getStore();\n }\n };\n}\n"],"mappings":";;;;;;;;;;;;AAiCA,SAAgB,2BAAoE;CAChF,MAAM,aAAc,WAA0E;CAC9F,IAAI,OAAO,eAAe,YACtB,OAAO,IAAI,WAAW;CAG1B,MAAM,OAAO;CAKb,IAAI;EACA,MAAM,aAAa,KAAK,SAAS,mBAAmB,aAAa;EACjE,IAAI,YAAY,mBACZ,OAAO,IAAI,WAAW,kBAAkB;CAEhD,QAAQ,CAER;CAEA,IAAI;EACA,IAAI,OAAO,YAAY,YAAY;GAE/B,MAAM,aAAa,QAAQ,kBAAkB;GAC7C,IAAI,YAAY,mBACZ,OAAO,IAAI,WAAW,kBAAkB;EAEhD;CACJ,QAAQ,CAER;AAGJ;;;AC+KA,MAAM,cAA+B,yBAAkD;;;;;;;;;;;;;;;;;;;;;;AAuBvF,SAAgB,iBAAiB,SAAyC;CACtE,IAAI,UAAmC,EAAE,GAAG,QAAQ,eAAe;CACnE,IAAI,WAAiD,QAAQ,kBACvD,EAAE,GAAG,QAAQ,gBAAgB,IAC7B,KAAA;CAGN,MAAM,MAAM,QAAQ,eAAe;CAEnC,OAAO;EACH,aAA8B;GAC1B,OAAO,EAAE,GAAG,QAAQ;EACxB;EAEA,YAAe,UAAmC,IAA6B;GAE3E,IAAI,CAAC,KAAK;IACN,IAAI,IAAI,OAAO,GAAG;IAClB;GACJ;GAEA,IAAI,CAAC,IAAI,OAAO,KAAA;GAIhB,MAAM,SAAS;IAAE,GAAG;IAAS,GAAG,IAAI,SAAS;IAAG,GAAG;GAAS;GAC5D,OAAO,IAAI,IAAI,QAAQ,EAAE;EAC7B;EAEA,MAAM,iBAAoB,UAAmC,IAAkC;GAC3F,IAAI,CAAC,KAAK,OAAO,GAAG;GACpB,MAAM,SAAS;IAAE,GAAG;IAAS,GAAG,IAAI,SAAS;IAAG,GAAG;GAAS;GAC5D,OAAO,IAAI,IAAI,QAAQ,EAAE;EAC7B;EAEA,eAA4B;GACxB,UAAU,CAAC;GACX,OAAO;EACX;EAEA,YAAY,KAA4C;GACpD,WAAW;IAAE,GAAG;IAAU,GAAG;GAAI;GACjC,OAAO;EACX;EAEA,MAAM,QAAmD;GAMrD,MAAM,WAAW,KAAK,sBAAsB;GAC5C,MAAM,cAAc,QAAQ,mBAAmB,CAAC,CAAC;GAEjD,YAAoD,sBAAsB;GAC1E,OAAO;EACX;EAEA,oBAA6C;GAGzC,MAAM,OAAO,KAAK,sBAAsB;GACxC,MAAM,aAAa,KAAK,SAAS;GACjC,IAAI,cAAc,OAAO,KAAK,UAAU,CAAC,CAAC,SAAS,GAC/C,OAAO;IAAE,GAAG;IAAM,GAAG;GAAW;GAEpC,OAAO;EACX;EAEA,wBAAiD;GAG7C,IAAI,OAAgC,CAAC;GACrC,MAAM,eAAe,QAAQ,yBAAyB,KAAK;GAC3D,IAAI,gBAAgB,OAAO,KAAK,YAAY,CAAC,CAAC,SAAS,GACnD,OAAO;QACJ,IAAI,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,GACrC,OAAO;GAEX,IAAI,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,GAC9B,OAAO;IAAE,GAAG;IAAM,GAAG;GAAQ;GAEjC,OAAO;EACX;EAEA,eAAqD;GACjD,OAAO;EACX;EAEA,eAAoD;GAChD,OAAO,KAAK,SAAS;EACzB;CACJ;AACJ"}
|
|
1
|
+
{"version":3,"file":"LogContext-CIKxWPrK.cjs","names":[],"sources":["../../src/utils/asyncLocalStorage.ts","../../src/context/LogContext.ts"],"sourcesContent":["/**\n * @fileoverview Resolución compartida de `AsyncLocalStorage` — utilidad\n * interna, NO exportada por el barrel público (`src/utils/index.ts`).\n *\n * Único punto de verdad para resolver `node:async_hooks` por capas. Lo\n * consumen tanto `transports/SpanRuntime.ts` (ALS singleton de spans) como\n * `context/LogContext.ts` (ALS singleton de MDC). Antes había dos copias de\n * este conocimiento: una acertaba (SpanRuntime, la que sigue este archivo) y\n * otra usaba `typeof AsyncLocalStorage !== 'undefined'` — un feature-detect\n * roto, porque en Node y Bun el constructor NO es global, así que esa rama\n * quedaba siempre en `undefined` y el MDC de logs era no-op silencioso fuera\n * del browser.\n */\n\n/**\n * Forma mínima de `AsyncLocalStorage<T>` que necesita este paquete.\n */\nexport interface AsyncLocalStorageLike<T> {\n run<R>(store: T, fn: () => R): R;\n getStore(): T | undefined;\n}\n\n/**\n * Resuelve `AsyncLocalStorage` por capas:\n * 1. global `AsyncLocalStorage` (runtimes/polyfills que lo exponen),\n * 2. `process.getBuiltinModule('async_hooks')` (Node >= 22.3, Bun),\n * 3. `require('node:async_hooks')` (CJS interop),\n * 4. `undefined` → browser estricto: sin correlación (degradación\n * documentada; el caller decide qué hacer sin ALS).\n *\n * Nota: NO basta con `typeof AsyncLocalStorage !== 'undefined'` — en Node y\n * Bun el constructor NO es global y hay que ir a `node:async_hooks`.\n */\nexport function resolveAsyncLocalStorage<T>(): AsyncLocalStorageLike<T> | undefined {\n const globalCtor = (globalThis as { AsyncLocalStorage?: new () => AsyncLocalStorageLike<T> }).AsyncLocalStorage;\n if (typeof globalCtor === 'function') {\n return new globalCtor();\n }\n\n const proc = globalThis as {\n process?: {\n getBuiltinModule?: (id: string) => { AsyncLocalStorage?: new () => AsyncLocalStorageLike<T> } | undefined;\n };\n };\n try {\n const asyncHooks = proc.process?.getBuiltinModule?.('async_hooks');\n if (asyncHooks?.AsyncLocalStorage) {\n return new asyncHooks.AsyncLocalStorage();\n }\n } catch {\n // getBuiltinModule no disponible — siguiente capa\n }\n\n try {\n if (typeof require === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const asyncHooks = require('node:async_hooks') as { AsyncLocalStorage?: new () => AsyncLocalStorageLike<T> };\n if (asyncHooks?.AsyncLocalStorage) {\n return new asyncHooks.AsyncLocalStorage();\n }\n }\n } catch {\n // ESM puro sin require ni builtin accessor — browser\n }\n\n return undefined;\n}\n","/**\n * @fileoverview Bridge de LogContext — gestión de MDC (Mapped Diagnostic Context).\n *\n * Encapsula el contexto estructurado por logger, la creación de child loggers y\n * el merge de resource OTel en cada record emitido.\n *\n * Modelo de API:\n * - `withContext(bindings, fn?)` — si se pasa `fn`, lo ejecuta dentro de un\n * scope de AsyncLocalStorage mergeando `bindings`. Sin `fn`: no-op (shim de\n * backwards compat para la vieja forma de setter).\n * - `withContextAsync(bindings, fn)` — variante async callback.\n * - `child(bindings)` — inmutable (patrón canónico de MDC).\n * - Feature-detect de AsyncLocalStorage; en browser sin ALS es no-op.\n */\n\nimport type { ILogResourceRef } from '../types/index.js';\nimport type { LoggerConfig } from '../types/index.js';\nimport { resolveAsyncLocalStorage, type AsyncLocalStorageLike } from '../utils/asyncLocalStorage.js';\n\n/**\n * Snapshot del contexto bound. Lo retorna {@link LogContext.getContext}.\n *\n * Es `Readonly` para marcar contractually que el objeto devuelto es una shallow\n * copy: mutarlo no afecta a los records que emitan futuras llamadas de log.\n */\nexport type ContextSnapshot = Readonly<Record<string, unknown>>;\n\n/**\n * Tipo de la factory function para crear instancias child de Logger.\n *\n * Se inyecta en LogContext para que `child()` pueda instanciar nuevos loggers\n * sin introducir un import circular entre `Logger.ts` y `LogContext.ts`.\n * Retorna `unknown` — la clase Logger concreta la maneja el caller, y la\n * instancia devuelta tiene su campo `context` escrito por LogContext tras la\n * creación.\n */\nexport type ChildLoggerFactory = (config: Partial<LoggerConfig>) => unknown;\n\n/**\n * Shape mínima de una instancia de Logger que LogContext necesita ver.\n *\n * Evita dependencias circulares entre LogContext y Logger. El campo\n * `_parentContextRecord` lo setea el Logger padre después de que\n * `LogContext.child()` retorna, estableciendo la cadena de contextos.\n */\nexport interface ChildLoggerShape {\n _parentContextRecord?: Record<string, unknown>;\n /** Campo legacy — ya no es la fuente canónica del contexto. */\n context?: Record<string, unknown>;\n}\n\n/**\n * Options que se pasan a {@link createLogContext}.\n */\nexport interface ILogContextOptions {\n /** Pares key-value iniciales del contexto. */\n initialContext?: Record<string, unknown>;\n /** Factory para crear instancias child de logger. */\n childLoggerFactory: ChildLoggerFactory;\n /** Resource OTel inicial a mergear en cada record emitido. */\n initialResource?: Partial<ILogResourceRef>;\n /**\n * Retorna el record de contexto mergeado del logger padre en el momento\n * de creación del child. Lo usa `_getContextRecord()` para construir la\n * cadena de contextos.\n * @internal\n */\n getParentContextRecord?: () => Record<string, unknown>;\n /**\n * Instancia de AsyncLocalStorage a usar para el scoping de `withContext`.\n * @internal\n */\n alsInstance?: ALS;\n}\n\n/**\n * Contrato que retorna {@link createLogContext}.\n *\n * Fachada de MDC (Mapped Diagnostic Context) por logger. Combina tres fuentes\n * de contexto:\n * - **base inmutable** vía `child()` (snapshot capturado al crear el child),\n * - **scope transitorio** vía `withContext()` / `withContextAsync()` sobre\n * AsyncLocalStorage,\n * - **resource OTel** mergeado en cada record.\n *\n * En entornos browser sin `AsyncLocalStorage`, las variantes `withContext*`\n * degradan a no-op: ejecutan `fn` sin scoping (o lo skipan si no hay `fn`).\n * `child()` sigue operativo en browser porque no depende de ALS.\n */\nexport interface LogContext {\n /**\n * Snapshot actual del contexto bound.\n *\n * @returns Copia inmutable (shallow) del contexto; mutarla no afecta a los\n * records que emitan futuras llamadas de log.\n *\n * @example\n * const ctx = logContext.getContext();\n * console.log(ctx.requestId); // 'abc-123'\n */\n getContext(): ContextSnapshot;\n\n /**\n * Ejecuta `fn` dentro de un scope de AsyncLocalStorage donde `bindings`\n * se mergean al contexto para todas las llamadas de log dentro de `fn`.\n *\n * Si no se pasa `fn` (la vieja forma de setter), es no-op por backwards\n * compatibility. Para binding persistente prefiere `child()`; para\n * callbacks async usa `withContextAsync()`.\n *\n * **Browser fallback**: sin ALS, ejecuta `fn` directamente sin scoping\n * (los bindings NO se mergean). Si tampoco hay `fn`, retorna `undefined`.\n *\n * @param bindings - Pares key-value a attachar durante la ejecución de `fn`\n * @param fn - Función sincrónica opcional a ejecutar bajo el scope ALS\n * @returns El valor de retorno de `fn`, o `undefined` si no se pasa `fn`\n *\n * @example\n * logContext.withContext({ requestId: 'abc-123' }, () => {\n * logger.info('procesando'); // el record lleva requestId=abc-123\n * });\n * // fuera de fn: requestId ya no está presente en próximos logs\n *\n * @see {@link LogContext.withContextAsync} para callbacks async\n * @see {@link LogContext.child} para binding persistente inmutable (sin ALS)\n */\n withContext<R>(bindings: Record<string, unknown>, fn?: () => R): R | undefined;\n\n /**\n * Variante async de {@link withContext}. Ejecuta `fn` dentro de un scope\n * de AsyncLocalStorage para que los bindings queden disponibles a todas las\n * llamadas de log async dentro de `fn` (incluso tras `await`).\n *\n * **Browser fallback**: sin ALS, ejecuta `fn` directamente sin scoping.\n *\n * @param bindings - Pares key-value a attachar durante la ejecución de `fn`\n * @param fn - Función async a ejecutar bajo el scope ALS\n * @returns El Promise retornado por `fn`\n *\n * @example\n * await logContext.withContextAsync({ traceId }, async () => {\n * const user = await fetchUser();\n * logger.info('user cargado', { id: user.id });\n * // el record lleva el traceId aunque el log ocurra tras un await\n * });\n */\n withContextAsync<R>(bindings: Record<string, unknown>, fn: () => Promise<R>): Promise<R>;\n\n /**\n * Droppea todas las keys del contexto bound. Tras esta llamada, los\n * records emitidos ya no llevan `attributes` hasta que\n * {@link withContext} o {@link child} restablezcan uno.\n *\n * @returns La misma instancia de LogContext, ahora sin contexto\n *\n * @example\n * logContext.clearContext();\n * logger.info('limpio'); // sin attributes\n */\n clearContext(): this;\n\n /**\n * Actualiza el resource OTel por defecto (service.name, version,\n * deployment.environment, ...).\n *\n * Se persiste en el campo `resource` de cada record emitido, salvo que el\n * propio record lo overridee.\n *\n * @param resource - Resource OTel parcial a mergear con el actual\n * @returns La misma instancia de LogContext, para encadenar calls\n *\n * @example\n * logContext.setResource({ serviceName: 'api-gateway', environment: 'prod' });\n */\n setResource(resource: Partial<ILogResourceRef>): this;\n\n /**\n * Devuelve una copia inmutable de este logger con el contexto extra bound.\n *\n * Las llamadas futuras sobre el child emiten con el contexto mergeado, sin\n * mutar al padre — patrón canónico de MDC.\n *\n * A diferencia de {@link withContext}, **no involucra AsyncLocalStorage**:\n * el binding es persistente y queda capturado en el snapshot del child al\n * crearse. Por eso `child()` es operativo también en browser sin ALS.\n *\n * Los bindings transitorios de ALS activos en el momento de `child()` NO\n * se bakean en el child — solo se captura el contexto base. ALS se aplica\n * fresco en cada dispatch vía `_getContextRecord()`.\n *\n * @param extra - Pares key-value a attachar (requestId, userId, ...)\n * @returns Un nuevo Logger con el contexto mergeado\n *\n * @example\n * const requestLog = logContext.child({ requestId: 'abc-123' });\n * requestLog.info('inicio'); // siempre lleva requestId=abc-123\n * requestLog.info('fin');\n * // el logger padre no se ve afectado por estos bindings\n *\n * @see {@link LogContext.withContext} para scoping transitorio (ALS)\n */\n child(extra: Record<string, unknown>): ChildLoggerShape;\n\n /**\n * Record de contexto interno. Expuesto para el ensamblado de TransportRecord\n * (base + overlay ALS si hay store activo).\n * @internal\n */\n _getContextRecord(): Record<string, unknown>;\n /**\n * Retorna el contexto base SIN el overlay de ALS.\n *\n * Lo usa `Logger.child()` para capturar el snapshot del contexto padre al\n * crear un child logger, garantizando que el binding ALS transitorio no\n * se bakeé en el child.\n * @internal\n */\n _getBaseContextRecord(): Record<string, unknown>;\n /**\n * Record de resource interno. Expuesto para el ensamblado de TransportRecord.\n * @internal\n */\n _getResource(): Partial<ILogResourceRef> | undefined;\n /**\n * Retorna el store actual de AsyncLocalStorage, si ALS está activo en el\n * call stack corriente.\n * @internal\n */\n _getAlsStore(): Record<string, unknown> | undefined;\n}\n\n// AsyncLocalStorage type (Node 14+, undefined in browser)\ntype ALS = AsyncLocalStorageLike<Record<string, unknown>>;\n\n// ALS singleton del módulo. Resolución por capas (global →\n// `process.getBuiltinModule` → `require`, undefined en browser) delegada al\n// helper compartido `resolveAsyncLocalStorage` — el mismo que usa el ALS de\n// spans en `transports/SpanRuntime.ts`. Antes esto era\n// `typeof AsyncLocalStorage !== 'undefined'`, un feature-detect roto: ese\n// constructor no es global en node/bun, así que siempre resolvía `undefined`\n// y `withContext`/`withContextAsync` eran no-op silenciosos fuera del browser.\n//\n// Se resuelve lazy en el primer `withContext(fn)`: cargar `node:async_hooks`\n// cuesta ~2,2 MB de RSS en bun, y `_getContextRecord` consulta el store en\n// cada dispatch de log — resolverlo al importar se lo cobraría a todo\n// proceso que loguea, use MDC o no. Sin `run()` previo `getStore()` devuelve\n// `undefined`, así que el guard por flag es observable-identico.\nlet alsInstance: ALS | undefined;\nlet alsActivated = false;\n\n/**\n * Factory que crea una instancia de {@link LogContext}.\n *\n * @param options - Configuración (ver {@link ILogContextOptions})\n * @returns Una instancia de LogContext lista para usar\n *\n * @example\n * const logContext = createLogContext({\n * childLoggerFactory: (cfg) => new Logger(cfg),\n * initialContext: { service: 'orders-api' },\n * initialResource: { serviceName: 'orders-api', environment: 'prod' }\n * });\n *\n * // Child inmutable con contexto persistente\n * const requestLog = logContext.child({ requestId: 'abc-123' });\n *\n * // Scope transitorio vía ALS (Node; en browser sin ALS es no-op)\n * logContext.withContext({ traceId: 't-9' }, () => {\n * requestLog.info('procesando orden');\n * });\n */\nexport function createLogContext(options: ILogContextOptions): LogContext {\n let context: Record<string, unknown> = { ...options.initialContext };\n let resource: Partial<ILogResourceRef> | undefined = options.initialResource\n ? { ...options.initialResource }\n : undefined;\n\n // Provided instance wins; otherwise the module singleton resolves on\n // first real use (see the note on `alsInstance` above). The module\n // instance stays shared across LogContexts: nested `withContext` de\n // loggers distintos se ven entre sí vía el mismo store.\n const activateAls = (): ALS | undefined => {\n if (!alsActivated) {\n alsActivated = true;\n alsInstance = resolveAsyncLocalStorage<Record<string, unknown>>();\n }\n return options.alsInstance ?? alsInstance;\n };\n\n return {\n getContext(): ContextSnapshot {\n return { ...context };\n },\n\n withContext<R>(bindings: Record<string, unknown>, fn?: () => R): R | undefined {\n // No fn: backwards-compat no-op setter shim — never activates ALS\n if (!fn) return undefined;\n const store = activateAls();\n // No AsyncLocalStorage (browser fallback): run fn as-is\n if (!store) return fn();\n // Run fn within AsyncLocalStorage scope, merged with the active\n // outer scope (if any) so nested withContext calls accumulate\n // bindings instead of replacing them.\n const merged = { ...context, ...store.getStore(), ...bindings };\n return store.run(merged, fn);\n },\n\n async withContextAsync<R>(bindings: Record<string, unknown>, fn: () => Promise<R>): Promise<R> {\n const store = activateAls();\n if (!store) return fn();\n const merged = { ...context, ...store.getStore(), ...bindings };\n return store.run(merged, fn);\n },\n\n clearContext(): typeof this {\n context = {};\n return this;\n },\n\n setResource(res: Partial<ILogResourceRef>): typeof this {\n resource = { ...resource, ...res };\n return this;\n },\n\n child(_extra: Record<string, unknown>): ChildLoggerShape {\n // Creates the child logger via factory. Captures the current\n // _getBaseContextRecord() snapshot (parent context WITHOUT ALS) at\n // child-creation time. ALS is transient and should not be baked into\n // the child's _parentContextRecord — it is applied fresh at dispatch time.\n // Note: _extra (bindings) are stored by Logger.child() as _bindings.\n const snapshot = this._getBaseContextRecord();\n const childLogger = options.childLoggerFactory({}) as ChildLoggerShape;\n // Store on childLogger for Logger.child() to pick up\n (childLogger as unknown as Record<string, unknown>)['__parentSnapshot'] = snapshot;\n return childLogger;\n },\n\n _getContextRecord(): Record<string, unknown> {\n // Returns the full merged context for dispatch purposes.\n // Base (parent snapshot + own context) plus ALS overlay if active.\n // An injected instance is read as-is (external runs count); the\n // module singleton only after activation — pre-activation its\n // store would be empty anyway.\n const base = this._getBaseContextRecord();\n const store = options.alsInstance ?? (alsActivated ? alsInstance : undefined);\n const alsContext = store?.getStore();\n if (alsContext && Object.keys(alsContext).length > 0) {\n return { ...base, ...alsContext };\n }\n return base;\n },\n\n _getBaseContextRecord(): Record<string, unknown> {\n // Returns parent context chain + own context (NO ALS overlay).\n // ALS is applied by _getContextRecord() as a live overlay.\n let base: Record<string, unknown> = {};\n const parentRecord = options.getParentContextRecord?.() ?? null;\n if (parentRecord && Object.keys(parentRecord).length > 0) {\n base = parentRecord;\n } else if (Object.keys(context).length > 0) {\n base = context;\n }\n if (Object.keys(context).length > 0) {\n base = { ...base, ...context };\n }\n return base;\n },\n\n _getResource(): Partial<ILogResourceRef> | undefined {\n return resource;\n },\n\n _getAlsStore(): Record<string, unknown> | undefined {\n return (options.alsInstance ?? (alsActivated ? alsInstance : undefined))?.getStore();\n }\n };\n}\n"],"mappings":";;;;;;;;;;;;AAiCA,SAAgB,2BAAoE;CAChF,MAAM,aAAc,WAA0E;CAC9F,IAAI,OAAO,eAAe,YACtB,OAAO,IAAI,WAAW;CAG1B,MAAM,OAAO;CAKb,IAAI;EACA,MAAM,aAAa,KAAK,SAAS,mBAAmB,aAAa;EACjE,IAAI,YAAY,mBACZ,OAAO,IAAI,WAAW,kBAAkB;CAEhD,QAAQ,CAER;CAEA,IAAI;EACA,IAAI,OAAO,YAAY,YAAY;GAE/B,MAAM,aAAa,QAAQ,kBAAkB;GAC7C,IAAI,YAAY,mBACZ,OAAO,IAAI,WAAW,kBAAkB;EAEhD;CACJ,QAAQ,CAER;AAGJ;;;ACqLA,IAAI;AACJ,IAAI,eAAe;;;;;;;;;;;;;;;;;;;;;;AAuBnB,SAAgB,iBAAiB,SAAyC;CACtE,IAAI,UAAmC,EAAE,GAAG,QAAQ,eAAe;CACnE,IAAI,WAAiD,QAAQ,kBACvD,EAAE,GAAG,QAAQ,gBAAgB,IAC7B,KAAA;CAMN,MAAM,oBAAqC;EACvC,IAAI,CAAC,cAAc;GACf,eAAe;GACf,cAAc,yBAAkD;EACpE;EACA,OAAO,QAAQ,eAAe;CAClC;CAEA,OAAO;EACH,aAA8B;GAC1B,OAAO,EAAE,GAAG,QAAQ;EACxB;EAEA,YAAe,UAAmC,IAA6B;GAE3E,IAAI,CAAC,IAAI,OAAO,KAAA;GAChB,MAAM,QAAQ,YAAY;GAE1B,IAAI,CAAC,OAAO,OAAO,GAAG;GAItB,MAAM,SAAS;IAAE,GAAG;IAAS,GAAG,MAAM,SAAS;IAAG,GAAG;GAAS;GAC9D,OAAO,MAAM,IAAI,QAAQ,EAAE;EAC/B;EAEA,MAAM,iBAAoB,UAAmC,IAAkC;GAC3F,MAAM,QAAQ,YAAY;GAC1B,IAAI,CAAC,OAAO,OAAO,GAAG;GACtB,MAAM,SAAS;IAAE,GAAG;IAAS,GAAG,MAAM,SAAS;IAAG,GAAG;GAAS;GAC9D,OAAO,MAAM,IAAI,QAAQ,EAAE;EAC/B;EAEA,eAA4B;GACxB,UAAU,CAAC;GACX,OAAO;EACX;EAEA,YAAY,KAA4C;GACpD,WAAW;IAAE,GAAG;IAAU,GAAG;GAAI;GACjC,OAAO;EACX;EAEA,MAAM,QAAmD;GAMrD,MAAM,WAAW,KAAK,sBAAsB;GAC5C,MAAM,cAAc,QAAQ,mBAAmB,CAAC,CAAC;GAEjD,YAAoD,sBAAsB;GAC1E,OAAO;EACX;EAEA,oBAA6C;GAMzC,MAAM,OAAO,KAAK,sBAAsB;GAExC,MAAM,cADQ,QAAQ,gBAAgB,eAAe,cAAc,KAAA,GAAA,EACzC,SAAS;GACnC,IAAI,cAAc,OAAO,KAAK,UAAU,CAAC,CAAC,SAAS,GAC/C,OAAO;IAAE,GAAG;IAAM,GAAG;GAAW;GAEpC,OAAO;EACX;EAEA,wBAAiD;GAG7C,IAAI,OAAgC,CAAC;GACrC,MAAM,eAAe,QAAQ,yBAAyB,KAAK;GAC3D,IAAI,gBAAgB,OAAO,KAAK,YAAY,CAAC,CAAC,SAAS,GACnD,OAAO;QACJ,IAAI,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,GACrC,OAAO;GAEX,IAAI,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,GAC9B,OAAO;IAAE,GAAG;IAAM,GAAG;GAAQ;GAEjC,OAAO;EACX;EAEA,eAAqD;GACjD,OAAO;EACX;EAEA,eAAoD;GAChD,QAAQ,QAAQ,gBAAgB,eAAe,cAAc,KAAA,GAAA,EAAa,SAAS;EACvF;CACJ;AACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LogContext.d.ts","sourceRoot":"","sources":["../../src/context/LogContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAA4B,KAAK,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAErG;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEhE;;;;;;;;GAQG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,OAAO,CAAC;AAE5E;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,qDAAqD;IACrD,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,8DAA8D;IAC9D,eAAe,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3C;;;;;OAKG;IACH,sBAAsB,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvD;;;OAGG;IACH,WAAW,CAAC,EAAE,GAAG,CAAC;CACrB;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,UAAU;IACvB;;;;;;;;;OASG;IACH,UAAU,IAAI,eAAe,CAAC;IAE9B;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAE/E;;;;;;;;;;;;;;;;;OAiBG;IACH,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAEzF;;;;;;;;;;OAUG;IACH,YAAY,IAAI,IAAI,CAAC;IAErB;;;;;;;;;;;;OAYG;IACH,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC;IAEtD;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,gBAAgB,CAAC;IAExD;;;;OAIG;IACH,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C;;;;;;;OAOG;IACH,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjD;;;OAGG;IACH,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,CAAC;IACrD;;;;OAIG;IACH,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;CACvD;AAGD,KAAK,GAAG,GAAG,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"LogContext.d.ts","sourceRoot":"","sources":["../../src/context/LogContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAA4B,KAAK,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAErG;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEhE;;;;;;;;GAQG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,OAAO,CAAC;AAE5E;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,qDAAqD;IACrD,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,8DAA8D;IAC9D,eAAe,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3C;;;;;OAKG;IACH,sBAAsB,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvD;;;OAGG;IACH,WAAW,CAAC,EAAE,GAAG,CAAC;CACrB;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,UAAU;IACvB;;;;;;;;;OASG;IACH,UAAU,IAAI,eAAe,CAAC;IAE9B;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAE/E;;;;;;;;;;;;;;;;;OAiBG;IACH,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAEzF;;;;;;;;;;OAUG;IACH,YAAY,IAAI,IAAI,CAAC;IAErB;;;;;;;;;;;;OAYG;IACH,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC;IAEtD;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,gBAAgB,CAAC;IAExD;;;;OAIG;IACH,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C;;;;;;;OAOG;IACH,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjD;;;OAGG;IACH,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,CAAC;IACrD;;;;OAIG;IACH,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;CACvD;AAGD,KAAK,GAAG,GAAG,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAkB1D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,GAAG,UAAU,CAyGxE"}
|
package/dist/context.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_LogContext = require("./chunks/LogContext-
|
|
2
|
+
const require_LogContext = require("./chunks/LogContext-CIKxWPrK.cjs");
|
|
3
3
|
exports.createLogContext = require_LogContext.createLogContext;
|
package/dist/context.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as createLogContext } from "./chunks/LogContext-
|
|
1
|
+
import { t as createLogContext } from "./chunks/LogContext-BO-f0KXu.js";
|
|
2
2
|
export { createLogContext };
|
package/dist/index.cjs
CHANGED
|
@@ -8,7 +8,7 @@ const require_utils = require("./chunks/utils-W_cxqriN.cjs");
|
|
|
8
8
|
const require_styling = require("./chunks/styling-Cel2wPRy.cjs");
|
|
9
9
|
const require_environment_detector = require("./chunks/environment-detector-D-tHkKWA.cjs");
|
|
10
10
|
const require_spinner = require("./chunks/spinner-BHyYEXsM.cjs");
|
|
11
|
-
const require_LogContext = require("./chunks/LogContext-
|
|
11
|
+
const require_LogContext = require("./chunks/LogContext-CIKxWPrK.cjs");
|
|
12
12
|
const require_HookBridge = require("./chunks/HookBridge-C-AvXmPD.cjs");
|
|
13
13
|
const require_SerializerBridge = require("./chunks/SerializerBridge-C4a9Z37F.cjs");
|
|
14
14
|
const require_server_fallback = require("./chunks/server-fallback-CaCPjWby.cjs");
|
|
@@ -1566,19 +1566,38 @@ function createTransportBridge() {
|
|
|
1566
1566
|
}
|
|
1567
1567
|
//#endregion
|
|
1568
1568
|
//#region src/transports/SpanRuntime.ts
|
|
1569
|
-
/**
|
|
1569
|
+
/**
|
|
1570
|
+
* ALS singleton del módulo — compartido por todas las instancias de Logger.
|
|
1570
1571
|
*
|
|
1571
1572
|
* Resolución por capas (global → `process.getBuiltinModule` → `require`,
|
|
1572
1573
|
* undefined en browser) delegada al helper compartido
|
|
1573
1574
|
* {@link resolveAsyncLocalStorage} — ver su doc para el detalle de capas.
|
|
1574
|
-
* `context/LogContext.ts` usa el mismo helper para su ALS de MDC.
|
|
1575
|
-
|
|
1575
|
+
* `context/LogContext.ts` usa el mismo helper para su ALS de MDC.
|
|
1576
|
+
*
|
|
1577
|
+
* Se crea lazy en el primer `runWithActiveSpan`: cargar `node:async_hooks`
|
|
1578
|
+
* cuesta ~2,2 MB de RSS en bun, y `getActiveSpan` se consulta en cada
|
|
1579
|
+
* dispatch de log — resolverlo al importar se lo cobraría a todo proceso
|
|
1580
|
+
* que loguea, use spans o no.
|
|
1581
|
+
*/
|
|
1582
|
+
let activeSpanStore;
|
|
1583
|
+
let spanStoreActivated = false;
|
|
1584
|
+
function activateSpanStore() {
|
|
1585
|
+
if (!spanStoreActivated) {
|
|
1586
|
+
spanStoreActivated = true;
|
|
1587
|
+
activeSpanStore = require_LogContext.resolveAsyncLocalStorage();
|
|
1588
|
+
}
|
|
1589
|
+
return activeSpanStore;
|
|
1590
|
+
}
|
|
1576
1591
|
/**
|
|
1577
1592
|
* Span activo en el call stack corriente (dentro de `span(fn)`), si lo hay.
|
|
1578
1593
|
* Lo consumen la correlación log→span (`TransportRecord.traceId/spanId`) y la
|
|
1579
1594
|
* resolución de `parentSpanId` en spans hijos.
|
|
1595
|
+
*
|
|
1596
|
+
* Sin `run()` previo el store estaría vacío igual, así que el guard por
|
|
1597
|
+
* flag es observable-identico a consultar el ALS real.
|
|
1580
1598
|
*/
|
|
1581
1599
|
function getActiveSpan() {
|
|
1600
|
+
if (!spanStoreActivated) return void 0;
|
|
1582
1601
|
return activeSpanStore?.getStore();
|
|
1583
1602
|
}
|
|
1584
1603
|
/**
|
|
@@ -1586,7 +1605,8 @@ function getActiveSpan() {
|
|
|
1586
1605
|
* ejecuta `fn` directamente — sin correlación pero funcional.
|
|
1587
1606
|
*/
|
|
1588
1607
|
function runWithActiveSpan(record, fn) {
|
|
1589
|
-
|
|
1608
|
+
const store = activateSpanStore();
|
|
1609
|
+
return store ? store.run(record, fn) : fn();
|
|
1590
1610
|
}
|
|
1591
1611
|
/** Nanosegundos Unix actuales como string decimal (formato OTLP). */
|
|
1592
1612
|
function nowUnixNano() {
|
|
@@ -2670,36 +2690,6 @@ var Logger = class Logger {
|
|
|
2670
2690
|
* @internal
|
|
2671
2691
|
*/
|
|
2672
2692
|
_dispatchTag;
|
|
2673
|
-
/**
|
|
2674
|
-
* Computa el contexto completamente mergueado para este logger.
|
|
2675
|
-
*
|
|
2676
|
-
* La cadena de contexto se construye en el momento de crear el child:
|
|
2677
|
-
* cada child almacena el contexto fully-merged de su parent (en ese
|
|
2678
|
-
* instante) como `_parentContextRecord`. Esto implica que
|
|
2679
|
-
* `_parentContextRecord` ya contiene los bindings de todos los ancestros
|
|
2680
|
-
* en el orden de precedencia correcto (root primero, child más cercano al final).
|
|
2681
|
-
*
|
|
2682
|
-
* Orden de merge (gana el último):
|
|
2683
|
-
* 1. _parentContextRecord — snapshot del contexto mergueado del parent en la creación
|
|
2684
|
-
* 2. _bindings — bindings propios de este logger (llamadas a `child()`)
|
|
2685
|
-
* 3. ALS store — scope de `withContext`/`withContextAsync` (prioridad máxima)
|
|
2686
|
-
*
|
|
2687
|
-
* @internal
|
|
2688
|
-
* @returns El record de contexto mergueado
|
|
2689
|
-
*/
|
|
2690
|
-
_getMergedContext() {
|
|
2691
|
-
let merged = this._parentContextRecord ?? {};
|
|
2692
|
-
if (this._bindings && Object.keys(this._bindings).length > 0) merged = {
|
|
2693
|
-
...merged,
|
|
2694
|
-
...this._bindings
|
|
2695
|
-
};
|
|
2696
|
-
const alsContext = this.logContext._getAlsStore?.() ?? {};
|
|
2697
|
-
if (alsContext && Object.keys(alsContext).length > 0) merged = {
|
|
2698
|
-
...merged,
|
|
2699
|
-
...alsContext
|
|
2700
|
-
};
|
|
2701
|
-
return merged;
|
|
2702
|
-
}
|
|
2703
2693
|
/** @internal Expone el contexto base mergueado (sin ALS) a la closure de la child factory de LogContext. */
|
|
2704
2694
|
_captureMergedContext() {
|
|
2705
2695
|
let merged = this._parentContextRecord ?? {};
|