voltlog-io 1.0.0

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.

Potentially problematic release.


This version of voltlog-io might be problematic. Click here for more details.

package/dist/index.mjs ADDED
@@ -0,0 +1,738 @@
1
+ // src/core/logger.ts
2
+ import { createId } from "@paralleldrive/cuid2";
3
+
4
+ // src/core/types.ts
5
+ var LogLevel = {
6
+ TRACE: 10,
7
+ DEBUG: 20,
8
+ INFO: 30,
9
+ WARN: 40,
10
+ ERROR: 50,
11
+ FATAL: 60,
12
+ SILENT: Infinity
13
+ };
14
+ var LogLevelNameMap = Object.fromEntries(
15
+ Object.entries(LogLevel).map(([k, v]) => [k.toLowerCase(), v])
16
+ );
17
+ var LogLevelValueMap = Object.fromEntries(
18
+ Object.entries(LogLevel).filter(([, v]) => Number.isFinite(v)).map(([k, v]) => [v, k])
19
+ );
20
+
21
+ // src/core/levels.ts
22
+ function resolveLevel(level) {
23
+ const n = LogLevelNameMap[level.toLowerCase()];
24
+ return n !== void 0 ? n : LogLevel.INFO;
25
+ }
26
+ function shouldLog(entryLevel, filterLevel) {
27
+ return entryLevel >= filterLevel;
28
+ }
29
+ function shouldIncludeStack(entryLevel, includeStack) {
30
+ if (typeof includeStack === "boolean") return includeStack;
31
+ return entryLevel >= resolveLevel(includeStack);
32
+ }
33
+
34
+ // src/core/pipeline.ts
35
+ function composeMiddleware(middleware, final) {
36
+ if (middleware.length === 0) return final;
37
+ return (entry) => {
38
+ let index = 0;
39
+ const next = (e) => {
40
+ if (index < middleware.length) {
41
+ const mw = middleware[index++];
42
+ mw(e, next);
43
+ } else {
44
+ final(e);
45
+ }
46
+ };
47
+ next(entry);
48
+ };
49
+ }
50
+ function fanOutToTransformers(entry, transformers, loggerLevel) {
51
+ for (const t of transformers) {
52
+ const tLevel = t.level ? resolveLevel(t.level) : loggerLevel;
53
+ if (!shouldLog(entry.level, tLevel)) continue;
54
+ try {
55
+ const result = t.transform(entry);
56
+ if (result && typeof result.catch === "function") {
57
+ result.catch(() => {
58
+ });
59
+ }
60
+ } catch {
61
+ }
62
+ }
63
+ }
64
+
65
+ // src/core/logger.ts
66
+ var LoggerImpl = class {
67
+ _level;
68
+ _transports;
69
+ _middlewareList;
70
+ _pipeline;
71
+ _context;
72
+ _includeStack;
73
+ _timestampFn;
74
+ constructor(options = {}) {
75
+ this._level = resolveLevel(options.level ?? "INFO");
76
+ this._transports = [...options.transports ?? []];
77
+ this._middlewareList = [...options.middleware ?? []];
78
+ this._context = options.context ? { ...options.context } : {};
79
+ this._includeStack = options.includeStack ?? "ERROR";
80
+ this._timestampFn = options.timestamp ?? Date.now;
81
+ this._pipeline = this._buildPipeline();
82
+ }
83
+ // ─── Log Methods ────────────────────────────────────────────
84
+ trace(message, meta) {
85
+ this._log(10, "TRACE", message, meta);
86
+ }
87
+ debug(message, meta) {
88
+ this._log(20, "DEBUG", message, meta);
89
+ }
90
+ info(message, meta) {
91
+ this._log(30, "INFO", message, meta);
92
+ }
93
+ warn(message, meta) {
94
+ this._log(40, "WARN", message, meta);
95
+ }
96
+ error(message, metaOrError, error) {
97
+ if (metaOrError instanceof Error) {
98
+ this._log(50, "ERROR", message, void 0, metaOrError);
99
+ } else {
100
+ this._log(50, "ERROR", message, metaOrError, error);
101
+ }
102
+ }
103
+ fatal(message, metaOrError, error) {
104
+ if (metaOrError instanceof Error) {
105
+ this._log(60, "FATAL", message, void 0, metaOrError);
106
+ } else {
107
+ this._log(60, "FATAL", message, metaOrError, error);
108
+ }
109
+ }
110
+ // ─── Child Logger ───────────────────────────────────────────
111
+ child(context) {
112
+ return new ChildLoggerImpl(this, { ...this._context, ...context });
113
+ }
114
+ // ─── Dynamic Configuration ─────────────────────────────────
115
+ addTransformer(transformer) {
116
+ this._transports.push(transformer);
117
+ }
118
+ removeTransformer(name) {
119
+ this._transports = this._transports.filter((t) => t.name !== name);
120
+ }
121
+ addMiddleware(middleware) {
122
+ this._middlewareList.push(middleware);
123
+ this._pipeline = this._buildPipeline();
124
+ }
125
+ // ─── Lifecycle ──────────────────────────────────────────────
126
+ async flush() {
127
+ await Promise.all(this._transports.map((t) => t.flush?.()).filter(Boolean));
128
+ }
129
+ async close() {
130
+ await this.flush();
131
+ await Promise.all(this._transports.map((t) => t.close?.()).filter(Boolean));
132
+ }
133
+ // ─── Internal ───────────────────────────────────────────────
134
+ /** @internal */
135
+ _log(level, levelName, message, meta, error) {
136
+ this._logWithContext(level, levelName, message, this._context, meta, error);
137
+ }
138
+ /** @internal — used by child loggers to inject bound context */
139
+ _logWithContext(level, levelName, message, context, meta, error) {
140
+ if (!shouldLog(level, this._level)) return;
141
+ const entry = {
142
+ id: createId(),
143
+ level,
144
+ levelName,
145
+ message,
146
+ timestamp: this._timestampFn(),
147
+ meta: meta ?? {},
148
+ context: Object.keys(context).length > 0 ? context : void 0
149
+ };
150
+ if (error) {
151
+ const logError = {
152
+ message: error.message,
153
+ name: error.name,
154
+ code: error.code
155
+ };
156
+ if (shouldIncludeStack(level, this._includeStack)) {
157
+ logError.stack = error.stack;
158
+ }
159
+ entry.error = logError;
160
+ }
161
+ this._pipeline(entry);
162
+ }
163
+ _buildPipeline() {
164
+ return composeMiddleware(this._middlewareList, (entry) => {
165
+ fanOutToTransformers(entry, this._transports, this._level);
166
+ });
167
+ }
168
+ };
169
+ var ChildLoggerImpl = class _ChildLoggerImpl {
170
+ constructor(_parent, _context) {
171
+ this._parent = _parent;
172
+ this._context = _context;
173
+ }
174
+ trace(message, meta) {
175
+ this._parent._logWithContext(10, "TRACE", message, this._context, meta);
176
+ }
177
+ debug(message, meta) {
178
+ this._parent._logWithContext(20, "DEBUG", message, this._context, meta);
179
+ }
180
+ info(message, meta) {
181
+ this._parent._logWithContext(30, "INFO", message, this._context, meta);
182
+ }
183
+ warn(message, meta) {
184
+ this._parent._logWithContext(40, "WARN", message, this._context, meta);
185
+ }
186
+ error(message, metaOrError, error) {
187
+ if (metaOrError instanceof Error) {
188
+ this._parent._logWithContext(
189
+ 50,
190
+ "ERROR",
191
+ message,
192
+ this._context,
193
+ void 0,
194
+ metaOrError
195
+ );
196
+ } else {
197
+ this._parent._logWithContext(
198
+ 50,
199
+ "ERROR",
200
+ message,
201
+ this._context,
202
+ metaOrError,
203
+ error
204
+ );
205
+ }
206
+ }
207
+ fatal(message, metaOrError, error) {
208
+ if (metaOrError instanceof Error) {
209
+ this._parent._logWithContext(
210
+ 60,
211
+ "FATAL",
212
+ message,
213
+ this._context,
214
+ void 0,
215
+ metaOrError
216
+ );
217
+ } else {
218
+ this._parent._logWithContext(
219
+ 60,
220
+ "FATAL",
221
+ message,
222
+ this._context,
223
+ metaOrError,
224
+ error
225
+ );
226
+ }
227
+ }
228
+ child(context) {
229
+ return new _ChildLoggerImpl(this._parent, {
230
+ ...this._context,
231
+ ...context
232
+ });
233
+ }
234
+ addTransformer(transformer) {
235
+ this._parent.addTransformer(transformer);
236
+ }
237
+ removeTransformer(name) {
238
+ this._parent.removeTransformer(name);
239
+ }
240
+ addMiddleware(middleware) {
241
+ this._parent.addMiddleware(middleware);
242
+ }
243
+ flush() {
244
+ return this._parent.flush();
245
+ }
246
+ close() {
247
+ return this._parent.close();
248
+ }
249
+ };
250
+ function createLogger(options) {
251
+ return new LoggerImpl(options);
252
+ }
253
+
254
+ // src/middleware/redaction.ts
255
+ var DEFAULT_REDACT_VALUE = "[REDACTED]";
256
+ function redactionMiddleware(options) {
257
+ const paths = new Set(options.paths.map((p) => p.toLowerCase()));
258
+ const replacement = options.replacement ?? DEFAULT_REDACT_VALUE;
259
+ const deep = options.deep ?? true;
260
+ function redactObject(obj) {
261
+ const result = {};
262
+ for (const [key, value] of Object.entries(obj)) {
263
+ if (paths.has(key.toLowerCase())) {
264
+ result[key] = replacement;
265
+ } else if (deep && value !== null && typeof value === "object" && !Array.isArray(value)) {
266
+ result[key] = redactObject(value);
267
+ } else {
268
+ result[key] = value;
269
+ }
270
+ }
271
+ return result;
272
+ }
273
+ return (entry, next) => {
274
+ const redacted = { ...entry };
275
+ if (entry.meta && typeof entry.meta === "object") {
276
+ redacted.meta = redactObject(
277
+ entry.meta
278
+ );
279
+ }
280
+ if (entry.context && typeof entry.context === "object") {
281
+ redacted.context = redactObject(entry.context);
282
+ }
283
+ next(redacted);
284
+ };
285
+ }
286
+
287
+ // src/middleware/sampling.ts
288
+ function samplingMiddleware(options = {}) {
289
+ const keyFn = options.keyFn ?? ((entry) => entry.message);
290
+ const maxPerWindow = options.maxPerWindow ?? 100;
291
+ const windowMs = options.windowMs ?? 6e4;
292
+ const sampleRate = options.sampleRate ?? 1;
293
+ const priorityLevel = options.priorityLevel ?? 40;
294
+ const buckets = /* @__PURE__ */ new Map();
295
+ return (entry, next) => {
296
+ if (entry.level >= priorityLevel) {
297
+ return next(entry);
298
+ }
299
+ if (sampleRate < 1 && Math.random() > sampleRate) {
300
+ return;
301
+ }
302
+ const key = keyFn(entry);
303
+ const now = entry.timestamp;
304
+ let bucket = buckets.get(key);
305
+ if (!bucket || now - bucket.windowStart >= windowMs) {
306
+ bucket = { count: 0, windowStart: now };
307
+ buckets.set(key, bucket);
308
+ }
309
+ if (bucket.count < maxPerWindow) {
310
+ bucket.count++;
311
+ next(entry);
312
+ }
313
+ if (buckets.size > 2e3) {
314
+ const expireBefore = now - windowMs * 2;
315
+ for (const [k, b] of buckets) {
316
+ if (b.windowStart < expireBefore) {
317
+ buckets.delete(k);
318
+ }
319
+ }
320
+ }
321
+ };
322
+ }
323
+
324
+ // src/middleware/ocpp.ts
325
+ function ocppMiddleware(options = {}) {
326
+ const autoPayloadSize = options.autoPayloadSize ?? true;
327
+ const propagateCorrelationId = options.propagateCorrelationId ?? true;
328
+ return (entry, next) => {
329
+ const enriched = { ...entry, meta: { ...entry.meta } };
330
+ if (autoPayloadSize && enriched.meta.payloadSize === void 0 && enriched.meta.action) {
331
+ try {
332
+ enriched.meta.payloadSize = JSON.stringify(enriched.meta).length;
333
+ } catch {
334
+ }
335
+ }
336
+ if (propagateCorrelationId && enriched.meta.correlationId && !enriched.correlationId) {
337
+ enriched.correlationId = enriched.meta.correlationId;
338
+ }
339
+ next(enriched);
340
+ };
341
+ }
342
+
343
+ // src/middleware/alert.ts
344
+ function alertMiddleware(rules) {
345
+ const states = /* @__PURE__ */ new Map();
346
+ for (const rule of rules) {
347
+ states.set(rule.name, { entries: [], lastFired: -Infinity });
348
+ }
349
+ return (entry, next) => {
350
+ const now = entry.timestamp;
351
+ for (const rule of rules) {
352
+ if (!rule.when(entry)) continue;
353
+ const state = states.get(rule.name);
354
+ const windowMs = rule.windowMs ?? Infinity;
355
+ const threshold = rule.threshold ?? 1;
356
+ const cooldownMs = rule.cooldownMs ?? 0;
357
+ if (Number.isFinite(windowMs)) {
358
+ state.entries = state.entries.filter(
359
+ (e) => now - e.timestamp < windowMs
360
+ );
361
+ }
362
+ state.entries.push(entry);
363
+ if (state.entries.length >= threshold && now - state.lastFired >= cooldownMs) {
364
+ const alertEntries = [...state.entries];
365
+ state.entries = [];
366
+ state.lastFired = now;
367
+ try {
368
+ const result = rule.onAlert(alertEntries);
369
+ if (result && typeof result.catch === "function") {
370
+ result.catch(() => {
371
+ });
372
+ }
373
+ } catch {
374
+ }
375
+ }
376
+ }
377
+ next(entry);
378
+ };
379
+ }
380
+
381
+ // src/middleware/create-middleware.ts
382
+ function createMiddleware(fn) {
383
+ return fn;
384
+ }
385
+
386
+ // src/transformers/console.ts
387
+ function consoleTransport(options = {}) {
388
+ const useConsoleLevels = options.useConsoleLevels ?? true;
389
+ const formatter = options.formatter ?? ((entry) => JSON.stringify(entry));
390
+ return {
391
+ name: "console",
392
+ level: options.level,
393
+ transform(entry) {
394
+ const output = formatter(entry);
395
+ if (!useConsoleLevels) {
396
+ console.log(output);
397
+ return;
398
+ }
399
+ if (entry.level >= LogLevel.FATAL) {
400
+ console.error(output);
401
+ } else if (entry.level >= LogLevel.ERROR) {
402
+ console.error(output);
403
+ } else if (entry.level >= LogLevel.WARN) {
404
+ console.warn(output);
405
+ } else if (entry.level >= LogLevel.INFO) {
406
+ console.info(output);
407
+ } else if (entry.level >= LogLevel.DEBUG) {
408
+ console.debug(output);
409
+ } else {
410
+ console.log(output);
411
+ }
412
+ }
413
+ };
414
+ }
415
+
416
+ // src/transformers/pretty.ts
417
+ var RESET = "\x1B[0m";
418
+ var DIM = "\x1B[2m";
419
+ var BOLD = "\x1B[1m";
420
+ var COLORS = {
421
+ TRACE: "\x1B[90m",
422
+ // gray
423
+ DEBUG: "\x1B[36m",
424
+ // cyan
425
+ INFO: "\x1B[32m",
426
+ // green
427
+ WARN: "\x1B[33m",
428
+ // yellow
429
+ ERROR: "\x1B[31m",
430
+ // red
431
+ FATAL: "\x1B[35;1m"
432
+ // bold magenta
433
+ };
434
+ var ICONS = {
435
+ TRACE: "\u{1F50D}",
436
+ DEBUG: "\u{1F41B}",
437
+ INFO: "\u2139",
438
+ WARN: "\u26A0",
439
+ ERROR: "\u2716",
440
+ FATAL: "\u{1F480}"
441
+ };
442
+ var EXCHANGE_ICONS = {
443
+ CALL: "\u26A1",
444
+ CALLRESULT: "\u2714",
445
+ CALLERROR: "\u{1F6A8}"
446
+ };
447
+ var DIRECTION_ARROWS = {
448
+ IN: "\u2192",
449
+ OUT: "\u2190"
450
+ };
451
+ function prettyTransport(options = {}) {
452
+ const showTimestamps = options.timestamps ?? true;
453
+ const useColors = options.colors ?? true;
454
+ function colorize(text, color) {
455
+ return useColors ? `${color}${text}${RESET}` : text;
456
+ }
457
+ function formatExchange(entry) {
458
+ const meta = entry.meta;
459
+ if (!meta || !meta.action || !meta.messageType) return null;
460
+ const icon = EXCHANGE_ICONS[meta.messageType] ?? "\u2022";
461
+ const arrow = DIRECTION_ARROWS[meta.direction ?? "IN"] ?? "\u2192";
462
+ const cpId = meta.chargePointId ?? "unknown";
463
+ const action = meta.action;
464
+ const msgType = meta.messageType;
465
+ const dir = meta.direction ?? "";
466
+ let line = `${icon} ${colorize(cpId, BOLD)} ${arrow} ${colorize(action, BOLD)} [${dir}] ${colorize(msgType, DIM)}`;
467
+ if (meta.status || meta.latencyMs !== void 0) {
468
+ const statusIcon = meta.messageType === "CALLERROR" ? "\u274C" : "\u2714";
469
+ const status = meta.status ?? "";
470
+ const latency = meta.latencyMs !== void 0 ? `(${meta.latencyMs}ms)` : "";
471
+ line += `
472
+ ${statusIcon} ${status} ${colorize(latency, DIM)}`;
473
+ }
474
+ return line;
475
+ }
476
+ function formatStandard(entry) {
477
+ const icon = ICONS[entry.levelName] ?? "\u2022";
478
+ const levelColor = COLORS[entry.levelName] ?? "";
479
+ const level = colorize(entry.levelName.padEnd(5), levelColor);
480
+ const ts = showTimestamps ? colorize(new Date(entry.timestamp).toISOString(), DIM) + " " : "";
481
+ let line = `${icon} ${ts}${level} ${entry.message}`;
482
+ if (entry.context && Object.keys(entry.context).length > 0) {
483
+ line += ` ${colorize(JSON.stringify(entry.context), DIM)}`;
484
+ }
485
+ if (entry.meta && Object.keys(entry.meta).length > 0) {
486
+ line += ` ${colorize(JSON.stringify(entry.meta), DIM)}`;
487
+ }
488
+ if (entry.error) {
489
+ line += `
490
+ ${colorize(`${entry.error.name ?? "Error"}: ${entry.error.message}`, COLORS["ERROR"] ?? "")}`;
491
+ if (entry.error.stack) {
492
+ line += `
493
+ ${colorize(entry.error.stack, DIM)}`;
494
+ }
495
+ }
496
+ return line;
497
+ }
498
+ return {
499
+ name: "pretty",
500
+ level: options.level,
501
+ transform(entry) {
502
+ const exchangeOutput = formatExchange(entry);
503
+ if (exchangeOutput) {
504
+ console.log(exchangeOutput);
505
+ return;
506
+ }
507
+ const output = formatStandard(entry);
508
+ if (entry.level >= LogLevel.ERROR) {
509
+ console.error(output);
510
+ } else if (entry.level >= LogLevel.WARN) {
511
+ console.warn(output);
512
+ } else {
513
+ console.log(output);
514
+ }
515
+ }
516
+ };
517
+ }
518
+
519
+ // src/transformers/json-stream.ts
520
+ function jsonStreamTransport(options) {
521
+ const stream = options.stream;
522
+ const serialize = options.serializer ?? ((entry) => JSON.stringify(entry) + "\n");
523
+ return {
524
+ name: "json-stream",
525
+ level: options.level,
526
+ transform(entry) {
527
+ const data = serialize(entry);
528
+ stream.write(data);
529
+ },
530
+ close() {
531
+ return new Promise((resolve) => {
532
+ if ("end" in stream && typeof stream.end === "function") {
533
+ stream.end(() => resolve());
534
+ } else {
535
+ resolve();
536
+ }
537
+ });
538
+ }
539
+ };
540
+ }
541
+
542
+ // src/transformers/webhook.ts
543
+ function webhookTransport(options) {
544
+ const {
545
+ url,
546
+ method = "POST",
547
+ headers = {},
548
+ batchSize = 1,
549
+ flushIntervalMs = 5e3,
550
+ retry = false,
551
+ maxRetries = 3
552
+ } = options;
553
+ const serialize = options.serializer ?? ((entries) => JSON.stringify({
554
+ entries,
555
+ count: entries.length,
556
+ timestamp: Date.now()
557
+ }));
558
+ let buffer = [];
559
+ let flushTimer = null;
560
+ async function sendBatch(entries, attempt = 0) {
561
+ try {
562
+ const response = await fetch(url, {
563
+ method,
564
+ headers: {
565
+ "Content-Type": "application/json",
566
+ ...headers
567
+ },
568
+ body: serialize(entries)
569
+ });
570
+ if (!response.ok && retry && attempt < maxRetries) {
571
+ const delay = Math.min(1e3 * Math.pow(2, attempt), 3e4);
572
+ await new Promise((r) => setTimeout(r, delay));
573
+ return sendBatch(entries, attempt + 1);
574
+ }
575
+ } catch {
576
+ if (retry && attempt < maxRetries) {
577
+ const delay = Math.min(1e3 * Math.pow(2, attempt), 3e4);
578
+ await new Promise((r) => setTimeout(r, delay));
579
+ return sendBatch(entries, attempt + 1);
580
+ }
581
+ }
582
+ }
583
+ function scheduleFlush() {
584
+ if (flushTimer) return;
585
+ flushTimer = setTimeout(() => {
586
+ flushTimer = null;
587
+ doFlush();
588
+ }, flushIntervalMs);
589
+ }
590
+ function doFlush() {
591
+ if (buffer.length === 0) return;
592
+ const batch = buffer;
593
+ buffer = [];
594
+ sendBatch(batch).catch(() => {
595
+ });
596
+ }
597
+ return {
598
+ name: "webhook",
599
+ level: options.level,
600
+ transform(entry) {
601
+ buffer.push(entry);
602
+ if (buffer.length >= batchSize) {
603
+ doFlush();
604
+ } else {
605
+ scheduleFlush();
606
+ }
607
+ },
608
+ async flush() {
609
+ if (flushTimer) {
610
+ clearTimeout(flushTimer);
611
+ flushTimer = null;
612
+ }
613
+ if (buffer.length > 0) {
614
+ const batch = buffer;
615
+ buffer = [];
616
+ await sendBatch(batch);
617
+ }
618
+ },
619
+ async close() {
620
+ await this.flush();
621
+ }
622
+ };
623
+ }
624
+
625
+ // src/transformers/batch.ts
626
+ function batchTransport(inner, options = {}) {
627
+ const batchSize = options.batchSize ?? 100;
628
+ const flushIntervalMs = options.flushIntervalMs ?? 5e3;
629
+ let buffer = [];
630
+ let flushTimer = null;
631
+ function scheduleFlush() {
632
+ if (flushTimer) return;
633
+ flushTimer = setTimeout(() => {
634
+ flushTimer = null;
635
+ doFlush();
636
+ }, flushIntervalMs);
637
+ }
638
+ function doFlush() {
639
+ if (buffer.length === 0) return;
640
+ const batch = buffer;
641
+ buffer = [];
642
+ for (const entry of batch) {
643
+ try {
644
+ const result = inner.transform(entry);
645
+ if (result && typeof result.catch === "function") {
646
+ result.catch(() => {
647
+ });
648
+ }
649
+ } catch {
650
+ }
651
+ }
652
+ }
653
+ return {
654
+ name: `batch(${inner.name})`,
655
+ level: inner.level,
656
+ transform(entry) {
657
+ buffer.push(entry);
658
+ if (buffer.length >= batchSize) {
659
+ doFlush();
660
+ } else {
661
+ scheduleFlush();
662
+ }
663
+ },
664
+ async flush() {
665
+ if (flushTimer) {
666
+ clearTimeout(flushTimer);
667
+ flushTimer = null;
668
+ }
669
+ doFlush();
670
+ await inner.flush?.();
671
+ },
672
+ async close() {
673
+ await this.flush();
674
+ await inner.close?.();
675
+ }
676
+ };
677
+ }
678
+
679
+ // src/transformers/redis.ts
680
+ function redisTransport(options) {
681
+ const { client, streamKey = "logs", maxLen, level } = options;
682
+ const fieldMapper = options.fieldMapper ?? defaultFieldMapper;
683
+ function defaultFieldMapper(entry) {
684
+ return {
685
+ id: entry.id,
686
+ level: String(entry.level),
687
+ levelName: entry.levelName,
688
+ message: entry.message,
689
+ timestamp: String(entry.timestamp),
690
+ data: JSON.stringify({
691
+ meta: entry.meta,
692
+ context: entry.context,
693
+ correlationId: entry.correlationId,
694
+ error: entry.error
695
+ })
696
+ };
697
+ }
698
+ return {
699
+ name: "redis",
700
+ level,
701
+ transform(entry) {
702
+ const fields = fieldMapper(entry);
703
+ const args = [streamKey];
704
+ if (maxLen) {
705
+ args.push("MAXLEN", "~", maxLen);
706
+ }
707
+ args.push("*");
708
+ for (const [key, value] of Object.entries(fields)) {
709
+ args.push(key, value);
710
+ }
711
+ client.xadd(...args).catch(() => {
712
+ });
713
+ },
714
+ async close() {
715
+ }
716
+ };
717
+ }
718
+ export {
719
+ LogLevel,
720
+ LogLevelNameMap,
721
+ LogLevelValueMap,
722
+ alertMiddleware,
723
+ batchTransport,
724
+ consoleTransport,
725
+ createLogger,
726
+ createMiddleware,
727
+ jsonStreamTransport,
728
+ ocppMiddleware,
729
+ prettyTransport,
730
+ redactionMiddleware,
731
+ redisTransport,
732
+ resolveLevel,
733
+ samplingMiddleware,
734
+ shouldIncludeStack,
735
+ shouldLog,
736
+ webhookTransport
737
+ };
738
+ //# sourceMappingURL=index.mjs.map