@mks2508/better-logger 0.18.2-alpha.1 → 0.18.2-alpha.2
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/README.md +38 -336
- package/dist/Logger.d.ts +243 -154
- package/dist/Logger.d.ts.map +1 -1
- package/dist/ScopedLogger.d.ts +511 -8
- package/dist/ScopedLogger.d.ts.map +1 -1
- package/dist/chunks/HookBridge-C-AvXmPD.cjs +504 -0
- package/dist/chunks/HookBridge-C-AvXmPD.cjs.map +1 -0
- package/dist/chunks/HookBridge-CI2PH79S.js +487 -0
- package/dist/chunks/HookBridge-CI2PH79S.js.map +1 -0
- package/dist/chunks/{LogContext-L7HzynFw.cjs → LogContext-BaMXleWj.cjs} +19 -4
- package/dist/chunks/LogContext-BaMXleWj.cjs.map +1 -0
- package/dist/chunks/{LogContext-Cwn-1Zzb.js → LogContext-DjlITOzZ.js} +19 -4
- package/dist/chunks/LogContext-DjlITOzZ.js.map +1 -0
- package/dist/chunks/SerializerBridge-Ba43Mk7j.js +393 -0
- package/dist/chunks/SerializerBridge-Ba43Mk7j.js.map +1 -0
- package/dist/chunks/SerializerBridge-C4a9Z37F.cjs +410 -0
- package/dist/chunks/SerializerBridge-C4a9Z37F.cjs.map +1 -0
- package/dist/chunks/{StyleManager-CIpd6wbO.cjs → StyleManager-DQ6UNRB-.cjs} +37 -11
- package/dist/chunks/StyleManager-DQ6UNRB-.cjs.map +1 -0
- package/dist/chunks/StyleManager-DjwAYbxE.js +113 -0
- package/dist/chunks/StyleManager-DjwAYbxE.js.map +1 -0
- package/dist/chunks/{core-PoT7RrTK.js → core-Blfi2klP.js} +1 -4
- package/dist/chunks/core-Blfi2klP.js.map +1 -0
- package/dist/chunks/{core-Dzz7agGa.cjs → core-CqS_UBzJ.cjs} +1 -4
- package/dist/chunks/core-CqS_UBzJ.cjs.map +1 -0
- package/dist/chunks/{environment-detector-CI3TrWK_.js → environment-detector-7NvnYUfr.js} +11 -11
- package/dist/chunks/environment-detector-7NvnYUfr.js.map +1 -0
- package/dist/chunks/{environment-detector-Cnn6wr6O.cjs → environment-detector-D-tHkKWA.cjs} +11 -11
- package/dist/chunks/environment-detector-D-tHkKWA.cjs.map +1 -0
- package/dist/chunks/server-fallback-CaCPjWby.cjs +119 -0
- package/dist/chunks/server-fallback-CaCPjWby.cjs.map +1 -0
- package/dist/chunks/server-fallback-jj0T6XaK.js +114 -0
- package/dist/chunks/server-fallback-jj0T6XaK.js.map +1 -0
- package/dist/chunks/{spinner-DNvxbM9a.cjs → spinner-BHyYEXsM.cjs} +319 -37
- package/dist/chunks/spinner-BHyYEXsM.cjs.map +1 -0
- package/dist/chunks/{spinner-D3FsF78o.js → spinner-BtkwpzYv.js} +319 -37
- package/dist/chunks/spinner-BtkwpzYv.js.map +1 -0
- package/dist/chunks/styling-CRw3KQW4.js +1592 -0
- package/dist/chunks/styling-CRw3KQW4.js.map +1 -0
- package/dist/chunks/styling-Cel2wPRy.cjs +1645 -0
- package/dist/chunks/styling-Cel2wPRy.cjs.map +1 -0
- package/dist/chunks/transports-BGfwwakw.js +1237 -0
- package/dist/chunks/transports-BGfwwakw.js.map +1 -0
- package/dist/chunks/transports-yK6CL0Ml.cjs +1278 -0
- package/dist/chunks/transports-yK6CL0Ml.cjs.map +1 -0
- package/dist/chunks/{utils-BqlFYocD.cjs → utils-W_cxqriN.cjs} +44 -37
- package/dist/chunks/utils-W_cxqriN.cjs.map +1 -0
- package/dist/chunks/{utils-VETbVpkR.js → utils-tKfBAWUM.js} +44 -37
- package/dist/chunks/utils-tKfBAWUM.js.map +1 -0
- package/dist/cli/CommandProcessor.d.ts +166 -19
- package/dist/cli/CommandProcessor.d.ts.map +1 -1
- package/dist/cli/commands/ConfigCommand.d.ts +36 -1
- package/dist/cli/commands/ConfigCommand.d.ts.map +1 -1
- package/dist/cli/commands/ExportCommand.d.ts +49 -3
- package/dist/cli/commands/ExportCommand.d.ts.map +1 -1
- package/dist/cli/commands/ThemeCommand.d.ts +62 -3
- package/dist/cli/commands/ThemeCommand.d.ts.map +1 -1
- package/dist/cli/help.d.ts +30 -2
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/index.d.ts +29 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli.cjs +2 -2
- package/dist/cli.js +2 -2
- package/dist/context/LogContext.d.ts +165 -66
- package/dist/context/LogContext.d.ts.map +1 -1
- package/dist/context.cjs +1 -1
- package/dist/context.js +1 -1
- package/dist/core.cjs +52 -29
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.ts +50 -27
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +52 -29
- package/dist/core.js.map +1 -1
- package/dist/hooks/HookBridge.d.ts +15 -9
- package/dist/hooks/HookBridge.d.ts.map +1 -1
- package/dist/hooks/HookManager.d.ts +295 -2
- package/dist/hooks/HookManager.d.ts.map +1 -1
- package/dist/hooks.cjs +1 -1
- package/dist/hooks.js +1 -1
- package/dist/index.cjs +1092 -212
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1092 -212
- package/dist/index.js.map +1 -1
- package/dist/playground/TerminalBridge.d.ts +23 -16
- package/dist/playground/TerminalBridge.d.ts.map +1 -1
- package/dist/playground/box.d.ts +36 -5
- package/dist/playground/box.d.ts.map +1 -1
- package/dist/playground/cli-table.d.ts +41 -5
- package/dist/playground/cli-table.d.ts.map +1 -1
- package/dist/playground/divider.d.ts +22 -3
- package/dist/playground/divider.d.ts.map +1 -1
- package/dist/playground/header.d.ts +21 -4
- package/dist/playground/header.d.ts.map +1 -1
- package/dist/playground/server-fallback.d.ts +96 -9
- package/dist/playground/server-fallback.d.ts.map +1 -1
- package/dist/playground/spinner.d.ts +159 -10
- package/dist/playground/spinner.d.ts.map +1 -1
- package/dist/playground/step.d.ts +25 -6
- package/dist/playground/step.d.ts.map +1 -1
- package/dist/playground.cjs +1 -1
- package/dist/playground.js +1 -1
- package/dist/serializers/SerializerBridge.d.ts +13 -6
- package/dist/serializers/SerializerBridge.d.ts.map +1 -1
- package/dist/serializers/SerializerRegistry.d.ts +236 -0
- package/dist/serializers/SerializerRegistry.d.ts.map +1 -1
- package/dist/serializers.cjs +1 -1
- package/dist/serializers.js +1 -1
- package/dist/styles/StyleManager.d.ts +138 -31
- package/dist/styles/StyleManager.d.ts.map +1 -1
- package/dist/styles.cjs +2 -2
- package/dist/styles.js +2 -2
- package/dist/styling/SmartPresets.d.ts +100 -6
- package/dist/styling/SmartPresets.d.ts.map +1 -1
- package/dist/styling/StyleBuilder.d.ts +453 -32
- package/dist/styling/StyleBuilder.d.ts.map +1 -1
- package/dist/styling/banners.d.ts +83 -7
- package/dist/styling/banners.d.ts.map +1 -1
- package/dist/styling/themes.d.ts +41 -2
- package/dist/styling/themes.d.ts.map +1 -1
- package/dist/transports/ConsoleTransport.d.ts +95 -0
- package/dist/transports/ConsoleTransport.d.ts.map +1 -1
- package/dist/transports/FileTransport.d.ts +99 -18
- package/dist/transports/FileTransport.d.ts.map +1 -1
- package/dist/transports/HttpTransport.d.ts +135 -22
- package/dist/transports/HttpTransport.d.ts.map +1 -1
- package/dist/transports/OtlpTransport.d.ts +53 -36
- package/dist/transports/OtlpTransport.d.ts.map +1 -1
- package/dist/transports/TransportBridge.d.ts +19 -13
- package/dist/transports/TransportBridge.d.ts.map +1 -1
- package/dist/transports/TransportManager.d.ts +223 -8
- package/dist/transports/TransportManager.d.ts.map +1 -1
- package/dist/transports.cjs +1 -1
- package/dist/transports.js +1 -1
- package/dist/types/core.d.ts +155 -59
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/hooks.d.ts +92 -14
- package/dist/types/hooks.d.ts.map +1 -1
- package/dist/types/serializers.d.ts +72 -0
- package/dist/types/serializers.d.ts.map +1 -1
- package/dist/types/transports.d.ts +42 -37
- package/dist/types/transports.d.ts.map +1 -1
- package/dist/utils/ansi-colors.d.ts +15 -15
- package/dist/utils/environment-detector.d.ts +11 -11
- package/dist/utils/formatting.d.ts +8 -8
- package/dist/utils/output.d.ts +9 -9
- package/dist/utils/output.d.ts.map +1 -1
- package/dist/utils/stackTrace.d.ts +2 -2
- package/package.json +24 -25
- package/dist/chunks/HookBridge-CiRfR67f.cjs +0 -190
- package/dist/chunks/HookBridge-CiRfR67f.cjs.map +0 -1
- package/dist/chunks/HookBridge-SgMmbXZB.js +0 -173
- package/dist/chunks/HookBridge-SgMmbXZB.js.map +0 -1
- package/dist/chunks/LogContext-Cwn-1Zzb.js.map +0 -1
- package/dist/chunks/LogContext-L7HzynFw.cjs.map +0 -1
- package/dist/chunks/SerializerBridge-BaOQOb8q.cjs +0 -166
- package/dist/chunks/SerializerBridge-BaOQOb8q.cjs.map +0 -1
- package/dist/chunks/SerializerBridge-BkpQu5c9.js +0 -149
- package/dist/chunks/SerializerBridge-BkpQu5c9.js.map +0 -1
- package/dist/chunks/StyleManager-CIpd6wbO.cjs.map +0 -1
- package/dist/chunks/StyleManager-LCvVlVdx.js +0 -87
- package/dist/chunks/StyleManager-LCvVlVdx.js.map +0 -1
- package/dist/chunks/core-Dzz7agGa.cjs.map +0 -1
- package/dist/chunks/core-PoT7RrTK.js.map +0 -1
- package/dist/chunks/environment-detector-CI3TrWK_.js.map +0 -1
- package/dist/chunks/environment-detector-Cnn6wr6O.cjs.map +0 -1
- package/dist/chunks/server-fallback-BUKjdLS7.cjs +0 -42
- package/dist/chunks/server-fallback-BUKjdLS7.cjs.map +0 -1
- package/dist/chunks/server-fallback-BsuWH1Dk.js +0 -37
- package/dist/chunks/server-fallback-BsuWH1Dk.js.map +0 -1
- package/dist/chunks/spinner-D3FsF78o.js.map +0 -1
- package/dist/chunks/spinner-DNvxbM9a.cjs.map +0 -1
- package/dist/chunks/styling-84N8T97t.js +0 -941
- package/dist/chunks/styling-84N8T97t.js.map +0 -1
- package/dist/chunks/styling-Cg5saQ46.cjs +0 -994
- package/dist/chunks/styling-Cg5saQ46.cjs.map +0 -1
- package/dist/chunks/transports-BiDk345e.js +0 -715
- package/dist/chunks/transports-BiDk345e.js.map +0 -1
- package/dist/chunks/transports-COPWmlF1.cjs +0 -756
- package/dist/chunks/transports-COPWmlF1.cjs.map +0 -1
- package/dist/chunks/utils-BqlFYocD.cjs.map +0 -1
- package/dist/chunks/utils-VETbVpkR.js.map +0 -1
- package/dist/example.d.ts +0 -18
- package/dist/example.d.ts.map +0 -1
- package/dist/main.d.ts +0 -2
- package/dist/main.d.ts.map +0 -1
|
@@ -1,9 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview
|
|
2
|
+
* @fileoverview Configuraciones de banner para Advanced Logger.
|
|
3
3
|
*/
|
|
4
4
|
import type { BannerType, ThemeVariant } from '../types/index.js';
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
6
|
+
* Catálogo de variantes del banner de inicialización del logger.
|
|
7
|
+
*
|
|
8
|
+
* Cada variante es un par `{ text, style }` listo para pasar a
|
|
9
|
+
* `console.log(\`%c${text}\`, style)`. Las variantes escalan en complejidad
|
|
10
|
+
* visual según las capacidades del navegador:
|
|
11
|
+
* - `simple` — una sola línea con gradiente.
|
|
12
|
+
* - `ascii` — ASCII art multiníveles (Safari, sin SVG).
|
|
13
|
+
* - `unicode` — caja Unicode con gradiente de fondo.
|
|
14
|
+
* - `svg` — `background-image` SVG con texto vectorial.
|
|
15
|
+
* - `animated` — gradiente animado vía `@keyframes gradientShift`.
|
|
16
|
+
*
|
|
17
|
+
* La función {@link detectBannerCapabilities} elige automáticamente la
|
|
18
|
+
* variante más rica soportada por el entorno actual.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* import { BANNER_VARIANTS } from '@mks2508/better-logger/styles';
|
|
23
|
+
*
|
|
24
|
+
* const { text, style } = BANNER_VARIANTS.unicode;
|
|
25
|
+
* console.log(`%c${text}`, style);
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @see {@link BannerType} para la unión de claves válidas.
|
|
29
|
+
* @see {@link displayInitBanner} para pintar el banner auto-detectado.
|
|
7
30
|
*/
|
|
8
31
|
export declare const BANNER_VARIANTS: {
|
|
9
32
|
simple: {
|
|
@@ -28,22 +51,75 @@ export declare const BANNER_VARIANTS: {
|
|
|
28
51
|
};
|
|
29
52
|
};
|
|
30
53
|
/**
|
|
31
|
-
*
|
|
54
|
+
* Banners de inicialización específicos por {@link ThemeVariant}.
|
|
55
|
+
*
|
|
56
|
+
* Cada theme trae su propio par `{ simple, style }` (banner de una línea
|
|
57
|
+
* + CSS) que combina con la paleta del theme. El texto del banner es
|
|
58
|
+
* siempre una sola línea (sin ASCII art), por lo que es la variante
|
|
59
|
+
* usada por defecto cuando el logger arranca con un theme concreto.
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```ts
|
|
63
|
+
* import { THEME_BANNERS } from '@mks2508/better-logger/styles';
|
|
64
|
+
*
|
|
65
|
+
* const { simple, style } = THEME_BANNERS.cyberpunk;
|
|
66
|
+
* console.log(`%c${simple}`, style);
|
|
67
|
+
* ```
|
|
68
|
+
*
|
|
69
|
+
* @see {@link THEME_PRESETS} para los estilos de badge por nivel de cada theme.
|
|
70
|
+
* @see {@link ThemeVariant} para la lista de themes disponibles.
|
|
32
71
|
*/
|
|
33
72
|
export declare const THEME_BANNERS: Record<ThemeVariant, {
|
|
34
73
|
simple: string;
|
|
35
74
|
style: string;
|
|
36
75
|
}>;
|
|
37
76
|
/**
|
|
38
|
-
*
|
|
39
|
-
* if neither `navigator` nor `document` exist (Node, SSR, workers).
|
|
77
|
+
* Detecta la variante de banner más rica que el entorno puede renderizar.
|
|
40
78
|
*
|
|
79
|
+
* Usa `navigator.userAgent` y probes sobre `document` para decidir entre
|
|
80
|
+
* `animated` (Chrome con CSS animations), `svg` (Chrome/Firefox con SVG),
|
|
81
|
+
* `unicode` (Chrome/Firefox fallback), `ascii` (Safari) o `simple`
|
|
82
|
+
* (todo lo demás). En entornos sin `navigator` o `document` retorna
|
|
83
|
+
* `'simple'` inmediatamente (Node, SSR, Web Workers).
|
|
84
|
+
*
|
|
85
|
+
* @returns {BannerType} Variante de banner recomendada para el entorno.
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```ts
|
|
89
|
+
* import { detectBannerCapabilities } from '@mks2508/better-logger/styles';
|
|
90
|
+
*
|
|
91
|
+
* const capable = detectBannerCapabilities();
|
|
92
|
+
* console.log(`Best banner for this env: ${capable}`);
|
|
93
|
+
* ```
|
|
94
|
+
*
|
|
95
|
+
* @see {@link BANNER_VARIANTS} para el catálogo que indexa este resultado.
|
|
41
96
|
*/
|
|
42
97
|
export declare function detectBannerCapabilities(): BannerType;
|
|
43
98
|
/**
|
|
44
|
-
*
|
|
45
|
-
*
|
|
99
|
+
* Pinta el banner de inicialización del logger en la consola del navegador.
|
|
100
|
+
*
|
|
101
|
+
* Si no se pasa `bannerType`, se auto-detecta vía
|
|
102
|
+
* {@link detectBannerCapabilities}. Además del banner, abre un
|
|
103
|
+
* `console.group` con la lista de features soportadas (styling, stack
|
|
104
|
+
* traces, performance timers, handlers, ...).
|
|
105
|
+
*
|
|
106
|
+
* No-op cuando `document` no está disponible (Node, SSR, Web Workers),
|
|
107
|
+
* para evitar referencias a APIs inexistentes.
|
|
108
|
+
*
|
|
109
|
+
* @param {BannerType} [bannerType] - Variante de banner a pintar. Si se
|
|
110
|
+
* omite, se detecta automáticamente la mejor soportada.
|
|
111
|
+
* @returns {void}
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* ```ts
|
|
115
|
+
* import { displayInitBanner } from '@mks2508/better-logger/styles';
|
|
116
|
+
*
|
|
117
|
+
* displayInitBanner(); // auto-detecta
|
|
118
|
+
* displayInitBanner('ascii'); // fuerza ASCII art
|
|
119
|
+
* ```
|
|
46
120
|
*
|
|
121
|
+
* @see {@link BANNER_VARIANTS} para las variantes disponibles.
|
|
122
|
+
* @see {@link THEME_BANNERS} para banners específicos por theme.
|
|
47
123
|
*/
|
|
48
124
|
export declare function displayInitBanner(bannerType?: BannerType): void;
|
|
49
125
|
//# sourceMappingURL=banners.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"banners.d.ts","sourceRoot":"","sources":["../../src/styling/banners.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAElE
|
|
1
|
+
{"version":3,"file":"banners.d.ts","sourceRoot":"","sources":["../../src/styling/banners.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAElE;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;CAoD3B,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,YAAY,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAyBjF,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,wBAAwB,IAAI,UAAU,CA8BrD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,CAyC/D"}
|
package/dist/styling/themes.d.ts
CHANGED
|
@@ -1,10 +1,49 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview
|
|
2
|
+
* @fileoverview Presets de themes visuales para Advanced Logger.
|
|
3
3
|
*/
|
|
4
4
|
import type { ThemeVariant } from '../types/index.js';
|
|
5
5
|
import type { LevelStyleConfig } from '../utils/index.js';
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
7
|
+
* Catálogo de themes visuales para los badges de cada log level.
|
|
8
|
+
*
|
|
9
|
+
* Cada {@link ThemeVariant} mapea a un record de {@link LevelStyleConfig}
|
|
10
|
+
* indexado por nivel (`debug`, `info`, `warn`, `error`, `success`,
|
|
11
|
+
* `critical`). El {@link StyleManager} consume este mappeo para resolver
|
|
12
|
+
* los estilos CSS del badge que rodea al label del nivel en la consola
|
|
13
|
+
* del navegador.
|
|
14
|
+
*
|
|
15
|
+
* Un {@link LevelStyleConfig} por nivel define seis campos visuales:
|
|
16
|
+
* - `emoji` — glyph que precede al label (vacío en themes minimal).
|
|
17
|
+
* - `label` — texto en mayúsculas renderizado dentro del badge.
|
|
18
|
+
* - `background` — CSS background (típicamente un `linear-gradient`).
|
|
19
|
+
* - `color` — color del texto interior del badge.
|
|
20
|
+
* - `border` — CSS border completo (`<width> <style> <color>`).
|
|
21
|
+
* - `shadow` — box-shadow alrededor del badge; `'none'` lo desactiva.
|
|
22
|
+
*
|
|
23
|
+
* Themes disponibles: `default` (gradientes vivos), `dark` (paleta oscura
|
|
24
|
+
* para DevTools oscuro), `neon` (glow neón sobre fondo oscuro), `minimal`
|
|
25
|
+
* (badges planos sin sombras ni emojis), `light` (paleta pastel para
|
|
26
|
+
* DevTools claro) y `cyberpunk` (cian/magenta con sombras extendidas).
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```ts
|
|
30
|
+
* import { THEME_PRESETS } from '@mks2508/better-logger/styles';
|
|
31
|
+
*
|
|
32
|
+
* // Inspeccionar el badge `error` del theme `neon`
|
|
33
|
+
* const { emoji, label, background, color } = THEME_PRESETS.neon.error;
|
|
34
|
+
* console.log(`${emoji} ${label} → ${background}`);
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```ts
|
|
39
|
+
* // Aplicar un theme al logger entero
|
|
40
|
+
* import logger from '@mks2508/better-logger';
|
|
41
|
+
* logger.configure({ theme: 'cyberpunk' });
|
|
42
|
+
* logger.error('Algo se rompió'); // badge con glow magenta
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* @see {@link ThemeVariant} para la lista de claves válidas.
|
|
46
|
+
* @see {@link LevelStyleConfig} para la shape exacta de cada entrada.
|
|
8
47
|
*/
|
|
9
48
|
export declare const THEME_PRESETS: Record<ThemeVariant, Record<string, LevelStyleConfig>>;
|
|
10
49
|
//# sourceMappingURL=themes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"themes.d.ts","sourceRoot":"","sources":["../../src/styling/themes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D
|
|
1
|
+
{"version":3,"file":"themes.d.ts","sourceRoot":"","sources":["../../src/styling/themes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAmQhF,CAAC"}
|
|
@@ -1,9 +1,104 @@
|
|
|
1
1
|
import type { TransportRecord, TransportOptions, ITransport } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Transport por defecto que escribe cada {@link TransportRecord} al `console`
|
|
4
|
+
* global del runtime (navegador o Node.js).
|
|
5
|
+
*
|
|
6
|
+
* Es el transport que el Logger registra automáticamente cuando no se configura
|
|
7
|
+
* ninguno explícito, garantizando que los registros siempre lleguen a un
|
|
8
|
+
* destino visible sin configuración adicional.
|
|
9
|
+
*
|
|
10
|
+
* **Mapeo level → console method**: traduce cada nivel de log al método más
|
|
11
|
+
* cercano de la API `console`, de forma que el filtrado nativo del DevTools /
|
|
12
|
+
* `NODE_DEBUG` siga funcionando:
|
|
13
|
+
*
|
|
14
|
+
* | LogLevel | console method |
|
|
15
|
+
* |--------------|----------------|
|
|
16
|
+
* | `debug` | `console.log` |
|
|
17
|
+
* | `info` | `console.info` |
|
|
18
|
+
* | `warn` | `console.warn` |
|
|
19
|
+
* | `error` | `console.error`|
|
|
20
|
+
* | `critical` | `console.error`|
|
|
21
|
+
*
|
|
22
|
+
* **Formato de output**: cada línea se compone como
|
|
23
|
+
* `[LEVEL] [prefix] message (file:line)`, donde `prefix` y la localización
|
|
24
|
+
* se omiten si el registro no las trae.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* // Uso directo como ITransport
|
|
28
|
+
* import { ConsoleTransport } from '@mks2508/better-logger/transports';
|
|
29
|
+
* const transport = new ConsoleTransport();
|
|
30
|
+
* transport.write({
|
|
31
|
+
* level: 'info',
|
|
32
|
+
* msg: 'Arrancando worker',
|
|
33
|
+
* prefix: 'worker',
|
|
34
|
+
* // ... resto del TransportRecord
|
|
35
|
+
* });
|
|
36
|
+
* // → console.info("[INFO] [worker] Arrancando worker (worker.ts:12)")
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* // Registro a través del Logger (típico — el logger lo añade por defecto)
|
|
40
|
+
* logger.addTransport({ target: new ConsoleTransport() });
|
|
41
|
+
*
|
|
42
|
+
* @see {@link ITransport}
|
|
43
|
+
* @see {@link TransportRecord}
|
|
44
|
+
*/
|
|
2
45
|
export declare class ConsoleTransport implements ITransport {
|
|
3
46
|
private options?;
|
|
47
|
+
/** Identificador del transport usado por el Logger para deduplicar y exponer metadatos. */
|
|
4
48
|
readonly name = "console";
|
|
49
|
+
/**
|
|
50
|
+
* Crea una instancia de {@link ConsoleTransport}.
|
|
51
|
+
*
|
|
52
|
+
* El parámetro `options` se acepta para cumplir con la firma canónica de
|
|
53
|
+
* {@link TransportOptions} (filtros de nivel, formateadores, etc.), aunque
|
|
54
|
+
* la implementación actual escribe el registro tal cual llega sin
|
|
55
|
+
* transformaciones adicionales.
|
|
56
|
+
*
|
|
57
|
+
* @param {TransportOptions} [options] - Configuración opcional del transport
|
|
58
|
+
* (nivel mínimo, formatter, etc.).
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* const transport = new ConsoleTransport({ level: 'warn' });
|
|
62
|
+
*/
|
|
5
63
|
constructor(options?: TransportOptions | undefined);
|
|
64
|
+
/**
|
|
65
|
+
* Escribe un {@link TransportRecord} al `console` global.
|
|
66
|
+
*
|
|
67
|
+
* Selecciona el método de console según el nivel del registro, compone el
|
|
68
|
+
* prefijo `[LEVEL] [prefix]` y, si la localización está disponible, añade
|
|
69
|
+
* el sufijo `(file:line)`. No lanza ni retorna errores: si `console[method]`
|
|
70
|
+
* fallara (raro), la excepción propagaría al caller.
|
|
71
|
+
*
|
|
72
|
+
* @param {TransportRecord} record - Registro normalizado producido por el Logger.
|
|
73
|
+
* @returns {void}
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* transport.write({
|
|
77
|
+
* level: 'error',
|
|
78
|
+
* msg: 'DB connection lost',
|
|
79
|
+
* prefix: 'db',
|
|
80
|
+
* location: { file: 'pool.ts', line: 87, function: 'acquire' },
|
|
81
|
+
* // ... resto del TransportRecord
|
|
82
|
+
* });
|
|
83
|
+
* // → console.error("[ERROR] [db] DB connection lost (pool.ts:87)")
|
|
84
|
+
*/
|
|
6
85
|
write(record: TransportRecord): void;
|
|
86
|
+
/**
|
|
87
|
+
* Resuelve el método de `console` apropiado para un {@link LogLevel}.
|
|
88
|
+
*
|
|
89
|
+
* Tabla de mapeo:
|
|
90
|
+
* - `debug` → `log` (sin ruido en DevTools por defecto)
|
|
91
|
+
* - `info` → `info`
|
|
92
|
+
* - `warn` → `warn`
|
|
93
|
+
* - `error` → `error`
|
|
94
|
+
* - `critical` → `error` (no existe `console.critical`)
|
|
95
|
+
* - cualquier otro → `log` (fallback seguro)
|
|
96
|
+
*
|
|
97
|
+
* @internal Método privado; no forma parte de la API pública del transport.
|
|
98
|
+
*
|
|
99
|
+
* @param {LogLevel} level - Nivel del registro a traducir.
|
|
100
|
+
* @returns {'log' | 'info' | 'warn' | 'error'} Nombre del método de `console`.
|
|
101
|
+
*/
|
|
7
102
|
private getConsoleMethod;
|
|
8
103
|
}
|
|
9
104
|
//# sourceMappingURL=ConsoleTransport.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConsoleTransport.d.ts","sourceRoot":"","sources":["../../src/transports/ConsoleTransport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,UAAU,EAAY,MAAM,mBAAmB,CAAC;AAEjG,qBAAa,gBAAiB,YAAW,UAAU;
|
|
1
|
+
{"version":3,"file":"ConsoleTransport.d.ts","sourceRoot":"","sources":["../../src/transports/ConsoleTransport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,UAAU,EAAY,MAAM,mBAAmB,CAAC;AAEjG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,qBAAa,gBAAiB,YAAW,UAAU;IAkBnC,OAAO,CAAC,OAAO,CAAC;IAjB5B,2FAA2F;IAC3F,QAAQ,CAAC,IAAI,aAAa;IAE1B;;;;;;;;;;;;;OAaG;gBACiB,OAAO,CAAC,EAAE,gBAAgB,YAAA;IAE9C;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,KAAK,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAUpC;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,gBAAgB;CAU3B"}
|
|
@@ -1,53 +1,134 @@
|
|
|
1
1
|
import type { TransportRecord, TransportOptions, IBufferedTransport, HookLogEntry } from '../types/index.js';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
* Node
|
|
5
|
-
*
|
|
3
|
+
* Opciones para {@link FileTransport}. El campo `destination` se interpreta
|
|
4
|
+
* como ruta de fichero en Node y como clave de `localStorage` en el browser
|
|
5
|
+
* (componente saneado a `[a-zA-Z0-9_-]`).
|
|
6
6
|
*
|
|
7
|
+
* Hereda los defaults de {@link TransportOptions}: `batchSize=100`,
|
|
8
|
+
* `maxBufferSize=10000`.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* const transport = new FileTransport({
|
|
12
|
+
* destination: 'logs/app.log',
|
|
13
|
+
* batchSize: 200,
|
|
14
|
+
* flushInterval: 2000,
|
|
15
|
+
* maxBufferSize: 5000,
|
|
16
|
+
* onError: (entry) => captureFailure(entry)
|
|
17
|
+
* });
|
|
7
18
|
*/
|
|
8
19
|
export interface FileTransportOptions extends TransportOptions {
|
|
9
20
|
/**
|
|
10
|
-
*
|
|
11
|
-
* `process.cwd()`
|
|
12
|
-
*
|
|
21
|
+
* Destino de escritura. En Node es una ruta de fichero (resuelta relativa
|
|
22
|
+
* a `process.cwd()` y saneada contra path traversal). En el browser es una
|
|
23
|
+
* clave de `localStorage` (saneada a alfanumérico + `-_`).
|
|
13
24
|
* @default 'app.log' (Node) | 'better-logger:default' (browser)
|
|
14
25
|
*/
|
|
15
26
|
destination?: string;
|
|
16
27
|
/**
|
|
17
|
-
*
|
|
18
|
-
* quota
|
|
19
|
-
*
|
|
28
|
+
* Hook opcional que se dispara cuando el transport no puede escribir
|
|
29
|
+
* (error de FS, quota agotada, tab del browser en modo privado, ...).
|
|
30
|
+
* Recibe un {@link HookLogEntry} sintético.
|
|
20
31
|
*/
|
|
21
32
|
onError?: (entry: HookLogEntry) => void | Promise<void>;
|
|
22
33
|
}
|
|
23
34
|
/**
|
|
24
|
-
*
|
|
35
|
+
* Transport que escribe registros a fichero (Node) o `localStorage` (browser).
|
|
36
|
+
*
|
|
37
|
+
* En Node, hace `appendFile` asíncrono vía `fs.promises` cargado con dynamic
|
|
38
|
+
* import (no bloquea el event loop, no envía código Node-only al bundle del
|
|
39
|
+
* browser). En el browser, acumula en `localStorage` con prefijo `better-logger:`
|
|
40
|
+
* y degrada a no-op silencioso si el storage no está disponible (modo privado,
|
|
41
|
+
* sandbox de iframes, quota agotada).
|
|
42
|
+
*
|
|
43
|
+
* El buffer es bounded: al llegar a `maxBufferSize` suelta el registro más
|
|
44
|
+
* viejo (drop-oldest) e invoca `onError` con el payload descartado, de modo
|
|
45
|
+
* que un pico de tráfico sostenido no agota memoria.
|
|
46
|
+
*
|
|
47
|
+
* El `destination` se sanea antes de usarse:
|
|
48
|
+
* - Node: se rechazan rutas con segmentos `..`, `~` o absolutas (path traversal).
|
|
49
|
+
* - Browser: se colapsa a `[a-zA-Z0-9_-]` recortado a 64 caracteres.
|
|
25
50
|
*
|
|
26
|
-
*
|
|
27
|
-
* - In the browser, writes batches into `localStorage` (fallback no-op if
|
|
28
|
-
* `localStorage` is unavailable — e.g. private mode, sandboxed iframes).
|
|
51
|
+
* @implements {IBufferedTransport}
|
|
29
52
|
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
53
|
+
* @example
|
|
54
|
+
* // Node: append a fichero con flush cada segundo
|
|
55
|
+
* logger.addTransport({
|
|
56
|
+
* target: new FileTransport({
|
|
57
|
+
* destination: 'logs/app.log',
|
|
58
|
+
* batchSize: 100,
|
|
59
|
+
* flushInterval: 1000,
|
|
60
|
+
* onError: (entry) => captureFailure(entry)
|
|
61
|
+
* })
|
|
62
|
+
* });
|
|
35
63
|
*
|
|
64
|
+
* @example
|
|
65
|
+
* // Browser: persiste en localStorage bajo 'better-logger:audit'
|
|
66
|
+
* logger.addTransport({
|
|
67
|
+
* target: new FileTransport({ destination: 'audit' })
|
|
68
|
+
* });
|
|
69
|
+
*
|
|
70
|
+
* @see {@link FileTransportOptions}
|
|
71
|
+
* @see {@link IBufferedTransport}
|
|
36
72
|
*/
|
|
37
73
|
export declare class FileTransport implements IBufferedTransport {
|
|
74
|
+
/** Identificador del transport dentro del pipeline (`'file'`). */
|
|
38
75
|
readonly name = "file";
|
|
39
76
|
private buffer;
|
|
40
77
|
private flushTimer?;
|
|
41
78
|
private options;
|
|
42
79
|
private closed;
|
|
80
|
+
/**
|
|
81
|
+
* Construye el transport. Si se pasa `flushInterval`, arranca un timer
|
|
82
|
+
* periódico que vacía el buffer al vencimiento; si no, el flush se
|
|
83
|
+
* dispara solo cuando el buffer alcanza `batchSize`.
|
|
84
|
+
*
|
|
85
|
+
* @param {FileTransportOptions} [options] - Configuración. Defaults: `batchSize=100`, `maxBufferSize=10000`.
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* const t = new FileTransport({ destination: 'app.log', flushInterval: 1000 });
|
|
89
|
+
*/
|
|
43
90
|
constructor(options?: FileTransportOptions);
|
|
91
|
+
/** Registros pendientes en el buffer (aún sin flush). */
|
|
44
92
|
get bufferSize(): number;
|
|
93
|
+
/** Capacidad máxima del buffer; al superarla se aplica drop-oldest. */
|
|
45
94
|
get maxBufferSize(): number;
|
|
95
|
+
/**
|
|
96
|
+
* Indica si el transport acepta escrituras. Devuelve `false` después de
|
|
97
|
+
* {@link FileTransport.close} — cualquier `write` posterior se descarta.
|
|
98
|
+
*
|
|
99
|
+
* @returns {boolean} `true` mientras el transport no esté cerrado.
|
|
100
|
+
*/
|
|
46
101
|
isReady(): boolean;
|
|
102
|
+
/**
|
|
103
|
+
* Encola un registro serializado (JSON + `\n`). Si el buffer está a tope,
|
|
104
|
+
* suelta el registro más viejo (drop-oldest) y emite un evento `onError`
|
|
105
|
+
* con el payload descartado para que la pérdida sea observable. Si al
|
|
106
|
+
* encolar se alcanza `batchSize`, dispara un flush asíncrono.
|
|
107
|
+
*
|
|
108
|
+
* No-op silencioso si el transport está cerrado.
|
|
109
|
+
*
|
|
110
|
+
* @param {TransportRecord} record - Registro a escribir.
|
|
111
|
+
*/
|
|
47
112
|
write(record: TransportRecord): void;
|
|
113
|
+
/**
|
|
114
|
+
* Vuelca el buffer al destino. En Node concatena el contenido y hace
|
|
115
|
+
* un único `appendFile`; en browser hace un único `setItem` sobre
|
|
116
|
+
* `localStorage`. El buffer se vacía antes del I/O para que los registros
|
|
117
|
+
* entrantes no esperen al disco. Los errores de escritura se reportan
|
|
118
|
+
* vía `onError` (nunca lanzan al caller).
|
|
119
|
+
*
|
|
120
|
+
* @returns {Promise<void>} Resuelve cuando el I/O terminó o falló.
|
|
121
|
+
*/
|
|
48
122
|
flush(): Promise<void>;
|
|
49
123
|
private flushNode;
|
|
50
124
|
private flushBrowser;
|
|
125
|
+
/**
|
|
126
|
+
* Cierra el transport: detiene el timer de flush y dispara un flush
|
|
127
|
+
* final para no perder registros pendientes. Tras cerrar, `write` y
|
|
128
|
+
* `flush` se vuelven no-op.
|
|
129
|
+
*
|
|
130
|
+
* @returns {Promise<void>} Resuelve cuando el flush final termina.
|
|
131
|
+
*/
|
|
51
132
|
close(): Promise<void>;
|
|
52
133
|
private resolveNodeDestination;
|
|
53
134
|
private resolveBrowserKey;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileTransport.d.ts","sourceRoot":"","sources":["../../src/transports/FileTransport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,eAAe,EACf,gBAAgB,EAEhB,kBAAkB,EAClB,YAAY,EAEf,MAAM,mBAAmB,CAAC;AAO3B
|
|
1
|
+
{"version":3,"file":"FileTransport.d.ts","sourceRoot":"","sources":["../../src/transports/FileTransport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,eAAe,EACf,gBAAgB,EAEhB,kBAAkB,EAClB,YAAY,EAEf,MAAM,mBAAmB,CAAC;AAO3B;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,oBAAqB,SAAQ,gBAAgB;IAC1D;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,qBAAa,aAAc,YAAW,kBAAkB;IACpD,kEAAkE;IAClE,QAAQ,CAAC,IAAI,UAAU;IAEvB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,UAAU,CAAC,CAAiC;IACpD,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,MAAM,CAAS;IAEvB;;;;;;;;;OASG;gBACS,OAAO,CAAC,EAAE,oBAAoB;IAc1C,yDAAyD;IACzD,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,uEAAuE;IACvE,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED;;;;;OAKG;IACH,OAAO,IAAI,OAAO;IAIlB;;;;;;;;;OASG;IACH,KAAK,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IA6BpC;;;;;;;;OAQG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAad,SAAS;YAaT,YAAY;IAc1B;;;;;;OAMG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,SAAS;CAYpB"}
|
|
@@ -1,67 +1,180 @@
|
|
|
1
1
|
import type { TransportRecord, TransportOptions, IBufferedTransport, HookLogEntry } from '../types/index.js';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
3
|
+
* Configuración para {@link HttpTransport}. Extiende {@link TransportOptions}
|
|
4
|
+
* con parámetros HTTP: URL destino, headers custom, buffer acotado,
|
|
5
|
+
* retry con backoff para fallos transitorios, timeout de fetch por intento, y
|
|
6
|
+
* un hook `onError` que reporta drops (overflow / 4xx / retry exhausto)
|
|
7
|
+
* sin escalar excepciones al caller.
|
|
5
8
|
*
|
|
9
|
+
* @example
|
|
10
|
+
* // Mínimo: solo URL
|
|
11
|
+
* new HttpTransport({ url: 'https://logs.example.com/ingest' });
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* // Con retry/backoff ajustado y hook de errores
|
|
15
|
+
* new HttpTransport({
|
|
16
|
+
* url: 'https://logs.example.com/ingest',
|
|
17
|
+
* headers: { Authorization: 'Bearer <REDACTED>' },
|
|
18
|
+
* maxRetries: 5,
|
|
19
|
+
* initialBackoffMs: 500,
|
|
20
|
+
* maxBackoffMs: 30_000,
|
|
21
|
+
* fetchTimeoutMs: 5_000,
|
|
22
|
+
* onError: (entry) => metrics.increment('log_drop', { reason: entry.message })
|
|
23
|
+
* });
|
|
6
24
|
*/
|
|
7
25
|
export interface HttpTransportOptions extends TransportOptions {
|
|
8
|
-
/**
|
|
26
|
+
/** URL destino. Se usa POST con body JSON. */
|
|
9
27
|
url?: string;
|
|
10
|
-
/**
|
|
28
|
+
/** Headers extra de la request (ej. `Authorization: Bearer ...`). */
|
|
11
29
|
headers?: Record<string, string>;
|
|
12
|
-
/**
|
|
30
|
+
/** Tope máximo de records en buffer. En overflow se dropea el más viejo. */
|
|
13
31
|
maxBufferSize?: number;
|
|
14
|
-
/**
|
|
32
|
+
/** Reintentos consecutivos por batch antes de dropear los records. */
|
|
15
33
|
maxRetries?: number;
|
|
16
|
-
/**
|
|
34
|
+
/** Backoff inicial en ms. Duplica por intento hasta `maxBackoffMs`. */
|
|
17
35
|
initialBackoffMs?: number;
|
|
18
|
-
/**
|
|
36
|
+
/** Techo de backoff en ms. */
|
|
19
37
|
maxBackoffMs?: number;
|
|
20
|
-
/**
|
|
38
|
+
/** Timeout del fetch en ms (por intento). Default 10_000. */
|
|
21
39
|
fetchTimeoutMs?: number;
|
|
22
40
|
/**
|
|
23
|
-
*
|
|
24
|
-
*
|
|
41
|
+
* Hook opcional que se dispara cuando el buffer hace overflow o un batch
|
|
42
|
+
* se dropea tras `maxRetries`. Recibe una entrada {@link HookLogEntry}
|
|
43
|
+
* sintética.
|
|
25
44
|
*/
|
|
26
45
|
onError?: (entry: HookLogEntry) => void | Promise<void>;
|
|
27
46
|
}
|
|
28
47
|
/**
|
|
29
|
-
* HTTP
|
|
30
|
-
*
|
|
31
|
-
*
|
|
48
|
+
* Transport basado en HTTP. Bufferea records, los batcha por tamaño o
|
|
49
|
+
* intervalo, POSTea el batch como JSON, y reporta fallos vía retry, buffer
|
|
50
|
+
* acotado y un hook `onError` — nunca un `.catch(() => {})` silencioso.
|
|
51
|
+
*
|
|
52
|
+
* Lifecycle de cada batch (driveado internamente por `sendWithRetry`):
|
|
53
|
+
* 1. `fetch(url, { method: 'POST', body, signal })` con un `AbortController`
|
|
54
|
+
* que aborta tras `fetchTimeoutMs`.
|
|
55
|
+
* 2. Si `response.ok` → batch considerado entregado.
|
|
56
|
+
* 3. Si `4xx` → dropeado sin reintento: el cliente nunca se recupera de un
|
|
57
|
+
* error de URL/auth/payload mal formado. Se dispara `onError`.
|
|
58
|
+
* 4. Si `5xx` o `fetch` lanza (red caída / abort por timeout) → reintento con
|
|
59
|
+
* backoff exponencial: arranca en `initialBackoffMs`, duplica por intento,
|
|
60
|
+
* techo `maxBackoffMs`, hasta `maxRetries` intentos. Tras el agotamiento
|
|
61
|
+
* el batch se re-bufferiza (o se trimea contra `maxBufferSize`) y se
|
|
62
|
+
* dispara `onError` con `droppedCount`.
|
|
63
|
+
*
|
|
64
|
+
* El body por defecto es el envelope JSON `{ logs: TransportRecord[] }`.
|
|
65
|
+
* Para cambiar el wire format, sobrescribe los hooks `protected`
|
|
66
|
+
* {@link HttpTransport.serializeBody} y {@link HttpTransport.buildHeaders}
|
|
67
|
+
* (referencia: {@link OtlpTransport}).
|
|
68
|
+
*
|
|
69
|
+
* Extender esta clase es la vía recomendada para shippear un transport
|
|
70
|
+
* nuevo orientado a HTTP.
|
|
32
71
|
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
72
|
+
* @example
|
|
73
|
+
* // Registro en un logger
|
|
74
|
+
* import logger from '@mks2508/better-logger';
|
|
75
|
+
* import { HttpTransport } from '@mks2508/better-logger/transports';
|
|
35
76
|
*
|
|
77
|
+
* logger.addTransport({
|
|
78
|
+
* target: new HttpTransport({
|
|
79
|
+
* url: 'https://logs.example.com/ingest',
|
|
80
|
+
* flushInterval: 5_000,
|
|
81
|
+
* batchSize: 100,
|
|
82
|
+
* onError: (entry) => console.error('[log-drop]', entry.message)
|
|
83
|
+
* })
|
|
84
|
+
* });
|
|
85
|
+
*
|
|
86
|
+
* @see {@link HttpTransportOptions}
|
|
87
|
+
* @see {@link OtlpTransport}
|
|
36
88
|
*/
|
|
37
89
|
export declare class HttpTransport implements IBufferedTransport {
|
|
90
|
+
/** Identificador del transport. Los loggers lo usan para lookup, dedup y logs de diagnóstico. */
|
|
38
91
|
readonly name: string;
|
|
39
92
|
private buffer;
|
|
40
93
|
private flushTimer?;
|
|
41
94
|
private closed;
|
|
42
|
-
/**
|
|
95
|
+
/** Bag de options — `protected` para que subclasses (ej. {@link OtlpTransport}) puedan leerlo o extenderlo. */
|
|
43
96
|
protected options: HttpTransportOptions;
|
|
97
|
+
/**
|
|
98
|
+
* Crea una instancia de {@link HttpTransport}.
|
|
99
|
+
*
|
|
100
|
+
* Los campos omitidos en `options` se rellenan con defaults sensatos
|
|
101
|
+
* (`batchSize=50`, `maxBufferSize=10_000`, `maxRetries=3`,
|
|
102
|
+
* `initialBackoffMs=250`, `maxBackoffMs=5_000`, `fetchTimeoutMs=10_000`).
|
|
103
|
+
* Si se pasa `flushInterval`, arranca un `setInterval` que flushea cada
|
|
104
|
+
* N ms; si se omite, el flush solo dispara por llenado de `batchSize`.
|
|
105
|
+
*
|
|
106
|
+
* @param {HttpTransportOptions} [options] - Configuración opcional. Si se omite por completo, el transport queda inactivo hasta que se setee `options.url` por otra vía (subclasses).
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* const t = new HttpTransport({
|
|
110
|
+
* url: 'https://logs.example.com/ingest',
|
|
111
|
+
* flushInterval: 5_000
|
|
112
|
+
* });
|
|
113
|
+
*/
|
|
44
114
|
constructor(options?: HttpTransportOptions);
|
|
115
|
+
/** Records actualmente encolados esperando el próximo flush. */
|
|
45
116
|
get bufferSize(): number;
|
|
117
|
+
/** Capacidad máxima del buffer. Al superarla, el registro más viejo se dropea y se notifica vía `onError`. */
|
|
46
118
|
get maxBufferSize(): number;
|
|
119
|
+
/**
|
|
120
|
+
* Indica si el transport está listo para aceptar y entregar records.
|
|
121
|
+
* Devuelve `false` tras {@link close} o si no se configuró `url`.
|
|
122
|
+
*
|
|
123
|
+
* @returns {boolean} `true` si el transport puede enviar.
|
|
124
|
+
*/
|
|
47
125
|
isReady(): boolean;
|
|
126
|
+
/**
|
|
127
|
+
* Encola un record en el buffer. Si el buffer está lleno, aplica la
|
|
128
|
+
* política de overflow (dropea el más viejo + dispara `onError`). Si tras
|
|
129
|
+
* el push se alcanza `batchSize`, dispara un flush asíncrono (sin await).
|
|
130
|
+
*
|
|
131
|
+
* No-op si el transport ya fue cerrado ({@link close}).
|
|
132
|
+
*
|
|
133
|
+
* @param {TransportRecord} record - Registro a encolar.
|
|
134
|
+
*/
|
|
48
135
|
write(record: TransportRecord): void;
|
|
49
136
|
/**
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
137
|
+
* Serializa un batch al body de la request. Las subclasses sobrescriben
|
|
138
|
+
* para cambiar la codificación (ej. {@link OtlpTransport} produce OTLP/HTTP
|
|
139
|
+
* JSON en vez del envelope default `{ logs: [...] }`).
|
|
53
140
|
*
|
|
54
141
|
*/
|
|
55
142
|
protected serializeBody(records: TransportRecord[]): string;
|
|
56
143
|
/**
|
|
57
|
-
*
|
|
58
|
-
* headers (
|
|
144
|
+
* Construye los headers de la request. Las subclasses pueden prependear
|
|
145
|
+
* headers transport-specific (ej. `signoz-ingestion-key`).
|
|
59
146
|
*
|
|
60
147
|
*/
|
|
61
148
|
protected buildHeaders(): Record<string, string>;
|
|
62
149
|
private applyOverflowPolicy;
|
|
150
|
+
/**
|
|
151
|
+
* Flushea el buffer actual: toma un snapshot de los records pendientes,
|
|
152
|
+
* los envía con retry/backoff vía `sendWithRetry`, y ante fallo los
|
|
153
|
+
* re-bufferiza preservando el orden. Si la re-bufferización excede
|
|
154
|
+
* `maxBufferSize`, trimea los más viejos y dispara `onError` con
|
|
155
|
+
* `droppedCount`.
|
|
156
|
+
*
|
|
157
|
+
* No-op si el transport está cerrado, el buffer está vacío o no hay
|
|
158
|
+
* `url` configurada.
|
|
159
|
+
*
|
|
160
|
+
* @returns {Promise<void>} Resuelve cuando el intento de entrega del batch actual terminó (success, drop definitivo o no-op).
|
|
161
|
+
*
|
|
162
|
+
* @see {@link HttpTransportOptions.onError}
|
|
163
|
+
*/
|
|
63
164
|
flush(): Promise<void>;
|
|
64
165
|
private sendWithRetry;
|
|
166
|
+
/**
|
|
167
|
+
* Cierra el transport: marca el flag `closed`, detiene el timer de
|
|
168
|
+
* `flushInterval` si estaba corriendo, y ejecuta un flush final para
|
|
169
|
+
* entregar lo pendiente.
|
|
170
|
+
*
|
|
171
|
+
* Tras `close()`, todo {@link write} posterior es no-op y
|
|
172
|
+
* {@link isReady} devuelve `false`.
|
|
173
|
+
*
|
|
174
|
+
* @returns {Promise<void>} Resuelve cuando el flush final termina.
|
|
175
|
+
*
|
|
176
|
+
* @see {@link flush}
|
|
177
|
+
*/
|
|
65
178
|
close(): Promise<void>;
|
|
66
179
|
}
|
|
67
180
|
//# sourceMappingURL=HttpTransport.d.ts.map
|